配置与 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 的帮助。

下面的一切都属于某个客户端。

该包还会安装第二个独立的 bin: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 完全不会被填充。

当你把 Inspector 指向一个不是你写的配置文件时——同事的、某个客户端应用的,或签入仓库的——你需要的是 --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_PATHWeb、CLI、TUI--catalog 的回退值。CLI 只有在未给出临时目标时才采用它,因此导出该变量的 shell 仍可执行一次性的临时调用。web 客户端和 TUI 则无条件应用它,因此在它们那里把它与临时目标组合会被拒绝。
MCP_CLIENT_CONFIG_PATHCLI、TUI--client-config 的回退值。
MCP_OAUTH_CALLBACK_URLCLI、TUI--callback-url 的回退值。
MCP_STORAGE_DIRWeb、CLI、TUI存储目录。会改变 OAuth 状态文件(<dir>/oauth.json)与机密文件(<dir>/secrets.json)的位置。
MCP_INSPECTOR_OAUTH_STATE_PATHCLI、TUI逐文件覆盖 OAuth 状态路径。优先于 MCP_STORAGE_DIR。
MCP_AUTO_OPEN_ENABLEDWeb、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_PORTWeb UI 端口。默认 6274。
DANGEROUSLY_BIND_ALL_INTERFACES绑定通配主机(0.0.0.0、:: 或任何等价写法)所需的显式选择加入。
ALLOWED_ORIGINS逗号分隔的来源允许列表。是替换默认列表,而不是合并。
MCP_PROXY_AUTH_TOKENMCP_INSPECTOR_API_TOKEN 的 v1 旧名,仅在新名称未设置时使用。
MCP_SANDBOX_PORTMCP Apps 沙箱端口。默认 6275;0 表示向操作系统请求一个空闲端口。
SERVER_PORTv1 的代理端口,现在仅在 MCP_SANDBOX_PORT 未设置或无效时作为沙箱端口的回退值。
MCP_APP_ORIGIN_PORT供声明 _meta.ui.domain 的 MCP Apps 使用的 app-origin 服务器端口。默认 6278;0 表示向操作系统请求。
MCP_SANDBOX_FULL_ADDRESSMCP Apps 沙箱代理的公开 URL,用于在反向代理后运行。
MCP_APP_ORIGIN_FULL_ADDRESS_meta.ui.domain 文档所由之提供的公开来源,用于在反向代理后运行。
MCP_LOG_FILE将后端的结构化(JSON lines)日志追加到此文件。
MCP_AUTO_OPEN_ENABLEDfalse 会阻止浏览器在启动时打开。参见 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_STOREkeyring、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 在首次使用时。所有客户端使用相同顺序:

  1. MCP_INSPECTOR_SECRET_STORE,如果设置为 keyring、file 或 memory。此时不做任何探测。
  2. 操作系统钥匙串,如果探测能访问到:macOS 上的 Keychain、Windows 上的 Credential Manager、Linux 上的 Secret Service(libsecret,如 GNOME Keyring 或 KWallet)。条目存放在服务名 mcp-inspector 之下。大多数桌面安装到此为止。
  3. 回退方案,会在 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 导入现有客户端配置 。