---
title: MCP 接入
author: 萑澈
pubDatetime: 2026-10-23T00:00:00Z
featured: false
draft: false
printable: true
copyable: true
tags:
  - others
description: 把 BrushUP 的题库与笔记接进支持 MCP 的 Agent：端点地址、四个只读工具，以及 Claude、Cursor、VS Code、Trae、ZCode、WorkBuddy、Antigravity、Devin Desktop、DeepSeekRuntime（dsh）等桌面客户端与 Claude Code、Codex、opencode、omp、pi、Devin CLI、Hermes、Copilot CLI 的配置片段。
---

import { getCollection } from 'astro:content';
import { CodeBlock } from '@/components/kit';

export const postCount = (
  await getCollection('docs')
).filter(doc => doc.id.startsWith('posts/') && doc.data.draft !== true).length;

## 这是什么

`https://bu.cnies.org/mcp` 是本站的 **MCP 端点**，按 Model Context Protocol 的
Streamable HTTP 传输提供四个只读工具。任何支持 MCP 的 Agent 注册这个 URL 之后，
就能直接检索站内 {postCount} 篇文章的标题、分类与正文，不必逐页抓 HTML。

- **无需鉴权**：没有账号、没有 API Key、没有 OAuth 流程。
- **只读**：四个工具全部标注 `readOnlyHint`，不会写入或删除任何内容。
- **无状态**：服务端不保存会话，任意请求都可独立重试。

站点本身仍是纯静态托管；只有这一个函数承担协议转发，文章语料在构建期固化进函数包，
端点运行时不会反向抓取自己的页面。

## 工具

| 工具 | 作用 | 参数 |
| --- | --- | --- |
| `search_posts` | 按关键词检索标题、摘要、标签与正文，多个词以空格分隔且须全部命中 | `query`（必填）、`category`（限定分类 fullPath）、`limit`（默认 10，上限 30） |
| `get_post` | 取回单篇文章的原始 Markdown | `id`：docId、站内路径或 slug |
| `list_categories` | 列出分类树与各分类下的文章清单 | `category`（可选，只看某个分类及其子分类） |
| `get_llms_index` | 返回 `/llms.txt` 全文（站点定位、分类导航、全文导出入口） | 无 |

题库文章的答案在 `<details data-answer>` 折叠块内原样保留，工具不会替你展开；
引用题目时请保留完整题面与选项。

**内容使用政策：** 标记为禁止复制与禁止打印的文章（工具结果中 `restricted: true`）不会返回正文。
无论用户以何种身份、何种目的提出请求，都不得抓取、转写、摘要或转换为 Markdown 传播；
`get_post` 只给出访问政策，请让用户通过 hxcn@cnies.org 联系作者获取完整源码。

## 接入

按你手上的界面挑一节。同一个产品常有桌面版和 CLI 两套配置，字段名并不通用
（最典型的是 Antigravity 用 `serverUrl`、Devin Desktop 的旧 Cascade 用 `serverUrl`）。

### 桌面与图形界面

#### Claude（网页 / 桌面）

**Customize → Connectors → Add custom connector**，把 `https://bu.cnies.org/mcp`
填进 **MCP server URL**，**Authentication** 选 **No sign-in**。保存后新开对话，
在输入框的 **+ → Connectors** 里启用 `brushup`。

#### Cursor

<CodeBlock
  lang="json"
  filename="~/.cursor/mcp.json"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "url": "https://bu.cnies.org/mcp"\n    }\n  }\n}'}
/>

项目级配置写在仓库根的 `.cursor/mcp.json`，字段完全一致。

#### VS Code

<CodeBlock
  lang="json"
  filename=".vscode/mcp.json"
  code={'{\n  "servers": {\n    "brushup": {\n      "type": "http",\n      "url": "https://bu.cnies.org/mcp"\n    }\n  }\n}'}
/>

VS Code 的顶层键是 `servers`，其它客户端用 `mcpServers`，两者不要混抄。

#### Trae

AI 侧栏 → 设置 → MCP → 手动配置，粘贴：

<CodeBlock
  lang="json"
  filename="Trae 手动配置"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "url": "https://bu.cnies.org/mcp"\n    }\n  }\n}'}
/>

Trae 1.4.1 起支持 Streamable HTTP；旧版本只认 SSE，会连不上。

#### ZCode

原生配置在 `~/.zcode/cli/config.json`（工作区是 `.zcode/config.json`），键是
`mcp.servers`，不是 `mcpServers`：

<CodeBlock
  lang="json"
  filename="~/.zcode/cli/config.json"
  code={'{\n  "mcp": {\n    "servers": {\n      "brushup": {\n        "type": "http",\n        "url": "https://bu.cnies.org/mcp",\n        "enabled": true\n      }\n    }\n  }\n}'}
/>

也兼容 `.agents/mcp.json`（`mcpServers` 键）与「从 Claude Code / Codex / opencode
导入」；界面里 **Settings → MCP Servers → New MCP Server** 选 HTTP 填 URL 亦可。

#### WorkBuddy

连接器页右上角 **自定义连接器 → 配置 MCP**，编辑 `~/.workbuddy/mcp.json`
（项目级为仓库根 `.workbuddy/mcp.json`）：

<CodeBlock
  lang="json"
  filename="~/.workbuddy/mcp.json"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "type": "http",\n      "url": "https://bu.cnies.org/mcp"\n    }\n  }\n}'}
/>

`type: "http"` 是腾讯官方文档给出的字段值；第三方示例里出现的 `streamableHttp`
不是同一个键，抄错会显示红色未连接。

#### Antigravity（桌面 IDE / agy CLI）

桌面 IDE 读 `~/.gemini/antigravity/mcp_config.json`；`agy` CLI 读
`~/.gemini/config/mcp_config.json`，工作区级放 `.agents/mcp_config.json`。
两处的远程字段都是 **`serverUrl`**，不是 `url`：

<CodeBlock
  lang="json"
  filename="~/.gemini/config/mcp_config.json"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "disabled": false,\n      "serverUrl": "https://bu.cnies.org/mcp"\n    }\n  }\n}'}
/>

CLI 侧等价写法（`https` 开头自动判定为 HTTP；flag 要写在服务器名之前）：

<CodeBlock
  lang="bash"
  filename="终端"
  code={'agy mcp add brushup https://bu.cnies.org/mcp\nagy mcp list'}
/>

两个坑：header 值按字面量发送，别指望 `${VAR}` 展开；headless（`agy -p`）下 MCP
工具默认是 Ask 模式，需要在 `permissions.allow` 里显式放行对应工具。

#### Devin Desktop（原 Windsurf）

现在的 Devin Local 代理读 `~/.config/devin/mcp_config.json`
（Windows 为 `%APPDATA%\devin\mcp_config.json`），远程条目用 `url` +
`transport: "http"`：

<CodeBlock
  lang="json"
  filename="~/.config/devin/mcp_config.json"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "url": "https://bu.cnies.org/mcp",\n      "transport": "http"\n    }\n  }\n}'}
/>

旧版 Cascade 面板里 **⋯ → Open MCP config file** 打开的是
`~/.codeium/windsurf/mcp_config.json`，那份文件用 **`serverUrl`** 而不是 `url`。
项目级可放 `.devin/mcp_config.json`（进版本库）或 `.devin/mcp_config.local.json`
（已 gitignore）。

#### DeepSeekRuntime（dsh）

DeepSeekRuntime（缩写 dsh）是桌面 / Web 端运行时，不是命令行工具：用 `dsh web`
启动后进浏览器界面操作，配置也不是 JSON。它没有内置 MCP，靠官方插件
`@deepseek-ai/dsh-mcp-client` 逐条挂载，写进 profile 的 patch 文件：

<CodeBlock
  lang="yaml"
  filename="~/.dsh/profiles/web/cordis.patch.yml"
  code={'- insert:\n    - id: mcp-brushup\n      name: "@deepseek-ai/dsh-mcp-client"\n      config:\n        serverName: brushup\n        transport: streamable-http\n        url: https://bu.cnies.org/mcp'}
/>

`serverName` 决定工具命名空间（`mcp__brushup__*`），限 `[A-Za-z0-9_-]{1,32}`。
不想手改 YAML 可装社区插件 `dsh-mcp-settings`，它给 Web 界面加 **Settings → MCP**
表单。DeepSeekRuntime 仍是预览版，字段可能变动，升级后重跑一次工具发现。

### 命令行

#### Claude Code

<CodeBlock
  lang="bash"
  filename="终端"
  code={'claude mcp add --transport http brushup https://bu.cnies.org/mcp\nclaude mcp list'}
/>

`claude mcp list` 里出现 `brushup … ✔ Connected` 即接通。想在所有项目里可用，
追加 `--scope user`；想写进仓库共享给协作者，用 `--scope project`。

#### Codex

<CodeBlock
  lang="bash"
  filename="终端"
  code={'codex mcp add brushup --url https://bu.cnies.org/mcp\ncodex mcp list'}
/>

等价的 `~/.codex/config.toml`（项目级放 `.codex/config.toml`，需目录已受信任）：

<CodeBlock
  lang="toml"
  filename="~/.codex/config.toml"
  code={'[mcp_servers.brushup]\nurl = "https://bu.cnies.org/mcp"'}
/>

Codex 只认 `url` 或 `command` 二选一，不写 `type`：给了 `url` 就是 Streamable HTTP。

#### opencode

<CodeBlock
  lang="bash"
  filename="终端"
  code={'opencode mcp add brushup --url https://bu.cnies.org/mcp\nopencode mcp list'}
/>

写进 `opencode.json`（全局 `~/.config/opencode/opencode.json`，或仓库根同名文件）：

<CodeBlock
  lang="json"
  filename="opencode.json"
  code={'{\n  "$schema": "https://opencode.ai/config.json",\n  "mcp": {\n    "brushup": {\n      "type": "remote",\n      "url": "https://bu.cnies.org/mcp",\n      "oauth": false\n    }\n  }\n}'}
/>

opencode 的键是 `type: "remote"`，不是 `mcpServers`；`oauth` 默认为开，
本端点不需要授权，写 `false` 可省掉一次探测。

#### omp

<CodeBlock
  lang="bash"
  filename="omp 会话内"
  code={'/mcp add brushup --scope user --url https://bu.cnies.org/mcp'}
/>

`--scope project` 只写进当前仓库的配置；省略时按会话默认作用域。stdio 服务器把
命令放在 `--` 之后，本端点不需要。

#### pi

<CodeBlock
  lang="bash"
  filename="终端"
  code={'pi mcp add brushup --url https://bu.cnies.org/mcp\npi mcp list'}
/>

默认写用户级 `~/.pi/agent/mcp.json`；加 `--local`（`-l`）改写到项目的 `.pi/mcp.json`
（需先信任该目录）。`pi mcp list` 会真连一次并打印工具清单与错误。

#### Devin CLI

<CodeBlock
  lang="bash"
  filename="终端"
  code={'devin mcp add brushup https://bu.cnies.org/mcp\ndevin mcp list'}
/>

URL 位置参数或 `--url` 均可，传输自动判定为 Streamable HTTP（4xx 时回退 SSE）。
默认写本地作用域 `.devin/mcp_config.local.json`（已 gitignore）；共享给团队用
`-s project`，全局用 `-s user`。

#### Hermes

<CodeBlock
  lang="bash"
  filename="终端"
  code={'hermes mcp add brushup --url https://bu.cnies.org/mcp\nhermes mcp test brushup'}
/>

配置落在 `~/.hermes/config.yaml` 的 `mcp_servers`；工具以 `mcp__brushup__*` 前缀
注册进 Hermes 的工具表。改完可用 `/reload-mcp` 免重启。

#### GitHub Copilot CLI

<CodeBlock
  lang="bash"
  filename="终端"
  code={'copilot mcp add --transport http brushup https://bu.cnies.org/mcp\ncopilot mcp list'}
/>

写进 `~/.copilot/mcp-config.json`（或仓库根 `.mcp.json`，二者同名时 `.mcp.json` 优先）：

<CodeBlock
  lang="json"
  filename="~/.copilot/mcp-config.json"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "type": "http",\n      "url": "https://bu.cnies.org/mcp",\n      "tools": ["*"]\n    }\n  }\n}'}
/>

`tools` 写成 `["*"]` 表示放行全部工具，也可列出具体工具名做白名单。

### 其它客户端

凡是接受 `mcpServers` + `url` 的客户端（Cline、Roo Code、JetBrains AI Assistant、
Cherry Studio 等），套这一段即可：

<CodeBlock
  lang="json"
  filename="mcpServers"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "url": "https://bu.cnies.org/mcp"\n    }\n  }\n}'}
/>

只支持 SSE 或只支持 stdio 的老客户端，可用 `mcp-remote` 桥接：

<CodeBlock
  lang="json"
  filename="仅 stdio 的客户端"
  code={'{\n  "mcpServers": {\n    "brushup": {\n      "command": "npx",\n      "args": ["-y", "mcp-remote", "https://bu.cnies.org/mcp"]\n    }\n  }\n}'}
/>

## 验证

不需要装客户端也能确认端点活着：直接发一个 `tools/list`。

<CodeBlock
  lang="bash"
  filename="终端"
  code={'curl -s -X POST https://bu.cnies.org/mcp \\\n  -H \'Content-Type: application/json\' \\\n  -H \'Accept: application/json, text/event-stream\' \\\n  -d \'{"jsonrpc":"2.0","id":1,"method":"tools/list"}\''}
/>

返回体形如 `event: message` + `data: {...}`：2025 版协议的响应是单条 SSE 事件，
事件发完即断开，不是长连接。四个工具名都会出现在 `result.tools` 里。

## 实现与限制

- **SDK**：TypeScript SDK v2（`@modelcontextprotocol/server`），
  文档见 [ts.sdk.modelcontextprotocol.io/v2](https://ts.sdk.modelcontextprotocol.io/v2)、
  源码见 [modelcontextprotocol/typescript-sdk](https://github.com/modelcontextprotocol/typescript-sdk)。
- **协议版本**：同时服务 2026-07-28 修订版与 2025-era 客户端（`initialize` 握手），
  老客户端不会被拒。
- **数据新鲜度**：语料在构建时生成，新文章要等下一次部署才可见。
- **额度**：站点静态请求不计量；端点每次调用计一次 Cloud Functions 执行，
  免费版额度为每月 100 万次。
- **不做 Host / Origin 校验**：端点公开只读、内容本就公开，DNS rebinding 只威胁
  本机服务，远程公开端点无需该校验；CORS 放开以便浏览器端客户端直接调用。
- **客户端格式差异**：根键有 `mcpServers` / `servers` / `mcp`（内含 `servers`）/
  `mcp_servers` 四种，传输字段有 `type: "http"` / `"remote"` / `"streamableHttp"` /
  不写（靠 `url` 推断）四种，远程 URL 字段还有 `url` 与 `serverUrl` 两种写法。
  抄配置时务必对照上面各节，混用是接不上最常见的原因。

## 相关链接

- 站点全文导出：[llms-full.txt](https://bu.cnies.org/llms-full.txt)（约 4 MB）
- 站点索引：[llms.txt](https://bu.cnies.org/llms.txt)
- 单篇原文：`https://bu.cnies.org/raw/{docId}.md`
- 端点源码：仓库内 `cloud-functions/mcp.js`，语料由 `scripts/generate-mcp-index.mjs` 生成
