mcp-inspector
MCPJam CLI Investigation
Use this skill when analyzing MCP server behavior from mcpjam or MCP Inspector output. The goal is to separate:
- real protocol issues
- interoperability warnings
- implementation polish
- mcpjam or SDK artifacts
Interactive use
When the user wants to connect to a server and use it:
- Probe the server first:
server probe --url <url> --quiet --format json.
- Use the probe to learn auth posture, resource metadata, authorization-server metadata, and registration strategies before assuming the connected surface is public.
- If the probe shows
oauth_required, authenticate withoauth login --credentials-out <path>or runoauth conformance --credentials-out <path>when the task is specifically to test the OAuth flow. - Discover tools:
tools list --url <url> --credentials-file <path> --quiet --format json.
- Tools with
_meta.ui.resourceUri, deprecated_meta["ui/resourceUri"], oropenai/outputTemplateintoolsMetadatahave interactive UI. - For a specific tool, check
toolsMetadata.<toolName>._meta.ui.resourceUri,toolsMetadata.<toolName>._meta["ui/resourceUri"], ortoolsMetadata.<toolName>["openai/outputTemplate"].
- Execute a tool:
tools call --url <url> --tool-name <name> --tool-args <json> --credentials-file <path>. - Execute with UI:
tools call --url <url> --tool-name <name> --tool-args <json> --credentials-file <path> --ui.
--uistarts or attaches to the local Inspector backend and renders the completed result in App Builder.- In non-TTY, agent, and CI runs,
--uidoes not open a browser by default. Pass--openwhen the CLI should open App Builder itself. --openopens a system browser URL; it does not attach an already-controlled automation browser or make fresh tabs hydrate an injected render. Use--no-openwhen browser automation already opened Inspector App Builder. Use--attach-onlywhen startup, browser opening, and discovery must all be disallowed.no_active_clientmeans the Inspector backend may be running but no browser client is attached. If manual recovery is needed, usemcpjam inspector open, notmcpjam inspector start.unknown_serverin the rooterror.codeor aninspectorRender.commands.*.error.codemeans Inspector could not match the requested server. If the message says App Builder is focused on another server, retry with--server-name <focused-name>.- Treat UI success as
inspectorRender.status === "rendered", not exit code0alone. If the render isskipped, branch oninspectorRender.remediationor the stable rootwarning.code. - Use
--require-renderwhen the UI render itself is the deliverable and a skipped render should fail the command. - Do not require external screenshots as proof of render success; iframe/canvas content can defeat browser snapshot tools. Prefer
inspectorRender.status, command responses, and snapshot evidence. - Use
--uionly when the tool has UI metadata or the user explicitly asks to see UI.
When the user asks to investigate, audit, or triage, use the Investigation workflow below.
Default stance
- Treat raw request/response evidence as higher trust than normalized CLI convenience output.
- Separate observations, compliance issues, and security findings. They are related, but not interchangeable.
- Map claims to spec strength:
MUSTandMUST NOTare strong conformance signals;SHOULDandRECOMMENDEDare softer guidance;MAYand optional fields are usually informational. - Do not label a security finding
highunless you can support a concrete attacker benefit or clear breakage path. - When evidence is ambiguous, lower confidence or use
pendingbefore overstating the conclusion.
Investigation workflow
- Start with the narrowest command that actually proves the claim.
- If the command may fail, you want a reusable handoff artifact, or CI should retain evidence, add
--debug-out <path>toserver probe,server validate,tools call, oroauth login. - If the probe shows
oauth_requiredand the task is to inspect the server surface, continue withoauth loginor another supported auth flow to obtain reusable credentials before judging post-auth behavior. For multi-command connected sessions, use--credentials-out <path>onoauth login,oauth conformance, oroauth conformance-suiteto persist tokens and--credentials-file <path>on later commands; readreferences/cli-surface-notes.mdfor access-token-only exceptions. When a token is already available (CI, M2M, env var), prefer a credentials file when possible and pass--access-tokenor--oauth-access-tokenonly as an escape hatch. - After successful auth, inspect the connected surface with direct commands such as
server info,server capabilities,tools list,resources list/read/templates, andprompts list/get. - Use
server doctor --out <path>when you need one breadth-first snapshot instead of several single-purpose command outputs. - If the output came from
server doctoror a--debug-outartifact, split it into primary command evidence, probe evidence, and connected-sweep evidence. - If the claim is specifically about MCP Apps tool metadata or
ui://resources, start withapps conformance --quiet --format jsonbefore dropping totools listorresources read. - If the claim is about a tool result rendering in Inspector, use
tools call --tool-name <name> --tool-args <json|@file|-> --ui --quiet --format json.
- In non-TTY runs, add
--openif no Inspector browser client is already attached. - If browser automation already opened
http://127.0.0.1:6274/#app-builder, add--no-open;--openlaunches a system browser and may not target the automation-controlled client. - Confirm UI delivery with
inspectorRender.status === "rendered". TreatinspectorRender.remediationand stable skipped-renderwarning.codevalues as recovery hints, not MCP tool failures. - If
unknown_serverappears in the root error or command errors and the message names the focused server, retry with--server-name <focused-name>. - Use
--require-renderwhen a skipped render should become a hard error instead of a warning.
- If a field may be CLI-added or SDK-normalized, read
references/cli-surface-notes.mdbefore concluding anything. - If the claim depends on MCP semantics, read
references/mcp-2025-11-25-interpretation.md. - If the task involves security review, read
references/security-best-practices.mdfor the full checklist and follow the security review workflow below. - Write the result using the output contract below.
Security review workflow
Use this when the task is to assess an MCP server's security posture. All checks use existing CLI commands. No special security tooling is needed. Do not assume every server should require auth.
Phase 1: Observe (read-only)
Run server probe --url <target> --quiet --format json first. Add oauth metadata or server doctor --out <path> only when they clarify the picture.
- Record an initial auth signal:
full-auth candidate: probestatusisoauth_requiredpublic-or-mixed candidate: probestatusisreadyunknown: probe is onlyreachable,error, or otherwise ambiguous
- Capture discovery facts:
- OAuth metadata URLs and whether they point to public, private, or suspicious targets
scopes_supported,WWW-Authenticate, and PKCE methods- registration strategies such as
dcr,cimd, andpreregistered
- Record the evidence surface you are trusting. Raw probe/RPC evidence beats doctor summaries or convenience fields.
- Phase 1 can produce observations and compliance notes. By itself it should not produce a
highsecurity severity.
Phase 2: Provoke (behavior, still mostly unauth)
Treat the Phase 1 auth signal as provisional until behavior confirms it.
- For a
full-auth candidate:- run DCR shape probes if DCR is supported
- spot-check representative unauth
tools listortools callbehavior when feasible - check malformed, expired, or obviously wrong-audience token handling without overstating what a rejection proves
- For a
public-or-mixed candidate:- run unauth
tools list - classify exposed tools as read-only, write, or side-effect
- call representative public tools unauth
- check whether gated tools fail with a clean auth challenge instead of silent empty data or partial data
- run unauth
- Anonymous tiers, rate limits, or degraded public access are posture notes, not a separate posture class.
- Reclassify to one of
no-auth,full-auth,mixed-auth, orunknownonce Phase 2 behavior is clear. If Phase 2 contradicts Phase 1, update the posture and rerun the relevant checks instead of forcing the old classification. - Input-validation hits from Phase 2 cap at
mediumsecurity severity until Phase 3 proves attacker benefit. - Design or posture findings can be real security findings in Phase 2, but do not auto-promote them. Document the unsafe behavior, abuse path, and any owner-intent uncertainty before calling them
mediumorhigh.
Phase 3: Exploit or confirm attacker benefit
Use oauth login and the same browser session when the proof depends on consent or cookies.
- Use Phase 3 to turn a plausible concern into a real end-to-end security finding:
- DCR plus authorization flow proof
- redirect URI exact-match bypass proof
- foreign-token acceptance or token passthrough proof
- code, token, or cross-tenant data capture
- Consent skip is one route to
high, not the only route. Any demonstrated chain that shows concrete attacker gain can justifyhigh.
Phase 4: Inventory blast radius
- After auth succeeds, decode JWT claims, inspect
Mcp-Session-Idwith raw logs, and enumerate tools, resources, prompts, scopes, and tenant context. - Phase 4 is mainly blast-radius calibration. Treat it as context unless you also prove abuse.
Security severity calibration
high: demonstrated attacker benefit or conforming-client breakage with direct evidencemedium: credible security issue with a concrete attack scenario, but end-to-end proof is still partiallow: hardening gap or limited-impact security concernpending: plausible security concern with a specific missing proof step that could materially raise or lower severityinfo: true observation with no credible attacker benefit yet
Use pending instead of manufacturing a medium or high security severity from a checklist hit.
Command choice
server probe: HTTP transport reachability, initialize behavior, and OAuth discovery hints.server doctor: combined triage artifact for probe plus connected behavior. Good for breadth, not always sufficient to prove wire-level behavior by itself.oauth metadata,oauth proxy,oauth debug-proxy: exact endpoint and metadata inspection when conformance output looks surprising.oauth login: obtain reusable credentials and verify the authenticated MCP path. Use--credentials-out <path>to save tokens to disk (mode 0600) so later connected commands can use--credentials-file <path>without manual token extraction; checkreferences/cli-surface-notes.mdfor commands that require a non-expired access token. Use this when the goal is to inspect a server that requires OAuth, then follow it with connected commands rather than stopping at the login result.oauth conformance,oauth conformance-suite: flow-level auth checks. Treat these as targeted probes, not a complete security review. Use--credentials-out <path>when a passing flow should hand credentials to later connected commands; use--credentials-file <path>after that instead of extracting tokens from JSON output. Raw JSON output redacts OAuth secrets by default. When--conformance-checksis enabled, the command can directly probe DCR non-loopbackhttp://redirects, invalid client rejection, authorization-endpoint redirect mismatch handling, invalid bearer-token rejection at the MCP server, and token-endpoint redirect mismatch handling.apps conformance: server-side MCP Apps checks for_meta.ui.resourceUri,ui://resources,resources/read, HTML MIME and payload shape, and_meta.uimetadata. Use this for MCP Apps surface triage.server info,server capabilities,server validate,server ping,server export: connected behavior after initialization and auth.tools listandtools call,resources list/read/templates,prompts list/get/list-multi: direct post-connect capability checks. With--ui,tools callrenders the completed tool result in Inspector and reportsinspectorRenderas UI command/render evidence.- Prefer
--quiet --format json. Add--rpcwhen available if you need request and response evidence rather than a summary. Add--debug-outwhen you need a failure-safe artifact, not as a replacement for raw evidence. - Use
--reporter junit-xmlor--reporter json-summaryfor CI report artifacts on conformance and diff commands.server validatedoes not accept--reporter; use--debug-outfor validation artifacts. Do not use--format junit-xml;--formatis only for rawjsonorhumanoutput. - For JSON-valued options, prefer
@pathor-stdin over shell-escaped inline JSON when payloads are generated or contain quotes. For example:mcpjam tools call --url <target> --tool-name <name> --tool-args @params.json --quiet --format json.
Output contract
General triage output
For non-security tasks, return:
Verdict:real issue,interop warning,implementation polish, orscanner/client artifactSeverity:high,medium,low, orinfoConfidence:high,medium, orlowWhy it matters: one short paragraph tied to interoperability, security, or user impactEvidence: the exact CLI behavior that supports the claimMissing evidence: what would need to be confirmed before raising severity or confidence
Security review output
For each claimed security-review finding, return:
Verdict:real issue,interop warning,implementation polish, orscanner/client artifactCompliance severity:high,medium,low, orinfoSecurity severity:high,medium,low,info, orpendingConfidence:high,medium, orlowAttack scenario or pending rationale: ifSecurity severityismediumorhigh, open with 2-3 sentences answering who the attacker is, what they need, and what they gain; if it ispending, say exactly what proof is missingVerified via: the phase plus exact command or result that supports the claimEvidence: the exact CLI behavior that supports the claimMissing evidence: what would need to be confirmed before raising severity or confidence
Hard rules
- Never call
toolsMetadataan MCP server field. - Never use removed app/widget commands for UI rendering. Use
tools call --ui; useresources read --resource-uri ui://...for raw resource HTML. - Never manually orchestrate Inspector API calls when
tools call --uican drive the render. - Never skip
tools listdiscovery when the user names a server but not a specific tool. - Never infer prompt support from an empty prompts list unless you have raw RPC evidence that
prompts/listwas actually sent and answered by the server. - Never stop at
oauth_requiredwhen the user asked to inspect the authenticated server surface and the CLI can complete login. Authenticate and continue with post-login commands when feasible. - Never treat a passing
apps conformanceresult as full SEP-1865 conformance. The current command is server-side only and does not prove host lifecycle, sandbox proxy, or postMessage bridge behavior. - Never treat missing optional metadata such as
outputSchema, content annotations,scopes_supported, orscopehints as a hard failure without aMUST. - Separate OAuth RFC violations from MCP profile preferences.
- Distinguish "the server correctly rejected a bad request" from "the overall design is secure."
- Treat
--debug-outartifacts as aggregated evidence envelopes, not pure wire captures. - Never flag missing
scopes_supportedor missingscopeinWWW-Authenticateas a security issue. Both are optional. - Never claim a server is "secure" based solely on it rejecting one specific bad input. A single negative test does not prove broader security posture.
- Never treat a passing
oauth_invalid_tokenor redirect-mismatch probe as proof that the whole authorization design is secure. Those checks only prove the exact case that was sent. - Never let a checklist hit assign
highsecurity severity by itself. - JWT
audmismatch is not token passthrough proof unless you show the server accepts a token issued for a different audience or resource, or otherwise misbinds the token. - Supporting
plainPKCE is usually hardening only. It cannot compound with attacker-owned-client DCR flows where the attacker chose the verifier. - Hostile
redirect_urivalues are not SSRF unless you show the server fetches them. - Public unauthenticated access is not itself a finding. Check whether behavior matches advertised posture and whether exposed surfaces are safe by design.
- Anonymous trial or rate-limited access is a posture note, not a separate severity finding.
- When compounding findings, explain the compound attack path. Do not just list unrelated findings and call the combination worse.
Reference map
references/cli-surface-notes.mdUse for command-specific caveats, artifact shapes, local enrichments, merged errors, and normalized empty arrays.references/mcp-2025-11-25-interpretation.mdUse for capability, lifecycle, transport, authorization, tools, resources, and prompts interpretation against the latest MCP spec.references/security-best-practices.mdUse for security review checks mapped to CLI commands. Covers SSRF, confused deputy, PKCE, token passthrough, scope minimization, auth-posture checks, and session security. Source: https://modelcontextprotocol.io/docs/tutorials/security/security_best_practices