使用说明
Vercel上的Express MCP服务器(天气)
使用Express构建的模型上下文协议(MCP)服务器,该服务器提供了由美国国家气象局(NWS)API支持的天气工具。随附可流式传输的HTTP传输和示例代理脚本,用于本地测试或部署测试。
这个应用的作用
- 暴露MCP工具 通过HTTP访问
POST /mcp针对AI代理/客户端。 - 可用的工具 (在……中定义
src/create-server.ts):- 获取警报获取美国某州的实时天气警报。输入:
{ state: "CA" }(2字母代码)。 - 获取天气预报获取纬度/经度的天气预报。输入:
{ latitude: 37.7749, longitude: -122.4194 }。
- 获取警报获取美国某州的实时天气警报。输入:
- 使用NWS API (
api.weather.gov) 具有可配置的User-Agent。
架构概述
- **
src/index.ts**Express 启动、CORS(跨域资源共享)、静态文件、MCP 路由(POST /mcp,GET /mcp,DELETE /mcp)。 实现了基于会话的可流式传输HTTP传输:新会话被创建并存储在initialize;后续请求将重用已存储的传输(或“已存储的传输方式”)mcp-session-id。 - **
src/create-server.ts**创建McpServer,寄存器get-alerts并且get-forecast使用Zod验证输入,调用NWS(美国国家气象局),并格式化结果。 - **
public/**静态资源。 - **
build/**编译后的JS输出(请勿直接编辑)。 - **
scripts/agent.mjs**一个最小化连接的代理/mcp并运行一个提示(服务器分配会话ID)。 - **
scripts/multi-agent.mjs**同时运行两个代理;每个代理都有自己的MCP HTTP会话(由服务器分配)。 - **
scripts/vercel-ai-agent.mjs**使用Vercel AI SDK的MCP客户端来发现此服务器上的工具。
交通: 可流式传输的HTTP 来自 @modelcontextprotocol/sdk,这需要一个MCP(多点控制单元) initialize 在调用工具之前进行握手。服务器分配会话ID;客户端不得硬编码或预先生成它们。
先决条件
- Node 18或更高版本(推荐使用Node 20)
- pnpm(首选)
本地安装并运行
pnpm install
pnpm dev
# Server listens on http://localhost:3000
构建并运行编译后的包:
pnpm build
pnpm start
环境变量(通过 dotenv 在 src/index.ts 和 scripts/*.mjs):
PORT(可选):默认为3000.OPENAI_API_KEY(需使用OpenAI模型运行示例代理脚本)。MCP_URL(脚本中可选):例如。http://localhost:3000/mcp或者您已部署的/mcpURL(统一资源定位符)。AGENT_PROMPT,AGENT_A_PROMPT,AGENT_B_PROMPT(可选):自定义脚本提示。
创建一个 .env 根据需要,在仓库根目录中:
OPENAI_API_KEY=sk-...
MCP_URL=http://localhost:3000/mcp
使用MCP Inspector(图形用户界面)进行测试
- 安装/运行 MCP检查器。
- 使用以下方式连接:
- 交通HTTP
- URL(统一资源定位符):
http://localhost:3000/mcp(或你已部署的/mcp)
- 检查器处理MCP握手和头部信息,并允许您交互式地调用工具。
使用提供的代理脚本进行测试
这些脚本使用OpenAI Agents SDK和Vercel AI SDK来连接到MCP服务器并运行提示。服务器在MCP握手过程中分配会话ID。
- 单一代理(默认提示要求CA警报):
pnpm agent
# or override the prompt
AGENT_PROMPT="Forecast for 37.7749,-122.4194" pnpm agent
- 脚本:
scripts/agent.mjs
- 多代理(两个代理,独立会话,并发执行):
pnpm agents:multi
# with prompt overrides
AGENT_A_PROMPT="List tools with schemas" \
AGENT_B_PROMPT="Forecast for 40.7128,-74.0060" \
pnpm agents:multi
- 脚本:
scripts/multi-agent.mjs
- Vercel AI SDK MCP 客户端(工具发现):
pnpm vercel:agent
- 脚本:
scripts/vercel-ai-agent.mjs
使用curl进行测试(高级)
Streamable HTTP传输需要同时满足以下两个条件:
Accept: application/json, text/event-stream- 一个MCP(Multi-Channel Processor,多通道处理器)
initialize在任何(行动)之前先握手tools/*(电话)呼叫
因为使用curl管理会话/握手容易出错,所以建议使用Inspector或脚本。如果您仍然想尝试使用curl,请确保:
- 包含 Accept 请求头。
- 执行
initialize首先,并在后续调用中重用同一个会话。
列出工具(未初始化时将失败):
curl -s http://localhost:3000/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
部署(Vercel)
- 通过Vercel按钮或您的工作流程进行部署。确保
/mcp路由可达。 - 在客户端中使用您的部署URL:
https://<your-deployment>.vercel.app/mcp。 - 冷启动:此服务器现在等待初始化后才能提供服务
/mcp减少“服务器未初始化”的响应。
NWS注:
USER_AGENT在src/create-server.ts如果你发布这个,应该将其更新为你自己的标识符。
故障排除
-
不可接受:客户端必须同时接受 application/json 和 text/event-stream
- 添加标题:
-H 'Accept: application/json, text/event-stream'
- 添加标题:
-
错误请求:服务器未初始化
- 您的客户必须执行MCP(最小化兼容协议/流程,具体含义根据上下文确定)
initialize首先进行握手。服务器将分配一个会话ID;客户端应在后续请求中重用该ID。检查器和提供的脚本会自动处理这一过程。
- 您的客户必须执行MCP(最小化兼容协议/流程,具体含义根据上下文确定)
-
无效请求:服务器已初始化
- 您尝试对一个已存在的可流式传输HTTP会话进行重新初始化。请不要发送第二个(请求/初始化)
initialize对于同一个会话;相反,应重用服务器返回的会话ID。
- 您尝试对一个已存在的可流式传输HTTP会话进行重新初始化。请不要发送第二个(请求/初始化)
-
客户端提供的会话ID失败
- 不要预先生成
sessionId客户端。让服务器在期间分配它initialize,然后在后续请求中通过(某种方式)将其包含进去mcp-session-id头部(SDK 会为您处理这部分)。
- 不要预先生成
-
端口3000正在使用中
- 终止正在使用该进程的程序,或者设置
PORT在.env并重新启动。
- 终止正在使用该进程的程序,或者设置
-
zod 的同级依赖警告
- 你可以对齐版本,例如:。
pnpm add zod@^3.25.40,但在本地测试时它是非阻塞的。
- 你可以对齐版本,例如:。
项目脚本
pnpm dev– 在TypeScript中启用watch + nodemonbuild/index.js。pnpm build– 编译为build/。pnpm start– 运行编译后的服务器。pnpm agent– 使用HTTP上的MCP(可能是指某种通信协议或中间件)的单代理示例。pnpm agents:multi– 两名代理同时进行,各自拥有独立会话。pnpm vercel:agent– Vercel AI SDK 客户端,用于连接 MCP 服务器并发现工具。
API终端点
POST /mcp– 可流式传输的HTTP MCP端点。用于初始化和JSON-RPC方法调用。GET /mcp– 为当前会话流式传输响应。DELETE /mcp– 关闭当前会话。
回购指南
以下 TypeScript 源代码 src/不要编辑 build/使用 pnpm 进行安装。环境通过 dotenv. 见 AGENTS.md 关于存储库规范和注意事项。
要深入了解会话管理的变化以及如何避免常见陷阱,请参阅 docs/session-management-fix.md。