技术博客
把链接读取接进 MCP:在 Cherry Studio、ChatBox 里让模型自己读公开网页

把链接读取接进 MCP:在 Cherry Studio、ChatBox 里让模型自己读公开网页

作者: 万维易源
2026-09-15
链接读取MCPAI客户端Cherry StudioAgent 集成
# 把链接读取接进 MCP:在 Cherry Studio、ChatBox 里让模型自己读公开网页 接口:链接读取(apiCode=3262)· MCP 端点:`http://www.showapi.com.cn/mcp/3262/{your_appKey}` · 计费:50 厘/次 · 适用人群:用 AI 客户端的用户与 Agent 开发者 · 阅读时间:约 8 分钟 · 最后实测核对:2026-09-15 ## 核心要点 - 链接读取提供接口级 MCP 服务,一个公网 URL 就够,不用自己部署任何东西。 - 工具名是中文的「获取网页正文」,返回的是**原始 JSON 信封字符串**,不是解析好的正文——模型得自己再解一层。 - 服务端要求回传 `Mcp-Session-Id` 响应头,不回就是 HTTP 400。正规 MCP 客户端会自动处理,手写客户端要留意。 ## 为什么走 MCP 你已经有一个支持 MCP 的 AI 客户端,想让模型自己去看某个公开网页。 不走 MCP 的话,你得写个脚本调接口、把结果贴进对话框。走 MCP,模型在需要的时候自己去读,读完接着往下想。少一层人工搬运。 链接读取的 MCP 服务是接口级的,配一次覆盖本接口的全部接入点(目前就一个)。 ## 配置 把页面给出的这段 JSON 里 `{your_appKey}` 换成你的真实 AppKey: ```json { "mcpServers": { "showapi-mcp-3262": { "url": "http://www.showapi.com.cn/mcp/3262/{your_appKey}" } } } ``` Cherry Studio、ChatBox 这类客户端都提供"添加自定义 MCP 服务器"的入口,选流式 HTTP / SSE 类型,把上面那个 URL 粘进去即可。具体菜单名和字段位置各版本会有差异,认准「服务地址 / URL」这一项填对就行。 有些客户端不支持直接把 AppKey 写在 URL 里,那就用等价的 JSON 配置方式导入。 配好之后确认两件事:客户端把服务识别成了 MCP(不是普通 HTTP 接口),以及工具列表里出现了「获取网页正文」。 **未实测提示**:本次实测的是协议层(下面几节都是真实请求),**没有在 Cherry Studio / ChatBox 的图形界面里实际配置过**。界面步骤请以你所用版本的客户端为准。 ## 协议层实测:它到底怎么工作 下面这些是 2026-09-15 用真实请求跑出来的,MCP 端点与 HTTP 端点为同一个接口,返回同一份正文。 ### 握手 ```bash curl -X POST "http://www.showapi.com.cn/mcp/3262/YOUR_APPKEY" \ -H "Content-Type: application/json" \ -H "Accept: application/json, text/event-stream" \ -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"demo","version":"1.0"}}}' ``` 真实返回: ```json {"jsonrpc":"2.0","result":{"protocolVersion":"2024-11-05","instructions":"Hello, MCP!","serverInfo":{"name":"lua-resty-mcp","version":"2.0"},"capabilities":{"prompts":{"listChanged":true},"tools":{"listChanged":true},"completions":{},"resources":{"subscribe":true,"listChanged":true},"logging":{}}},"id":1} ``` 响应头里带一个 `Mcp-Session-Id`,例如 `aqiwjA9jzK8CAIlx`。 ### 会话头必须回传 这是接入时最先遇到的一项协议要求。缺少 `Mcp-Session-Id` 直接调 `tools/call`,服务端返回 **HTTP 400 Bad Request**。 ```bash # 先 initialize 拿到 Mcp-Session-Id,后续每个请求都要带上 -H "Mcp-Session-Id: <initialize 返回的那个值>" ``` 标准 MCP 客户端会自动维护这个头。自行实现客户端调测时需要手动带上。 ### 工具列表 ```bash -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' ``` 真实返回(SSE 格式,报文逐字原样,未作改动): ``` data:{"jsonrpc":"2.0","result":{"tools":[{"description":"获取网页正文功能当前适用于UTF-8编码的网页。","name":"获取网页正文","inputSchema":{"properties":{"url":{"description":"要获取的网页URL","type":"string"},"content-type":{"description":"","type":"string"}},"type":"object"}}]},"id":1} ``` 三点值得注意: - 工具名是**中文**的 `获取网页正文`。绝大多数客户端能用,但如果你要写代码按名字匹配工具,记得用这个中文名。 - `inputSchema` 里列了 `url` 和 `content-type` 两个属性,**没有 `required` 数组**。也就是说从 schema 看不出 `url` 是必填的,但实际不传会失败。 - 响应体是 `text/event-stream`,格式是 `data:{...}` 加一行 `id:1`。客户端要按 SSE 解帧,不能直接 `JSON.parse` 整个 body。 ### 调用工具 ```bash -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"获取网页正文","arguments":{"url":"https://www.showapi.com/apiGateway/view/3262"}}}' ``` 真实返回(已截断): ```json {"jsonrpc":"2.0","result":{"content":[{"text":" {\n \"showapi_res_error\": \"\",\n \"showapi_res_id\": \"6aa8b718fb638c2f69f06794\",\n \"showapi_res_code\": 0,\n \"showapi_fee_num\": 1,\n \"showapi_res_body\": {\"output\":\"API市场/企业服务/链接读取\\n\\n链接读取\\n\\n# 链接读取\\n\\n官方自营\\n……\"}\n }\n"}]}} ``` (上面的报文是接口原样返回。前导空格、转义方式和信封结构都未改动,只在 `output` 中间做了截断。) 这就是最需要留意的地方:**`content[0].text` 是一整段 JSON 字符串,不是正文本身。** 里面还带着接口原始返回的前导空格和换行。 模型拿到它之后得再做一次解析,剥出 `showapi_res_body.output`。返回里**没有 `structuredContent`**,也没有把 `output` 单独放一个字段。 对比一下 HTTP 直连的返回:同一个 URL(本接口自己的产品详情页),HTTP 端点返回的 `output` 与 MCP 返回的那份 JSON 内容一致,`showapi_fee_num` 都是 `1`。也就是说 MCP 这层是薄的,它把原始信封原样递过来了。 ## 让模型用起来 服务配好之后,在对话里直接说要做什么就行。工具描述是中文的,模型匹配起来没障碍。几个能用的说法: - "帮我读一下这个页面,总结要点:https://..." - "把这个网址的正文整理成 Markdown 存到文档里" - "对比这两个页面,看它们的区别" - "读一下这个公告页,找出里面提到的所有日期" 模型会自己决定要不要调工具。有些客户端会弹确认框,接受一次之后就顺了。 有个小技巧:如果你的客户端支持提示词,可以加一句约束——"拿到的是 JSON 字符串,请先取出 `showapi_res_body.output` 字段再阅读"。这样能减少模型把整段 JSON 当正文念给你听的情况。 ## 计费与配置说明 **计费按次。** MCP 这一层不额外计费;模型每读一个页面,后端走一次 3262-1,计 1 次、50 厘。批量使用前按调用次数估算规模即可。 **`output` 为空时传给模型的是空串。** 模型可能把它理解成"这个页面没有内容"。可以在客户端提示词里加一句约束——"拿到的是 JSON 字符串,请先取出 `showapi_res_body.output` 字段再阅读",让模型先判断字段值。返回值语义与结果判断见 [链接读取返回结构说明与结果判断](https://www.showapi.com/guides/link-read-empty-output-3262)。 **AppKey 会出现在客户端配置文件里。** MCP 服务地址含 `{your_appKey}`,配置文件因此带密钥。共享设备上建议对该配置文件单独管理,不并入通用的同步目录或团队仓库。 ## FAQ **Q1:MCP 和直接调 HTTP 接口有什么区别?** 同一份数据,两种投递方式。HTTP 直连给你干净的 JSON;MCP 把原始 JSON 信封包成字符串塞进 `content[0].text`,让 AI 客户端能直接消费。功能和计费完全一致,选哪个取决于你的调用方是不是 AI 客户端。 **Q2:为什么调用 MCP 会报 400?** 最常见的原因是没回传 `Mcp-Session-Id`。实测中省略这个头直接调 `tools/call`,服务端返回 HTTP 400。必须先用 `initialize` 拿到会话 ID,后续每个请求都带上。 **Q3:MCP 返回里为什么没有 `structuredContent`?** 实测返回只有 `content[0].text` 这一个字段,里面是一整段 JSON 字符串。这意味着调用方(或模型)需要自己解析一层。 **Q4:工具名是中文的,会不会有兼容问题?** 实测在协议层用中文名调用成功。规范允许工具名使用非 ASCII 字符,主流客户端也能正常列出。需要调整的地方在调用方代码里——若存在按英文名匹配工具的逻辑,应改为 `获取网页正文`。 **Q5:MCP 服务覆盖几个接入点?** 页面标注是接口级,覆盖本接口全部接入点。链接读取目前只有 1 个接入点(获取网页正文)。 ## 下一步阅读 - 返回字段与结果判断 → [链接读取返回结构说明与结果判断](https://www.showapi.com/guides/link-read-empty-output-3262) - 把返回的 Markdown 收拾干净 → [链接读取的 output 到底是什么格式](https://www.showapi.com/guides/link-read-markdown-output-3262) - 第一次用 HTTP 方式调用 → [链接读取:用 Python 读取任意公开网页的正文](https://www.showapi.com/guides/link-read-quickstart-3262) - **本系列共 6 篇**:查看[链接读取指南总目录](https://www.showapi.com/guides/link-read-guides-3262)