如何使用Node.js、Express和MongoDB构建奖学金研究MCP服务器

如何使用Node.js、Express和MongoDB构建奖学金研究MCP服务器

💡 原文英文,约5100词,阅读约需19分钟。
📝

内容提要

本文介绍如何用Node.js、Express和MongoDB构建一个奖学金研究MCP服务器。该服务器通过九个工具(搜索、匹配、保存、笔记等)让AI助手查询奖学金目录、匹配学生条件并管理研究流程。文章涵盖架构设计、数据建模、工具注册、HTTP服务部署及测试方法,强调让服务器负责数据真实性,模型仅负责推理规划。

🔎

延伸解读

为何将数据逻辑放在服务器端

文章强调,MCP服务器应负责数据真实性,模型仅负责推理规划。通过将搜索、匹配等逻辑放在服务层,可避免模型“幻觉”出不符合条件的奖学金。例如,匹配工具会返回得分和原因,确保解释有据可依。这种设计模式适用于任何需要可靠数据查询的AI应用,而不仅是奖学金研究。

MCP工具设计的关键细节

工具描述需面向模型,使用Zod定义输入模式,并利用注解(如readOnlyHint)帮助宿主决定是否自动批准操作。返回结果应包含MongoDB ID,便于后续工具引用。此外,需对用户输入进行转义,避免正则表达式错误,并验证ID有效性,防止无效ID导致传输错误。

安全与部署注意事项

服务器默认绑定127.0.0.1,并通过Host/Origin检查防止DNS重绑定攻击。若部署到网络,需设置allowedHosts、启用TLS并要求Bearer令牌。文章提醒,开放的MCP服务器相当于开放数据库,必须谨慎保护。本地开发时,也应避免在配置文件中暴露数据库凭据。

Q&A

如何用Node.js、Express和MongoDB构建一个奖学金研究MCP服务器?

构建步骤包括:初始化Node.js项目并安装依赖(@modelcontextprotocol/server、@modelcontextprotocol/express、@modelcontextprotocol/node、express、mongoose、zod、dotenv);连接MongoDB;定义奖学金、已保存奖学金和研究笔记三个集合的Mongoose模型;编写奖学金服务层(搜索、匹配、保存、笔记等);注册九个MCP工具(search_scholarships、get_scholarship、match_scholarships等);暴露资源和提示;用Express通过Streamable HTTP提供MCP服务;最后用种子数据填充目录并测试。

MCP服务器中工具、资源和提示有什么区别?

工具是模型决定调用的动作,如搜索、保存、比较;资源是主机可以读取并附加为上下文的数据,如目录URI和单个奖学金URI;提示是命名模板,通常由用户通过斜杠命令或菜单调用,如研究计划提示。工具用于操作,资源用于提供数据,提示用于启动工作流。

为什么在奖学金研究MCP服务器中要使用MongoDB?

MongoDB适合存储奖学金目录,因为每个奖学金是一个文档,包含嵌套数组(如研究领域、公民身份、要求)。它还支持保存列表和研究笔记的持久化,使工作流跨会话保留。此外,MongoDB的查询能力便于实现过滤和匹配逻辑。

如何实现奖学金匹配逻辑?

匹配逻辑在服务层实现:加载所有开放奖学金,然后应用硬性过滤器(如教育水平、GPA、公民身份、仅限第一代、仅限女性),不满足条件的跳过;对剩余奖学金根据匹配程度打分(如教育水平匹配+20,GPA达标+15,领域匹配+30等),并返回得分和原因数组,以便模型解释匹配结果。

如何通过Express提供MCP服务?

使用@modelcontextprotocol/express的createMcpExpressApp创建Express应用,并配置allowedHosts;使用createMcpHandler创建MCP处理器,并通过toNodeHandler适配到Node的req/res;在/app/mcp路由上处理POST和GET请求;启动时先连接数据库,然后监听端口。

如何测试MCP服务器?

测试方法包括:启动服务器后,用curl发送JSON-RPC请求到/mcp端点,例如tools/list和tools/call;也可以使用MCP Inspector图形界面连接服务器进行测试;还可以运行项目中的smoke-test.js脚本。

如何将MCP服务器连接到Cursor或Claude Desktop?

对于Cursor,在MCP设置中添加服务器条目,指定URL为http://127.0.0.1:3000/mcp;对于Claude Desktop,在配置文件中添加服务器,使用mcp-remote桥接HTTP服务器,命令为npx -y mcp-remote http://127.0.0.1:3000/mcp。

为什么在MCP服务器中要使用Zod进行输入验证?

Zod用于定义工具输入模式,SDK会将其转换为JSON Schema供主机宣传给模型,并在调用工具前自动验证参数,确保类型正确,避免无效输入进入处理程序。

🏷️

标签

➡️

继续阅读