MercurieVV/ScalaSemantic

GitHub: MercurieVV/ScalaSemantic

面向 AI 编程代理的 Scala 语义分析 MCP 服务器,通过查询 SemanticDB 提供编译器级别的代码理解能力。

Stars: 0 | Forks: 0

# Scala 语义 [![Maven Central](https://img.shields.io/maven-central/v/io.github.mercurievv/scalasemantic-core_3?label=Maven%20Central)](https://central.sonatype.com/namespace/io.github.mercurievv) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/45f1cc8366013713.svg)](https://github.com/mercurievv/ScalaSemantic/actions/workflows/ci.yml) [![Docs](https://img.shields.io/badge/docs-site-blue)](https://mercurievv.github.io/ScalaSemantic/) [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE) **ScalaSemantic** 帮助 AI 像编译器一样理解你的 Scala 代码。与其让 agent 通过文本搜索 (grep) 来猜测,不如让它直接查询编译器生成的 **SemanticDB**,以获取精确的符号、 类型、隐式 (implicits)、继承、用法以及调用路径。 对于 Scala 开发者而言,这意味着 agent 可以回答如下问题: - 某个方法真正被使用的地方,且不会出现 `grep` 那样的错误匹配; - 哪些类扩展了 trait 或覆盖了某个成员; - 哪些 `given` 可以满足某个类型; - 某个方法在整个项目中是如何调用另一个方法的。 它通过 [MCP](https://modelcontextprotocol.io) 暴露接口,因此像 Claude Code 这样的客户端可以将其 作为本地工具进行调用,同时你仍可继续使用正常的 Scala 构建。 📖 **文档站点:** (经过 mdoc 检查,因此其代码 示例会在构建时执行)。 ## 为什么选择它,而不是 `grep` `grep` 只能匹配字符;而 ScalaSemantic 能理解已编译的程序。 | 你想知道… | `grep` | ScalaSemantic | |---|---|---| | 谁 extends 了 `Animal`? | 每一行包含 "Animal" 的文本 | 精确的子类型 — `class_hierarchy` | | 方法 `foo` 的所有用法 | 每一个 "foo",包含无关项 | 精确的符号引用 — `find_usages` | | 哪些 `given` 生成了 `Show[Int]`? | — 无法做到 | `resolve_implicits` | | 从 `a` 到 `c` 的调用路径? | — 无法做到 | `call_path` | 每一项能力都有相应的测试作为支撑,这些测试针对本仓库自身的 SemanticDB 运行 → [`AnalyzerSuite`](analysis/src/test/scala/com/github/mercurievv/scalasemantic/analysis/AnalyzerSuite.scala)。 完整的权衡分析,包括 `grep` 占优的场景:[docs/COMPARISON.md](docs/COMPARISON.md)。 ## 快速开始 你的 MCP 客户端会通过 stdio 启动该服务器。只需两样东西(只需要 **JVM** — 不需要 coursier,也不需要 sbt): 1. 目标项目**已使用 SemanticDB 编译**(`semanticdbEnabled := true`); 2. 一个 `.mcp.json` 条目,用于以该项目的根目录作为参数启动服务器。 选择一种设置方式: ### sbt 插件 — 推荐 最省事:它会自动启用 SemanticDB 并为你生成 `.mcp.json`;jar 包会在首次启动时下载。 ``` // project/plugins.sbt addSbtPlugin("io.github.mercurievv" % "sbt-scalasemantic-mcp" % "0.2.1") // build.sbt enablePlugins(ScalaSemanticMcpPlugin) ``` `sbt mcpClientConfig` 会打印出该条目;`sbt mcpRun` 会运行服务器以进行测试。 ### 任何构建工具 / 操作系统 - **自动下载启动器** — `curl -fsSL .../scripts/install.sh | sh`(Windows 系统使用:`…ps1`),然后将 `.mcp.json` 中的 `command` 设置为 `~/.local/bin/scalasemantic-mcp`。首次运行时会获取并缓存 fat jar。 - **直接使用 `java -jar`** — 从 [最新发布版本](https://github.com/MercurieVV/ScalaSemantic/releases/latest) 获取 `scalasemantic-mcp.jar` 并直接运行。 完整的设置、生成的配置以及生命周期:**[docs/INTEGRATION.md](docs/INTEGRATION.md)**。 ## 工具 | 工具 | 回答 | |------|---------| | `find_symbol` | 将普通/部分名称解析为 SemanticDB 符号字符串 — **从这里开始** | | `find_usages` | 对某个符号的引用,区分 def/ref,支持分页 | | `method_signature` | 完整的方法签名,包含 implicit/using 参数列表 | | `class_hierarchy` | 父类、线性化顺序、全索引范围内已知的子类型 | | `find_overloads` | 共享相同名称和所有者的所有重载 | | `members` | 声明的成员与继承的成员对比(感知 override) | | `type_at_position` | 位于 0 基点位置的符号 + 类型 | | `resolve_implicits` | 生成某个类型的 `given` 定义 | | `trace_implicit_chain` | 某个 given 的传递隐式依赖 | | `call_path` | 两个方法之间的最短调用路径 | 每个工具都接收一个 SemanticDB 符号字符串;请先调用 `find_symbol` 通过普通名称获取该字符串。 在 `initialize` 时,服务器还会发送 `instructions`,告知 agent 在回答 Scala 代码问题时 **优先使用这些工具,而不是 `grep`**。结果默认是**精简的**(位置以 `uri:line:col` 格式显示, 签名为单行,省略空字段);传入 `"detailed": true` 可以展开详情,并且 `find_usages` 支持 分页。 ## 支持的 Scala 版本 服务器*读取* SemanticDB,因此它与编译器版本无关:它可以作用于任何 生成 SemanticDB 的项目。跨版本行为由测试强制保证 —— 分析器已针对 来自 **Scala 2.13 和 3.x** 的标准 SemanticDB 进行了测试(参见 [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md#cross-version-compatibility-test))。 服务器本身运行在任何 JVM 上(`java` 11+);目标项目的 Scala 版本是独立的。 ## 文档 - **[文档网站](https://mercurievv.github.io/ScalaSemantic/)** — 渲染后的、经过 mdoc 检查的微型网站 - [集成](docs/INTEGRATION.md) — 向客户端注册、sbt 插件、其他构建工具 - [对比](docs/COMPARISON.md) — 对比 `grep`(优缺点),以及关于 Metals/LSP 的说明 - [开发](docs/DEVELOPMENT.md) — 模块结构、构建与测试、跨版本测试 - [设计决策](docs/DESIGN.md) — 为什么使用 upickle、可扩展性(外部 jar 工具)、文档工具 - [发布](docs/RELEASING.md) — Sonatype Central 发布流程 ## 许可证 [MIT](LICENSE)
标签:AI编程辅助, MCP, Scala, SemanticDB, 云安全监控, 代码分析, 凭证管理, 静态分析