语义代码搜索服务器

一个基于AST感知分块和向量嵌入的语义代码搜索服务器,适用于任何支持MCP的AI编码工具。

  • by smallthinkingmachines
  • TypeScript
  • 本地部署
  • 4 星标
  • 更新于
在 GitHub 查看 smallthinkingmachines/semantic-code-mcp

使用说明

语义代码mcp

使用AST感知分块和向量嵌入进行语义代码搜索的MCP服务器。适用于任何支持MCP的AI编码工具。

GitHub | npm

问题

传统的搜索工具,如grep、ripgrep和ag,可以精确地匹配文本模式。当开发人员提出诸如“如何处理身份验证?”或“我们在哪里处理付款?”之类的概念性问题时,这些工具需要知道确切的函数名称或代码模式。这导致:

  • 压倒性的结果:数千行包含搜索词,其中大多数不相关
  • 命名惯例的盲目性:“authenticateUser”、“login”、“validateSession”和“handleAuth”是同一个概念——grep不知道
  • 上下文丢失:结果显示没有周围代码结构的孤立行

AI编码工具继承了这些局限性。Claude Code依赖于grep/ripgrep进行代码搜索——没有语义理解,只有字符串匹配。Aider使用带有图排名的仓库映射来选择相关代码,但仍然依赖于结构分析而不是意义。这些方法适用于较小的代码库,但在规模上很难实现,在不相关的结果上燃烧令牌或缺少概念上相关的代码。

解决方案

语义搜索通过意义来理解代码,而不仅仅是文本。它可以通过理解概念关系来回答“用户身份验证是如何实现的?”,而不管函数名或文件位置如何。

使用局部嵌入和向量搜索,它弥合了文本搜索限制和LLM上下文约束之间的差距,为导航大型代码库提供了更准确的结果。

特性

  • 语义搜索 -按含义查找代码,而不仅仅是关键字
  • 上下文图 -了解代码如何通过图增强搜索进行连接(调用、导入、继承)
  • 会话记忆 -跨多回合对话跟踪代理探索状态
  • AST感知分块 -Tree sitter WASM用于跨平台解析,无需本机编译
  • 本地嵌入 -带nomic嵌入代码的ONNX运行时(768 dims,8K上下文)
  • 混合搜索 -向量相似度+BM25关键字匹配
  • 交叉编码器重新排序 -变压器重新分级,精度更高
  • 增量索引 -MD5哈希用于更改检测,仅重新索引修改过的文件
  • 文件监视 -编码时实时更新
  • 懒惰索引 -索引建立在首次搜索的基础上,而不是启动时
  • GPU支持 -CUDA自动检测,索引速度提高10-50倍

安装

开源代码

添加 ~/.config/opencode/opencode.json:

{
  "mcp": {
    "semantic-code": {
      "type": "local",
      "command": ["npx", "@smallthinkingmachines/semantic-code-mcp"],
      "enabled": true
    }
  }
}

克劳德代码

添加 ~/.claude.json 或项目 .mcp.json:

{
  "mcpServers": {
    "semantic-code": {
      "command": "npx",
      "args": ["@smallthinkingmachines/semantic-code-mcp"]
    }
  }
}

VS Code

添加 .vscode/mcp.json (工作区)或运行 MCP: Add Server 命令:

{
  "servers": {
    "semantic-code": {
      "command": "npx",
      "args": ["-y", "@smallthinkingmachines/semantic-code-mcp"]
    }
  }
}

指定目录

默认情况下,服务器会为您当前的工作目录建立索引。要为特定目录建立索引,请将其添加为参数:

# OpenCode: ["npx", "@smallthinkingmachines/semantic-code-mcp", "/path/to/project"]
# VS Code:  "args": ["-y", "@smallthinkingmachines/semantic-code-mcp", "/path/to/project"]
# Claude:   "args": ["@smallthinkingmachines/semantic-code-mcp", "/path/to/project"]

首次运行

首次搜索时,服务器将:

  1. 下载型号 (~400MB)-嵌入和重新排序模型缓存在 ~/.cache/semantic-code-mcp/
  2. 索引你的代码库 -解析并嵌入所有支持的文件(进度显示在日志中)

后续搜索使用缓存的模型和索引。文件更改时,索引会自动更新。

工具:语义搜索

使用自然语言查询在语义上搜索代码。

参数

参数 类型 必填 说明
query string Yes 描述您要查找的内容的自然语言查询
path string 否 搜索范围的目录路径
limit number 否 最大结果数(默认值:10,最大值:50)
file_pattern string 否 用于过滤文件的Glob模式(例如,“*.ts“,”**/*南美国家巴拉圭的缩写(Paraguay)

示例

semantic_search({
  query: "authentication middleware that validates JWT tokens",
  path: "src/",
  limit: 5
})

建筑

MCP Server
├── Chunker (web-tree-sitter) → AST-aware code splitting (WASM, cross-platform)
├── Embedder (ONNX local)     → nomic-embed-code, 768 dims
├── Vector DB (LanceDB)       → Serverless, hybrid search
├── Context Graph (SQLite)    → Structural relationships + session memory
├── File Watcher (chokidar)   → Incremental updates
└── Hybrid Search             → BM25 + vector + reranking

上下文图(选择加入)

上下文图在语义搜索的基础上增加了结构感知。通过以下方式启用它:

SEMANTIC_CODE_GRAPH_ENABLED=true

启用后,服务器在索引期间从AST提取结构关系(调用、导入、扩展、实现),并将其存储在SQLite图中。这为另外三个工具提供了动力。

工具:context_query

语义搜索+图邻域扩展。返回富含结构上下文的搜索结果。

参数 类型 必填 说明
query string 是 自然语言查询
path string 否 要确定搜索范围的目录
limit number No 最大结果数(默认值:10)
file_pattern string 否 用于过滤文件的Glob模式
depth number No 图遍历深度(1-3,默认值:1)
edge_kinds string[] 否 要遵循的边缘类型:调用、导入、扩展、实现、导出、agent_linked
session_id string 否 用于探索跟踪的会话ID
context_query({
  query: "payment processing",
  depth: 2,
  session_id: "debug-checkout"
})

返回每个搜索结果及其图邻居(调用者、被调用者、导入和继承),而无需读取其他文件。

工具:graph_annotate

在代码节点上留下注释,并在相关块之间创建链接。

参数 类型 必填 说明
session_id string 是 会话ID
node_id string 是 要注释的块ID
note string 否 要附加的注释
link_to string[] 否 创建代理链接边的块ID
reasoning string 否 推理日志条目

工具:会话_摘要

查看探索状态:访问的节点、边界、注释、推理日志和图形统计信息。

参数 类型 必填 说明
session_id string 是 要汇总的会话ID

图形配置

变量 描述 默认值
SEMANTIC_CODE_GRAPH_ENABLED 启用上下文图 false
SEMANTIC_CODE_GRAPH_DEPTH 默认BFS遍历深度(1-5) 2
SEMANTIC_CODE_SESSION_TTL 会话TTL(秒) 3600
SEMANTIC_CODE_EDGE_KINDS 要遵循的逗号分隔边类型 所有类型

图会优雅地降级——如果SQLite初始化失败,语义搜索在没有图特征的情况下继续工作。

支持的语言

  • Types/JavaScript(包括TSX/JSX)
  • python
  • 走
  • 锈
  • Java
  • C/C++
  • C

其他语言又回到了基于行的分块。

配置

环境变量

变量 描述 默认值
SEMANTIC_CODE_ROOT 要索引的根目录 当前工作目录
SEMANTIC_CODE_INDEX 自定义索引存储位置 .semantic-code/index/
SEMANTIC_CODE_GRAPH_ENABLED 启用上下文图 false
SEMANTIC_CODE_GRAPH_DEPTH 默认图形遍历深度(1-5) 2
SEMANTIC_CODE_SESSION_TTL 会话TTL(秒) 3600
SEMANTIC_CODE_EDGE_KINDS 要遵循的边类型(逗号分隔) 所有类型

默认忽略模式

默认情况下忽略以下模式:

**/node_modules/**
**/.git/**
**/dist/**
**/build/**
**/.next/**
**/coverage/**
**/__pycache__/**
**/venv/**
**/.venv/**
**/target/**          (Rust)
**/vendor/**          (Go)
**/*.min.js
**/*.bundle.js
**/*.map
**/package-lock.json
**/yarn.lock
**/pnpm-lock.yaml
**/.semantic-code/**

安全

该服务器包括对常见攻击媒介的保护:

  • SQL注入:所有过滤器输入都根据严格的白名单进行验证
  • 路径遍历:验证搜索路径是否保留在根目录中
  • 输入验证:在数据库操作之前验证ID和模式

无效输入抛出类型错误(InvalidFilterError, PathTraversalError, InvalidIdError)这可以被适当地捕捉和处理。

存储

  • 索引位置: .semantic-code/index/ (添加到 .gitignore)
  • 图形数据库: .semantic-code/index/graph.db (SQLite,在启用图形时创建)
  • 模型缓存: ~/.cache/semantic-code-mcp/
  • 估计大小:3GB代码库→ ~1.5GB指数(含float16)

文档

发展

# Install dependencies
yarn install

# Build
yarn build

# Run in development
yarn dev

# Run tests
yarn test

# Run specific test suites
yarn test -- tests/integration/    # Integration tests
yarn test -- tests/edge-cases/     # Edge case tests
yarn test -- tests/performance/    # Performance benchmarks

项目结构

semantic-code-mcp/
├── src/
│   ├── index.ts              # MCP server entry point
│   ├── chunker/
│   │   ├── index.ts          # AST-aware chunker + edge extraction
│   │   ├── languages.ts      # Language configs with WASM paths
│   │   └── wasm-loader.ts    # WASM grammar loader with caching
│   ├── embedder/
│   │   ├── index.ts          # ONNX embedding generation
│   │   └── model.ts          # Model download & loading
│   ├── graph/
│   │   ├── index.ts          # SQLite graph store (nodes, edges, BFS)
│   │   ├── config.ts         # Graph configuration from env vars
│   │   ├── extractor.ts      # Edge resolution (raw edges → graph edges)
│   │   ├── schema.ts         # SQLite DDL for graph tables
│   │   ├── session.ts        # In-memory session manager
│   │   └── types.ts          # GraphNode, GraphEdge, RawEdge types
│   ├── store/
│   │   └── index.ts          # LanceDB integration
│   ├── search/
│   │   ├── index.ts          # Hybrid search orchestration
│   │   └── reranker.ts       # Cross-encoder reranking
│   ├── watcher/
│   │   └── index.ts          # File watcher + incremental indexing
│   ├── tools/
│   │   ├── semantic-search.ts # semantic_search tool
│   │   ├── context-query.ts   # context_query tool (search + graph)
│   │   ├── graph-annotate.ts  # graph_annotate tool
│   │   └── session-summary.ts # session_summary tool
│   └── utils/
│       ├── logger.ts          # Structured logging
│       ├── validation.ts      # Shared ID validation
│       └── ...
├── grammars/                  # Pre-built WASM parsers
├── scripts/
│   └── copy-grammars.js      # Build script for WASM files
├── package.json
├── tsconfig.json
└── README.md

附录

Nix用户

由于Nix的路径隔离, npx 可能找不到二进制文件。改为安装到固定位置:

npm install --prefix ~/.local/share/semantic-code-mcp @smallthinkingmachines/semantic-code-mcp

然后在MCP配置中使用(替换 YOUR_USERNAME):

{
  "mcpServers": {
    "semantic-code": {
      "command": "node",
      "args": ["/home/YOUR_USERNAME/.local/share/semantic-code-mcp/node_modules/@smallthinkingmachines/semantic-code-mcp/dist/index.js"]
    }
  }
}