天体照相仪
  ](https://hub.docker.com/r/thaylo/astrograph)   
一 MCP服务器 这有助于AI代理在编写之前检测重复代码。它提供了编写和编辑工具,使用AST图同构将新代码与代码库中的现有函数进行比较——由算法而不是LLM令牌提供支持。当发现结构重复时,将使用指向现有代码的指针阻止该操作。变量名、格式和注释将被忽略——如果两段代码共享相同的抽象结构,则ASTrogram会将它们标记为重复。
安装
添加 .mcp.json 到您的项目根目录:
{
"mcpServers": {
"astrograph": {
"command": "docker",
"args": [
"run", "--rm", "-i", "--pull", "missing",
"--add-host", "host.docker.internal:host-gateway",
"-v", ".:/workspace",
"thaylo/astrograph:latest"
]
}
}
}图像是多拱形(amd64,arm64)。代码库在启动时被索引。元数据存储在项目目录之外(在用户数据目录中),因此它永远不会干扰您的代码库。
要更新到新版本,请执行以下操作:
docker pull thaylo/astrograph:latest运行版本在MCP中始终可见 serverInfo.version 连接上的字段。
Claude Desktop
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json 窗户: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"astrograph": {
"command": "docker",
"args": [
"run", "--rm", "-i", "--pull", "missing",
"--add-host", "host.docker.internal:host-gateway",
"-v", "/absolute/path/to/project:/workspace",
"thaylo/astrograph:latest"
]
}
}
}Codex
~/.codex/config.toml:
[mcp_servers.astrograph]
command = "docker"
args = [
"run", "--rm", "-i", "--pull", "missing",
"--add-host", "host.docker.internal:host-gateway",
"-v", "/absolute/path/to/project:/workspace",
"thaylo/astrograph:latest"
]wmark
~/.config/wmark/.mcp.json (用户级别,适用于macOS上的所有项目):
{
"mcpServers": {
"astrograph": {
"command": "docker",
"args": [
"run", "--rm", "-i", "--pull", "missing",
"--add-host", "host.docker.internal:host-gateway",
"-v", "/Users:/Users:rw",
"thaylo/astrograph:latest"
]
}
}
}安装 /Users 使容器内的所有macOS主路径保持不变。呼叫 set_workspace 使用完整的主机路径(例如。 /Users/yourname/project)为项目编制索引。
对于Linux,替换 /Users:/Users:rw 和 /home:/home:rw.
Without Docker
pip install .{
"mcpServers": {
"astrograph": {
"command": "python",
"args": ["-m", "astrograph.server"],
"cwd": "/path/to/astrograph"
}
}
}运作原理
您的代码库已包含:
# src/math.py
def calculate_sum(a, b):
return a + bAI代理试图写:
# src/utils.py
def add_numbers(x, y):
return x + yA程序检测到重复并阻止写入:
BLOCKED: Cannot write - identical code exists at src/math.py:calculate_sum (lines 1-2).
Reuse the existing implementation instead.不同的变量名,相同的结构。源代码被转换为带标签的有向图,并使用Weisfeiler Leman哈希与VF2同构验证进行比较——所有这些都是算法,没有在搜索上花费LLM令牌。
检测类型
AST程序检测四种类型的结构复制:
| 类型 | 它捕获了什么 | 它是如何工作的 |
|---|---|---|
| 精确 | 具有重命名变量或不同格式的相同AST结构 | WL哈希标识+VF2图同构验证 |
| 模式 | 具有不同运算符或常量的相同控制流 | 运算符规范化图哈希 |
| 块 | 函数内重复的内部块(for/if/while/try) | 块级AST提取+哈希匹配 |
| 近重复 | 约80%的结构相似性——复制粘贴修改模式 | 4/5深度级别的层次哈希前缀匹配 |
接近重复检测可以捕获精确和模式检测失败的Type-3克隆。例如,Flask的 TagBytes, TagDateTime, TagTuple,以及 TagUUID 类共享80%以上的相同结构,但在叶级细节上有所不同。
语言支持
Python、JavaScript和TypeScript可以开箱即用。C、C++、Java和Go通过TCP连接到已经运行的语言服务器。
| 语言 | 版本 | 模式 | 默认端点 |
|---|---|---|---|
| Python | 3.11-3.14 | 捆绑 | pylsp |
| JavaScript | ES2021+,节点20/22/24 LTS | 捆绑 | typescript-language-server --stdio |
| TypeScript | TypeScript 5.x,节点20/22/24 LTS | 捆绑 | typescript-language-server --stdio |
| 转到 | 1.21--1.25 | 附加 | tcp://127.0.0.1:2091 |
| C | C11、C17、C23 | 附 | tcp://127.0.0.1:2087 |
| C++ | C++17、C++20、C++23 | 附加 | tcp://127.0.0.1:2088 |
| Java | 11、17、21、25 | 附加 | tcp://127.0.0.1:2089 |
Docker镜像捆绑了Python和JS/TS LSP运行时。对于基于连接的语言,使用以下命令在TCP端口上公开语言服务器 socat 并通过MCP JSON进行配置:
{
"mcpServers": {
"astrograph": {
"command": "docker",
"args": ["run", "--rm", "-i", "--add-host", "host.docker.internal:host-gateway", "-v", ".:/workspace", "thaylo/astrograph:latest"],
"env": {
"ASTROGRAPH_CPP_LSP_COMMAND": "tcp://host.docker.internal:2088",
"ASTROGRAPH_GO_LSP_COMMAND": "tcp://host.docker.internal:2091",
"ASTROGRAPH_JAVA_LSP_COMMAND": "tcp://host.docker.internal:2089",
"ASTROGRAPH_C_LSP_COMMAND": "tcp://host.docker.internal:2087"
}
}
}
}| 语言 | Env-var | Socat桥示例 |
|---|---|---|
C ASTROGRAPH_C_LSP_COMMAND | socat TCP-LISTEN:2087,reuseaddr,fork EXEC:clangd | |
C ASTROGRAPH_CPP_LSP_COMMAND | socat TCP-LISTEN:2088,reuseaddr,fork EXEC:clangd | |
Java ASTROGRAPH_JAVA_LSP_COMMAND | socat TCP-LISTEN:2089,reuseaddr,fork EXEC:jdtls | |
| 去吧 | ASTROGRAPH_GO_LSP_COMMAND | socat TCP-LISTEN:2091,reuseaddr,fork EXEC:"gopls serve" |
python ASTROGRAPH_PY_LSP_COMMAND | (捆绑,必要时覆盖) | |
| JS | ASTROGRAPH_JS_LSP_COMMAND | (捆绑,必要时覆盖) |
| TS | ASTROGRAPH_TS_LSP_COMMAND | (捆绑,必要时覆盖) |
跑 lsp_setup(mode='inspect') 查看哪些语言可用,缺少什么。
真实世界的结果
在流行的开源项目上进行了测试:
| 项目 | 语言 | 文件 | 代码单位 | 发现重复项 |
|---|---|---|---|---|
| 瑞迪斯 | C | 208 | 18272 | 556组 |
| 类型ORM | TypeScript | 492 | 7107 | 511组 |
| Express.js | JavaScript | 141 | 3866 | 468组 |
| nlohmann/json | C++ | 488 | 9103 | 959组 |
| 金酒 | 前往 | 99 | 1557 | 141组 |
| 烧瓶 | Python | 24 | 910 | 48组 |
| 春季宠物诊所 | Java | 47 | 270 | 17组 |
通过VF2图同构验证了精确、模式和块发现。通过层次哈希前缀相似性(约80%的结构同一性)匹配近似重复项。
星迹

许可证
麻省理工学院
