用单个无状态函数实现远程 MCP
作者介绍如何不用 MCP SDK,以单个 Vercel 函数和 Clerk OAuth 提供仅含工具的远程 MCP 服务。协议层采用无状态 JSON-RPC 请求响应,并明确通知、HTTP 方法及不支持流式传输等边界。
原文暂未完整获取,基于公开信息的快读
Joyrise 团队把文章运营能力接入 MCP,让用户通过 Claude、ChatGPT、Cursor 等客户端查询文章表现、安排选题或暂停发布。他们没有使用 MCP SDK,而是用单个 Vercel 函数处理无状态请求,并通过 Clerk OAuth 完成认证。这套实现只提供工具调用,明确舍弃了会话和流式传输。
目前能确认什么
协议层采用 JSON-RPC:每个 POST 携带一条消息,返回 JSON;没有 id 的通知返回 202,响应体为空。GET 和 DELETE 返回 405,不提供 SSE 流,也不维护会话。代码处理初始化、连通性检查、工具列表和工具调用,并为旧协议版本保留批量请求兼容。
无状态指请求之间不依赖服务端保存的会话,不代表业务没有数据库或账户状态。
认证也不只是校验一个 token。客户端先发现受保护资源元数据,再找到 Clerk 完成注册、登录和授权。团队只接受带用户身份的 OAuth access token;认证服务不可达时返回 503,避免用 401 误导客户端重新登录。
工具复用应用已有的服务函数,但团队把原先仅由界面限制的操作顺序下沉到了服务层,例如未完成引导不能恢复发布。
我的判断
这份实现最有参考价值的,是把协议范围收窄,并让业务规则独立于界面成立。
对已有后端的程序员,接入 MCP 可以从封装服务函数开始。但助手能按任意顺序调用工具,按钮隐藏、页面跳转这些限制,都需要服务层重新检查。
「协议层约 60 行」不能当作完整接入成本。认证发现、token 类型识别、客户端兼容和错误表达,同样需要处理。
现有节选还不足以确认完整的参数校验、业务错误映射及各客户端兼容情况。团队未来需要 resources、prompts 或 streaming 时会重新审视方案,也不能据此认定这些能力都必须依赖有状态服务。