Narsil MCP
官方以 Rust 🦀 打造的極速 🔥 頂尖 MCP 伺服器,具備神經引擎、安全分析功能,並可選用圖形前端介面。
你可以用 Narsil MCP 做什麼?
- 跨 32 種語言搜尋符號 — 使用
find_symbols或workspace_symbol_search依名稱或模式搜尋函式、類別或介面。 - 追蹤受污染資料以進行安全稽核 — 透過
trace_taint追蹤使用者輸入在程式碼庫中的流向,並偵測 SQL 注入或 XSS 等注入漏洞。 - 分析函式呼叫關係 — 使用
get_call_graph、get_callers和find_call_path繪製呼叫者、被呼叫者及函式間的路徑。 - 生成軟體物料清單 — 匯出 CycloneDX 或 SPDX 格式的 SBOM,並透過
generate_sbom和check_dependencies比對 OSV 資料庫檢查相依性。 - 無需外部檢查器即可推斷型別 — 使用
infer_types取得 Python、JavaScript 或 TypeScript 變數的推定型別,並找出潛在的型別錯誤。 - 將程式碼庫作為知識圖譜查詢 — 對 RDF 圖執行 SPARQL 查詢,或使用
sparql_query和export_ccg匯出分層 CCG 層供 AI 使用。
文件
narsil-mcp
極速、隱私優先的 MCP 伺服器,提供深度程式碼智慧
一個以 Rust 驅動的 MCP(模型上下文協定)伺服器,透過 90 個專業工具為 AI 助理提供深度的程式碼理解。
為何選擇 narsil-mcp?
| 功能 | narsil-mcp | XRAY | Serena | GitHub MCP |
|---|---|---|---|---|
| 語言 | 32 | 4 | 30+ (LSP) | N/A |
| 神經搜尋 | 是 | 否 | 否 | 否 |
| 汙染分析 | 是 | 否 | 否 | 否 |
| SBOM/授權 | 是 | 否 | 否 | 部分 |
| 離線/本地 | 是 | 是 | 是 | 否 |
| WASM/瀏覽器 | 是 | 否 | 否 | 否 |
| 呼叫圖 | 是 | 部分 | 否 | 否 |
| 型別推斷 | 是 | 否 | 否 | 否 |
主要功能
- 程式碼智慧 - 符號提取、語意搜尋、呼叫圖分析
- 神經語意搜尋 - 使用嵌入向量尋找相似程式碼(Voyage AI、OpenAI)
- 安全分析 - 汙染分析、漏洞掃描、OWASP/CWE 涵蓋範圍
- 供應鏈安全 - SBOM 生成、依賴稽核、授權合規
- 進階分析 - 控制流圖、資料流分析、死碼偵測
為何選擇 narsil-mcp?
- 以 Rust 撰寫 - 極速、記憶體安全、單一二進位檔(約 30MB)
- Tree-sitter 驅動 - 對 32 種語言進行精確的增量解析
- 零配置 - 指向儲存庫即可開始
- 符合 MCP 規範 - 可與 Claude、Cursor、VS Code Copilot、Zed 及任何 MCP 客戶端搭配使用
- 隱私優先 - 完全本地執行,資料不會離開你的機器
- 平行索引 - 透過 Rayon 使用所有核心
- 智慧摘錄 - 擴展至完整的語法作用域
- 安全優先 - 內建漏洞偵測與汙染分析
- 神經嵌入 - 可選用 Voyage AI 或 OpenAI 進行語意搜尋
- WASM 支援 - 可透過 WebAssembly 建置在瀏覽器中執行
- 即時串流 - 大型儲存庫的索引進度會即時顯示結果
支援的語言
| 語言 | 副檔名 | 提取的符號 |
|---|---|---|
| Rust | .rs | 函式、結構體、列舉、特徵、實作、模組 |
| Python | .py, .pyi | 函式、類別 |
| JavaScript | .js, .jsx, .mjs | 函式、類別、方法、變數 |
| TypeScript | .ts, .tsx | 函式、類別、介面、型別、列舉 |
| Go | .go | 函式、方法、型別 |
| C | .c, .h | 函式、結構體、列舉、typedef |
| C++ | .cpp, .cc, .hpp | 函式、類別、結構體、命名空間 |
| Java | .java | 方法、類別、介面、列舉 |
| C# | .cs | 方法、類別、介面、結構體、列舉、委派、命名空間 |
| Bash | .sh, .bash, .zsh | 函式、變數 |
| Ruby | .rb, .rake, .gemspec | 方法、類別、模組 |
| Kotlin | .kt, .kts | 函式、類別、物件、介面 |
| PHP | .php, .phtml | 函式、方法、類別、介面、特徵 |
| Swift | .swift | 類別、結構體、列舉、協定、函式 |
| Verilog/SystemVerilog | .v, .vh, .sv, .svh | 模組、任務、函式、介面、類別 |
| Scala | .scala, .sc | 類別、物件、特徵、函式、vals |
| Lua | .lua | 函式、方法 |
| Haskell | .hs, .lhs | 函式、資料型別、型別類別 |
| Elixir | .ex, .exs | 模組、函式 |
| Clojure | .clj, .cljs, .cljc, .edn | 列表(基本 AST) |
| Dart | .dart | 函式、類別、方法 |
| Julia | .jl | 函式、模組、結構體 |
| R | .R, .r, .Rmd | 函式 |
| Perl | .pl, .pm, .t | 函式、套件 |
| Zig | .zig | 函式、變數 |
| Erlang | .erl, .hrl | 函式、模組、記錄 |
| Elm | .elm | 函式、型別 |
| Fortran | .f90, .f95, .f03, .f08, .f, .for, .fpp | 程式、子程式、函式、模組 |
| PowerShell | .ps1, .psm1, .psd1 | 函式、類別、列舉 |
| Nix | .nix | 繫結 |
| Groovy | .groovy, .gradle | 方法、類別、介面、列舉、函式 |
安裝
透過套件管理器(建議)
macOS / Linux (Homebrew):
brew tap postrv/narsil
brew install narsil-mcp
Windows (Scoop):
scoop bucket add narsil https://github.com/postrv/scoop-narsil
scoop install narsil-mcp
Rust/Cargo(所有平台):
cargo install narsil-mcp
Node.js/npm(所有平台):
npm install -g narsil-mcp
# or
yarn global add narsil-mcp
# or
pnpm add -g narsil-mcp
Nix:
# Run directly without installing
nix run github:postrv/narsil-mcp -- --repos ./my-project
# Install to profile
nix profile install github:postrv/narsil-mcp
# With web visualization frontend
nix profile install github:postrv/narsil-mcp#with-frontend
# Development shell
nix develop github:postrv/narsil-mcp
一鍵安裝腳本
macOS / Linux:
curl -fsSL https://raw.githubusercontent.com/postrv/narsil-mcp/main/install.sh | bash
Windows (PowerShell):
irm https://raw.githubusercontent.com/postrv/narsil-mcp/main/install.ps1 | iex
Windows (Git Bash / MSYS2):
curl -fsSL https://raw.githubusercontent.com/postrv/narsil-mcp/main/install.sh | bash
Windows 使用者注意: PowerShell 安裝程式提供更佳的錯誤訊息和原生的 Windows 整合。如果需要從原始碼建置,它會自動設定你的 PATH 並檢查必要的建置工具。
從原始碼建置
先決條件:
- Rust 1.70 或更新版本
- Windows 上:Visual Studio Build Tools,包含「使用 C++ 的桌面開發」
# Clone and build
git clone git@github.com:postrv/narsil-mcp.git
cd narsil-mcp
cargo build --release
# Binary will be at:
# - macOS/Linux: target/release/narsil-mcp
# - Windows: target/release/narsil-mcp.exe
功能建置
narsil-mcp 針對不同使用情境支援不同的功能集:
# Default build - native MCP server (~30MB)
cargo build --release
# With RDF knowledge graph and CCG tools (~35MB) - SPARQL queries, Code Context Graph
cargo build --release --features graph
# With neural vector search (~32MB) - adds TF-IDF similarity
cargo build --release --features neural
# With ONNX model support (~50MB) - adds local neural embeddings
cargo build --release --features neural-onnx
# With embedded visualization frontend (~31MB)
cargo build --release --features frontend
# Full-featured build with graph + frontend (~40MB)
cargo build --release --features graph,frontend
# For browser/WASM usage
cargo build --release --target wasm32-unknown-unknown --features wasm
| 功能 | 說明 | 大小 |
|---|---|---|
native(預設) | 包含所有工具的完整 MCP 伺服器 | ~30MB |
graph | + RDF 知識圖譜、SPARQL、CCG 工具 | ~35MB |
frontend | + 嵌入式視覺化網頁 UI | ~31MB |
neural | + TF-IDF 向量搜尋、API 嵌入 | ~32MB |
neural-onnx | + 本地 ONNX 模型推論 | ~50MB |
wasm | 瀏覽器建置(無檔案系統、git) | ~3MB |
重要:
--graphCLI 旗標要求二進位檔必須以--features graph建置。如果你將--graph傳遞給未包含此功能的二進位檔,你會看到一個警告,且 SPARQL/CCG 工具將無法使用。請參閱下方的疑難排解。
如需詳細的安裝說明、疑難排解和特定平台指南,請參閱 docs/INSTALL.md。
使用方式
基本用法
macOS / Linux:
# Index a single repository
narsil-mcp --repos /path/to/your/project
# Index multiple repositories
narsil-mcp --repos ~/projects/project1 --repos ~/projects/project2
# Enable verbose logging
narsil-mcp --repos /path/to/project --verbose
# Force re-index on startup
narsil-mcp --repos /path/to/project --reindex
Windows (PowerShell / CMD):
# Index a single repository
narsil-mcp --repos C:\Users\YourName\Projects\my-project
# Index multiple repositories
narsil-mcp --repos C:\Projects\project1 --repos C:\Projects\project2
# Enable verbose logging
narsil-mcp --repos C:\Projects\my-project --verbose
# Force re-index on startup
narsil-mcp --repos C:\Projects\my-project --reindex
完整功能集
narsil-mcp \
--repos ~/projects/my-app \
--git \ # Enable git blame, history, contributors
--call-graph \ # Enable function call analysis
--persist \ # Save index to disk for fast startup
--watch \ # Auto-reindex on file changes
--lsp \ # Enable LSP for hover, go-to-definition
--streaming \ # Stream large result sets
--remote \ # Enable GitHub remote repo support
--neural \ # Enable neural semantic embeddings
--neural-backend api \ # Backend: "api" (Voyage/OpenAI) or "onnx"
--neural-model voyage-code-2 \ # Model to use
--neural-dimension 3072 \ # Override embedding dimensions (auto-detected per model)
--graph # Enable SPARQL/RDF knowledge graph and CCG tools (requires --features graph build)
關於
--graph的注意事項: 此旗標會啟用 SPARQL 查詢和程式碼上下文圖(CCG)工具,但僅限於二進位檔是以--features graph建置時。預設的二進位檔不包含此功能。如果你需要 SPARQL/CCG 功能,請從原始碼建置:cargo build --release --features graph如果你將
--graph傳遞給未包含此功能的二進位檔,啟動時會看到一個警告,且伺服器將在不包含 SPARQL/CCG 工具的情況下繼續執行。
注意: 神經嵌入需要 API 金鑰(或自訂端點)。最簡單的設定方式是使用互動式精靈:
# Run the neural API key setup wizard
narsil-mcp config init --neural
此精靈將會:
- 偵測你的編輯器(Claude Desktop、Claude Code、Zed、VS Code、JetBrains)
- 提示你選擇 API 提供者(Voyage AI、OpenAI 或自訂)
- 驗證你的 API 金鑰
- 自動將其新增至你編輯器的 MCP 設定中
或者,你可以手動設定下列其中一個環境變數:
EMBEDDING_API_KEY- 適用於任何提供者的通用 API 金鑰VOYAGE_API_KEY- Voyage AI 專用 API 金鑰OPENAI_API_KEY- OpenAI 專用 API 金鑰EMBEDDING_SERVER_ENDPOINT- 自訂嵌入 API 端點 URL(選用,允許使用自行託管的模型)
設定
v1.1.0+ 引入了選用設定,可對工具和效能進行精細控制。所有現有的使用方式都繼續有效 - 設定完全是選用的!
快速入門
# Generate default config interactively
narsil-mcp config init
# List available tools
narsil-mcp tools list
# Apply a preset via CLI
narsil-mcp --repos ~/project --preset minimal
自動編輯器偵測
narsil-mcp 會偵測你的編輯器並自動套用最佳預設集:
| 編輯器 | 預設集 | 工具數 | 上下文 Token 數 | 原因 |
|---|---|---|---|---|
| Zed | 最小 | 26 | ~4,686 | 快速啟動,最小上下文 |
| VS Code | 平衡 | 51 | ~8,948 | 良好的功能平衡 |
| Claude Desktop | 完整 | 90 | ~12,001 | 最大功能 |
節省的 Token 數:
- 最小預設集: 相較於完整版節省 61% 的 token
- 平衡預設集: 相較於完整版節省 25% 的 token
預設集
根據你的使用情境選擇一個預設集:
# Minimal - Fast, lightweight (Zed, Cursor)
narsil-mcp --repos ~/project --preset minimal
# Balanced - Good defaults (VS Code, IntelliJ)
narsil-mcp --repos ~/project --preset balanced --git --call-graph
# Full - All features (Claude Desktop, comprehensive analysis)
narsil-mcp --repos ~/project --preset full --git --call-graph
# Security-focused - Security and supply chain tools
narsil-mcp --repos ~/project --preset security-focused
設定檔
使用者設定 (~/.config/narsil-mcp/config.yaml):
version: "1.0"
preset: "balanced"
tools:
# Disable slow tools
overrides:
neural_search:
enabled: false
reason: "Too slow for interactive use"
performance:
max_tool_count: 50 # Limit total tools
專案設定(儲存庫根目錄中的 .narsil.yaml):
version: "1.0"
preset: "security-focused" # Override user preset
tools:
categories:
Security:
enabled: true
SupplyChain:
enabled: true
具名儲存庫設定檔適用於多儲存庫工作區:
version: "1.0"
profiles:
platform:
repos:
- ~/src/api
- ~/src/web
git: true
call_graph: true
persist: true
preset: balanced
narsil-mcp --profile platform
narsil-mcp config profiles
優先順序: CLI 旗標 > 環境變數 > 專案設定 > 使用者設定 > 預設值
環境變數
# Select repos/profile
export NARSIL_REPOS=~/src/api,~/src/web
export NARSIL_PROFILE=platform
# Apply preset
export NARSIL_PRESET=minimal
# Enable specific categories
export NARSIL_ENABLED_CATEGORIES=Repository,Symbols,Search
# Disable specific tools
export NARSIL_DISABLED_TOOLS=neural_search,generate_sbom
CLI 指令
# View effective config
narsil-mcp config show
# Validate config file
narsil-mcp config validate ~/.config/narsil-mcp/config.yaml
# List tools by category
narsil-mcp tools list --category Search
# Search for tools
narsil-mcp tools search "git"
# Export config
narsil-mcp config export > my-config.yaml
# List named repository profiles
narsil-mcp config profiles
了解更多:
視覺化前端
在瀏覽器中以互動方式探索呼叫圖、匯入、符號參考和控制流。
# Build with embedded frontend
cargo build --release --features frontend
# Run with HTTP server
narsil-mcp --repos ~/project --http --call-graph
# Open http://localhost:3000
五種圖形檢視:
| 檢視 | 說明 |
|---|---|
| 呼叫圖 | 具有深度控制和方向篩選的函式呼叫關係 |
| 匯入圖 | 跨程式碼庫的檔案層級匯入依賴關係 |
| 符號圖 | 符號的所有參考,包含檔案叢集 |
| 混合圖 | 結合呼叫圖和匯入圖,並分配預算 |
| 控制流 | 包含基本區塊、分支和迴圈回邊的真實 CFG |
功能:
- 互動式 Cytoscape.js 圖形,支援拖曳、縮放和雙擊深入探索
- 複雜度指標疊加層,以顏色編碼(綠色/黃色/橙色/紅色)
- 安全性漏洞疊加層,突顯汙染來源和匯點
- 六種佈局演算法(dagre、力導向、廣度優先、同心圓、圓形、網格)
- 檔案樹側邊欄,附帶語法突顯的程式碼檢視器
- URL 驅動的狀態(可分享的連結、瀏覽器上一頁/下一頁)
- 深色模式支援
- 節點詳細資訊面板,包含程式碼摘錄和導覽至原始碼
完整文件: 請參閱 docs/frontend.md 了解設定、API 端點和開發模式。
神經語意搜尋
使用神經嵌入尋找相似的程式碼 - 即使變數名稱和結構不同也能找到。
# Quick setup with wizard
narsil-mcp config init --neural
# Or manually with Voyage AI
export VOYAGE_API_KEY="your-key"
narsil-mcp --repos ~/project --neural --neural-model voyage-code-2
支援 Voyage AI、OpenAI、自訂端點和本地 ONNX 模型。
完整文件: 請參閱 docs/neural-search.md 了解設定、後端和使用案例。
型別推斷
內建 Python、JavaScript 和 TypeScript 的型別推斷 - 無需 mypy 或 tsc。
| 工具 | 說明 |
|---|---|
infer_types | 取得函式中所有變數的推斷型別 |
check_type_errors | 尋找潛在的型別不符 |
get_typed_taint_flow | 使用型別資訊增強安全分析 |
def process(data):
result = data.split(",") # result: list[str]
count = len(result) # count: int
return count * 2 # returns: int
Forgemax 整合(實驗性)
對於大規模的代理工作流程,narsil-mcp 可以透過 Forgemax 使用 — 這是一個 Code Mode MCP 閘道,可將所有 90 個工具合併為僅 2 個(search + execute),將工具綱要的開銷從約 12,000 個 token 減少到約 1,000 個。
# Install Forgemax
cargo install forgemax
# Run narsil-mcp through Forgemax (uses forge.toml in repo root)
forgemax
內含的 forge.toml 使用合理的預設值來設定 narsil-mcp:
[servers.narsil]
command = "narsil-mcp"
args = ["--repos", ".", "--git", "--call-graph", "--persist", "--watch"]
transport = "stdio"
[sandbox]
timeout_secs = 10
max_heap_mb = 64
max_concurrent = 8
LLM 會在沙箱化的 V8 isolate 中,透過型別化代理物件寫入 JavaScript 來進行呼叫——憑證、檔案路徑和內部狀態永遠不會離開主機。這種方法在同時使用多個 MCP 伺服器時特別有用,因為它能讓整體工具環境保持精簡且可預測。
MCP 設定
透過建立設定檔,將 narsil-mcp 加入你的 AI 助理。以下是建議的設定方式:
Claude Code(專案根目錄中的 .mcp.json - 建議):
在你的專案目錄中建立 .mcp.json 以進行專案層級設定:
{
"mcpServers": {
"narsil-mcp": {
"command": "narsil-mcp",
"args": ["--repos", ".", "--git", "--call-graph"]
}
}
}
然後在你的專案中啟動 Claude Code:
cd /path/to/project
claude
使用 . 作為 --repos 會自動索引當前目錄。Claude 現在可以存取 90 個程式碼智慧工具。
提示:加入
--persist --index-path .claude/cache可在後續執行時加快啟動速度。
如需全域設定,請改為編輯 ~/.claude/settings.json。進階設定請參閱 Claude Code 整合。
Cursor (.cursor/mcp.json):
{
"mcpServers": {
"narsil-mcp": {
"command": "narsil-mcp",
"args": ["--repos", ".", "--git", "--call-graph"]
}
}
}
VS Code + GitHub Copilot (.vscode/mcp.json):
{
"servers": {
"narsil-mcp": {
"command": "narsil-mcp",
"args": ["--repos", ".", "--git", "--call-graph"]
}
}
}
Copilot Enterprise 注意事項:MCP 支援需要 VS Code 1.102 以上版本,且必須由你的組織管理員啟用。
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"narsil-mcp": {
"command": "narsil-mcp",
"args": ["--repos", "/path/to/your/projects", "--git"]
}
}
}
Zed (settings.json → 內容伺服器):
{
"context_servers": {
"narsil-mcp": {
"command": "narsil-mcp",
"args": ["--repos", ".", "--git"]
}
}
}
Zed 注意事項:narsil-mcp 會立即啟動並在背景索引,避免初始化逾時。
Claude Code 外掛程式
針對 Claude Code 使用者,我們提供了一個包含斜線指令和技能的外掛程式,以便有效使用工具。
透過 Marketplace 安裝(建議):
# Add the narsil-mcp marketplace
/plugin marketplace add postrv/narsil-mcp
# Install the plugin
/plugin install narsil@narsil-mcp
或直接從 GitHub 安裝:
/plugin install github:postrv/narsil-mcp/narsil-plugin
內含項目:
| 元件 | 說明 |
|---|---|
/narsil:security-scan | 執行全面的安全稽核 |
/narsil:explore | 探索不熟悉的程式碼庫 |
/narsil:analyze-function | 深入探討特定函式 |
/narsil:find-feature | 尋找功能實作位置 |
/narsil:supply-chain | 分析供應鏈安全 |
| 技能 | 引導 Claude 有效使用 90 個工具 |
| MCP 設定 | 以合理的預設值自動啟動 narsil-mcp |
完整文件請參閱 narsil-plugin/README.md。
Ralph 自動化整合
Ralph 是一個用於自主程式碼開發的 Claude Code 自動化套件。當 narsil-mcp 可用時,Ralph 可獲得增強的程式碼智慧功能:
| 功能 | 無 narsil-mcp | 有 narsil-mcp |
|---|---|---|
| 安全掃描 | 基本(clippy) | OWASP/CWE 漏洞偵測 |
| 程式碼理解 | 基於檔案 | 呼叫圖、符號參考 |
| 架構分析 | 手動 | CCG L0/L1/L2 自動分層 |
| 相依性分析 | cargo tree | 匯入圖、循環相依性偵測 |
設定:
# Install narsil-mcp (Ralph auto-detects it)
cargo install narsil-mcp
# Ralph's quality gates use these tools:
narsil-mcp scan_security --repo <name>
narsil-mcp check_type_errors --repo <name> --path src
narsil-mcp find_injection_vulnerabilities --repo <name>
當 narsil-mcp 無法使用時,Ralph 會優雅降級——所有核心自動化功能無需它也能運作。
文件: 完整整合細節請參閱 Ralph README。
操作手冊與教學
請參閱 docs/playbooks 以取得實用指南:
| 指南 | 說明 |
|---|---|
| 入門指南 | 快速設定與首次工具呼叫 |
| 理解程式碼庫 | 探索不熟悉的專案 |
| 修復錯誤 | 使用呼叫圖與汙染分析進行除錯 |
| 安全稽核 | 使用 OWASP/CWE 掃描尋找漏洞 |
| 程式碼審查 | 有效審查變更 |
每份操作手冊都展示了 Claude 用來回答你問題的確切工具鏈。
WebAssembly(瀏覽器)使用方式
narsil-mcp 可以完全透過 WebAssembly 在瀏覽器中執行——非常適合基於瀏覽器的 IDE、程式碼審查工具或教育平台。
npm install @narsil-mcp/wasm
import { CodeIntelClient } from '@narsil-mcp/wasm';
const client = new CodeIntelClient();
await client.init();
client.indexFile('src/main.rs', rustSourceCode);
const symbols = client.findSymbols('Handler');
完整文件: 建置說明、React 範例和 API 參考請參閱 docs/wasm.md。
可用工具(90 個)
儲存庫與檔案管理
| 工具 | 說明 |
|---|---|
list_repos | 列出所有已索引的儲存庫及其元資料 |
get_project_structure | 取得包含檔案圖示和大小的目錄樹 |
get_file | 取得檔案內容,可選擇行範圍 |
get_excerpt | 擷取特定行周圍的程式碼及上下文 |
reindex | 觸發儲存庫的重新索引 |
discover_repos | 自動探索目錄中的儲存庫 |
validate_repo | 檢查路徑是否為有效的儲存庫 |
get_index_status | 顯示索引統計資料和已啟用的功能 |
符號搜尋與導覽
| 工具 | 說明 |
|---|---|
find_symbols | 按類型/模式尋找結構、類別、函式 |
get_symbol_definition | 取得符號原始碼及周圍上下文 |
find_references | 尋找符號的所有參考 |
get_dependencies | 分析匯入項與相依項 |
workspace_symbol_search | 跨工作區模糊搜尋符號 |
find_symbol_usages | 跨檔案符號使用情況及匯入 |
get_export_map | 從檔案/模組取得匯出的符號 |
程式碼搜尋
| 工具 | 說明 |
|---|---|
search_code | 具備相關性排名的關鍵字搜尋 |
semantic_search | BM25 排名的語意搜尋 |
hybrid_search | 結合 BM25 + TF-IDF 與排名融合 |
search_chunks | 搜尋 AST 感知的程式碼區塊 |
find_similar_code | 尋找與程式碼片段相似的程式碼(TF-IDF) |
find_similar_to_symbol | 尋找與符號相似的程式碼 |
AST 感知區塊化
| 工具 | 說明 |
|---|---|
get_chunks | 取得檔案的 AST 感知區塊 |
get_chunk_stats | 程式碼區塊的統計資料 |
get_embedding_stats | 嵌入索引統計資料 |
神經語意搜尋(需要 --neural)
| 工具 | 說明 |
|---|---|
neural_search | 使用神經嵌入進行語意搜尋(即使名稱不同也能找到相似程式碼) |
find_semantic_clones | 尋找函式的 Type-3/4 語意複製 |
get_neural_stats | 神經嵌入索引統計資料 |
呼叫圖分析(需要 --call-graph)
| 工具 | 說明 |
|---|---|
get_call_graph | 取得儲存庫/函式的呼叫圖 |
get_callers | 尋找呼叫某函式的函式 |
get_callees | 尋找被某函式呼叫的函式 |
find_call_path | 尋找兩個函式之間的路徑 |
get_complexity | 取得循環/認知複雜度 |
get_function_hotspots | 尋找高度連接的函式 |
控制流分析
| 工具 | 說明 |
|---|---|
get_control_flow | 取得顯示基本區塊和分支的 CFG |
find_dead_code | 尋找無法到達的程式碼區塊 |
資料流分析
| 工具 | 說明 |
|---|---|
get_data_flow | 變數定義與使用 |
get_reaching_definitions | 哪些賦值會到達每個點 |
find_uninitialized | 初始化前使用的變數 |
find_dead_stores | 從未被讀取的賦值 |
型別推斷(Python/JavaScript/TypeScript)
| 工具 | 說明 |
|---|---|
infer_types | 在無外部型別檢查器的情況下,推斷函式中變數的型別 |
check_type_errors | 在不執行 mypy/tsc 的情況下,尋找潛在的型別錯誤 |
get_typed_taint_flow | 結合資料流與型別推斷的增強型汙染分析 |
匯入/相依性圖
| 工具 | 說明 |
|---|---|
get_import_graph | 建置並分析匯入圖 |
find_circular_imports | 偵測循環相依性 |
get_incremental_status | Merkle 樹與變更統計資料 |
安全分析 - 汙染追蹤
| 工具 | 說明 |
|---|---|
find_injection_vulnerabilities | 尋找 SQL 注入、XSS、命令注入、路徑遍歷 |
trace_taint | 從來源追蹤受汙染的資料流 |
get_taint_sources | 列出汙染來源(使用者輸入、檔案、網路) |
get_security_summary | 全面的安全風險評估 |
安全分析 - 規則引擎
| 工具 | 說明 |
|---|---|
scan_security | 使用安全規則掃描(OWASP、CWE、加密、機密) |
check_owasp_top10 | 掃描 OWASP Top 10 2021 漏洞 |
check_cwe_top25 | 掃描 CWE Top 25 弱點 |
explain_vulnerability | 取得詳細的漏洞說明 |
suggest_fix | 取得發現項目的修復建議 |
供應鏈安全
| 工具 | 說明 |
|---|---|
generate_sbom | 產生 SBOM(CycloneDX/SPDX/JSON) |
check_dependencies | 檢查已知漏洞(OSV 資料庫) |
check_licenses | 分析授權條款的合規性問題 |
find_upgrade_path | 為有漏洞的相依套件尋找安全的升級路徑 |
Git 整合(需要 --git)
| 工具 | 說明 |
|---|---|
get_blame | 檔案的 Git blame |
get_file_history | 檔案的提交歷史 |
get_recent_changes | 儲存庫中的近期提交 |
get_hotspots | 高變更率和高複雜度的檔案 |
get_contributors | 儲存庫/檔案的貢獻者 |
get_commit_diff | 特定提交的差異 |
get_symbol_history | 變更了某個符號的提交 |
get_branch_info | 目前分支與狀態 |
get_modified_files | 工作目錄的變更 |
LSP 整合(需要 --lsp)
| 工具 | 說明 |
|---|---|
get_hover_info | 型別資訊與文件 |
get_type_info | 精確的型別資訊 |
go_to_definition | 尋找定義位置 |
遠端儲存庫支援(需要 --remote)
| 工具 | 說明 |
|---|---|
add_remote_repo | 複製並索引 GitHub 儲存庫 |
list_remote_files | 透過 GitHub API 列出檔案 |
get_remote_file | 透過 GitHub API 擷取檔案 |
指標
| 工具 | 說明 |
|---|---|
get_metrics | 效能統計資料與計時 |
SPARQL / 知識圖譜(需要 --graph)
| 工具 | 說明 |
|---|---|
sparql_query | 對 RDF 知識圖譜執行 SPARQL 查詢 |
list_sparql_templates | 列出可用的 SPARQL 查詢範本 |
run_sparql_template | 使用參數執行預定義的 SPARQL 範本 |
程式碼上下文圖(CCG)(需要 --graph)
CCG 以分層方式提供標準化、可供 AI 使用的程式碼庫表示。
| 工具 | 說明 |
|---|---|
get_ccg_manifest | 第 0 層清單(~1-2KB JSON-LD)- 儲存庫識別、計數 |
export_ccg_manifest | 將第 0 層清單匯出至檔案 |
export_ccg_architecture | 第 1 層架構(~10-50KB JSON-LD)- 模組、API |
export_ccg_index | 第 2 層符號索引(~100-500KB N-Quads gzipped) |
export_ccg_full | 第 3 層完整細節(~1-20MB N-Quads gzipped) |
export_ccg | 將所有 CCG 層匯出為一個套件 |
query_ccg | 使用 SPARQL 查詢 CCG |
get_ccg_acl | 為 CCG 層產生 WebACL 存取控制 |
get_ccg_access_info | 取得 CCG 存取層級資訊 |
import_ccg | 從 URL 或檔案匯入 CCG 層 |
import_ccg_from_registry | 從 codecontextgraph.com 登錄匯入 CCG |
安全規則
narsil-mcp 在 rules/ 中包含內建的安全規則:
核心規則集:
owasp-top10.yaml- OWASP Top 10 2021 漏洞模式cwe-top25.yaml- CWE Top 25 最危險弱點crypto.yaml- 加密問題(弱演算法、硬編碼金鑰)secrets.yaml- 機密偵測(API 金鑰、密碼、權杖) 語言特定規則:rust.yaml- Rust 安全模式(不安全轉型、FFI 邊界、命令注入、TOCTOU)elixir.yaml- Elixir/BEAM 模式(原子耗盡、binary_to_term、Code.eval、Ecto SQL 注入)go.yaml- Go 安全模式(SQL 注入、TLS、命令注入)java.yaml- Java 漏洞(XXE、反序列化、LDAP 注入)csharp.yaml- C# 安全問題(反序列化、XSS、路徑遍歷)kotlin.yaml- Kotlin/Android 模式(WebView、意圖、機密)bash.yaml- Shell 腳本漏洞(命令注入、eval)
基礎設施與組態:
iac.yaml- 基礎設施即程式碼(Terraform、CloudFormation、Kubernetes)config.yaml- 組態檔安全(硬編碼憑證、不安全設定)
可使用 scan_security --ruleset /path/to/rules.yaml 載入自訂規則。
架構
+-----------------------------------------------------------------+
| MCP Server |
| +-----------------------------------------------------------+ |
| | JSON-RPC over stdio | |
| +-----------------------------------------------------------+ |
| | |
| +---------------------------v-------------------------------+ |
| | Code Intel Engine | |
| | +------------+ +------------+ +------------------------+ | |
| | | Symbol | | File | | Search Engine | | |
| | | Index | | Cache | | (Tantivy + TF-IDF) | | |
| | | (DashMap) | | (DashMap) | +------------------------+ | |
| | +------------+ +------------+ | |
| | +------------+ +------------+ +------------------------+ | |
| | | Call Graph | | Taint | | Security Rules | | |
| | | Analysis | | Tracker | | Engine | | |
| | +------------+ +------------+ +------------------------+ | |
| +-----------------------------------------------------------+ |
| | |
| +---------------------------v-------------------------------+ |
| | Tree-sitter Parser | |
| | +------+ +------+ +------+ +------+ +------+ | |
| | | Rust | |Python| | JS | | TS | | Go | ... | |
| | +------+ +------+ +------+ +------+ +------+ | |
| +-----------------------------------------------------------+ |
| | |
| +---------------------------v-------------------------------+ |
| | Repository Walker | |
| | (ignore crate - respects .gitignore) | |
| +-----------------------------------------------------------+ |
+-----------------------------------------------------------------+
效能
在 Apple M1 上使用 criterion.rs 進行基準測試:
解析吞吐量
| 語言 | 輸入大小 | 時間 | 吞吐量 |
|---|---|---|---|
| Rust(大型檔案) | 278 KB | 131 µs | 1.98 GiB/s |
| Rust(中型檔案) | 27 KB | 13.5 µs | 1.89 GiB/s |
| Python | ~4 KB | 16.7 µs | - |
| TypeScript | ~5 KB | 13.9 µs | - |
| 混合(5 個檔案) | ~15 KB | 57 µs | - |
搜尋延遲
| 操作 | 語料庫大小 | 時間 |
|---|---|---|
| 符號精確匹配 | 1,000 個符號 | 483 ns |
| 符號前綴匹配 | 1,000 個符號 | 2.7 µs |
| 符號模糊匹配 | 1,000 個符號 | 16.5 µs |
| BM25 全文 | 1,000 份文件 | 80 µs |
| TF-IDF 相似度 | 1,000 份文件 | 130 µs |
| 混合(BM25+TF-IDF) | 1,000 份文件 | 151 µs |
端到端索引
| 儲存庫 | 檔案數 | 符號數 | 時間 | 記憶體 |
|---|---|---|---|---|
| narsil-mcp(此儲存庫) | 53 | 1,733 | 220 ms | ~50 MB |
| rust-analyzer | 2,847 | ~50K | 2.1s | 89 MB |
| linux kernel | 78,000+ | ~500K | 45s | 2.1 GB |
關鍵指標:
- Tree-sitter 解析:~2 GiB/s 持續吞吐量
- 符號查找:精確匹配 <1µs
- 全文搜尋:大多數查詢 <1ms
- 混合搜尋透過 rayon 並行執行 BM25 + TF-IDF
開發
# Run the full test suite
cargo test
# Run benchmarks (criterion.rs)
cargo bench
# Run with debug logging
RUST_LOG=debug cargo run -- --repos ./test-fixtures
# Format code
cargo fmt
# Lint
cargo clippy
# Test with MCP Inspector
npx @modelcontextprotocol/inspector ./target/release/narsil-mcp --repos ./path/to/repo
疑難排解
Tree-sitter 建置錯誤
如果您在建置期間看到有關缺少 C 編譯器或 tree-sitter 的錯誤:
# macOS
xcode-select --install
# Ubuntu/Debian
sudo apt install build-essential
# For WASM builds
brew install emscripten # macOS
神經搜尋 API 錯誤
# Check your API key is set
echo $VOYAGE_API_KEY # or $OPENAI_API_KEY
# Common issue: wrong key format
export VOYAGE_API_KEY="pa-..." # Voyage keys start with "pa-"
export OPENAI_API_KEY="sk-..." # OpenAI keys start with "sk-"
索引找不到檔案
# Check .gitignore isn't excluding files
narsil-mcp --repos /path --verbose # Shows skipped files
# Force reindex
narsil-mcp --repos /path --reindex
大型儲存庫的記憶體問題
# For very large repos (>50K files), increase stack size
RUST_MIN_STACK=8388608 narsil-mcp --repos /path/to/huge-repo
# Or index specific subdirectories
narsil-mcp --repos /path/to/repo/src --repos /path/to/repo/lib
圖形功能無法運作
如果您傳遞 --graph 並看到類似以下的警告:
WARN: --graph flag was passed but the binary was built without the 'graph' feature.
SPARQL and CCG tools will not be available.
這表示您使用的二進位檔未使用 graph 功能編譯。若要修復:
# Build from source with the graph feature
cargo build --release --features graph
# Or with multiple features
cargo build --release --features graph,frontend
# Then run with --graph
./target/release/narsil-mcp --repos ~/project --graph
為什麼這是一個獨立的功能? graph 功能新增了 Oxigraph RDF 資料庫(約增加 5MB 的二進位檔大小),這對大多數使用案例來說並非必要。將其保留為可選項,以保持預設二進位檔較小。
如何檢查圖形是否已啟用: 查看啟動日誌:
graph=true表示該功能已編譯並啟用graph=false表示該功能未編譯,或未傳遞--graph
路線圖
已完成
- 多語言符號提取(32 種語言)
- 使用 Tantivy 進行全文搜尋(BM25 排名)
- 混合搜尋(BM25 + TF-IDF 搭配 RRF)
- AST 感知程式碼分塊
- Git blame/歷史記錄整合
- 呼叫圖分析與複雜度指標
- 控制流圖(CFG)分析
- 資料流分析(DFG)與到達定義
- 死碼和死儲存偵測
- 注入漏洞的汙染分析
- 安全規則引擎(OWASP、CWE、加密、機密)
- SBOM 生成(CycloneDX、SPDX)
- 依賴漏洞檢查(OSV)
- 授權合規分析
- 匯入圖與循環依賴偵測
- 跨語言符號解析
- 使用 Merkle 樹進行增量索引
- 索引持久化
- 檔案變更監控模式
- LSP 整合
- 遠端儲存庫支援
- 串流回應
最新消息
v1.6.x(目前版本)
- 防崩潰分塊 - 修復了
chunk_file()和extract_signature()中不安全的位元組層級字串切片,這些切片導致hybrid_search、search_chunks和get_chunk_stats在處理包含多位元組 UTF-8 字元(表情符號、CJK、重音字元)的檔案時崩潰。所有位元組切片現在都使用安全的content.get()並具備回退機制。 - NaN 安全排序操作 - 修復了搜尋、嵌入、git、索引和提取模組中 5 處
partial_cmp().unwrap()在 NaN 浮點值上會發生恐慌的位置。所有排序現在都使用unwrap_or(Ordering::Equal)。 - 縱深防禦分塊 - 在所有儲存庫範圍的
chunk_file()迴圈周圍新增了catch_unwind包裝器,以便某個檔案中的恐慌會跳過它,而不是使整個 MCP 伺服器崩潰。 - 視覺化前端大修 - 完整的 SPA,具備 HashRouter 路由、檔案樹側邊欄、語法高亮程式碼檢視器、儀表板和每個儲存庫的概覽頁面
- 圖形檢視效能 - 匯入圖現在使用快取的索引資料,而非檔案系統走訪;符號圖直接迭代檔案快取,而非 markdown 往返;所有檢視都遵守
max_nodes以實現提前終止 - 真實控制流圖 - 流程檢視現在使用真實的 CFG 建構器(
cfg::analyze_function),具備適當的基本區塊、分支條件和迴圈回邊,而非單一區塊的存根 - 混合圖預算分割 - 混合檢視在呼叫圖和匯入圖之間分配 60/40 的節點預算,以獲得平衡的結果
- 修復 #14:可設定的嵌入維度 - 新增了
--neural-dimensionCLI 參數和default_dimension_for_model()查找,以便像text-embedding-3-large這樣的模型使用正確的維度(3072),而非硬編碼的 1536 - 修復 #13:Nix 前端建置 - 在
flake.nix中使用buildNpmPackage新增了frontendDist衍生,以便nix profile install github:postrv/narsil-mcp#with-frontend可以運作 - Rust 安全規則 - 18 條新規則(RUST-004 至 RUST-021),涵蓋命令注入、轉型、FFI 邊界、TOCTOU、ReDoS、static mut、SSRF 等
- Elixir 安全規則 - 18 條新規則(EX-001 至 EX-018),涵蓋原子耗盡、binary_to_term 反序列化、Code.eval 注入、Ecto SQL 注入、Phoenix XSS、Erlang 分散式安全
- 從
serde_yaml遷移到serde-saphyr- 已棄用的serde_yaml被積極維護、無恐慌的 YAML 函式庫取代 - 自訂 favicon - 前端現在使用 narsil-mcp 品牌圖示,而非預設的 Vite 標誌
- 依賴安全性 - 將
time更新至 0.3.47(RUSTSEC-2026-0009),bytes更新至 1.11.1(RUSTSEC-2026-0007) - 測試數量 從 1,611 增加到 1,763(+152 個測試)
v1.5.x
- 確定性呼叫圖解析 - 作用域提示傳播消除了被呼叫者解析的歧義(例如,
App::run()正確解析為src/app/mod.rs::run) - 8 項圖形分析修復 - 合格的節點鍵、熱點過濾、CFG 表達式處理、匯入路徑解析
- Nix flake 改進 - DRY
mkPkg輔助工具,移除了不必要的 macOS 框架,用於沙箱建置的--lib測試策略
v1.4.x
- SPARQL / RDF 知識圖譜 - 透過 Oxigraph 使用 SPARQL 查詢程式碼智慧資料
- 程式碼上下文圖(CCG) - 12 個工具,用於標準化、可供 AI 使用的程式碼庫表示,具備分層層級(L0-L3)
- 型別感知安全分析 - 增強的汙染追蹤,具備型別推斷和特徵實作
- 多語言 CFG/DFG - 控制流和資料流分析擴展到 Go、Java、C#、Kotlin
- 基礎設施即程式碼掃描 - 針對 Terraform、CloudFormation、Kubernetes 的新
iac.yaml規則 - 語言特定安全規則 - 針對 Go、Java、C#、Kotlin、Bash 的新規則
- 6 種新語言 - Erlang、Elm、Fortran、PowerShell、Nix、Groovy
- 總共 90 個工具 - 從 79 個增加到 90 個,新增了 SPARQL、CCG 和分析功能
v1.2.x
exclude_tests參數 - 22 個工具支援過濾掉測試檔案- npm 套件 - 透過
npm install -g narsil-mcp安裝
v1.1.x
- 多平台發行 - 透過 Homebrew、Scoop、npm、Cargo 或直接下載安裝
- 可設定的工具預設集 - 最小、平衡、完整和安全聚焦的預設集
- 自動編輯器偵測 - 針對 Zed、VS Code、Claude Desktop 的最佳預設值
- 互動式設定精靈 -
narsil-mcp config init用於輕鬆設定 - 支援 32 種語言 - 新增 Dart、Julia、R、Perl、Zig 等
- 效能提升 - 透過背景索引加快啟動速度
v1.0.x
- 神經語意搜尋 - 使用 Voyage AI 或 OpenAI 嵌入尋找相似程式碼
- 型別推斷 - 無需外部工具即可在 Python/JavaScript/TypeScript 中推斷型別
- 多語言汙染分析 - 針對 PHP、Java、C#、Ruby、Kotlin 的安全掃描
- WASM 建置 - 在瀏覽器中執行,用於程式碼遊樂場和教育工具
- 147 條捆綁的安全規則 - OWASP、CWE、加密、機密、Rust、Elixir 偵測
- 包含 IDE 設定 - Claude Desktop、Cursor、VS Code、Zed 範本
授權
依據以下任一授權條款授權:
- Apache License, Version 2.0(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT license(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您選擇。
致謝
使用以下技術建置:
- tree-sitter - 增量解析
- tantivy - 全文搜尋
- tokio - 非同步執行階段
- rayon - 資料平行處理
- serde - 序列化