1. 项目概述:一个为开发者与AI模型打造的上下文桥梁

如果你和我一样,每天都在和代码编辑器、终端以及各种AI助手打交道,那你肯定遇到过这样的场景:想让AI帮你审查一段代码,但它对你项目的整体结构、依赖关系、甚至API规范一无所知,给出的建议往往隔靴搔痒。或者,你想在编辑器里快速运行一个安全的构建命令,却不得不在终端和编辑器之间来回切换。这正是我最近在折腾的一个项目—— mcp-developer-context-server ——想要解决的核心痛点。简单来说,它是一个基于Model Context Protocol(MCP)的服务器,专门用来向任何兼容MCP的客户端(比如你正在用的AI助手,或者像Cursor这样的智能编辑器)暴露你当前项目的完整上下文。

这个“上下文”包含的东西很实在:它能让你在编辑器里直接搜索整个代码库,用简单的命令查看项目结构,安全地执行预定义好的构建或检查命令(比如 npm run lint ),甚至能帮你快速抓取和总结一个远程的OpenAPI规范文档。想象一下,你正在和AI结对编程,它不仅能读懂你当前打开的文件,还能通过这个服务器“看到”你项目的 package.json tsconfig.json ,知道哪些命令是安全的可以执行,并能即时分析你引用的API接口文档。这极大地减少了上下文切换和信息传递的损耗,让AI真正成为你项目团队里一个“知情”的成员。

这个项目非常适合前端、全栈开发者,尤其是那些重度依赖TypeScript生态、并使用Cursor或类似智能编码工具的朋友。它本质上是一个“胶水层”服务,将你本地的开发环境能力标准化后,通过MCP协议提供给上层应用使用。接下来,我会带你从设计思路到实操部署,完整地走一遍这个项目的核心脉络。

2. 核心设计思路与架构拆解

2.1 为什么是MCP?协议选型的深层考量

在决定自己造轮子之前,我评估过几种方案。最直接的是让AI客户端直接去读我的文件系统或执行命令,但这存在巨大的安全和可控性问题。另一个方案是为每个AI工具写特定的插件,但这意味着重复劳动和碎片化。最终选择基于Model Context Protocol(MCP)来构建,是基于几个关键的判断:

首先, MCP是一个开放协议 。它由Anthropic提出,但设计目标就是让任何AI模型或客户端都能以统一的方式与外部工具、资源和数据源交互。这意味着我今天为Cursor写的这个服务器,明天如果换到另一个支持MCP的IDE或AI聊天界面,理论上可以无缝迁移。这种避免被单一平台锁定的特性,对于长期维护的开发者工具至关重要。

其次, 它明确了边界和职责 。MCP协议清晰地定义了Server(提供能力方)、Client(消费能力方)和Transport(通信方式,如stdio、SSE)。我的服务器只需要专注于实现好“搜索代码”、“运行命令”这些能力,并以MCP规定的JSON格式提供出去。至于客户端如何呈现、调用这些能力,我不需要关心。这种关注点分离让代码更干净,也更容易测试。

最后, 它内置了类型安全 。MCP使用JSON Schema来严格定义Tools(工具)、Resources(资源)和Prompts(提示模板)的输入输出格式。我在用TypeScript实现时,能获得极好的类型提示和编译时检查,大大减少了运行时错误。例如, run-command 工具必须接收一个 command 字符串参数,这个约束在协议层和代码层都被强制执行了。

注意 :虽然MCP由Anthropic推动,但它本身是一个协议标准。实现这个服务器并不需要绑定任何特定的AI模型(如Claude)。你的客户端可以是任何实现了MCP Client协议的程序,这给了项目很大的灵活性。

2.2 核心能力定义:我们究竟需要暴露什么?

确定了协议,下一步就是定义这个“开发者上下文服务器”应该提供哪些具体能力。我将其归纳为四类,这也是项目源码中 src/ 目录下四个子模块的划分依据:

  1. Tools(工具) :这是主动调用的能力,通常对应一个明确的动作。

    • search-codebase :这是使用频率最高的工具。它的核心价值在于,让AI能在不直接访问所有文件的情况下,快速定位相关代码。实现上,它基于 glob 模式匹配和内容正则搜索,并自动忽略 node_modules dist 这类生成目录,确保搜索效率和相关性。
    • project-structure :快速给AI一个项目的鸟瞰图。输出不是简单的 tree 命令结果,而是经过提炼的,会突出根目录下的关键配置文件( package.json , tsconfig.json 等),帮助AI理解项目类型和基础配置。
    • run-command 安全是重中之重 。这个工具不能成为一个任意命令执行器。我的设计是,通过环境变量 ALLOWED_COMMANDS 提供一个白名单。只有名单内的命令(如 npm run lint , npx tsc --noEmit )才能被执行。这就在便利性和安全性之间取得了平衡。
    • fetch-api-spec :现代开发离不开API。这个工具接受一个OpenAPI规范的URL,将其下载并解析,然后生成一个包含所有接口路径、方法和核心模型名称的摘要。这比直接把几百KB的JSON规范扔给AI要高效得多,节省了大量Token。
    • validate-json :一个实用的瑞士军刀,用于快速格式化或验证JSON片段,在调试或编写配置时非常有用。
  2. Resources(资源) :这是被动的数据源,通过URI(如 project://manifest )来访问,类似于一个只读的微型API。

    • project://manifest :直接返回 package.json 的内容。这是AI了解项目依赖、脚本和元数据的最直接途径。
    • project://config :返回一个聚合视图,包含项目内找到的所有关键配置文件(如 tsconfig.json , .eslintrc.js )的内容,以及 .env.example 中的环境变量示例键名(不包含值,出于安全)。
    • api://spec :作为 fetch-api-spec 工具的资源形态,方便客户端通过URI直接获取某个API的摘要。
  3. Prompts(提示模板) :这是预定义的对话模板,用于引导AI完成特定任务。它不是一个工具调用,而是一个“提示词”,客户端(如AI)收到后,可以将其作为系统提示或用户消息的一部分,来发起更专业的对话。

    • code-review :当用户提供一段代码和一个可选的审查焦点(如“性能”、“安全性”)时,这个提示会生成一个结构化的请求,引导AI进行针对性的代码审查。
    • api-usage :当用户提供一个OpenAPI中的 operationId 时,这个提示会请求AI生成使用该API的客户端代码示例(可指定语言)。
    • test-plan :当用户提供一个模块路径时,这个提示会请求AI为该模块设计单元测试方案。
  4. 项目结构设计 :清晰的模块化。从项目结构可以看出, src/ 目录下按能力类型分成了 tools/ resources/ prompts/ 以及共享的 lib/ 。入口文件 index.ts 职责单一,主要负责初始化MCP服务器、注册上述所有能力,并建立stdio传输。这种结构让新增一个工具或资源变得非常容易,只需在对应目录创建文件并在入口注册即可。

3. 环境准备与项目初始化实操

3.1 系统与Node.js环境确认

这个项目基于Node.js运行时,因此第一步是确保你的开发环境符合要求。我强烈推荐使用Node.js的版本管理工具,如 nvm (Node Version Manager) 或 fnm ,这能让你在不同项目间轻松切换Node版本。

打开你的终端,执行以下命令来检查当前版本并确保使用Node.js 20或更高版本:

# 检查当前Node.js版本
node --version

# 如果版本低于20,使用nvm安装并切换(如果你使用nvm)
nvm install 20
nvm use 20

# 或者使用fnm
fnm use 20

为什么必须是Node.js 20+?项目中可能使用了较新的JavaScript语言特性或Node.js API(比如原生的 .env 文件加载、稳定的Fetch API等),低版本可能导致语法错误或运行时异常。使用LTS(长期支持)版本如Node.js 20,能在获得新特性的同时保证稳定性。

3.2 克隆项目与依赖安装

环境就绪后,我们来获取项目代码。使用 git clone 命令将仓库克隆到本地你喜欢的目录:

# 克隆项目
git clone https://github.com/AbdulRahmanMudasser/mcp-developer-ctx.git
# 进入项目目录
cd mcp-developer-ctx

进入项目根目录后,你会看到标准的Node.js项目结构,包含 package.json tsconfig.json 等文件。接下来安装项目依赖:

npm install

这个命令会根据 package.json 中的定义,下载所有必需的依赖包到 node_modules 目录。关键依赖通常包括:

  • @modelcontextprotocol/sdk :MCP协议的官方TypeScript SDK,这是项目的核心,提供了创建Server、定义Tools/Resources/Prompts的类和方法。
  • typescript :用于编译TypeScript代码。
  • tsx ts-node :用于开发环境直接运行TypeScript。
  • 其他工具库,如 glob (用于文件匹配)、 axios node-fetch (用于网络请求)、 zod (用于输入验证)等。

安装过程通常很快。如果遇到网络问题,可以考虑配置npm镜像源。安装完成后,你可以快速浏览一下 package.json 中的 scripts 部分,熟悉一下可用的命令。

3.3 关键配置解析与环境变量设置

项目设计得很灵活,大部分配置通过环境变量实现,避免了硬编码。你需要理解并可能设置以下两个关键变量:

  1. PROJECT_ROOT (项目根目录)

    • 作用 :告诉服务器,哪个目录是你的“项目”。服务器所有的文件搜索、结构查看、命令执行,都将基于这个目录进行。
    • 默认值 :如果不设置,服务器会使用启动它时的进程工作目录( process.cwd() )。这在大多数情况下是可行的。
    • 何时需要设置 :当你从非项目目录启动服务器时。例如,你习惯把所有的服务脚本放在一个统一的 ~/scripts 目录下运行,那么你就需要通过这个变量明确指出你的代码项目在哪里。
    • 设置方法 :在启动命令前设置,例如:
      PROJECT_ROOT=/Users/yourname/your-project npm start
      
      或者在 .env 文件中定义(如果项目支持 .env 加载)。
  2. ALLOWED_COMMANDS (允许执行的命令)

    • 作用 :这是 run-command 工具的 安全白名单 。它定义了哪些命令可以被服务器安全地执行。
    • 默认值 :如果未设置,项目内部会使用一个预设的、相对安全的默认列表,通常包含像 npm run lint npm run typecheck npm test npx tsc --noEmit 这类不修改文件、只进行检查或测试的命令。
    • 为什么如此重要 :绝对不能让AI或任何客户端通过这个服务器执行 rm -rf / curl http://恶意网站 这样的命令。白名单机制是核心安全防线。
    • 如何自定义 :你可以通过环境变量设置一个以逗号分隔的命令列表。例如,如果你想允许运行项目的构建命令和某个特定的脚本:
      ALLOWED_COMMANDS="npm run build,npm run dev,./deploy.sh" npm start
      
    • 实操心得 :我建议在项目初期使用默认列表。当你确实需要某个特定命令(如 docker compose up )时,再将其明确添加到白名单中。永远遵循最小权限原则。

4. 构建、运行与基础功能测试

4.1 编译与启动服务器的两种模式

项目提供了两种运行方式:生产模式(运行编译后的JavaScript)和开发模式(直接运行TypeScript源码)。

生产模式(推荐用于稳定使用) : 这种方式先使用TypeScript编译器( tsc )将 src/ 目录下的 .ts 文件编译成 .js 文件,输出到 dist/ 目录,然后运行编译后的代码。性能更好,也更接近部署状态。

# 1. 编译TypeScript代码
npm run build

# 2. 启动编译后的服务器
npm start

执行 npm start 后,终端会看起来“卡住”了,没有输出。这是正常的!因为MCP服务器默认使用 stdio (标准输入输出)作为传输方式,它在等待客户端(比如Cursor)通过标准流与之建立连接并发送JSON-RPC请求。此时按 Ctrl+C 可以终止服务器。

开发模式(用于修改和调试) : 在开发新功能或修复Bug时,每次修改代码后都要重新编译再运行会很麻烦。开发模式利用 tsx 这类工具,直接在内存中转换并执行TypeScript,支持热重载(修改代码后需要重启进程)。

npm run dev

dev 脚本通常会配置 NODE_ENV=development 并启用更详细的日志,方便你看到服务器接收和发送的原始消息,对于调试协议交互非常有用。

4.2 使用MCP Inspector进行全方位功能验证

在将服务器集成到Cursor或其他客户端之前,强烈建议使用 MCP Inspector 进行独立测试。这是一个官方提供的Web调试工具,可以可视化地调用服务器提供的所有Tools、Resources和Prompts,并查看原始响应。

运行Inspector的方式很简单:

npm run inspector

这个命令会启动两个东西:1) 你的MCP服务器;2) 一个本地的Web服务器(通常在 http://localhost:6274 )。在浏览器中打开这个地址,你就进入了Inspector界面。

Inspector界面通常分为几个标签页:

  • Tools :这里列出了所有注册的工具( search-codebase , run-command 等)。你可以点击某个工具,在右侧面板输入参数(JSON格式),然后点击“Call”来执行。执行结果(成功或错误)会清晰地显示在下方。这是验证工具逻辑是否正确的最直接方法。
  • Resources :这里列出了所有资源的URI模板(如 project://manifest )。你可以直接“Fetch”资源来查看其返回的JSON内容。
  • Prompts :这里列出了所有提示模板。你可以提供参数,然后查看生成的提示消息内容。

如何利用Inspector做测试 : 你可以完全按照项目README中提供的“Testing with MCP Inspector”表格来逐一验证。例如:

  1. 在Tools标签页,选择 search-codebase ,输入 {"pattern": "registerTool", "glob": "**/*.ts"} ,点击Call。你应该能看到项目中所有包含 registerTool 字符串的TypeScript文件的行号及代码片段。
  2. 选择 run-command ,输入 {"command": "npm run lint"} (假设你的项目有lint脚本),应该能看到命令执行的输出和退出码。再输入 {"command": "echo hello"} (如果不在白名单),应该会收到“Command not allowed.”的错误信息。
  3. 在Resources标签页,Fetch project://manifest ,你应该能立即看到当前项目的 package.json 完整内容。

这个过程能帮你提前发现服务器端的配置问题或逻辑错误,避免在集成到Cursor后出现难以调试的问题。

4.3 核心工具与资源接口详解

让我们深入看看几个核心工具的内部逻辑和设计考量:

search-codebase 工具的实现细节 : 这个工具的目标是快速、准确地定位代码。它接收两个主要参数: pattern (搜索的正则表达式或字符串)和 glob (文件匹配模式,如 **/*.ts 表示所有TypeScript文件)。

  1. 路径解析 :首先,工具会将所有输入路径基于 PROJECT_ROOT 解析为绝对路径,确保搜索范围正确。
  2. 文件筛选 :使用 glob 库根据提供的模式匹配文件。这里有一个关键优化: 自动忽略列表 。无论 glob 是什么,工具内部会硬编码忽略 node_modules dist build .git 等目录。这避免了在巨大的依赖目录或构建产物中进行无意义的搜索,极大提升了速度。
  3. 内容搜索 :对筛选后的文件列表,逐行读取并匹配 pattern 。这里我选择的是逐行匹配并返回行号,而不是返回整个文件内容。为什么?因为MCP通信和AI模型的上下文都有Token限制。返回匹配行及其上下文(如前一行和后一行)的片段,能在提供足够信息的同时最大限度地节省Token。输出格式设计为 文件路径:行号: 代码片段 ,清晰且易于客户端解析。

run-command 工具的安全沙箱设计 : 这是最需要谨慎对待的工具。我的设计原则是: 默认拒绝,显式允许

  1. 命令解析 :客户端传入一个 command 字符串。
  2. 白名单校验 :服务器读取 ALLOWED_COMMANDS 环境变量(或使用默认列表),将其拆分为数组。检查传入的 command 是否 完全匹配 白名单中的某一项。注意,这里用的是完全匹配,而不是前缀匹配。 npm run lint 是允许的,但 npm run lint --fix 就不允许,除非后者也在白名单中。这提供了最强的控制力。
  3. 执行环境 :命令会在 PROJECT_ROOT 目录下,在一个独立的子进程( child_process )中执行。这样可以控制工作目录,并能够捕获标准输出、标准错误和退出码。
  4. 超时与输出限制 :为了防止命令长时间运行或产生海量输出阻塞通信,实现时应该考虑设置一个合理的超时时间(例如30秒),并对输出大小进行限制(例如前10000个字符)。这些细节在基础版本中可能没有,但却是生产环境必须考虑的。

project://config 资源的聚合智慧 : 这个资源的设计目标是给AI一个项目的“配置全景图”。它不只是返回一个文件。

  1. 它会扫描项目根目录,寻找一系列已知的配置文件: package.json , tsconfig.json , *.config.js/ts , .eslintrc.* , .prettierrc.* , tailwind.config.* 等。找到后,读取其内容。
  2. 对于 .env.example 文件,它有一个特殊处理: 只提取键名,不提取值 。例如,如果文件中有 API_KEY=your_key_here ,资源返回的数据中只会包含 API_KEY 。这既告诉了AI项目需要哪些环境变量,又避免了泄露任何可能的敏感示例值(虽然只是示例,但遵循安全最佳实践)。
  3. 最终,它将所有这些信息整合成一个结构化的JSON对象返回。这样,AI在分析项目时,就能一次性获得构建、代码风格、类型检查、环境依赖等多方面的配置信息,理解力大幅提升。

5. 集成到Cursor编辑器:让AI助手获得“超能力”

5.1 Cursor MCP配置详解

让这个服务器在Cursor中发挥作用,关键在于正确的配置。Cursor通过一个配置文件来管理它连接的所有MCP服务器。这个配置文件的位置可能是:

  • Cursor设置界面中的特定配置区域。
  • 一个本地的JSON配置文件,路径可能在 ~/.cursor/mcp.json ~/Library/Application Support/Cursor/User/globalStorage/mcp-settings.json (macOS),具体请参考Cursor的官方文档。

你需要在这个配置文件中添加你的服务器。配置是一个JSON对象,结构如下:

{
  "mcpServers": {
    "developer-context": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-developer-context-server/dist/index.js"],
      "env": {
        "PROJECT_ROOT": "/absolute/path/to/your/actual/project",
        "ALLOWED_COMMANDS": "npm run lint,npm run typecheck,npm test,npx tsc --noEmit"
      },
      "disabled": false
    }
  }
}

逐项解析配置

  • "developer-context" :这是你给这个服务器实例起的名字,可以自定义,在Cursor的界面中可能会显示这个名字。
  • command :启动服务器的命令。由于我们运行的是编译后的Node.js脚本,所以是 "node"
  • args :传递给 node 命令的参数。 这里必须是编译后的入口文件 dist/index.js 的绝对路径 。相对路径可能因Cursor的工作目录不同而导致启动失败。
  • env :设置环境变量。 PROJECT_ROOT 在这里至关重要 。你必须将其设置为你的 代码项目 的绝对路径,而不是服务器项目本身的路径。 ALLOWED_COMMANDS 可以在此覆盖或补充。
  • disabled :设为 false 以启用此服务器。

路径获取技巧 : 在终端中,进入你的 代码项目 目录,执行 pwd (Linux/macOS)或 cd (Windows)命令,即可得到绝对路径。同样,进入 mcp-developer-context-server 项目的 dist 目录,对 index.js 文件使用 pwd 命令并结合文件名,也能得到其绝对路径。

5.2 配置生效与验证

修改并保存配置文件后,你需要重启Cursor,或者在其界面内寻找“重新加载MCP配置”的选项(如果提供)。重启是最可靠的方式。

如何验证集成成功?

  1. 查看日志 :启动Cursor时,查看其开发者工具控制台(如果可访问)或日志文件,看是否有MCP服务器启动失败的错误信息。
  2. 观察AI能力 :在Cursor的聊天界面或编辑器内,尝试向AI助手提问一些需要项目上下文的问题。例如:
    • “我这个项目的 package.json 里定义了哪些脚本?”
    • “帮我搜索一下所有调用了 useState 钩子的文件。”
    • “运行一下代码检查。”(这需要 npm run lint 在允许的命令列表中) 如果配置正确,AI应该能够利用服务器提供的能力来回答这些问题,而不是泛泛而谈。

一个常见的踩坑点 :路径错误。如果 args 中的路径不正确,Cursor在启动时会静默失败(你可能看不到明显错误)。务必使用绝对路径,并确保 dist/index.js 文件确实存在(即你已经运行过 npm run build )。

5.3 在Cursor中的实际应用场景

集成成功后,你的开发体验会有质的提升:

场景一:深度代码审查 你写了一段复杂的业务逻辑,可以直接把代码粘贴到Cursor聊天框,然后说:“用 code-review 提示,聚焦‘性能’和‘错误处理’,帮我审查这段代码。” AI会利用 code-review 提示模板,结合它通过 project-structure project://manifest 了解到的项目技术栈(比如用的是React还是Vue,有没有特定的代码规范),给出比单纯看代码片段更贴合你项目上下文的建议。

场景二:快速API集成 当你需要调用一个外部服务时,你可以直接把OpenAPI规范的URL丢给AI:“用 fetch-api-spec 工具获取这个API的摘要,然后给我一个在项目中调用 createUser 接口的TypeScript Fetch示例。” AI会先通过工具获取API摘要,理解接口的路径、方法和参数,然后生成符合你项目风格的代码。

场景三:自动化项目检查 在提交代码前,你可以让AI助手:“运行一下lint和typecheck。” AI会通过 run-command 工具依次执行 npm run lint npm run typecheck ,并将结果直接返回给你。你无需离开编辑器去切换终端。

场景四:新人快速熟悉项目 一个新同事加入,他可以让AI“给我看看项目的整体结构”,AI通过 project-structure 工具返回一个清晰的目录树和关键文件列表。接着问“我们的主要依赖有哪些?”,AI通过 project://manifest 资源获取 package.json 并总结出核心依赖。这种交互式的探索比直接看文档更高效。

6. 高级配置、问题排查与扩展思路

6.1 安全与性能调优建议

当服务器开始处理真实项目,尤其是大型项目时,安全和性能就需要额外关注。

安全加固

  1. 严格限制 ALLOWED_COMMANDS :这是第一道也是最重要的防线。只添加你绝对信任且必要的命令。避免添加任何能修改系统文件、访问网络或执行脚本的命令(如 bash curl wget ),除非你完全清楚其后果并在隔离环境中测试过。
  2. 考虑进程隔离 :目前的实现是在主Node.js进程中通过 child_process 执行命令。对于更高级别的安全需求,可以考虑使用Docker容器或更严格的沙箱(如 nsjail seccomp )来隔离命令执行环境,但这会显著增加复杂性。
  3. 输入验证与清理 :虽然MCP SDK和TypeScript类型提供了一些保障,但对于像 search-codebase 中的 glob 模式这类用户输入,要进行必要的验证,防止目录遍历攻击(如 ../../../etc/passwd )。 glob 库本身有一定防护,但谨慎起见,可以添加逻辑,确保解析后的路径仍在 PROJECT_ROOT 之下。

性能优化

  1. search-codebase 添加缓存 :对于大型代码库,频繁的文件系统遍历和内容搜索是昂贵的。可以引入一个简单的内存缓存,将 (glob, pattern) 的组合作为键,搜索结果作为值,并设置一个较短的TTL(如5秒)。这样,AI在短时间内对同一问题进行追问时,可以立即返回缓存结果。
  2. 限制搜索范围和深度 :可以在工具参数中增加 maxFiles maxDepth 选项,防止用户(或AI)无意中发起一个匹配数万文件的搜索,拖垮服务器。
  3. 异步与非阻塞操作 :确保所有I/O密集型操作(文件读取、网络请求、命令执行)都是异步的,避免阻塞MCP服务器的主事件循环,影响其他请求的响应。

6.2 常见问题排查速查表

在部署和使用过程中,你可能会遇到以下问题。这里提供一个快速排查指南:

问题现象 可能原因 排查步骤与解决方案
Cursor启动时,MCP服务器连接失败,或AI无法使用相关功能。 1. 配置文件路径错误。
2. 服务器未成功编译。
3. 环境变量 PROJECT_ROOT 指向了错误目录。
4. Cursor未重启/重载配置。
1. 检查路径 :确认 args 中的 dist/index.js 绝对路径正确,且文件存在。
2. 检查编译 :在服务器项目目录运行 npm run build ,确保无报错且 dist/ 目录下有文件。
3. 检查环境变量 :确认 PROJECT_ROOT 指向的是你 想被分析的项目 ,而不是服务器项目本身。
4. 重启Cursor :修改配置后,务必完全重启Cursor。
search-codebase 返回结果为空,但确定文件存在。 1. glob 模式不匹配。
2. 文件在自动忽略的目录中(如 node_modules )。
3. PROJECT_ROOT 设置错误。
1. 简化测试 :先用最简单的 glob (如 **/* )和 pattern (如 function )测试。
2. 检查忽略规则 :确认你要搜索的文件不在 node_modules dist 等目录下。
3. 使用MCP Inspector :在Inspector中调用工具,查看原始请求和响应,更容易定位问题。
run-command 执行失败,返回“Command not allowed”。 命令不在 ALLOWED_COMMANDS 白名单中。 1. 检查环境变量 :确认启动服务器时设置的 ALLOWED_COMMANDS 包含了你想执行的命令。
2. 注意完全匹配 :命令字符串必须与白名单中的某一项完全一致(包括参数)。 npm run lint npm run lint --fix 被视为两个不同的命令。
fetch-api-spec 工具超时或返回错误。 1. 网络问题,无法访问提供的URL。
2. URL指向的不是有效的OpenAPI JSON文档。
3. 文档过大,解析超时。
1. 检查网络与URL :先用浏览器或 curl 测试URL是否能正常访问并返回JSON。
2. 验证文档格式 :确保URL返回的是合法的OpenAPI 3.0+ JSON,而不是YAML或错误格式。
3. 考虑本地文件 :对于内部或大型API文档,可以先下载到本地,然后让服务器读取本地文件(这需要修改工具逻辑)。
服务器进程占用内存或CPU过高。 1. 进行了未加限制的大规模文件搜索。
2. 执行的命令陷入死循环或内存泄漏。
1. 添加限制 :为 search-codebase 实现 maxFiles 和缓存。
2. 审查命令 :检查 ALLOWED_COMMANDS 中的命令,确保它们是安全、有限制的。
3. 监控进程 :使用 htop 或任务管理器观察服务器进程资源使用情况。

6.3 项目扩展与自定义开发

这个项目的架构是模块化的,很容易根据你的特定需求进行扩展。

添加一个新的工具 : 假设你想添加一个 git-diff 工具,用来获取上次提交的变更。

  1. src/tools/ 目录下创建新文件,例如 git-diff.ts
  2. 使用MCP SDK的 Tool 类定义工具,包括名称、描述、输入参数schema(例如 baseBranch 字符串)和输出schema。
  3. 在工具的 execute 函数中,使用Node.js的 child_process 模块执行 git diff origin/main --name-only 之类的命令(注意安全,可将其加入白名单逻辑或内部处理),并格式化输出。
  4. src/index.ts 中导入这个新工具,并将其注册到 server 实例中。
  5. 重新编译( npm run build )并重启服务器。

添加一个新的资源 : 假设你想暴露项目的 README.md 内容作为一个资源。

  1. src/resources/ 目录下创建新文件,例如 readme-resource.ts
  2. 定义一个资源模板,其URI模式可以是 project://readme
  3. 实现资源的 handler 函数,读取 PROJECT_ROOT/README.md 文件内容并以文本或JSON格式返回。
  4. src/index.ts 中注册这个新资源。

修改现有工具的行为 : 例如,你觉得默认的 search-codebase 忽略列表不够,还想忽略 .next .vuepress 目录。

  1. 找到 src/tools/search-codebase.ts 文件。
  2. 定位到执行文件搜索和过滤的逻辑部分。
  3. 在忽略数组(可能是一个叫 IGNORE_DIRS 的常量)中添加你的新目录名。
  4. 重新编译并测试。

实操心得 :在扩展时,务必先通过MCP Inspector测试新功能,确保输入输出符合MCP协议规范,然后再集成到Cursor。TypeScript的类型系统是你的好朋友,它能帮助你在编码阶段就发现很多接口不匹配的问题。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐