dlang_mcp-D语言mcp服务器
用于D语言工具的MCP(模型上下文协议)服务器,具有语义包搜索功能。
状态
- 一天中主要是氛围编码
- 仅在linux上测试
- PR的欢迎
- 实际上不确定LLM是否正确使用或是否真的有用
- 如果你有更好的东西,请告诉我
功能(20个MCP工具)
代码质量与分析
- 数字扫描仪 --对bug、样式问题和复杂性进行静态分析。支持多种模式:lint(默认)、语法验证、导入列表、行数、AST生成和ctags输出。可配置的检查预设(默认、严格、最小)。
- 可维护性设计 --使用可配置的大括号样式(allman、otbs、stroustrup)、缩进和行长度格式化D源代码。粘贴代码,返回格式化代码。
- compile_check --编译检查D代码,无需链接或运行。捕获类型错误、未定义的标识符和语法错误。接受内联代码或文件路径;集
dub_project用于自动解析导入路径。支持dmd和ldc2。 - 覆盖率分析 --从以下方面分析代码覆盖率
.lst由以下人员生成的文件dmd -cov或ldc2 --cov.按最多未覆盖行排序的每个功能覆盖率统计数据报告。将其指向单个文件或目录以扫描所有文件.lst文件夹。
构建、测试和运行
- 建筑工程 --构建一个D/dub项目并获得结构化的结果:成功/失败、编译器错误(包含文件/行/消息)和警告。支持调试/发布版本、编译器选择(dmd/ldc2)和强制重建。
- run_tests --为D/dub项目运行单元测试。如果构建失败,则返回通过/失败计数、测试输出和编译器错误。支持测试名称过滤和详细输出。
- run_工程 --构建并执行一个D/dub项目,返回stdout、stderr和exit代码。将参数传递给构建的程序。
包和依赖关系管理
- 食品包装 --从dub注册表下载一个D包到本地缓存。(可选)指定版本。
- 升级依赖性 --将项目依赖项升级到允许的最新版本。支持
missing_only(无需升级即可获取)以及verify(检查一致性,不进行修改)。 - 分析工程 --分析D/dub项目的构建配置:项目名称、依赖版本、源文件、导入路径和构建设置。用途
dub describe回退到直接文件解析。
代码导航和结构
- ctags_search --在项目中按名称搜索符号定义(函数、类、结构、枚举)。支持精确、前缀和正则表达式匹配以及类型过滤。需要时自动生成标签文件。
- get_module_outline --获取D源文件中每个符号的层次轮廓:名称、种类、行号、可见性、属性(
@safe,@nogc,nothrow,pure),返回类型、参数和ddoc注释。接受文件路径或内联代码。 - list_project_modules --列出项目中的所有模块及其公共API(函数、类、结构、带签名的枚举)的摘要。
- ddoc_分析 --使用DMD的JSON输出分析整个项目的文档覆盖率和属性使用情况。按模块报告文档覆盖率百分比、功能/类型计数和模板统计。
语义搜索(需要索引数据库)
这些工具搜索索引D包的本地SQLite数据库。使用 --ingest 填充数据库,并可选择启用ONNX神经嵌入或sqlite-vec向量相似性以获得更好的结果(请参见 语义搜索设置).
- 搜索包 --按名称、描述或标签搜索索引的D包。查找给定任务的库。
- 搜索功能 --在所有索引包中按名称、签名或描述搜索函数定义。了解如何在D中做事。
- 搜索类型 --按名称或描述搜索类型定义(类、结构、接口、枚举)。按种类过滤。
- 搜索示例 --按描述或代码模式搜索可运行的D代码示例。返回包含所需导入的完整代码段。
- get_imports --查找D符号所需的导入语句。传递符号名称,返回
import线。
诊断
- get_feature_status --检查哪些可选运行时功能可用:数据库、ONNX嵌入、sqlite-vec、外部工具(dscanner、dfmt)和活动搜索模式。有助于诊断问题。
快速开始
先决条件
- DMD 2.100+或LDC
- dub包管理器
- dscanner和dfmt(用于代码分析工具)
- SQLite 3.40+支持FTS5
构建
dub build一个命令设置
chmod +x setup.sh && ./setup.sh这将构建项目,安装可选组件(sqlite-vec、ONNX),并接收示例包。使用 --skip-onnx 对于仅限TF IDF的最小设置,或 --skip-packages 跳过包裹摄入。
最小手动设置
# 1. Build
dub build
# 2. Initialize database
./bin/dlang_mcp --init-db
# 3. Ingest some packages
./bin/dlang_mcp --ingest --package=phobos
./bin/dlang_mcp --ingest --package=intel-intrinsics
# 4. Train TF-IDF embeddings
./bin/dlang_mcp --train-embeddings
# 5. Run the MCP server
./bin/dlang_mcp有关使用神经嵌入(ONNX)或向量相似性(sqlite-vec)的语义搜索,请参阅 语义搜索设置 在......下面
MCP客户端配置
克劳德桌面版
增添 ~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"dlang": {
"command": "/path/to/dlang_mcp/bin/dlang_mcp"
}
}
}开源代码
增添 ~/.config/opencode/opencode.json:
{
"mcp": {
"dlang-mcp": {
"type": "local",
"command": ["/path/to/dlang_mcp/bin/dlang_mcp"],
"enabled": true
}
}
}GitHub副本(VS代码)
增添 .vscode/mcp.json 在您的工作空间中:
{
"servers": {
"dlang-mcp": {
"type": "stdio",
"command": "/path/to/dlang_mcp/bin/dlang_mcp"
}
}
}GitHub Copilot命令行界面
增添 ~/.config/github-copilot/github-copilot-cli/mcp.json:
{
"servers": {
"dlang-mcp": {
"type": "stdio",
"command": "/path/to/dlang_mcp/bin/dlang_mcp"
}
}
}OpenAI Codex命令行界面
增添 ~/.codex/config.json:
{
"mcpServers": {
"dlang-mcp": {
"type": "stdio",
"command": "/path/to/dlang_mcp/bin/dlang_mcp"
}
}
}泽德
增添 ~/.config/zed/settings.json:
{
"context_servers": {
"dlang-mcp": {
"command": {
"path": "/path/to/dlang_mcp/bin/dlang_mcp",
"args": []
},
"settings": {}
}
}
}命令行参考
# Run as MCP server over stdio (default)
./bin/dlang_mcp
# Run as MCP server over HTTP (SSE + streamable endpoints)
./bin/dlang_mcp --http --port=3000 --host=127.0.0.1
# Initialize the search database
./bin/dlang_mcp --init-db
# Show database statistics
./bin/dlang_mcp --stats
# Show runtime feature status
./bin/dlang_mcp --feature-status
# Ingest a single package from code.dlang.org
./bin/dlang_mcp --ingest --package=silly
# Ingest all packages from code.dlang.org
./bin/dlang_mcp --ingest
# Ingest with limit and fresh start
./bin/dlang_mcp --ingest --limit=50 --fresh
# Show ingestion progress
./bin/dlang_mcp --ingest-status
# Build vector embeddings
./bin/dlang_mcp --train-embeddings
# Mine usage patterns from indexed data
./bin/dlang_mcp --mine-patterns
# Analyze a D project (standalone, no MCP)
./bin/dlang_mcp --analyze-project=/path/to/project
./bin/dlang_mcp --ddoc-analyze=/path/to/project
# Test search with a query
./bin/dlang_mcp --test-search="hash table lookup"
# Verbose logging (--verbose for info, --vverbose for trace)
./bin/dlang_mcp --verbose
# Set process execution timeout (default: 30s)
./bin/dlang_mcp --timeout=60
# Show help
./bin/dlang_mcp --help直接运行MCP工具(不需要MCP客户端)
每个MCP工具都可以直接从命令行调用。传递一个JSON参数字符串并获取完整的 ToolResult 在stdout上返回JSON。
# Format D code
./bin/dlang_mcp --dfmt='{"code":"int x=1;"}'
# Static analysis
./bin/dlang_mcp --dscanner='{"code":"void main(){}", "mode":"sloc"}'
# Compile-check inline code
./bin/dlang_mcp --compile-check='{"code":"import std.stdio; void main(){writeln(42);}"}'
# Build a project
./bin/dlang_mcp --build-project='{"project_path":"."}'
# Run project tests
./bin/dlang_mcp --run-tests='{"project_path":".", "verbose":true}'
# Get module outline
./bin/dlang_mcp --module-outline='{"code":"module test; void foo() {}"}'
# Search symbol definitions
./bin/dlang_mcp --ctags-search='{"query":"main", "project_path":"."}'
# Fetch a dub package
./bin/dlang_mcp --fetch-package='{"package_name":"silly"}'
# Analyze coverage (just pass the .lst file)
./bin/dlang_mcp --coverage-analysis=source-app.lst所有19个工具标志:
| 标志 | 工具 |
|---|---|
--dscanner=JSON | 静态分析 |
--dfmt=JSON | 代码格式 |
--compile-check=JSON | 编译检查 |
--coverage-analysis=FILE | 覆盖率分析(通过a .lst 直接文件) |
--build-project=JSON | 建设项目 |
--run-tests=JSON | 运行测试 |
--run-project=JSON | 运行项目 |
--fetch-package=JSON | 提取包裹 |
--upgrade-dependencies=JSON | 升级deps |
--tool-analyze-project=JSON | 分析项目 |
--tool-ddoc-analyze=JSON | DDoc分析 |
--module-outline=JSON | 模块大纲 |
--list-modules=JSON | 列出模块 |
--ctags-search=JSON | 符号搜索 |
--search-packages=JSON | 搜索套餐 |
--search-functions=JSON | 搜索功能 |
--search-types=JSON | 搜索类型 |
--search-examples=JSON | 搜索示例 |
--get-imports=JSON | 获取导入 |
--tool-analyze-project和--tool-ddoc-analyze前缀为tool-避免与现有冲突--analyze-project和--ddoc-analyze标志(写入文件而不是打印JSON)。
语义搜索设置(可选)
搜索工具可以开箱即用TF-IDF关键字搜索。为了获得更好的结果,您可以选择启用向量相似性搜索和/或神经嵌入。
sqlite-vec(向量相似度)
启用基于向量的语义相似性搜索,而不仅仅是关键字匹配。
从源代码构建:
cd /tmp
git clone https://github.com/asg017/sqlite-vec
cd sqlite-vec
make loadable
cp dist/vec0.so /path/to/dlang_mcp/data/models/或者使用环境变量:
export SQLITE_VEC_PATH=/path/to/vec0.so
./bin/dlang_mcp --init-db自动检测路径:
data/models/vec0.so(Linux)/vec0.dylib(macOS)/vec0.dll(Windows)/usr/local/lib/vec0.*/usr/lib/vec0.*
证实 ./bin/dlang_mcp --init-db --应显示“矢量搜索已启用(sqlite-vec)”。
ONNX嵌入(神经搜索)
对于使用全MiniLM-L6-v2模型的语义嵌入:
# Download ONNX model and vocabulary
wget -O data/models/model.onnx \
https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/resolve/main/onnx/model.onnx
wget -O data/models/vocab.txt \
https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2/raw/main/vocab.txt
# Install ONNX Runtime library
cd /tmp
wget https://github.com/microsoft/onnxruntime/releases/download/v1.18.0/onnxruntime-linux-x64-1.18.0.tgz
tar xzf onnxruntime-linux-x64-1.18.0.tgz
mkdir -p /path/to/dlang_mcp/lib
cp onnxruntime-linux-x64-1.18.0/lib/libonnxruntime.so.1.18.0 /path/to/dlang_mcp/lib/
cd /path/to/dlang_mcp/lib && ln -sf libonnxruntime.so.1.18.0 onnxruntime.so二进制文件有一个嵌入的rpath($ORIGIN/../lib)因此,当放置在以下位置时,它会自动查找ONNX运行时库 lib/ 旁边 bin/ 目录。
当ONNX模型和库可用时,服务器使用神经嵌入进行更好的语义搜索。否则,TF-IDF将用作回退。
索引包
# Index a single package
./bin/dlang_mcp --ingest --package=silly
# Index all packages (takes a while)
./bin/dlang_mcp --ingest
# Resume interrupted ingestion (automatic)
./bin/dlang_mcp --ingest
# Start fresh
./bin/dlang_mcp --ingest --fresh
# Check ingestion progress
./bin/dlang_mcp --ingest-status
# Mine usage patterns after ingesting
./bin/dlang_mcp --mine-patterns故障排除
“矢量搜索已禁用”
确保已安装sqlite-vec:
ls -la data/models/vec0.so如果缺失,请构建它:
cd /tmp
git clone https://github.com/asg017/sqlite-vec
cd sqlite-vec
make loadable
cp dist/vec0.so /path/to/dlang_mcp/data/models/“加载sqlite vec失败”
检查扩展是否与SQLite版本兼容:
sqlite3 --version该扩展需要SQLite 3.40+。
包裹摄入失败
某些软件包可能具有不寻常的结构。检查错误消息并尝试:
# Clear cache and retry
rm -rf data/cache/sources/
./bin/dlang_mcp --ingest --package=
许可证
BOOST--参见 许可证 全文。
