配置与 flag
社区译文;来源: MCP 80041ab0
mcp-inspector 二进制文件是一个启动器:它自己只读取两个 flag,并把其他所有参数转发给三个客户端之一(web、CLI 或 TUI)。每个客户端定义各自的 flag,因此在一个客户端可用的 flag 在另一个客户端可能无法识别(例如 --method 仅属于 CLI)。下面按所属客户端列出 flag 与环境变量。
启动器只拥有两件事
| Flag | 行为 |
|---|---|
--web / --cli / --tui | 选择客户端,默认 --web。传入多于一个会失败并提示 Specify at most one of --web, --cli, or --tui. 启动器 flag 必须放在最前面:解析会在启动器不拥有的第一个参数处停止,从该点起的所有内容都原样转发给客户端。 |
-h / --help | 没有模式 flag 时,打印启动器自身的帮助并退出。有模式 flag 时会转发,因此 mcp-inspector --cli --help 打印的是 CLI 的帮助。 |
下面的一切都属于某个客户端。
mcpdo,即实验性的连接客户端。它不通过启动器进入,也不接受模式 flag。选择服务器
--catalog 与 --config
CLI 和 TUI 通过相同的共享代码解析 --catalog 和 --config,web 客户端也应用同样的规则,因此每个 flag 在三个客户端中含义一致。两者的差异见下表。
--catalog <path> | --config <path> | |
|---|---|---|
| 可写? | 可以,即 Inspector 自己的服务器列表。 | 不可以。按原样提供,永不写入、填充或迁移。 |
| 文件不存在? | 创建并填充(见下文)。 | 报错。 |
| 默认值 | ~/.mcp-inspector/mcp.json,或 MCP_CATALOG_PATH 环境变量。 | 无;必须显式传入。 |
| 可在 web UI 中编辑? | 可以。 | 不可以。 |
| 适用于 | 你自己的常用服务器集合。 | 针对他人配置文件的只读会话。 |
两者互斥,且都不能与临时目标组合使用。同时传入两者会被三个客户端以相同方式拒绝。web 客户端在某一方面更严格:它会同时拒绝把 --header 和 --protocol-era 与文件一起使用,而 CLI 和 TUI 会把它们叠加在文件设置之上。
新填充的 catalog 包含什么取决于客户端。 web 后端会填充三个示例服务器,因此首次启动就有可连接的对象:
{
"mcpServers": {
"filesystem-server-default": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
},
"everything-server-default": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-everything"]
},
"example-server-default": {
"type": "streamable-http",
"url": "https://example-server.modelcontextprotocol.io/mcp"
}
}
}CLI 和 TUI 则填充空的 { "mcpServers": {} }:它们是交互式或列表驱动的,示例条目只会成为噪音而不是起点。
无论哪种情况,填充都只在文件尚不存在时发生,而只读的 --config 完全不会被填充。
--config。它保证 Inspector 不会改动该文件。临时目标
除了文件,你也可以直接指定单个服务器:位置参数形式的命令(stdio)或一个 URL:
mcp-inspector node build/index.js # stdio, positional
mcp-inspector --server-url https://api.example.com/mcp --transport http共享的服务器选择 flag
由 web、CLI 和 TUI 各自单独定义,因此在三者中都可使用,差异已在表中标注:
| Flag | 含义 | 差异 |
|---|---|---|
--catalog <path> | 可写 catalog 文件。 | 无 |
--config <path> | 只读会话文件。 | 无 |
--server <name> | 从文件中选定一个具名服务器。 | 仅在 CLI 中起选择作用。 web 客户端接受该参数但忽略它并给出提示,仍列出所有服务器。TUI 未定义它(会报未知选项错误),改为让你交互选择。 |
--transport <type> | stdio、sse 或 http。 | 仅用于临时目标。 |
--server-url <url> | SSE/HTTP 的服务器 URL。 | 仅用于临时目标。 |
--cwd <path> | stdio 服务器进程的工作目录。 | 无 |
-e <KEY=VALUE> | stdio 服务器的环境变量。可重复。 | 无 |
--header "Name: Value" | HTTP/SSE 服务器的 HTTP headers。可重复。 | 在 web 客户端上需要临时 HTTP/SSE 服务器。 |
--protocol-era <era> | legacy、auto 或 modern:要协商的协议世代。 | 在 web 客户端上需要临时目标。CLI 和 TUI 还允许用它覆盖文件的 protocolEra。 |
--skill-catalog-max-skills <n> / --skill-catalog-max-bytes <n> | skills 验证运行的预算(最多检查多少个 skill、最多读取多少字节)。 | 仅 CLI 和 TUI。 覆盖文件的 skillCatalogMaxSkills / skillCatalogMaxBytes。 |
[target...] | 一个临时服务器的位置命令/URL。 | 无 |
-- 分隔符
web 和 TUI 客户端会把裸 -- 之后的所有内容作为目标命令自身的参数传给目标。这是你传入那些否则会被 Inspector 吃掉的 flag 的方式:
mcp-inspector node build/index.js -- --config /etc/myserver.conf --verbose没有分隔符时,--config 会被当作 Inspector 自己的只读会话 flag。
CLI 的切分方式相反: -- 之前的一切是目标,之后的一切是 Inspector 自己的选项。没有 -- 时,CLI 的目标只是开头那一段不以短横线开头的参数,因此接受 flag 的服务器需要该分隔符:
mcp-inspector --cli node build/index.js --config /etc/myserver.conf --verbose -- --method tools/list仅 web 的 flag
| Flag | 含义 |
|---|---|
--dev | 运行 Vite 开发服务器,而不是预构建的 bundle。在修改 Inspector 本身时很有用。 |
CLI 与 TUI:OAuth 客户端 flag
这五个只由 CLI 和 TUI 定义。web 客户端通过其 Client Settings 对话框获得相同设置。
| Flag | 环境变量 | 含义 |
|---|---|---|
--client-config <path> | MCP_CLIENT_CONFIG_PATH | 安装级客户端配置。默认 ~/.mcp-inspector/storage/client.json。 |
--client-id <id> | 无 | 静态客户端的 OAuth 客户端 ID。覆盖 client.json。 |
--client-secret <secret> | 无 | 机密客户端的 OAuth 客户端 secret。覆盖 client.json。 |
--client-metadata-url <url> | 无 | CIMD 元数据 URL。覆盖 client.json。 |
--callback-url <url> | MCP_OAUTH_CALLBACK_URL | 发送给授权服务器的重定向 URI。默认 http://127.0.0.1:6276/oauth/callback。必须是 loopback 主机(localhost、127.0.0.1 或其他任意 127.x.x.x 地址,或 [::1]):本地回调监听器通过明文 http 接收授权码,因此任何其他主机都会被拒绝,且没有可用于覆盖此行为的 flag。 |
仅 CLI 的 flag
整套脚本化能力都属于 CLI。用法参见 CLI 客户端。
| 分组 | Flags |
|---|---|
| 调用什么 | --method、--tool-name、--tool-arg、--tool-args-json、--uri、--cursor、--prompt-name、--prompt-args、--log-level、--metadata、--tool-metadata、--rename |
| 如何运行 | --connect-timeout、--format、-q / --quiet、--output、--output-format、--app-info、--advertise-apps、--strict、--verify、--require-digests、--completion <shell>(bash、zsh 或 fish) |
| 授权 | --use-stored-auth、--stored-auth-only、--relogin、--no-revoke、--wait-for-auth、--list-stored-auth、--print-handoff |
环境变量
环境变量与 flag 的划分方式相同:两个由启动器自身读取,其余属于 CLI 和 TUI、web 后端,或所有客户端(机密存储)。
由启动器读取
| 变量 | 作用 |
|---|---|
MCP_DEBUG | 在顶层 --web 或 --tui 失败时附加错误堆栈(--cli 失败则总是打印其 JSON 错误信封)。只有在设置为有意义的值时生效:0、false 和空值均视为关闭。 |
DEBUG | 同上,且有相同的"有意义的值"规则,因此偶然设置的 DEBUG=0 不会打开堆栈跟踪,而 DEBUG 仍可作为 npm debug 包的命名空间过滤器使用。 |
CLI 与 TUI
其中一些也会被 web 后端读取,如下方 Read by 列所示。
| 变量 | 读取方 | 作用 |
|---|---|---|
MCP_CATALOG_PATH | Web、CLI、TUI | --catalog 的回退值。CLI 只有在未给出临时目标时才采用它,因此导出该变量的 shell 仍可执行一次性的临时调用。web 客户端和 TUI 则无条件应用它,因此在它们那里把它与临时目标组合会被拒绝。 |
MCP_CLIENT_CONFIG_PATH | CLI、TUI | --client-config 的回退值。 |
MCP_OAUTH_CALLBACK_URL | CLI、TUI | --callback-url 的回退值。 |
MCP_STORAGE_DIR | Web、CLI、TUI | 存储目录。会改变 OAuth 状态文件(<dir>/oauth.json)与机密文件(<dir>/secrets.json)的位置。 |
MCP_INSPECTOR_OAUTH_STATE_PATH | CLI、TUI | 逐文件覆盖 OAuth 状态路径。优先于 MCP_STORAGE_DIR。 |
MCP_AUTO_OPEN_ENABLED | Web、CLI | 控制浏览器自动打开。false 从不打开。在 CLI 中,true 强制自动打开并允许在没有 TTY 时运行交互式 OAuth,未设置时仅在 TTY 上打开。在 web 客户端中,未设置时会在启动时打开 UI。TUI 不读取它。 |
Web 后端环境变量
| 变量 | 作用 |
|---|---|
MCP_INSPECTOR_API_TOKEN | 固定会话 token,而不是每次启动随机生成一个。 |
DANGEROUSLY_OMIT_AUTH | 完全禁用 /api/* 的 token 检查。只有 true 或 1 会关闭它。 |
HOST | 绑定主机。默认 127.0.0.1。 |
CLIENT_PORT | Web UI 端口。默认 6274。 |
DANGEROUSLY_BIND_ALL_INTERFACES | 绑定通配主机(0.0.0.0、:: 或任何等价写法)所需的显式选择加入。 |
ALLOWED_ORIGINS | 逗号分隔的来源允许列表。是替换默认列表,而不是合并。 |
MCP_PROXY_AUTH_TOKEN | MCP_INSPECTOR_API_TOKEN 的 v1 旧名,仅在新名称未设置时使用。 |
MCP_SANDBOX_PORT | MCP Apps 沙箱端口。默认 6275;0 表示向操作系统请求一个空闲端口。 |
SERVER_PORT | v1 的代理端口,现在仅在 MCP_SANDBOX_PORT 未设置或无效时作为沙箱端口的回退值。 |
MCP_APP_ORIGIN_PORT | 供声明 _meta.ui.domain 的 MCP Apps 使用的 app-origin 服务器端口。默认 6278;0 表示向操作系统请求。 |
MCP_SANDBOX_FULL_ADDRESS | MCP Apps 沙箱代理的公开 URL,用于在反向代理后运行。 |
MCP_APP_ORIGIN_FULL_ADDRESS | _meta.ui.domain 文档所由之提供的公开来源,用于在反向代理后运行。 |
MCP_LOG_FILE | 将后端的结构化(JSON lines)日志追加到此文件。 |
MCP_AUTO_OPEN_ENABLED | false 会阻止浏览器在启动时打开。参见 CLI 与 TUI。 |
MCP_CATALOG_PATH、MCP_STORAGE_DIR | 如 CLI 与 TUI 中所述。 |
HTTPS_PROXY / HTTP_PROXY / NO_PROXY | 出站 MCP 连接的标准代理路由。 |
DANGEROUSLY_OMIT_AUTH 和 DANGEROUSLY_BIND_ALL_INTERFACES。web 后端会启动进程并持有 OAuth token,因此任何能访问它的人都能操控它。关于 token 保护什么、不保护什么,见 Web 后端及其 API token。
机密存储变量
由所有客户端读取:web、CLI、TUI 以及 mcpdo。它们如何组合见机密存储于何处。
| 变量 | 作用 |
|---|---|
MCP_INSPECTOR_SECRET_STORE | keyring、file 或 memory(大小写不敏感)直接指定存储,并跳过钥匙串探测。空值视为未设置;任何其他值会被忽略并给出警告。 |
MCP_INSPECTOR_SECRET_FILE | 文件存储的路径。当设置了 MCP_STORAGE_DIR 时默认为其中的 secrets.json,否则为 ~/.mcp-inspector/secrets.json。 |
MCP_INSPECTOR_SECRET_KEY_FILE | 保存口令的文件路径,该口令用于加密文件存储(末尾换行会被移除)。首选方式,也正是 Docker 和 Compose secret 的用途。若文件缺失、不可读或为空,存储会拒绝读写。 |
MCP_INSPECTOR_SECRET_KEY | 口令本身。请使用生成的高熵值。同时设置两个密钥变量(且 MCP_INSPECTOR_SECRET_KEY 非空)会报错。 |
MCP_INSPECTOR_PERSIST_TOKENS | 持久化哪些已获取的 OAuth token:all(默认)、access(不保留 refresh token)或 none(每次运行都重新授权)。客户端 secret 始终会被持久化。 |
机密存储于何处
Inspector 会把凭据排除在 mcp.json、client.json 和 oauth.json 之外,这样共享、提交或同步这些文件时就不会泄露它们。这些内容改为存放在机密存储中:
- 已获取的 OAuth token(access、refresh 和 IdP 会话 token);
- 每个服务器的 OAuth 客户端 secret,以及来自 Client Settings 的企业 IdP 客户端 secret;
- 每个 stdio 服务器的
env:值。保存条目时,每个env键仍留在mcp.json中但值为空,真实值则进入存储。
headers 不会被移走。 它们会按写入原样保存在 mcp.json 中,因此携带凭据的 header 会留在文件里。
存储如何被选择
每个进程在第一次需要时选择一次存储:web 后端在启动时,CLI 和 TUI 在首次使用时。所有客户端使用相同顺序:
MCP_INSPECTOR_SECRET_STORE,如果设置为keyring、file或memory。此时不做任何探测。- 操作系统钥匙串,如果探测能访问到:macOS 上的 Keychain、Windows 上的 Credential Manager、Linux 上的 Secret Service(libsecret,如 GNOME Keyring 或 KWallet)。条目存放在服务名
mcp-inspector之下。大多数桌面安装到此为止。 - 回退方案,会在 stderr 上通告:
- 若容器中的机密目录未挂载在卷上,则为
memory,因为容器可写层中的文件无论如何都会丢失; - 其他情况均为
file。
- 若容器中的机密目录未挂载在卷上,则为
| 运行环境 | 存储 | 重启后是否保留? |
|---|---|---|
| 桌面版 macOS 或 Windows,或运行了 Secret Service 的 Linux | 操作系统钥匙串 | 是 |
| 没有 libsecret 或 Secret Service 的 Linux | 文件(secrets.json,权限 0600) | 是 |
| 没有 D-Bus 会话的无头服务器或 SSH 会话 | 文件 | 是 |
| Android/Termux | 文件 | 是 |
| 机密目录未挂载卷的容器 | 内存 | 否,仅限本次会话 |
| 机密目录挂载了卷的容器 | 文件 | 是 |
没有钥匙串时,机密会落到明文文件,而你并未主动要求这样做。 在钥匙串探测失败的主机上(没有 libsecret 或未运行 Secret Service 的 Linux、没有 D-Bus 会话的无头服务器或 SSH 会话、Android/Termux),Inspector 会自动把机密存放在 ~/.mcp-inspector/secrets.json。除非你提供密钥,否则该文件未加密。0600 权限能挡住其他非 root 用户,但挡不住 root,挡不住主目录的备份或副本,也挡不住任何以你的身份运行的程序,包括 Inspector 启动的 stdio 服务器。
请选择其一:
- 恢复钥匙串: 安装 libsecret 并运行 Secret Service(例如
gnome-keyring),或在桌面会话中运行 Inspector。下次启动时 Inspector 会把文件中的机密移入钥匙串并删除该文件。 - 加密该文件: 通过
MCP_INSPECTOR_SECRET_KEY_FILE(首选)或MCP_INSPECTOR_SECRET_KEY提供生成的密钥。 - 完全不把机密写入磁盘: 设置
MCP_INSPECTOR_SECRET_STORE=memory,并在每个会话中重新输入。
即使加密,磁盘上的机密仍带有中等风险。参见文件存储防范哪些风险。
mcpdo从不回退到 memory:它的命令与守护进程是不同进程,因此改用文件存储。
文件存储
文件位于 MCP_INSPECTOR_SECRET_FILE(若设置),否则为 MCP_STORAGE_DIR 中的 secrets.json(若设置),再否则为 ~/.mcp-inspector/secrets.json。默认位置在存储目录(~/.mcp-inspector/storage)旁边,而不是其中。
- 加密需要显式启用。 提供密钥后,文件以 AES-256-GCM 加密,口令经 scrypt 拉伸,盐值在每次写入时随机重新生成。请生成密钥而不是自行挑选,例如
(umask 077 && openssl rand -base64 32 > ~/.config/mcp-inspector/secret-key),并让它远离机密文件、其备份以及任何仓库。 - 之后再添加密钥是安全的。 下一次写入会在原地升级明文文件。
- 更换或丢失密钥则不安全。 无法再解密的文件会被读作空,且 Inspector 拒绝覆盖它。请恢复密钥,或删除该文件并重新输入这些值。
- 权限会被强制执行。 文件以
0600写入,并在启动时重新收紧。若无法做到(所有者不同、只读挂载),日志和设置页脚会说明情况。 - 并发的 Inspector 是安全的。 与 web 会话并行的 CLI 运行会在文件旁的锁上串行化,并通过回读来校验每次写入。
活动存储的报告位置
- 在 stderr 上,当存储被选择时:任何钥匙串回退都会给出警告,若文件未加密、权限过宽或不可读还会再给一条。两者都以指向 Inspector 的机密存储指南的链接结尾。web 客户端的启动横幅在每次运行时都有一行
Secrets:。 - 在 web 客户端中,Client Settings、Server Settings 以及 Add / Edit / Clone server 对话框中的页脚会指出当前存储,并在其仅为内存、未加密、权限过宽或不可读时变为警告。
迁回钥匙串
在原本使用文件存储的机器上安装 libsecret(或启动 Secret Service),下次启动就会选择钥匙串并把文件内容移入其中。钥匙串中已有的值优先于文件中的值。只有在每个条目都得到处置后才会删除文件,而无法解密的文件会原样保留。设置 MCP_INSPECTOR_SECRET_STORE=keyring 会触发同样的移交。选择 file 或 memory 则绝不会从钥匙串中复制出任何内容。
Catalog 文件格式
catalog 或配置文件就是常见的 MCP 客户端配置结构(一个 mcpServers 对象),并在旁边带有逐服务器的 Inspector 设置:
{
"mcpServers": {
"my-stdio-server": {
"command": "node",
"args": ["build/index.js"],
"env": { "API_KEY": "..." }
},
"my-modern-server": {
"type": "http",
"url": "https://api.example.com/mcp",
"protocolEra": "modern",
"modernLogLevel": "info",
"headers": { "X-Tenant": "acme" },
"roots": [{ "uri": "file:///Users/me/project", "name": "project" }]
}
}
}Inspector 回写文件时会省略等于默认值的字段,从而保持差异最小。protocolEra(参见协议世代)默认为 legacy,modernLogLevel 默认为 debug。
你无需手写这些;web 客户端可以从 Claude Desktop、Cursor、Cline 或 VS Code,或从注册表中的 server.json 导入现有客户端配置。