关于 mcp-inspector
用于调查 MCP 服务行为的技能,面向处理 mcpjam 或 MCP Inspector 输出的开发者。它提供从探测、认证和接口检查到安全审查的分步工作流,并强调依据原始证据区分协议问题与工具链提示。
主要功能
- 01探测服务及其认证状态
- 02登录 OAuth 并保存凭据
- 03检查和调用工具、资源及提示词
- 04验证 MCP Apps 与界面渲染
- 05按阶段审查安全状况
适用场景
- 01排查 MCP 服务的协议或互操作问题
- 02检查 OAuth 认证后的服务接口
- 03验证工具结果是否在 Inspector 中渲染
- 04审查服务的认证方式与安全风险
MCP 相关
该技能指导使用 mcpjam CLI 探测 MCP 服务、完成认证并检查其工具、资源和提示词。它也提供 MCP Apps 一致性检查及安全审查流程。
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mcpjam/ inspector --skill mcp-inspector安装后在 Claude Code 中输入/mcp-inspector确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/cli-surface-notes.mdmcp-2025-11-25-interpretation.mdsecurity-best-practices.mdxaa-id-jag-interpretation.md详细介绍
MCPJam CLI 调查
在分析来自 mcpjam 或 MCP Inspector 输出的 MCP 服务行为时使用此技能。目标是区分:
- 真正的协议问题
- 互操作性警告
- 实现方面的完善度
- mcpjam 或 SDK 产生的伪象
交互式使用
当用户希望连接到服务并使用它时:
- 先探测服务:
server probe --url <url> --quiet --format json。
- 使用探测结果了解身份验证状况、资源元数据、授权服务器元数据和注册策略,再判断已连接的接口是否公开。
- 如果探测结果显示
oauth_required,请使用oauth login --credentials-out <path>进行身份验证;如果任务是专门测试 OAuth 流程,则运行oauth conformance --credentials-out <path>。 - 发现工具:
tools list --url <url> --credentials-file <path> --quiet --format json。
toolsMetadata中含有_meta.ui.resourceUri、已弃用的_meta["ui/resourceUri"]或openai/outputTemplate的工具具有交互式 UI。- 对于特定工具,请检查
toolsMetadata.<toolName>._meta.ui.resourceUri、toolsMetadata.<toolName>._meta["ui/resourceUri"]或toolsMetadata.<toolName>["openai/outputTemplate"]。
- 执行工具:
tools call --url <url> --tool-name <name> --tool-args <json> --credentials-file <path>。 - 使用 UI 执行:
tools call --url <url> --tool-name <name> --tool-args <json> --credentials-file <path> --ui。
--ui会启动或连接到本地 Inspector 后端,并在 App Builder 中呈现已完成的结果。- 在非 TTY、Agent 和 CI 运行中,
--ui默认不会打开浏览器。需要 CLI 自行打开 App Builder 时,请传入--open。 --open会打开系统浏览器 URL;它不会连接到已受控的自动化浏览器,也不会让新标签页加载注入的渲染内容。如果浏览器自动化已打开 Inspector App Builder,请使用--no-open。如果必须禁止启动、打开浏览器和发现操作,请使用--attach-only。no_active_client表示 Inspector 后端可能正在运行,但没有浏览器客户端连接。如需手动恢复,请使用mcpjam inspector open,而非mcpjam inspector start。- 根级
error.code或inspectorRender.commands.*.error.code中的unknown_server表示 Inspector 无法匹配所请求的服务。如果消息表明 App Builder 当前聚焦于另一个服务,请使用--server-name <focused-name>重试。 - UI 成功应以
inspectorRender.status === "rendered"为准,而不能只看退出代码0。如果渲染状态为skipped,请根据inspectorRender.remediation或稳定的根级warning.code采取不同处理。 - 不要要求提供外部截图来证明渲染成功;iframe/canvas 内容可能导致浏览器快照工具无法正常工作。应优先参考
inspectorRender.status、命令响应和快照证据。 - 仅当工具具有 UI 元数据或用户明确要求查看 UI 时,才使用
--ui。
当用户要求调查、审计或分流处理时,请使用下面的调查工作流。
默认立场
- 相比经过规范化处理的 CLI 便捷输出,应更信任原始请求/响应证据。
- 应区分观察结果、合规性问题和安全发现。它们彼此相关,但不能互换。
- 根据规范强度评估声明:
MUST和MUST NOT是强有力的符合性信号;SHOULD和RECOMMENDED是较宽松的指导;MAY和可选字段通常仅供参考。 - 除非能证明攻击者可获得具体收益或存在明确的破坏路径,否则不要将安全发现标为
high。 - 证据模糊时,应降低置信度或使用
pending,不要夸大结论。
调查工作流
- 从能够证实该说法的最精简命令开始。
- 如果命令可能失败、你需要可复用的交接产物,或 CI 应保留证据,请在
server probe、server validate、tools call或oauth login后添加--debug-out <path>。 - 如果探测结果显示
oauth_required,且任务是检查服务端界面,请继续使用oauth login或其他受支持的身份验证流程,获取可复用的凭据,然后再判断身份验证后的行为。对于多命令连接会话,使用oauth login、oauth conformance或oauth conformance-suite上的--credentials-out <path>持久化令牌,并在后续命令中使用--credentials-file <path>;有关仅访问令牌的例外情况,请阅读references/cli-surface-notes.md。如果令牌已可用(CI、M2M、环境变量),请尽可能优先使用凭据文件,仅在不得已时才传入--access-token或--oauth-access-token。 - 成功完成身份验证后,使用
server info、server capabilities、tools list、resources list/read/templates和prompts list/get等直接命令检查已连接的界面。 - 如果你需要一份广度优先的快照,而不是多个单一用途的命令输出,请使用
server doctor --out <path>。 - 如果输出来自
server doctor或--debug-out产物,请将其拆分为主要命令证据、探测证据和已连接扫描证据。 - 如果说法具体涉及 MCP Apps 工具元数据或
ui://资源,请先运行apps conformance --quiet --format json,再考虑改用tools list或resources read。 - 如果说法涉及工具结果在 Inspector 中的渲染,请使用
tools call --tool-name <name> --tool-args <json|@file|-> --ui --quiet --format json。
- 在非 TTY 运行中,如果尚未连接 Inspector 浏览器客户端,请添加
--open。 - 如果浏览器自动化已打开
http://127.0.0.1:6274/#app-builder,请添加--no-open;--open会启动系统浏览器,且目标可能不是由自动化控制的客户端。 - 使用
inspectorRender.status === "rendered"确认 UI 已交付。将inspectorRender.remediation和稳定的跳过渲染warning.code值视为恢复提示,而不是 MCP 工具故障。 - 如果根错误或命令错误中出现
unknown_server,且消息中指出了目标服务,请使用--server-name <focused-name>重试。 - 如果跳过渲染时应报硬错误而不是警告,请使用
--require-render。
- 如果某个字段可能由 CLI 添加或经 SDK 规范化,请在得出结论前阅读
references/cli-surface-notes.md。 - 如果说法依赖 MCP 语义,请阅读
references/mcp-2025-11-25-interpretation.md。 - 如果任务涉及 Cross-App Access、ID-JAG 或企业管理的授权,请在分析
xaa run输出前阅读references/xaa-id-jag-interpretation.md。 - 如果任务涉及安全审查,请阅读
references/security-best-practices.md中的完整清单,并遵循下方的安全审查工作流。 - 按照下方的输出约定撰写结果。
安全审查工作流
当任务是评估 MCP 服务的安全状况时,请使用此工作流。所有检查都使用现有 CLI 命令,无需特殊安全工具。不要假设每个服务都应要求身份验证。
阶段 1:观察(只读)
首先运行 server probe --url <target> --quiet --format json。只有在有助于厘清情况时,才添加 oauth metadata 或 server doctor --out <path>。
- 记录初始身份验证信号:
full-auth candidate:探测status为oauth_requiredpublic-or-mixed candidate:探测status为readyunknown:探测结果仅为reachable、error或其他不明确状态
- 收集发现信息:
- OAuth 元数据 URL,以及它们指向公开、私有还是可疑目标
scopes_supported、WWW-Authenticate和 PKCE 方法dcr、cimd和preregistered等注册策略
- 记录你所依据的证据。原始探测/RPC 证据优于 doctor 摘要或便捷字段。
- 阶段 1 可形成观察结果和合规性说明。仅凭阶段 1 不应评定为
high安全严重级别。
阶段 2:触发行为(仍以未认证为主)
在行为确认之前,应将阶段 1 的身份验证信号视为暂定结论。
- 对于
full-auth candidate:- 如果支持 DCR,则运行 DCR 结构探测
- 在可行时,抽查有代表性的未认证
tools list或tools call行为 - 检查对格式错误、已过期或受众明显错误的令牌的处理方式,但不要夸大拒绝所能证明的内容
- 对于
public-or-mixed candidate:- 运行未认证的
tools list - 将暴露的工具分类为只读、写入或有副作用
- 未认证地调用有代表性的公开工具
- 检查受限工具是否会明确返回身份验证质询,而不是静默返回空数据或部分数据
- 运行未认证的
- 匿名访问层级、速率限制或受限的公开访问属于安全状况说明,不应单独构成一种安全状况类别。
- 阶段 2 行为明确后,重新归类为
no-auth、full-auth、mixed-auth或unknown之一。如果阶段 2 与阶段 1 矛盾,应更新安全状况并重新运行相关检查,而不是强行沿用旧分类。 - 在阶段 3 证实攻击者获益之前,阶段 2 的输入验证问题最高只能评为
medium安全严重级别。 - 阶段 2 中,设计或安全状况方面的问题可能构成真实的安全问题,但不要自动提升严重级别。在评为
medium或high之前,应记录不安全行为、滥用路径以及对所有者意图的不确定性。
阶段 3:利用或确认攻击者获益
如果证据依赖用户同意或 Cookie,请使用 oauth login 和同一浏览器会话。
- 使用阶段 3,将合理的安全疑虑转化为真实的端到端安全问题:
- 证明 DCR 与授权流程的组合问题
- 证明重定向 URI 精确匹配检查可被绕过
- 证明接受外部令牌或传递令牌
- 捕获代码、令牌或跨租户数据
- 跳过用户同意是评为
high的一种途径,但并非唯一途径。任何能够证明攻击者获得具体利益的链条都可支持high评级。
阶段 4:盘点影响范围
- 身份验证成功后,解码 JWT 声明,使用原始日志检查
Mcp-Session-Id,并枚举工具、资源、提示词、作用域和租户上下文。 - 阶段 4 主要用于评估影响范围。除非同时证明了滥用行为,否则应将其视为背景信息。
安全严重级别校准
high:有直接证据证明攻击者获益,或符合规范的客户端遭到破坏medium:存在可信的安全问题和具体攻击场景,但端到端证据仍不完整low:加固方面的缺口或影响有限的安全隐患pending:存在合理的安全隐患,且缺少某项具体证据;补足该证据可能显著提高或降低严重级别info:真实的观察结果,但尚无可信的攻击者获益
如果清单中的某项检查命中,但证据不足,请使用 pending,不要人为评定为 medium 或 high 安全严重级别。
命令选择
server probe:检查 HTTP 传输的可达性、初始化行为和 OAuth 发现提示。server doctor:生成综合诊断材料,涵盖探测和连接后的行为。适合广泛排查,但单独使用时未必足以证明线路级行为。oauth metadata、oauth proxy、oauth debug-proxy:当一致性检查结果出乎意料时,精确检查端点和元数据。oauth login:获取可重复使用的凭据,并验证通过身份验证的 MCP 路径。使用--credentials-out <path>将令牌保存到磁盘(权限模式为 0600),以便后续连接命令使用--credentials-file <path>,无需手动提取令牌;需要未过期访问令牌的命令,请查看references/cli-surface-notes.md。当目标是检查需要 OAuth 的服务时,请使用此命令,然后继续执行连接命令,而不要停留在登录结果上。oauth conformance、oauth conformance-suite:进行流程级身份验证检查。请将其视为针对性探测,而非完整的安全审查。若通过的流程应将凭据交给后续连接命令,请使用--credentials-out <path>;之后使用--credentials-file <path>,而不要从 JSON 输出中提取令牌。默认情况下,原始 JSON 输出会隐藏 OAuth 密钥。启用--conformance-checks后,该命令可以直接探测 DCR 对非回环http://重定向的处理、对无效客户端的拒绝、授权端点对重定向 URI 不匹配的处理、MCP 服务对无效承载令牌的拒绝,以及令牌端点对重定向 URI 不匹配的处理。xaa run:针对授权服务和 MCP 服务执行无头 Cross-App Access(ID-JAG)流程——签发令牌、通过 JWT 承载授权授予进行兑换,并执行通过身份验证的 MCP 初始化。当任务涉及企业管理的授权或 ID-JAG 信任排查时,请使用此命令。需要--issuer-base-url指向发布 CLI 本地签名密钥的源(通常为mcpjam inspector start);排查输出前,请阅读references/xaa-id-jag-interpretation.md。这些是针对当前 ID-JAG 草案的定向检查,并非一致性测试套件;负向测试评分卡(篡改后的 ID-JAG)位于 Inspector UI 中,而非 CLI 中。apps conformance:执行服务端 MCP Apps 检查,涵盖_meta.ui.resourceUri、ui://资源、resources/read、HTML MIME 类型和载荷结构,以及_meta.ui元数据。使用此命令排查 MCP Apps 接口问题。server info、server capabilities、server validate、server ping、server export:检查初始化和身份验证后的连接行为。tools list和tools call、resources list/read/templates、prompts list/get/list-multi:直接检查连接后的能力。使用--ui时,tools call会在 Inspector 中渲染已完成的工具结果,并将inspectorRender报告为 UI 命令/渲染证据。- 优先使用
--quiet --format json。如需请求和响应证据,而非摘要,请在支持时添加--rpc。如需确保失败时仍能生成材料,请添加--debug-out,但不要用它替代原始证据。 - 在一致性检查和差异命令中,使用
--reporter junit-xml或--reporter json-summary生成 CI 报告材料。server validate不接受--reporter;验证材料请使用--debug-out。不要使用--format junit-xml;--format仅用于原始json或human输出。 - 对于 JSON 值选项,当载荷由程序生成或包含引号时,优先使用
@path或-标准输入,而不是在 Shell 中转义内联 JSON。例如:mcpjam tools call --url <target> --tool-name <name> --tool-args @params.json --quiet --format json。
输出约定
常规分类输出
对于非安全任务,返回:
Verdict:real issue、interop warning、implementation polish或scanner/client artifactSeverity:high、medium、low或infoConfidence:high、medium或lowWhy it matters:用一段简短说明,联系互操作性、安全性或用户影响Evidence:支持该结论的确切命令行行为Missing evidence:在提高严重性或置信度之前需要确认的内容
安全审查输出
对于每项声称的安全审查发现,返回:
Verdict:real issue、interop warning、implementation polish或scanner/client artifactCompliance severity:high、medium、low或infoSecurity severity:high、medium、low、info或pendingConfidence:high、medium或lowAttack scenario or pending rationale:如果Security severity为medium或high,开头用 2-3 句话说明攻击者是谁、需要什么条件以及能获得什么;如果为pending,准确说明缺少什么证据Verified via:支持该结论的阶段及确切命令或结果Evidence:支持该结论的确切命令行行为Missing evidence:在提高严重性或置信度之前需要确认的内容
硬性规则
- 切勿将
toolsMetadata称为 MCP 服务字段。 - 切勿使用已移除的 app/widget 命令渲染 UI。使用
tools call --ui;如需原始资源 HTML,则使用resources read --resource-uri ui://...。 - 当
tools call --ui可以驱动渲染时,切勿手动编排 Inspector API 调用。 - 用户指定了服务但未指定具体工具时,切勿跳过
tools list发现步骤。 - 除非有原始 RPC 证据表明实际向服务器发送了
prompts/list并收到响应,否则切勿根据空的提示词列表推断服务器支持提示词。 - 用户要求检查经过身份验证的服务器接口,而 CLI 可以完成登录时,切勿停留在
oauth_required。应进行身份验证,并在可行时继续执行登录后的命令。 - 切勿将
apps conformance通过视为完全符合 SEP-1865。当前命令仅检查服务器端,无法证明主机生命周期、沙盒代理或 postMessage 桥接行为符合要求。 - 缺少
outputSchema、内容注释、scopes_supported或scope提示等可选元数据时,除非存在MUST要求,否则切勿视为硬性失败。 - 将 OAuth RFC 违规与 MCP 配置文件偏好区分开来。
- 区分“服务器正确拒绝了错误请求”和“整体设计是安全的”。
- 将
--debug-out生成的产物视为汇总证据包,而非纯粹的线上传输捕获记录。 - 切勿将缺少
scopes_supported或WWW-Authenticate中缺少scope标记为安全问题。这两者都是可选项。 - 切勿仅凭服务器拒绝了某个特定的错误输入,就声称服务器“安全”。一次负向测试无法证明整体安全态势。
- 切勿将通过
oauth_invalid_token或重定向不匹配探测视为整个授权设计安全的证明。这些检查只能证明所发送的确切用例。 - 切勿仅凭检查清单中的一项就将安全严重性定为
high。 - 除非能证明服务器接受了面向不同受众或资源签发的令牌,或以其他方式错误绑定令牌,否则 JWT
aud不匹配不能证明令牌透传。 - 支持
plainPKCE 通常只是加固措施。当攻击者拥有客户端的 DCR 流程由攻击者选择 verifier 时,这一点不能叠加成更严重的问题。 - 除非能证明服务器会获取这些值,否则恶意
redirect_uri值不构成 SSRF。 - 未经身份验证的公开访问本身不构成问题。应检查实际行为是否符合所宣称的安全态势,以及暴露的接口在设计上是否安全。
- 匿名试用或速率限制访问属于安全态势说明,不应作为单独的严重性问题。
- 将多个问题合并分析时,应说明组合攻击路径。切勿只列出互不相关的问题,就称组合后的情况更糟。
- 如果
verify_issuer_publication失败,或者错误是steps数组为空的纯连接失败,切勿将xaa run失败归咎于目标服务器。这些是本地 issuer 设置问题:--issuer-base-url必须提供 CLI 的本地签名密钥。 - 当兑换成功时,切勿将
xaa run输出中的not_advertised能力证据视为失败;也切勿将已公告视为兑换必定成功的证明。公告只是证据;令牌端点的响应才是判定结果。unknown(元数据键缺失)是比not_advertised(键存在但不含该值)更弱的证据——切勿混为一谈。 - 切勿将
idJag.verified: true视为授权服务器已验证断言的证明。这表示 CLI 使用自己的 issuer 验证自己签发的断言。 - 切勿根据一次完成的
xaa run就声称符合 ID-JAG 或具备安全的 XAA 安全态势。它只能证明一种注册策略下的一条成功路径。 - 切勿描述
--assertion-format saml会生成 SAML ID-JAG。它会改变身份断言环节和sub_id声明;ID-JAG 始终是 JWT。ID-JAG 是一份正在制定的 IETF Internet-Draft——引用 MUST/SHOULD 要求时,应注明草案修订版本,而非 RFC。 - 切勿将
xaa run输出中的[REDACTED]值报告为缺失数据,也切勿索要未脱敏输出。脱敏是有意设计的,即使服务器反射了机密信息,脱敏仍会保留。
参考指南
references/cli-surface-notes.md用于了解特定命令的注意事项、产物结构、本地补充信息、合并后的错误以及规范化的空数组。references/mcp-2025-11-25-interpretation.md用于根据最新 MCP 规范解读功能、生命周期、传输、授权、工具、资源和提示词。references/xaa-id-jag-interpretation.md用于解读xaa run的输出:三方信任模型、颁发方前提条件、功能证据语义、注册警告分类、SAML 维度,以及 Cross-App Access 发现项的严重性校准。references/security-best-practices.md用于将安全审查检查项映射到 CLI 命令。涵盖 SSRF、困惑代理、PKCE、令牌透传、范围最小化、授权态势检查和会话安全。来源:https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices
评论
支持 Markdown