基于MCP协议构建开发者上下文服务器,赋能AI智能编码
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/
目录下四个子模块的划分依据:
-
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片段,在调试或编写配置时非常有用。
-
-
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的摘要。
-
-
Prompts(提示模板) :这是预定义的对话模板,用于引导AI完成特定任务。它不是一个工具调用,而是一个“提示词”,客户端(如AI)收到后,可以将其作为系统提示或用户消息的一部分,来发起更专业的对话。
-
code-review:当用户提供一段代码和一个可选的审查焦点(如“性能”、“安全性”)时,这个提示会生成一个结构化的请求,引导AI进行针对性的代码审查。 -
api-usage:当用户提供一个OpenAPI中的operationId时,这个提示会请求AI生成使用该API的客户端代码示例(可指定语言)。 -
test-plan:当用户提供一个模块路径时,这个提示会请求AI为该模块设计单元测试方案。
-
-
项目结构设计 :清晰的模块化。从项目结构可以看出,
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 关键配置解析与环境变量设置
项目设计得很灵活,大部分配置通过环境变量实现,避免了硬编码。你需要理解并可能设置以下两个关键变量:
-
PROJECT_ROOT(项目根目录) :- 作用 :告诉服务器,哪个目录是你的“项目”。服务器所有的文件搜索、结构查看、命令执行,都将基于这个目录进行。
-
默认值
:如果不设置,服务器会使用启动它时的进程工作目录(
process.cwd())。这在大多数情况下是可行的。 -
何时需要设置
:当你从非项目目录启动服务器时。例如,你习惯把所有的服务脚本放在一个统一的
~/scripts目录下运行,那么你就需要通过这个变量明确指出你的代码项目在哪里。 -
设置方法
:在启动命令前设置,例如:
或者在PROJECT_ROOT=/Users/yourname/your-project npm start.env文件中定义(如果项目支持.env加载)。
-
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”表格来逐一验证。例如:
-
在Tools标签页,选择
search-codebase,输入{"pattern": "registerTool", "glob": "**/*.ts"},点击Call。你应该能看到项目中所有包含registerTool字符串的TypeScript文件的行号及代码片段。 -
选择
run-command,输入{"command": "npm run lint"}(假设你的项目有lint脚本),应该能看到命令执行的输出和退出码。再输入{"command": "echo hello"}(如果不在白名单),应该会收到“Command not allowed.”的错误信息。 -
在Resources标签页,Fetch
project://manifest,你应该能立即看到当前项目的package.json完整内容。
这个过程能帮你提前发现服务器端的配置问题或逻辑错误,避免在集成到Cursor后出现难以调试的问题。
4.3 核心工具与资源接口详解
让我们深入看看几个核心工具的内部逻辑和设计考量:
search-codebase
工具的实现细节
:
这个工具的目标是快速、准确地定位代码。它接收两个主要参数:
pattern
(搜索的正则表达式或字符串)和
glob
(文件匹配模式,如
**/*.ts
表示所有TypeScript文件)。
-
路径解析
:首先,工具会将所有输入路径基于
PROJECT_ROOT解析为绝对路径,确保搜索范围正确。 -
文件筛选
:使用
glob库根据提供的模式匹配文件。这里有一个关键优化: 自动忽略列表 。无论glob是什么,工具内部会硬编码忽略node_modules、dist、build、.git等目录。这避免了在巨大的依赖目录或构建产物中进行无意义的搜索,极大提升了速度。 -
内容搜索
:对筛选后的文件列表,逐行读取并匹配
pattern。这里我选择的是逐行匹配并返回行号,而不是返回整个文件内容。为什么?因为MCP通信和AI模型的上下文都有Token限制。返回匹配行及其上下文(如前一行和后一行)的片段,能在提供足够信息的同时最大限度地节省Token。输出格式设计为文件路径:行号: 代码片段,清晰且易于客户端解析。
run-command
工具的安全沙箱设计
:
这是最需要谨慎对待的工具。我的设计原则是:
默认拒绝,显式允许
。
-
命令解析
:客户端传入一个
command字符串。 -
白名单校验
:服务器读取
ALLOWED_COMMANDS环境变量(或使用默认列表),将其拆分为数组。检查传入的command是否 完全匹配 白名单中的某一项。注意,这里用的是完全匹配,而不是前缀匹配。npm run lint是允许的,但npm run lint --fix就不允许,除非后者也在白名单中。这提供了最强的控制力。 -
执行环境
:命令会在
PROJECT_ROOT目录下,在一个独立的子进程(child_process)中执行。这样可以控制工作目录,并能够捕获标准输出、标准错误和退出码。 - 超时与输出限制 :为了防止命令长时间运行或产生海量输出阻塞通信,实现时应该考虑设置一个合理的超时时间(例如30秒),并对输出大小进行限制(例如前10000个字符)。这些细节在基础版本中可能没有,但却是生产环境必须考虑的。
project://config
资源的聚合智慧
:
这个资源的设计目标是给AI一个项目的“配置全景图”。它不只是返回一个文件。
-
它会扫描项目根目录,寻找一系列已知的配置文件:
package.json,tsconfig.json,*.config.js/ts,.eslintrc.*,.prettierrc.*,tailwind.config.*等。找到后,读取其内容。 -
对于
.env.example文件,它有一个特殊处理: 只提取键名,不提取值 。例如,如果文件中有API_KEY=your_key_here,资源返回的数据中只会包含API_KEY。这既告诉了AI项目需要哪些环境变量,又避免了泄露任何可能的敏感示例值(虽然只是示例,但遵循安全最佳实践)。 - 最终,它将所有这些信息整合成一个结构化的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配置”的选项(如果提供)。重启是最可靠的方式。
如何验证集成成功?
- 查看日志 :启动Cursor时,查看其开发者工具控制台(如果可访问)或日志文件,看是否有MCP服务器启动失败的错误信息。
-
观察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 安全与性能调优建议
当服务器开始处理真实项目,尤其是大型项目时,安全和性能就需要额外关注。
安全加固 :
-
严格限制
ALLOWED_COMMANDS:这是第一道也是最重要的防线。只添加你绝对信任且必要的命令。避免添加任何能修改系统文件、访问网络或执行脚本的命令(如bash、curl、wget),除非你完全清楚其后果并在隔离环境中测试过。 -
考虑进程隔离
:目前的实现是在主Node.js进程中通过
child_process执行命令。对于更高级别的安全需求,可以考虑使用Docker容器或更严格的沙箱(如nsjail、seccomp)来隔离命令执行环境,但这会显著增加复杂性。 -
输入验证与清理
:虽然MCP SDK和TypeScript类型提供了一些保障,但对于像
search-codebase中的glob模式这类用户输入,要进行必要的验证,防止目录遍历攻击(如../../../etc/passwd)。glob库本身有一定防护,但谨慎起见,可以添加逻辑,确保解析后的路径仍在PROJECT_ROOT之下。
性能优化 :
-
为
search-codebase添加缓存 :对于大型代码库,频繁的文件系统遍历和内容搜索是昂贵的。可以引入一个简单的内存缓存,将(glob, pattern)的组合作为键,搜索结果作为值,并设置一个较短的TTL(如5秒)。这样,AI在短时间内对同一问题进行追问时,可以立即返回缓存结果。 -
限制搜索范围和深度
:可以在工具参数中增加
maxFiles或maxDepth选项,防止用户(或AI)无意中发起一个匹配数万文件的搜索,拖垮服务器。 - 异步与非阻塞操作 :确保所有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
工具,用来获取上次提交的变更。
-
在
src/tools/目录下创建新文件,例如git-diff.ts。 -
使用MCP SDK的
Tool类定义工具,包括名称、描述、输入参数schema(例如baseBranch字符串)和输出schema。 -
在工具的
execute函数中,使用Node.js的child_process模块执行git diff origin/main --name-only之类的命令(注意安全,可将其加入白名单逻辑或内部处理),并格式化输出。 -
在
src/index.ts中导入这个新工具,并将其注册到server实例中。 -
重新编译(
npm run build)并重启服务器。
添加一个新的资源
:
假设你想暴露项目的
README.md
内容作为一个资源。
-
在
src/resources/目录下创建新文件,例如readme-resource.ts。 -
定义一个资源模板,其URI模式可以是
project://readme。 -
实现资源的
handler函数,读取PROJECT_ROOT/README.md文件内容并以文本或JSON格式返回。 -
在
src/index.ts中注册这个新资源。
修改现有工具的行为
:
例如,你觉得默认的
search-codebase
忽略列表不够,还想忽略
.next
或
.vuepress
目录。
-
找到
src/tools/search-codebase.ts文件。 - 定位到执行文件搜索和过滤的逻辑部分。
-
在忽略数组(可能是一个叫
IGNORE_DIRS的常量)中添加你的新目录名。 - 重新编译并测试。
实操心得 :在扩展时,务必先通过MCP Inspector测试新功能,确保输入输出符合MCP协议规范,然后再集成到Cursor。TypeScript的类型系统是你的好朋友,它能帮助你在编码阶段就发现很多接口不匹配的问题。
更多推荐



所有评论(0)