Repository navigation
v0.6.0
发现类方法不再需要凭证
上一版给 /mcp 加 server card,是为了在不放宽 /mcp 鉴权的前提下让 agent 做连接前发现。这一版走了另一条路:直接让 /mcp 的元数据方法匿名可用。
起因是给市场提交时被拒——它们的检测器一律先发 initialize 再发 tools/list,不带任何凭证,而我们对每个请求都要求 Bearer,第一步就 401。查过 MCP 规范和 Anthropic 目录的要求,两边都没有规定发现类方法必须免鉴权,原来的行为是合规的;卡住我们的是检测器不走 OAuth discovery。
放开的判断依据是:工具和资源描述符本来就公开在仓库 manifest、server card 和 MCP Registry 上,对 tools/list 收着实际上没有保护到任何东西。
免鉴权的方法:initialize、notifications/initialized、ping、server/discover、tools/list、prompts/list、resources/list、resources/templates/list、resources/read。
判定一律 fail-closed:方法名同时从 mcp-method 头和 body 收集,全部在白名单里才放行;头和 body 不一致、batch 里混入非白名单方法、非 POST、body 解析不出 method——任何一条都退回鉴权路径。
工具调用完全没变
仍然 401 + WWW-Authenticate,仍然逐请求回源校验,仍然按用户计量。带了凭证就一定校验,包括发现类方法——所以过期 token 打 initialize 依旧触发 OAuth 挑战,客户端的重新授权时机不受影响。
另外加了一层防御:toolCredential() 在没有凭证时返回一个会抛错的 provider,而不是 undefined。否则 api.ts 的 apiKey || API_KEY 会回退到服务端自己的 SEARCH1API_KEY——将来万一分流写漏,未授权调用会记在运维账上。现在漏了只会报错。
stdio 不再硬退出
npx search1api-mcp 在未设置 SEARCH1API_KEY 时会 process.exit(1),transport 都没起来。客户端和目录工具探测新装的包时拿到的是一根死管道,而不是"缺少凭证"。
现在照常启动并返回工具元数据,只在调用工具时拒绝,错误信息直接说明要设哪个环境变量。
畸形请求返回 JSON-RPC
body 解析失败时 Express 会渲染 HTML 错误页。MCP 客户端和目录校验器只解析 JSON-RPC,多家市场把"返回 HTML 错误页"直接列为拒绝理由。现在返回 {"jsonrpc":"2.0","error":{"code":-32700,...},"id":null},5xx 收敛为 -32603。
修复 v0.5.4 的 Registry 发布失败
server.json、plugin.json、.cursor-plugin/plugin.json 当时仍停在 0.5.3,而 package.json 已是 0.5.4。mcp-registry.yml 里有 test "$SERVER_VERSION" = "$PACKAGE_VERSION",那次 Publish to MCP Registry 在 11 秒内失败——npm 发布成功,但 Registry 至今仍显示 0.5.3。
本版六个 manifest 全部对齐 0.6.0,Registry 会一并更新。
Full Changelog: v0.5.4...v0.6.0