关于 agents-mcp
agents-mcp 是用于判断何时采用 MCP、在 Claude Code 或 Codex 中配置服务,以及设计小范围自定义服务的技能。它强调核对最新协议规范、验证服务访问并在推广前管控权限。
主要功能
- 01MCP 采用决策指南
- 02Claude Code 与 Codex 配置
- 03自定义服务设计建议
- 04服务健康与访问检查
- 05安全和部署检查清单
适用场景
- 01评估工作流是否需要 MCP
- 02在 Claude Code 或 Codex 中添加现有服务
- 03为重复工作流规划小范围服务
MCP 相关
该技能协助在 Claude Code 和 Codex 中配置 MCP 服务、检查健康状态与权限,并规划自定义服务实现。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ vasilyu1983/ ai-agents-public --skill agents-mcp安装后在 Claude Code 中输入/agents-mcp确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
learnings.consolidated.mdlearnings.mdagents/openai.yamldata/sources.jsonversions.jsonreferences/mcp-custom.mdmcp-evaluation.mdmcp-for-dwh.mdmcp-knowledge-serving.mdmcp-patterns.mdmcp-security.mdmcp-servers.mdtransport-auth-matrix.mdscripts/mcp_health_check.shtest_mcp_health_check.py详细介绍
MCP(Model Context Protocol)
使用此技能可判断 MCP 是否是合适的抽象方式、在 Claude Code 或 Codex 中配置现有服务,或在重复的 Agent 工作流确有需要时构建一个精简的自定义服务。
协议修订版本需要查询,而不是一成不变的常量。构建或迁移服务前,请打开 modelcontextprotocol.io/specification 上列出的最新修订版本,阅读其变更日志和已弃用功能注册表,并记录服务所针对的修订版本。答案将决定下文哪些结构适用,以及哪些功能属于迁移负担。
需要了解的重大边界变化:2026-07-28 修订版相较于 2025-11-25 重新设计了协议(变更日志):
- 无状态协议。
initialize/notifications/initialized握手和Mcp-Session-Id标头已移除(SEP-2567、SEP-2575)。每个请求都会在_meta中携带协议版本和客户端能力;强制要求的server/discoverRPC 会公布支持的版本和身份信息。需要跨调用状态的服务会创建显式句柄,并将其作为普通工具参数传递。 - Roots、Sampling 和 Logging 已弃用(SEP-2577):仍可使用,但新实现不应采用。应分别迁移到工具参数中的目录或资源 URI、直接调用 LLM 提供商 API,以及 stderr 或 OpenTelemetry。
- 已移除服务端发起的请求。
roots/list、sampling/createMessage和elicitation/create已被 Multi Round-Trip Requests(MRTR)取代:服务端返回resultType: "input_required"和inputRequests,客户端携带inputResponses重试原始请求。 - 传输变更。 HTTP GET 端点和
resources/subscribe/unsubscribe合并为一个subscriptions/listen流;SSE 恢复能力(Last-Event-ID)已移除,因此流中断意味着需要使用新的 ID 重新发出请求。ping和logging/setLevel已移除。HTTP+SSE 传输已正式弃用;请使用 Streamable HTTP。
弃用时钟是规划时的重要依据。 规范定义了正式的功能生命周期(Active / Deprecated / Removed),弃用期至少为十二个月(SEP-2596)。任何基于已弃用功能构建的内容都有明确的生命周期上限:从一开始就应将其视为迁移负担。弃用期只是最低期限,并非承诺的移除日期;请查询注册表了解当前状态。
SDK 发布系列与规范独立演进。哪个 SDK 主版本针对哪个修订版本,以及旧系列能获得多长时间的修复支持,都需要查阅 SDK 仓库的 README(参见构建自定义服务)。
治理(影响供应商信任,而非技术判断):Anthropic 于 2025 年 12 月将 MCP 捐赠给 Agentic AI Foundation——Linux Foundation 旗下的定向基金(blog.modelcontextprotocol.io/posts/2025-12-09-mcp-joins-agentic-ai-foundation)。维护者通过 SEP 流程保留技术决策权。安全审查询问“谁拥有此协议”时,应引用该基金会,而非 Anthropic。
快速参考
- 当你需要跨会话复用、明确的权限、发现能力或稳定的工具契约时,使用 MCP
- 构建自定义基础设施前,优先考虑现有的官方服务或由供应商维护的服务
- 默认先进行低成本健康检查,再信任服务
- 构建尽可能精简的工具接口,并对写入权限进行限制
何时使用 MCP
- 为 Agent 重复访问数据库、文件系统或 SaaS 工具
- 为 Agent 工作流复用内部 API 封装
- 需要在多个客户端之间保持稳定契约的共享远程服务
- 通过明确的工具提供记忆、笔记库或仓库上下文检索
不要将 MCP 用于一次性 HTTP 调用,也不要在简单的直接工具就能满足需求时使用庞大的通用封装。
选择能完成任务的最轻量方案,优先顺序如下:当规则或钩子必须在每条匹配路径或事件中无须判断地触发时,使用规则或钩子;仅在需要时加载操作手册时,使用技能;多个客户端需要反复调用结构化工具接口时,使用 MCP;执行简单的本地操作时,使用本地 CLI 或脚本;执行单个范围明确的远程步骤时,直接调用 API。
只有同时满足以下两点时,才为所有人默认启用服务:(1)几乎所有使用该开发框架的用户都需要它;(2)该任务需要 MCP 提供的能力(会话状态、流式传输、身份验证握手、结构化浏览),而非可由封装在技能中的 CLI 处理的无状态请求与响应。如果任一点不满足,就按项目选择启用:除非已确认启用延迟加载,否则默认服务的工具架构会加载到每个会话中,无论是否使用。
默认设置
- 本地或私有服务:
stdio - 共享远程服务:Streamable HTTP(规范推荐的远程传输方式;HTTP+SSE 已弃用)
- 独立 SSE 传输:仅作为兼容性回退方案
- 注册表发现:优先使用官方注册表
- 授权:协议层面可选;通过 HTTP 实现时,必须使用带 PKCE(S256)的 OAuth 2.1,并满足规范中另外三项同样强制、但容易忽略的要求:每个授权请求和令牌请求都要包含 Resource Indicators(RFC 8707);在服务端的
/.well-known/oauth-protected-resource提供受保护资源元数据(RFC 9728);将 Client ID Metadata Documents 作为主要的客户端注册机制(Dynamic Client Registration 现仅用于向后兼容)。纯 OAuth 2.0 不符合规范。请参阅 references/mcp-security.md。 - SDK 指引:查阅 SDK 仓库中与你安装的主版本对应的 README 和迁移指南;将预览版 SDK 视为观察名单项目
- 工具失败:将其作为工具结果返回,并设置
isError: true,而不是作为协议错误返回(参见工具结果契约) - 延迟加载工具:Claude Code 的一项功能,其默认行为、提供方支持情况和设置会随版本变化;请查阅相关信息并进行测量(参见延迟加载工具)
快速开始
Claude Code
优先使用 CLI 配置,而不是手动编辑配置。将服务选项放在 -- 之前;其后的所有内容都会传递给 stdio 命令。请查阅 claude mcp add --help,确认已安装版本中选项的位置(CLI 配置文档)。
# stdio (local): postgres example; pick a maintained server from the registry first
claude mcp add postgres \
--scope project \
--env POSTGRES_URL=postgresql://user:pass@localhost:5432/app \
-- npx -y <maintained-postgres-mcp-server>
# Streamable HTTP (remote) — Linear example
claude mcp add --transport http linear-server https://mcp.linear.app/mcp
# Remote with bearer token header
claude mcp add --transport http \
--header "Authorization: Bearer ${SENTRY_TOKEN}" \
sentry https://mcp.sentry.io/mcp
claude mcp list
claude mcp get postgres
claude mcp remove postgres
使用 .mcp.json 配置项目共享设置。作用范围选项:local(默认,仅供你在此项目中使用)、project(.mcp.json)、user(你的所有项目)。local 和 user 条目都存放在 ~/.claude.json 中,而不是单独的 mcp.json 文件中。
Codex / OpenAI
codex mcp add CLI 涵盖两种传输方式:通过 --env 和 -- 分隔符使用 stdio,以及通过 --url 使用 Streamable HTTP。没有 --transport 标志:系统会根据 --url 或末尾的 -- <command> 推断传输方式。编写脚本前,请使用 codex mcp add --help 确认你的构建版本接受哪些标志。
# stdio (local helper) — CLI path
codex mcp add repo-tools --env API_KEY=secret -- node ./dist/index.js
# Streamable HTTP (remote) — CLI path, bearer token via env var
codex mcp add figma --url https://mcp.figma.com/mcp --bearer-token-env-var FIGMA_OAUTH_TOKEN
codex mcp login figma # OAuth handshake for a server that needs it (or --oauth-client-id / --oauth-resource on add)
codex mcp list
对于 CLI 未提供的字段,请直接编辑 ~/.codex/config.toml——模块化工具控制(enabled_tools/disabled_tools、default_tools_approval_mode)、静态 http_headers 以及 OAuth 回调端口:
# ~/.codex/config.toml — remote Streamable HTTP server, full field set
[mcp_servers.figma]
url = "https://mcp.figma.com/mcp"
bearer_token_env_var = "FIGMA_OAUTH_TOKEN"
startup_timeout_sec = 10
作用范围与 Claude Code 相同:~/.codex/config.toml 是全局配置;项目根目录下的 .codex/config.toml 仅作用于项目(仅限受信任的项目)。完整架构——环境变量、工具控制、OAuth 回调——见 references/mcp-custom.md。
Claude Code ↔ Codex 配置对照
| 注意事项 | Claude Code | Codex |
|---|---|---|
| 添加 stdio 服务(CLI) | claude mcp add NAME -- cmd args | codex mcp add NAME -- cmd args |
| 添加远程 HTTP 服务 | claude mcp add --transport http NAME URL | codex mcp add NAME --url URL |
| 项目共享文件 | .mcp.json(mcpServers) | .codex/config.toml([mcp_servers.NAME]) |
| 每个服务的环境变量 | --env K=V / JSON env | [mcp_servers.NAME.env] 表 |
| 远程身份验证标头 | --header "Authorization: Bearer …" | bearer_token_env_var 或 [mcp_servers.NAME.env_http_headers] |
| 每个工具的审批 | 权限设置 | default_tools_approval_mode、每个工具的 approval_mode |
两者的传输规则相同:本地辅助程序使用 stdio,远程共享服务使用 Streamable HTTP。
工作流
- 判断问题是否确实需要 MCP。
- 搜索官方注册表;如果已有服务的范围合适,则优先使用。
- 通过一次低成本读取验证传输方式、身份验证、工具范围和输出大小。
- 如果确有必要自定义,则构建能够解决重复工作流的最小服务。
- 在将服务接入 Agent 前,为预期身份记录有效能力集:一次成功读取和一次经过授权、不修改数据的拒绝探测,并记录所用服务、版本和身份验证范围。通过策略模拟器或试运行端点执行负向探测,或在隔离测试租户中使用无害的合成金丝雀。切勿为了证明请求会被拒绝而探测真实敏感数据或执行真实变更;任何外部状态测试都必须事先获得明确授权。发现阶段公布的架构并不能证明调用方有权使用其中的工具。
- 扩大部署范围前,先强化服务:遵循最小权限原则、缩小范围、限制输出、记录日志,并为写入操作设置审批控制。
健康检查
依赖任何 MCP 服务之前:
- 使用
mcp list确认客户端能够看到该服务 - 检查有效配置
- 运行一个低成本的列表或读取工具
- 在提高客户端输出上限前,先在服务端收紧分页或行数限制
如需脚本化连接检查,请从技能目录运行 bash scripts/mcp_health_check.sh。使用 --server NAME 指定服务;Claude Code 的 mcp list 可能不会显示 WebSocket 服务。运行 python3 scripts/test_mcp_health_check.py 执行脚本的离线回归测试。其 --verbose 选项会说明证据边界,但不会打印原始配置或服务响应。
身份验证失败规则
如果身份验证失败:
- 重新进行一次身份验证
- 重试一次
- 如果仍然失败,则停止并报告确切的传输方式、服务和错误
身份验证失败时不要循环重试。
优先从注册表发现
自定义构建前:
- 搜索
https://registry.modelcontextprotocol.io - 优先选择由提供方托管或官方维护的服务
- 记录传输方式、身份验证模式、写入范围、维护方,以及工具范围是否足够窄
- 现在,“官方维护”指的是由 AAIF 治理的 MCP 项目,而非仅指 Anthropic——注册表条目只是发现线索,并非安全审查;采用任何服务前,仍须根据下方清单逐一评估
典型场景
针对此技能实际收到的请求提供端到端操作方案。每个方案都以安全加固且经过验证的状态结束,而非仅建立连接。
S1 — 将 Agent 连接到生产数据库(只读)
- 在注册表中搜索维护状态良好、范围明确的 Postgres 服务,避免使用通用 SQL 解释器。检查维护状态:参考项目
@modelcontextprotocol/server-postgres已迁移至 servers 仓库的归档目录,因此不要将其用于新项目。 - 连接前创建只读数据库角色并设置行数限制——在数据库层强制执行,而不是依赖提示词(
references/mcp-for-dwh.md,第 1 层)。 claude mcp add postgres --scope project --env POSTGRES_URL=… -- <server command>(Codex:[mcp_servers.postgres]stdio 块 +[mcp_servers.postgres.env])。- 健康检查门槛:
mcp list→mcp get→ 执行一次低成本的SELECT … LIMIT 1。 - 如果之后工作流需要写入,请迁移到自定义精简服务(形态 C),并按工具设置审批——不要放宽只读角色的权限。
S2 — 将内部 REST API 封装为自定义服务
- 确认重复使用确有必要(供 Agent 反复使用,而非一次性获取——参见“构建还是使用”)。
- 构建尽可能精简的工具接口:每项操作对应一个工具,使用严格的
inputSchema,并为结构化返回值设置outputSchema。使用 SDK 的高级服务 API;根据主版本在 SDK README 中查找当前的类和导入路径(references/mcp-custom.md)。将失败作为isError结果返回(references/mcp-patterns.md)。 - 从一开始就加入重试、分页和服务端行数上限(
mcp-patterns.md中的 REST 与分页模式)。 - 在连接任何客户端之前,使用
npx @modelcontextprotocol/inspector进行冒烟测试。 - 仅限本地使用 →
stdio;共享使用 → 使用绑定到127.0.0.1并进行Host/Origin验证的 Streamable HTTP。
S3 — 添加启用 OAuth 的远程供应商 SaaS 服务
- 在注册表/供应商文档中核实,并记录传输方式、身份验证模型、写入权限范围和维护者。
- Claude Code:
claude mcp add --transport http NAME URL(如果需要 bearer token,则使用--header)。Codex:codex mcp add NAME --url URL --bearer-token-env-var VAR_NAME,如果需要 OAuth,再执行codex mcp login NAME。 - 接受前检查授予的权限范围;如果写入权限没有审批边界,则拒绝。
- 身份验证失败时遵循身份验证失败规则(重新身份验证一次、重试一次,然后停止)——此处大多数“协议”失败都是本地令牌过期导致的。
S4 — 减少服务器过多造成的上下文膨胀
- 先测量:使用
claude mcp list列出服务器,然后查看会话的上下文明细(/context),了解工具定义实际占用的上下文。各服务器的开销差异太大,无法估算。 - 在 Claude Code 的 MCP 文档中查找当前的工具搜索设置,并确认你的模型和提供商已启用延迟加载(参见延迟工具加载)。
- 连接大量服务器后重新测量,尤其是在 HTTP 网关后面时。如果定义仍会预先加载,那么减少服务器数量并缩小其范围,比调整
ENABLE_TOOL_SEARCH更有效。 - 在模块化服务器中禁用未使用的工具集;在 Codex 中使用
enabled_tools/disabled_tools。 - 如果某个服务器在一个项目中处于闲置状态、但在其他项目中需要使用,请在
/mcp面板中将其关闭,而不是删除其配置。Claude Code 会在~/.claude.json中按项目记录此选择(disabledMcpServers),并继续将该服务器列为已禁用。 - 移除不再使用的服务器;只有在服务器规模很大时,才添加带语义工具过滤功能的网关。
S5 — 让现有 AWS Lambda / API Gateway 环境支持 Agent 调用
- 不要为每个 Lambda 手工编写一个 MCP 服务。使用 AWS Bedrock AgentCore Gateway:通过配置而非代码实现(详见
../software-paas-hosting/references/aws-bedrock-agentcore.md中的 Gateway 部分)。 - 通过 Gateway 暴露的工具使用 MCP,因此任何 MCP 客户端(Claude、Codex、Cursor)都可以调用,而不只是 Bedrock Agent。
- 仅在需要对接非 AWS API、自定义身份验证或业务规则,或团队可能离开 AWS(可移植性)时,才选择手工编写自定义服务。
S6 — 为 Agent 提供持久的代码库 / 知识上下文
- 分层构建:将少量会话记忆保存在代码库文件中 → 通过 MCP 提供可搜索的知识 → 添加一个将原始笔记 / 转录内容转化为规范资料的摄取层。
- 使用文档 / 记忆服务(使用 Context7 获取实时库文档;使用代码图谱记忆服务获取代码库上下文)——按代码库 / 租户限定记忆范围,避免无关上下文相互混杂。
- 选定一个事实来源;如果文件记忆与 MCP 记忆重叠,不要同时运行而不确定以哪个为准(
references/mcp-servers.md,服务器类别)。
构建还是使用
- 数据库、文件系统、浏览器或已有优质服务的供应商 SaaS → 使用现有服务
- Agent 反复使用的内部 API → 构建自定义服务
- 一次性获取或临时自动化 → 不要构建 MCP
- 自定义身份验证、审批流程或业务规则执行 → 通常适合构建自定义服务
- 结构化数据存储(Postgres、Snowflake、BigQuery、DuckDB、BI 语义层)→ 使用 references/mcp-for-dwh.md 选择合适的形态和执行层
- 需要支持 Agent 调用的现有 AWS Lambda + API Gateway 环境 → 使用 AWS Bedrock AgentCore Gateway,而非手工编写 MCP 服务(场景 S5)
工具结果约定
模型会读取工具结果,而非程序。它是模型判断下一步操作的唯一信号。规则 1–5 来自协议,适用于所有 SDK 和客户端。规则 6 以及规则 3 中关于完整性的偏离,是一个项目(morluto/rea;参见 data/sources.json)的设计实践,并非协议要求。通用工具架构设计见 ../ai-agents/references/tool-design-specs.md;本节规定 MCP 结果约定。
- 有两种错误通道。根据谁能解决问题来选择。
- **工具执行错误:**模型可以修复问题或绕开问题。例如:未找到、资源权限被拒、上游 4xx/5xx、速率限制、业务规则拒绝、模型可以修正的参数。返回带有
isError: true的普通结果,并附上模型可以据此采取操作的文本块。 - **协议错误(JSON-RPC 错误响应):**仅用于服务无法理解的请求,例如未知工具、格式错误的请求或服务故障。客户端可能会将这些错误展示给用户而非模型,导致模型失去自我纠正的机会。
- 失败属于哪一类(例如参数的架构验证)由规范的工具页面定义。请检查你所针对的版本。
- **工具执行错误:**模型可以修复问题或绕开问题。例如:未找到、资源权限被拒、上游 4xx/5xx、速率限制、业务规则拒绝、模型可以修正的参数。返回带有
- **错误文本就是下一步指示。**说明失败原因、导致问题的输入,以及修正后的调用,例如:
No customer with id "c_91". Find the id with search_customers(email=...)。不要包含堆栈跟踪、内部主机名或机密信息。 - **在源头限制大小。**接受
limit/cursor参数,并设置较小的默认分页大小。截断时,说明这一点并提供继续获取结果的方式,例如"showing 50 of 1,240; call again with cursor=..."。客户端会自行执行输出上限。Claude Code 会在超过一个阈值时发出警告,并在超过另一个阈值时截断;这两个阈值可通过MAX_MCP_OUTPUT_TOKENS配置。请在其 MCP 文档中查阅当前值。绝不要用客户端上限作为你的限制值。例外情况:当答案取决于完整性(缺失、等价性、差异)时,绝不要静默分页或截断。返回完整结果。如果结果超过服务配置的响应预算(应设为不高于你支持的客户端中最小的接收限制,并且可配置),则返回带类型的错误(isError: true,附带机器可读原因),并提供调用方可在同一连接上交给分页工具或查看工具的引用。 - **调整结果结构,便于阅读。**默认返回简洁结果,并提供
detail/response_format参数以获取更多内容。在不透明 ID 旁附上人类可读的名称。调用方需要解析结果时,声明outputSchema并返回structuredContent,同时也提供文本呈现。对于大型负载,返回resource_link,而不是直接嵌入内容。 - **描述是发现工具的入口。**在延迟加载模式下,只有名称和描述会被搜索。将具有区分性的词语放在前面,因为客户端可能会截断较长的描述(请查看客户端文档中说明的限制)。每个工具只执行一个操作。使用服务的
instructions字段说明何时应使用该服务的工具。 - **缺少证据意味着未知,而非空或否。**说明每个数据源或子查询覆盖了哪些内容。部分搜索得到的空列表不能表述为“没有结果”。只有覆盖完整时,才能断言不存在或等价;否则返回
unknown。当服务推导关系时,应将观察到的事实与推断出的边区分标记,并保留尚未解决的边。
结果结构示例(错误与成功、分页、幂等键)见 references/mcp-patterns.md。
延迟加载工具(工具搜索)
Claude Code 可以延迟加载 MCP 工具架构。会话开始时加载工具名称和简短描述;完整架构则通过搜索工具按需加载。这样可以减少大型工具集的工具定义开销,并避免一次加载过多工具导致工具选择准确率下降。由于最初只能看到名称和简短描述,请根据用户描述任务时会使用的说法为每个工具命名,并为同一服务的工具使用统一前缀分组(tickets_search、tickets_update),以便搜索时将它们一起找到。这些控制选项属于 Claude Code,而非协议:
| 控制项 | 用途 |
|---|---|
ENABLE_TOOL_SEARCH 未设置 | 文档所述的默认行为 |
true / false | 强制启用搜索 / 预先加载所有架构 |
auto / auto:N | 阈值模式:工具定义未超过上下文窗口的一定比例时预先加载(N = 自定义百分比),超过时启用搜索 |
每个服务的 alwaysLoad | 保持小型且始终需要的服务的工具处于已加载状态 |
服务的 instructions | 告知工具搜索何时查找此服务的工具 |
查询步骤。 阅读 Claude Code 的 MCP 文档中“配置工具搜索”一节,确认以下四项:当前默认设置、支持延迟加载的模型和提供商(非第一方的 ANTHROPIC_BASE_URL 代理或部分云提供商可能会回退到预先加载)、准确的键名,以及每个请求的工具数量限制。这些内容会随版本更新而变化。确认结果将决定你应按延迟加载还是预先加载来规划工具集。
实际测量,不要想当然。 连接后,检查 /context。一则用户报告(anthropics/claude-code issue #40314,针对较早版本提交)称,即使设置了 ENABLE_TOOL_SEARCH=auto:5,HTTP 网关后的约 250 个工具仍会被预先加载。机器人以过时为由关闭了该问题(“暂不计划处理”)。没有维护者确认此情况,也没有记录任何修复,文档也没有说明存在传输方式例外。请将其视为需要实际测量的理由,而非已知限制。
Codex 的等效做法:在 config.toml 中通过每个服务的 enabled_tools / disabled_tools 和 default_tools_approval_mode / 每个工具的 approval_mode 控制工具的开放范围,而不是使用全局延迟加载标志。
构建自定义服务
构建新服务时:
- 复制任何模板前,先确认 SDK 版本路线。 阅读你将安装的 SDK 主版本的 README 和迁移指南。包名、高级服务类及其导入路径在不同主版本间都有变化,因此模板可能导入已不存在的名称。在依赖文件中固定主版本,避免全新安装时切换到不同的 API。
- 使用 SDK 的高级服务 API(通过架构声明式注册工具)。只有在需要控制高级 API 未公开的协议行为时,才使用底层请求处理器。
- Python:“FastMCP”指两个不同的东西:官方 SDK 中的高级类(名称因主版本而异,见迁移指南),以及独立的
fastmcp项目,后者是一个单独且功能范围更大的超集。请明确说明你指的是哪一个。
只构建工作流所需的工具。避免设计庞大而通用的 CRUD 接口。
构建时就为每个工具声明全部四项工具注解提示(readOnlyHint、destructiveHint、idempotentHint、openWorldHint),不要留到后续再补——参见 references/mcp-custom.md#tool-annotation-hints。在更大范围推广之前,按照 references/mcp-evaluation.md 编写评估问题。
如果服务会返回检索到的文档文本(知识库、政策语料库、代码中心),请在设计工具前同时加载 references/mcp-knowledge-serving.md:启动时绑定权限、输出围栏与清理、引用、拒绝作答。
请使用 mcp-custom.md、mcp-patterns.md 和 mcp-evaluation.md。
常见反模式
- 为一次性 HTTP 调用或本应留在常规应用代码中的工作流构建 MCP 服务。
- 当工作流需要范围明确且考虑策略的接口时,却暴露通用 CRUD 或 shell 风格的工具接口。
- 发布具有写入能力的远程服务,却没有明确的审批边界或行级限制。
- 将客户端分页视为足够的措施,而不在服务端强制执行限制。
- 假设所有客户端都支持相同的传输方式和身份验证配置。
- 因为“工具可信”,就让服务器输出未经验证直接流入特权操作。
已知陷阱
-
在一条建议中混用
stdio和 HTTP 传输指导,却不区分具体运行时。 解决方法:始终先声明传输方式,再给出针对该传输方式的指导。使用references/transport-auth-matrix.md中的传输与身份验证矩阵作为决策依据。切勿提供一个暗中假设了某种传输方式的单一配置块。 -
OAuth 或令牌缓存问题看起来像协议故障,实际上却是本地身份验证状态过期。 解决方法:遵循上文的身份验证故障规则:重新进行一次身份验证,重试一次,然后停止。只清除本地缓存,不要循环重试。如果错误再次出现,请在升级处理前报告具体的传输方式、服务名称和 HTTP 状态码。
-
发现注册表中的服务时,没有记录写入范围、维护者和身份验证模型,导致不安全地采用工具。 解决方法:采用注册表中的任何服务之前,都要在项目的服务清单中记录其传输方式、身份验证模型、写入范围和维护者。拒绝采用具有写入权限但没有明确审批边界的服务。
-
在尚未建立清单、所有权和生命周期管理之前就引入多服务枢纽。 解决方法:从单个服务开始。只有在第一个服务有负责人、已记录传输方式和身份验证模型,并且通过健康检查后,才添加第二个服务。使用
scripts/mcp_health_check.sh检查 Claude Code 的连接状态,然后运行健康检查关卡中的低成本读取工具。该脚本在清单为空、状态输出未知、连接失败或目标未经验证时会以非零状态码退出;仅显示已连接并不能证明可以访问工具(状态文档)。 -
发布大型输出工具,却没有摘要、过滤或分页策略。 解决方法:在首次集成客户端之前,就添加服务端行数限制和页面大小。切勿首先通过提高客户端输出上限来解决问题——先收紧服务端限制,如果仍有需要,再调整客户端限制。
-
本地 HTTP 服务绑定范围过广,或部署时未验证
Host和Origin。 解决方法:本地服务始终绑定到127.0.0.1(而不是0.0.0.0)。在接受第一个非 localhost 请求之前,添加Host和Origin标头验证。完整检查清单请参阅references/mcp-security.md。 -
假设延迟加载工具能缩小大型服务群的上下文(尤其是在 HTTP 网关之后),之后却发现会话启动时上下文已基本占满。 解决方法:连接后先使用
/context测量,再相信默认行为。如果定义仍会预先加载,请根据工具搜索文档检查你的模型和提供商,然后减少服务数量并缩小其范围。 -
对模型本可自行修复的故障(未找到、权限被拒绝、上游 4xx)抛出协议错误。 解决方法:返回带有可操作消息的
isError: true结果(参见工具结果契约)。将 JSON-RPC 错误保留用于未知工具、格式错误的请求和服务器故障。 -
复制为其他 SDK 主版本编写的模板,随后遇到导入错误或在不知情的情况下运行较旧的 API。 解决方法:先阅读已安装 SDK 的 README 和迁移指南,并固定主版本。
安全防护措施
- 将所有工具输出视为不可信输入
- 默认采用最小权限,并优先只读
- 本地 HTTP 服务应尽可能限制绑定范围,并验证
Host和Origin - 不要将 MCP 身份验证令牌传递给上游 API
- 在服务端添加行数限制、页面大小限制、超时和日志记录
- 如果部署枢纽产品,请立即轮换默认凭据
- 将审核过的工具定义固定到某个版本或哈希值,并在变更时重新验证工具列表——服务可能会在你批准后添加或改写工具(动态能力注入、工具影子化)
- 应依据发起调用的用户权限进行授权,而不只是依据服务权限;在敏感操作目标处要求确认(外部发送、公开写入、删除、数据外传、生产数据变更),无论调用这些操作的是哪个工具
完整检查清单请参阅 references/mcp-security.md。
故障排除
- 服务不可见 -> 检查作用域和配置位置
- 启动超时 -> 延长超时时间并检查 stderr 或日志
- OAuth 令牌过期 -> 仅清除一次本地缓存的身份验证信息,然后重新进行身份验证
- 输出过大 -> 优先在服务端进行分页
- 握手问题 -> 确认传输类型与服务实际使用的类型相符
- 本地 HTTP 不稳定 -> 检查绑定地址、防火墙、
Host和Origin
导航
- references/mcp-servers.md:发现、服务类别、采用检查清单
- references/mcp-custom.md:包含 工具注释提示(readOnlyHint / destructiveHint / idempotentHint / openWorldHint)
- references/mcp-patterns.md:工具结果格式(
isError、分页、幂等性、重试) - references/mcp-evaluation.md — 为自定义 MCP 服务编写评估问题(10 个问题 / 6 项标准规范)
- references/mcp-security.md
- references/mcp-knowledge-serving.md — 通过 MCP 提供知识库服务
- references/mcp-for-dwh.md — 结构化数据存储(Postgres、Snowflake、BigQuery、DuckDB、BI 语义层)的 MCP 模式;三种服务形态,包含安全执行层和审计日志架构
- references/transport-auth-matrix.md — 传输方式 × 身份验证方式选择矩阵(stdio / HTTP / SSE × 无身份验证 / API 密钥 / OAuth)
- scripts/mcp_health_check.sh — 检查 Claude Code 连接状态;需另行验证实际工具访问权限
- data/sources.json
相关技能
- ../agents-hooks/SKILL.md
- ../agents-subagents/SKILL.md
- ../agents-skills/SKILL.md
- ../agents-memory/SKILL.md
- ../ai-agents/SKILL.md
- ../ai-coding-agents-plugins/SKILL.md
- ../ai-coding-agents-surfaces/SKILL.md
验证关卡
交付输出前,请验证:
-
推荐的配置路径和命令确实存在,或已明确标注为建议方案
-
生成的 JSON 或 YAML 语法有效
-
传输方式、身份验证和审批指导与运行时相符
-
权限边界是此任务适用的最窄安全边界
-
优先参考 modelcontextprotocol.io 和官方 SDK 仓库,而非博客文章。
旧版模式
在现有服务中仍会遇到的 v1 时代 SDK 形态
- TypeScript:单一的
@modelcontextprotocol/sdk包,从@modelcontextprotocol/sdk/server/mcp.js导入McpServer,或使用低级别的Server+setRequestHandler(CallToolRequestSchema, ...)。v2 系列将其拆分为独立的服务端和客户端包。v1 系列在过渡期内仍持续获得修复;规划升级前,请查看 SDK README 中的支持期限。 - Python:使用
from mcp.server.fastmcp import FastMCP,并运行pip install "mcp[cli]"。根据 Python SDK 的迁移指南,v2 重命名了此类(FastMCP 改为 MCPServer)。因此,未固定版本的安装可能导致这些导入失效。 - 基于服务端发起的
sampling/createMessage、roots/list或elicitation/create,或基于 SSELast-Event-ID恢复机制构建的旧版服务,早于2026-07-28的重新设计。请将其视为迁移负担(参见顶部的破坏性变更界限)。
如果升级导致这些导入失效,请遵循迁移指南。不要悄悄回退固定版本而不记录这项负担。
经验循环
当以往的决策或陷阱与当前任务相关时,如果存在 learnings.consolidated.md,请查阅该文件;仅在需要历史记录或该文件是现有可用选项时,才使用 learnings.md。否则跳过这两个文件。
应用相关经验后,如果遇到值得记住的模式、值得防范的错误,或令你意外的领域事实,请通过 agents-skills-feedback-loop/scripts/append_learning.py 向 learnings.md 追加一条带日期的项目符号。不要修改 SKILL.md 本身。