Skip to main content

连接 stdio 与 HTTP 服务器

stdio

stdio 服务器是由 Inspector 启动的进程。所有位置参数都会作为命令行参数传递:
请在所有要传递给服务器的参数前加上 --。如果没有分隔符,--verbose 会被 Inspector 解析,而不会传递给服务器。 使用 -e 为进程设置环境变量,并使用 --cwd 设置工作目录:
服务器的 stderr 会显示在 Console 标签页(Web)或 Console 标签页(o,TUI)中。大多数 stdio 服务器都会将诊断信息输出到这里,因此当连接无明显原因失败时,请先检查该处。

HTTP 和 SSE

--transport 接受 http(Streamable HTTP)和 sse。如果服务器受到保护,请参阅授权:无需提前进行任何设置,因为当服务器返回 401 时,Inspector 会运行其中所述的 OAuth 流程,然后重试连接。 对于 HTTP 服务器,还需要确定其协议时代。默认值为 legacy;在服务器设置中设置为 modern 或 auto(或在目录文件中设置 protocolEra),即可体验 2026-07-28 的行为。对于临时目标,可在启动时使用 --protocol-era legacy|auto|modern 传入。

导入现有客户端配置

在“服务器”界面中,添加服务器可以导入您已在其他位置配置的 MCP 服务器,无需重新输入。 它可以直接解析 Claude Desktop、Cursor、Cline 和 VS Code 客户端配置,也可以读取服务器自身的 MCP 注册表 server.json。 导入内容会合并到当前激活的目录 (Inspector 可写入的服务器列表)中。如果导入服务器的 ID 已经被占用,您可以选择覆盖、跳过或重命名。如果您不想修改目录,也可以改为以只读方式针对外部文件启动:
--config 可确保文件按原样提供服务,并且永远不会被写入、初始化或迁移。

添加服务器提供了从现有客户端配置或注册表 server.json 导入的选项。

审查 MCP 应用

MCP 应用是携带 UI 小组件的工具。对于自动化审查程序(CI 或智能体),所有返回 JSON 的检查都使用 CLI,仅在检查渲染后的小组件时打开浏览器。
1

无需调用工具即可探测安全态势

--advertise-apps 会让 CLI 在 initialize 中声明支持 MCP Apps。由于 CLI 无法渲染应用,该选项默认关闭;但如果服务器只向支持应用的客户端返回应用工具,不启用它会导致服务器报告没有应用。标准输出中只有一行 JSON;如果工具包含应用则退出码为 0,否则为 2,因此 && 链会短路:
csp 和 permissions(以及资源声明了 domain 时的 domain)位于 UI 资源上,而不是工具上,因此 --app-info 会读取该资源。工具绝不会被调用。
2

获取完整结果负载,仍无需使用浏览器

3

启动 Web Inspector 一次,仅限回环地址

固定 MCP_SANDBOX_PORT 可以明确应用地址:应用 UI 由独立的沙盒端口提供服务,而自动化程序需要知道访问地址。
4

导航到渲染后小组件的一个深层链接

appArgs 是经过 base64url 编码的 JSON 格式工具参数,每个深层链接参数都在深层链接下进行了说明。autoConnect 和 autoOpen 必须都等于会话令牌,因为 autoOpen 会直接从 URL 触发工具调用,需要与 autoConnect 使用相同的门控机制。
5

等待确定性信号,而不是休眠

Apps 屏幕提供了稳定的自动化契约。请轮询以下属性,而不是进行休眠:

Docker

GitHub Container Registry 中发布了适用于 linux/amd64 和 linux/arm64 的容器镜像:
从容器日志中读取会话令牌,或使用 -e MCP_INSPECTOR_API_TOKEN=<value> 固定令牌。 该镜像默认使用 --web,绑定到 0.0.0.0:6274,关闭浏览器自动打开,并以非 root 的 node 用户(uid 1000)运行。它设置了 DANGEROUSLY_BIND_ALL_INTERFACES=true,因为容器必须绑定通配地址,才能通过 -p 访问。
所有发布端口都应保留 127.0.0.1: 前缀。 裸写 -p 6274:6274 会将端口发布到主机的所有接口,使一个能够创建进程、同时会暴露令牌的后端出现在局域网中。镜像中的 DANGEROUSLY_BIND_ALL_INTERFACES 只影响容器接口,不影响主机接口。请参阅仅在环回地址上发布端口。
要使用 Apps 标签页,还需发布 MCP Apps 沙盒端口 6275;如果应用声明了 _meta.ui.domain,还需发布 6278。请将内外端口设置为相同的端口号,因为浏览器会收到容器内的端口:

保留服务器和机密信息

服务器列表、OAuth 状态和机密信息位于容器可写层中的 /home/node/.mcp-inspector 下,因此 --rm 会将它们丢弃,每次运行都会从空状态开始。将卷挂载到该目录即可保留它们:
容器没有操作系统钥匙串,因此机密信息的存放位置取决于该卷: 如果挂载的是主机目录而不是命名卷,它会保留主机上的所有者信息,因此在 Linux 上请添加 --user "$(id -u):$(id -g)",或将目录 chown 给 uid 1000,否则保存会因 EACCES 失败。不要单独绑定挂载机密文件:它不会被识别为持久存储,也无法被原子替换。
挂载该卷会启用机密信息文件存储;没有密钥时,该文件是明文。 每个获取到的 OAuth 令牌,以及保存的每个客户端密钥和 stdio env: 值,都会写入卷上的 secrets.json。root、主机上 docker 组的每个成员,以及获得该卷备份、快照或副本的任何人都可以读取它。请生成一个密钥并写入只有您能读取、且位于卷及其备份和任何代码仓库之外的文件:
即使经过加密,磁盘上的机密信息仍有中等风险。请参阅文件存储可以防范什么。
使用 MCP_INSPECTOR_SECRET_KEY_FILE 将密钥以文件形式传给容器,不要将其作为环境变量传入。通过 -e MCP_INSPECTOR_SECRET_KEY=… 传入的密钥可被能够运行 docker inspect 或 docker exec 的任何人读取。
在没有 Swarm 的情况下,Compose secrets 是保留主机文件所有者和权限的绑定挂载,因此权限为 0600 的密钥文件必须由 uid 1000 所有。在 Linux 主机上,如果您的 uid 不同,请运行 sudo chown 1000 ~/.config/mcp-inspector/secret-key,不要放宽文件权限。每次运行都应提供相同的密钥。 如果密钥文件缺失、不可读、为空,或者同时设置了两个密钥变量,Inspector 会拒绝读取或写入机密信息文件,而不是回退到明文存储,并在日志和设置对话框页脚中说明原因。存储方式的其他方面(选择顺序、位置、权限)请参阅机密信息存储位置。

健康检查和其他模式

镜像的 HEALTHCHECK 会探测 Web UI 所在的 HOST 地址。--cli 和 --tui 没有 Web 服务器,因此探测器会从容器参数识别这两种模式,并在它们运行时报告健康。外部编排器(如 Kubernetes 探针或 Compose healthcheck)可以在 Web 端口调用不需要令牌的 GET /healthz,该接口只返回 {"status":"ok"}。 下面的 <target> 是一个临时目标:一个位置参数形式的 stdio 命令,或 --server-url <url> --transport http。
如果重新映射发布的端口,请设置 ALLOWED_ORIGINS。 使用 -p 127.0.0.1:8080:6274 时,浏览器的来源会变为 http://localhost:8080,这与 容器内的端口不再匹配,因此连接会返回 403。可以运行 -e CLIENT_PORT=8080 -p 127.0.0.1:8080:8080,或者设置 -e ALLOWED_ORIGINS=http://localhost:8080,http://127.0.0.1:8080。

在网络上托管

Inspector 默认绑定到 127.0.0.1,并且其后端会生成进程,因此应将其暴露到网络视为一项需要慎重决定的操作。 除非设置 DANGEROUSLY_BIND_ALL_INTERFACES=true,否则 Inspector 拒绝绑定通配符全接口地址(0.0.0.0、:: 以及所有等效写法)。绑定特定地址无需选择加入,因为这只会有意暴露一个地址,而不是一次性暴露所有接口;DNS 重绑定攻击正是针对后者。
ALLOWED_ORIGINS 会替换默认列表,而不是与其合并。请列出你会从中访问的每个源,包括你希望继续保留的回环地址形式:
每个条目都必须包含协议;不含协议的值会被丢弃,并显示警告。空值不会禁用检查,而是回退到默认值。没有任何选项可以关闭源验证。
脱离回环地址时,还需注意以下两点:
  • MCP Apps 还需要能够访问其沙盒端口。 这是一个独立的监听器(默认端口为 6275,可通过 MCP_SANDBOX_PORT 设置),因此请将它与 Web 端口一起暴露或转发。
  • 位于 TLS 或反向代理之后时,要为 MCP Apps 提供公共地址。 默认情况下,沙盒会被发布为 http://<bind host>:6275,https:// 页面会将其作为混合内容阻止。请设置 MCP_SANDBOX_FULL_ADDRESS(例如 https://inspector-sandbox.example.com/sandbox);对于声明 _meta.ui.domain 的应用,还要设置 MCP_APP_ORIGIN_FULL_ADDRESS(例如 https://inspector-apps.example.com)。二者都需要独立的主机名或端口;如果地址与 Inspector 共享来源,则会被拒绝。
  • MCP Apps 无法在裸 IPv6 字面量上渲染。 带方括号的 IPv6 字面量不是有效的 CSP 主机源,因此请通过名称或 IPv4 地址访问。
无论采用哪种形式,都应保持身份验证开启。切勿在任何除了你本人之外的其他人都能访问的环境中设置 DANGEROUSLY_OMIT_AUTH。相关原因请参阅安全性。

使用 mcpdo 保持连接

当一次探索包含许多调用(例如在同一会话中执行多步骤流程、持续查看日志或让代理在会话中使用服务器工具)时,每次调用 --cli 都重新连接会造成干扰。mcpdo 会为你保持连接:
同一个连接一次只执行一个调用,因此其他 shell 中针对该连接的命令会依次等待。 用于保持连接的守护进程会自动启动,并在最后一个连接关闭约一分钟后退出。在共享机器上使用它之前,请阅读mcpdo 连接守护进程。

开发工作流

一个在实践中行之有效的循环:
1

从 CLI 开始

--method initialize 会确认服务器启动、完成握手并报告你所期望的功能,整个过程只需一秒,并返回机器可读的结果。 大多数“它无法运行”的问题都出在这里。
2

转到 Web 客户端进行探索

由架构驱动的表单、渲染后的结果以及旁边的 Protocol 选项卡,让你可以快速找到工具行为异常的情况。
3

测试边界情况

测试无效输入、缺失的必需提示参数、并发调用,以及对于 HTTP 服务器的两种协议版本。确认这些错误和成功一样,都是经过有意设计的。
4

使用 CLI 固化结果

将你的发现转化为 CI 断言:将 CLI 的 --format json 输出通过管道传给 jq -e,并使用 --stored-auth-only,这样缺失令牌时会立即失败,而不是启动交互式 OAuth。完整命令请参阅在 CI 中验证服务器。