代码文档搜索分析工具

Preflight MCP是一个将代码库、文档和论文转换为可搜索捆绑包的服务,支持多源数据摄入、混合搜索、静态分析、代码智能和质量检查,适用于开发者和研究人员。

  • by jonnyhoo
  • TypeScript
  • 本地部署
  • 更新于
在 GitHub 查看 jonnyhoo/preflight-mcp

使用说明

飞行前MCP

一个MCP服务器,它将代码库、文档和论文转换为LLM代理的可搜索包。

特性

  • 多源摄入:GitHub仓库、本地目录、PDF、Office文档、web文档网站
  • 混合搜索:SQLite FTS5全文搜索+可选语义向量搜索
  • 静态分析:设计模式、架构检测、测试示例、配置分析
  • 代码智能:Python/Go/Rust/TypeScript的LSP集成(定义、引用、悬停)
  • 代码质量:对重复项、死代码、循环deps、复杂性、安全性进行统一检查
  • RAG支持:ChromaDB集成用于交叉验证的知识检索
  • ArXiv集成:搜索和下载具有翻译支持的学术论文
  • 存储器系统:具有垃圾收集功能的3层长期记忆(情景、语义、过程)
  • 知识蒸馏:提取和总结项目知识卡
  • PDF智能:MinerU/VLM集成,用于高质量的PDF解析和公式/表提取

快速开始

添加到MCP客户端配置中:

{
  "mcpServers": {
    "preflight": {
      "command": "npx",
      "args": ["preflight-mcp"]
    }
  }
}

标准工作流程

1. preflight_create_bundle   → Create bundle from source
2. preflight_get_overview    → Understand project structure
3. preflight_search_and_read → Find specific code/docs
4. preflight_lsp             → Navigate code (definitions, references) (requires LSP enabled)
5. preflight_check           → Check code quality

工具参考

工具数量:

  • 默认配置:14个工具 (包含 LSP)

捆绑包管理(6)

工具 说明
preflight_create_bundle 从GitHub、本地路径、web文档或PDF创建捆绑包
preflight_list_bundles 列出所有可用捆绑包
preflight_delete_bundle 删除捆绑包
preflight_get_overview ⭐ 获取项目概述(从这里开始)
preflight_read_file 从捆绑包中读取特定文件
preflight_repo_tree 查看目录结构

搜索(1)

工具 说明
preflight_search_and_read 带上下文的全文搜索

代码智能(2)

工具 说明
preflight_check 代码质量检查(重复、死代码、循环、复杂性、安全性)
preflight_lsp 转到定义、查找引用、悬停、符号(需要 PREFLIGHT_LSP_ENABLED=true)

知识提炼(3)

工具 说明
preflight_generate_card 从捆绑包中提取知识卡(需要LLM配置)
preflight_rag ChromaDB和RAG查询索引,支持交叉验证(需要ChromaDB+嵌入配置)
preflight_rag_manage 管理ChromaDB:列出索引内容、统计数据、按哈希删除或全部删除

ArXiv(2)

工具 说明
preflight_arxiv_search 通过预设、查询或ID搜索arXiv论文,并支持翻译
preflight_arxiv_download 将arXiv论文作为PDF文件下载到本地目录

存储系统(可选)

工具 说明
preflight_memory 管理3层长期记忆系统(情景、语义、程序)(需要 PREFLIGHT_MEMORY_ENABLED=true)

|------|-------------| | preflight_create_bundle |从GitHub、本地路径、web文档或PDF创建捆绑包| | preflight_list_bundles |列出所有可用捆绑包| | preflight_delete_bundle |删除捆绑包| | preflight_get_overview | ⭐ 获取项目概述(从这里开始)| | preflight_read_file |从捆绑包中读取特定文件| | preflight_repo_tree |查看目录结构| | preflight_update_bundle |从源代码更新现有捆绑包| | preflight_cleanup_orphans |清理存储中的孤立文件| | preflight_get_task_status |获取异步捆绑包操作的状态|

搜索(1)

工具 说明
preflight_search_and_read 带上下文的全文搜索

代码智能(2)

工具 说明
preflight_lsp 转到定义、查找引用、悬停、符号(需要 PREFLIGHT_LSP_ENABLED=true)
preflight_check 代码质量检查(重复、死代码、循环、复杂性、安全性)

知识提炼(3)

工具 说明
preflight_generate_card 从捆绑包中提取知识卡(需要LLM配置)
preflight_rag ChromaDB和RAG查询索引,支持交叉验证(需要ChromaDB+嵌入配置)
preflight_rag_manage 管理ChromaDB:列出索引内容、统计数据、按哈希删除或全部删除

存储系统(1)

工具 说明
preflight_memory 管理3层长期记忆系统(情景、语义、程序)(需要 PREFLIGHT_MEMORY_ENABLED=true)

ArXiv(2)

工具 说明
preflight_arxiv_search 通过预设、查询或ID搜索arXiv论文,并支持翻译
preflight_arxiv_download 将arXiv论文作为PDF文件下载到本地目录
工具 说明
preflight_create_bundle 从GitHub、本地路径、web文档或PDF创建捆绑包
preflight_list_bundles 列出所有可用捆绑包
preflight_delete_bundle 删除捆绑包
preflight_get_overview ⭐ 获取项目概述(从这里开始)
preflight_read_file 从捆绑包中读取特定文件
preflight_repo_tree 查看目录结构
preflight_update_bundle 从源代码更新现有捆绑包
preflight_cleanup_orphans 清理存储中的孤立文件
preflight_get_task_status 获取异步捆绑包操作的状态

搜索(1)

工具 说明
preflight_search_and_read 带上下文的全文搜索

代码智能(2)

工具 说明
preflight_lsp 转到定义、查找引用、悬停、符号(需要 PREFLIGHT_LSP_ENABLED=true)
preflight_check 代码质量检查(重复、死代码、循环、复杂性、安全性)

知识提炼(3)

工具 说明
preflight_generate_card 从捆绑包中提取知识卡(需要LLM配置)
preflight_rag ChromaDB和RAG查询索引,支持交叉验证(需要ChromaDB+嵌入配置)
preflight_rag_manage 管理ChromaDB:列出索引内容、统计数据、按哈希删除或全部删除

存储系统(1)

工具 说明
preflight_memory 管理三层长期记忆系统(情景、语义、程序)

ArXiv(2)

工具 说明
preflight_arxiv_search 通过预设、查询或ID搜索arXiv论文,并支持翻译
preflight_arxiv_download 将arXiv论文作为PDF文件下载到本地目录

工具示例

创建捆绑包

// GitHub repo
{"repos": [{"kind": "github", "repo": "owner/repo"}]}

// Local directory
{"repos": [{"kind": "local", "repo": "local/myproj", "path": "C:\\code\\myproj"}]}

// Web documentation
{"repos": [{"kind": "web", "url": "https://docs.example.com"}]}

// PDF (online or local)
{"repos": [{"kind": "pdf", "url": "https://arxiv.org/pdf/2512.14982"}]}
{"repos": [{"kind": "pdf", "path": "C:\\docs\\paper.pdf"}]}

搜索和阅读

{"bundleId": "abc123", "query": "authentication middleware", "scope": "code"}

代码质量检查

{"path": "/home/user/project", "checks": ["security", "deadcode", "circular"]}

可用支票:

  • duplicates -复制粘贴检测(150多种语言)
  • doccheck -文档代码一致性
  • deadcode -未使用的文件和导出
  • circular -循环导入依赖关系
  • complexity -高复杂度函数
  • errorprone -易出错模式
  • security -安全漏洞

LSP导航

{"action": "definition", "file": "/path/to/file.py", "line": 42, "column": 10}
{"action": "references", "file": "/path/to/file.ts", "line": 15, "column": 5}

支持: .py, .go, .rs, .ts, .tsx, .js, .jsx

RAG查询和交叉验证

// Index bundle
{"bundleId": "abc123", "index": true}

// Query with hierarchical expansion (default)
{"bundleId": "abc123", "question": "What is the main contribution?"}

// Cross-validation: call twice, compare answers
{"bundleId": "abc123", "question": "..."}  // First: default LLM
{"bundleId": "abc123", "question": "...", "useVerifierLlm": true}  // Second: verifier LLM

RAG管理

// List all indexed content
{"action": "list"}

// View statistics
{"action": "stats"}

// Delete by content hash
{"action": "delete", "contentHash": "77b44fcb..."}

// Delete ALL indexed content (use with caution)
{"action": "delete_all"}

ArXiv搜索与下载

// Search with preset (AI mainstream papers from last 2 days, brief mode)
{"preset": "ai_mainstream", "daysBack": 2, "brief": true}

// Search with custom query
{"query": "ti:\"reinforcement learning\" AND cat:cs.AI", "maxResults": 20}

// Get full details by ID
{"idList": ["2301.07041", "2312.12456"]}

// Translate titles and summaries to Chinese
{"preset": "ai_mainstream", "daysBack": 1, "translate": true}

// Save results to file
{"preset": "llm", "daysBack": 7, "outputFile": "papers.md"}

// Download PDFs
{"idList": ["2601.20732", "2601.20745"], "outputDir": "D:/papers/"}

内存管理

三层长期记忆系统存储以下信息:

  • L1:情景记忆(对话、事件、总结)
  • L2:语义记忆(事实、关系、实体)
  • L3:程序记忆(偏好、习惯、模式)
// Add memory
{"action": "add", "layer": "episodic", "content": "User prefers TypeScript over JavaScript", "metadata": {"type": "preference", "tags": ["coding-style"]}}

// Search memories
{"action": "search", "query": "coding preferences", "layers": ["semantic", "procedural"]}

// Get memory statistics
{"action": "stats"}

// List memories
{"action": "list", "layer": "procedural", "limit": 10}

// Update memory metadata
{"action": "update", "memoryId": "mem_pro_xxx", "metadata": {"category": "workflow"}, "mergeMode": "replace"}

// Delete memory
{"action": "delete", "memoryId": "mem_epi_xxx"}

// Extract facts from memories
{"action": "reflect", "reflectType": "extract_facts", "sourceIds": ["mem_epi_1", "mem_epi_2"]}

// Extract patterns from semantic memories
{"action": "reflect", "reflectType": "extract_patterns"}

// Compress episodic memories
{"action": "reflect", "reflectType": "compress", "compressStrategy": {"layer": "episodic", "maxCount": 10}}

// Garbage collect old/unused memories
{"action": "gc", "gcOptions": {"layers": ["episodic"], "maxAgeDays": 30, "minAccessCount": 1, "dryRun": false}}

存储系统功能:

  • PII/秘密检测,防止存储敏感信息
  • 置信度门控(语义<0.6,程序<0.8被拒绝)
  • 语义关系的冲突检测
  • 访问计数批处理(60秒刷新间隔)
  • 使用机器指纹进行每用户隔离(用PREFLIGH_user_ID覆盖)
  • 使用可配置的过滤器对旧/未使用的内存进行垃圾回收

配置

配置文件

创建 ~/.preflight/config.json (Windows: C:\Users\<username>\.preflight\config.json):

{
  "vlmEnabled": true,
  "vlmApiBase": "https://api.openai.com/v1",
  "vlmApiKey": "sk-xxx",
  "vlmModel": "gpt-4o",

  "llmEnabled": true,
  "llmApiBase": "https://api.openai.com/v1",
  "llmApiKey": "sk-xxx",
  "llmModel": "gpt-4o-mini",

  "verifierLlmApiBase": "https://api.openai.com/v1",
  "verifierLlmApiKey": "sk-xxx",
  "verifierLlmModel": "gpt-4o",

  "embeddingEnabled": true,
  "embeddingProvider": "openai",
  "embeddingApiBase": "https://api.openai.com/v1",
  "embeddingApiKey": "sk-xxx",
  "embeddingModel": "text-embedding-3-small",

  "chromaUrl": "http://localhost:8000",

  "pdfChunkingStrategy": "semantic",
  "pdfChunkLevel": 2,

  "mineruEnabled": true,
  "mineruApiBase": "https://mineru.net",
  "mineruApiKey": "your-mineru-key",

  "memory": {
    "enabled": true,
    "userId": "optional-user-override"
  }
}
型号 用途
VLM PDF提取(公式、表格)
LLM 知识卡生成、RAG答案合成
验证器LLM RAG交叉验证(可选,可靠性更高)
嵌入 语义搜索

PDF分块策略

控制RAG如何将PDF分割成块:

选项 值 默认值 描述
pdfChunkingStrategy semantic, token-based, hybrid semantic 分块算法
pdfChunkLevel 1, 2, 3, 4 2 标题水平拆分

策略:

  • semantic -仅按markdown标题拆分,没有标记限制(建议用于长上下文模型)
  • token-based -传统模式,按固定令牌计数划分
  • hybrid -语义分割,对超大块发出警告

块度:

  • 1 -拆分为 # (章节)→ ~10-20 每张纸的块数
  • 2 -拆分为 ## (章节)→ ~50-80 每张纸的块数(推荐)
  • 3 -拆分为 ### (子章节)→ ~100-150 每张纸的块数
  • 4 -拆分为 #### (段落)→ 更细粒度

语义策略完整地保留了包含图形、公式和表格的完整部分。

⚠️ 不要在LLM中使用“思维”模型(o1,DeepSeek-R1)——它们在 reasoning_content 而不是 content.

环境变量

# Storage
PREFLIGHT_STORAGE_DIR=~/.preflight-mcp/bundles
PREFLIGHT_STORAGE_DIRS=/path/to/storage1;/path/to/storage2  # Multiple storage (semicolon-separated)
PREFLIGHT_ANALYSIS_MODE=none|quick|full

# Limits
PREFLIGHT_MAX_FILE_BYTES=524288      # 512KB
PREFLIGHT_MAX_TOTAL_BYTES=52428800   # 50MB

# Semantic Search
PREFLIGHT_SEMANTIC_SEARCH=true
PREFLIGHT_EMBEDDING_PROVIDER=ollama|openai
PREFLIGHT_OLLAMA_HOST=http://localhost:11434
PREFLIGHT_OLLAMA_MODEL=nomic-embed-text
PREFLIGHT_OPENAI_API_KEY=sk-xxx

# LSP
PREFLIGHT_LSP_ENABLED=true

# HTTP API
PREFLIGHT_HTTP_ENABLED=true
PREFLIGHT_HTTP_PORT=37123

# VLM (Vision-Language Model for PDF analysis)
PREFLIGHT_VLM_ENABLED=true
VLM_API_KEY=sk-xxx

# LLM (for knowledge cards and RAG synthesis)
PREFLIGHT_LLM_ENABLED=true
PREFLIGHT_LLM_API_KEY=sk-xxx

# Verifier LLM (for RAG cross-validation)
PREFLIGHT_VERIFIER_LLM_API_KEY=sk-xxx

# MinerU (PDF parsing API)
PREFLIGHT_MINERU_ENABLED=true
PREFLIGHT_MINERU_API_KEY=your-key

# Memory System
PREFLIGHT_MEMORY_ENABLED=true
PREFLIGHT_USER_ID=optional-user-override

# PDF Chunking
PREFLIGHT_PDF_CHUNK_STRATEGY=semantic|token-based|hybrid
PREFLIGHT_PDF_CHUNK_LEVEL=2  # 1=chapter, 2=section, 3=subsection, 4=paragraph

# ChromaDB
PREFLIGHT_CHROMA_URL=http://localhost:8000

优先:环境变量>config.json>默认值

捆绑布局

bundle/
├── OVERVIEW.md          # Project summary
├── START_HERE.md        # Quick start guide
├── AGENTS.md            # Agent-specific guidance
├── manifest.json        # Bundle metadata
├── search.db            # FTS5 search index
├── analysis/
│   ├── gof-patterns.json
│   ├── architectural.json
│   ├── test-examples.json
│   └── config.json
└── repos/
    └── owner~repo/      # Ingested source files

部署

克劳德桌面版

{
  "mcpServers": {
    "preflight": {
      "command": "node",
      "args": ["path/to/preflight-mcp/dist/index.js"],
      "env": {
        "PREFLIGHT_STORAGE_DIR": "~/.preflight-mcp/bundles"
      }
    }
  }
}

光标

{
  "mcp": {
    "servers": {
      "preflight": {
        "command": "node",
        "args": ["path/to/preflight-mcp/dist/index.js"]
      }
    }
  }
}

码头工人

docker run -e PREFLIGHT_STORAGE_DIR=/bundles -v /host/bundles:/bundles preflight-mcp

发展

npm install
npm run dev          # Start development server
npm run typecheck    # Type checking without compilation
npm run build        # Production build with security checks
npm run build:quick  # Quick build without checks
npm run start        # Run production build
npm test             # Run tests
npm run smoke        # Smoke test after build
npm run docs:generate # Generate API documentation
npm run docs:serve   # Serve documentation with watch mode

常见问题解答

Q: 捆绑包创建缓慢
A: 使用 ifExists: "returnExisting" 以重用现有的捆绑包。对于大型回购,考虑限制 maxFiles.

Q: 语义搜索不起作用
A: 启用 embeddingEnabled: true 在config.json中,并提供嵌入API凭据。

Q: LSP工具不可用
A: 启用 PREFLIGHT_LSP_ENABLED=true 在环境变量中。确保安装了语言服务器(pyright, gopls, rust-analyzer, typescript-language-server).

Q: LSP超时
A: 增加 PREFLIGHT_LSP_TIMEOUT_MS。确保安装了语言服务器(pyright, gopls, rust-analyzer, typescript-language-server).

Q: Web爬网失败
A: 对于JavaScript密集型网站(React/Vue SPA),添加 useSpa: true 和 skipLlmsTxt: true。注意:SPA模式较慢。

Q: PDF提取质量
A: 启用VLM以更好地提取公式/表格。配置 vlmEnabled: true 使用视觉模型。

Q: ArXiv搜索返回的结果太多
A: 使用 brief: true 仅适用于标题列表,或使用筛选 daysBack 参数。使用 cursor 大型结果集的分页。

Q: ArXiv翻译失败
A: 确保验证器LLM在config.json中配置为 verifierLlmApiBase, verifierLlmApiKey,以及 verifierLlmModel.

Q: 内存工具不可用
A: 启用 memory.enabled: true 在config.json或 PREFLIGHT_MEMORY_ENABLED=true。确保ChromaDB正在运行。

Q: 内存垃圾回收不起作用
A: 使用 dryRun: true 首先预览将要删除的内容。调整 maxAgeDays 和 minAccessCount 根据需要过滤。

许可证

AGPL-3.0