⚠️ This snapshot is over 30 days old — treat the grade as stale until the next refresh. Re-scan locally to verify.
Trust Card · Static snapshot
modelcontextprotocol__inspector D
40/100 · 58 findings (29 critical) · scope excessive · Ranked #48 of 53 scanned.
Scanned 2026-09-09 · engine v0.1.0 (8 regex rules, OWASP-mapped) · upstream modelcontextprotocol/inspector @ 793d103 (2026-09-02)
Score breakdown
Score constrained by 29 critical and 28 high-severity findings.
Fix first (57 critical/high)
| Severity | Rule | Finding | Remediation |
|---|---|---|---|
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/auth/revocation-e2e.test.ts:41Evidence: const OTHER_CLIENT_SECRET = "test-2144-other-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/ema-mock-servers.ts:23Evidence: export const EMA_MOCK_RESOURCE_CLIENT_SECRET = "ema-mock-resource-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-modern-era-oauth.test.ts:54Evidence: const staticClientSecret = "test-secret-modern-era-oauth"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-direct-mid-session-e2e.test.ts:69Evidence: const staticClientSecret = "test-secret-direct-mid-session"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-direct-mid-session-e2e.test.ts:146Evidence: const staticClientSecret = "test-secret-direct-step-up"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:206Evidence: const staticClientSecret = "test-static-secret-2"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:723Evidence: const staticClientSecret = "test-secret-connect-no-nav"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:786Evidence: const staticClientSecret = "test-secret-connect-retry-no-disconnect"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:1331Evidence: const staticClientSecret = "test-offline-access-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:1401Evidence: const staticClientSecret = "test-no-offline-access-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:1472Evidence: const staticClientSecret = "test-inherited-offline-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:1545Evidence: const staticClientSecret = "test-as-migrate-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-remote-mid-session-e2e.test.ts:130Evidence: const staticClientSecret = "test-secret-mid-session"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-remote-mid-session-e2e.test.ts:215Evidence: const staticClientSecret = "test-secret-reconnect-mid-session"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-remote-mid-session-e2e.test.ts:455Evidence: const staticClientSecret = "test-secret-resume-fallback"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-remote-mid-session-e2e.test.ts:558Evidence: const staticClientSecret = "test-secret-ambient-interactive"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-remote-mid-session-e2e.test.ts:649Evidence: const staticClientSecret = "test-secret-ambient-auth"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth-remote-storage-e2e.test.ts:270Evidence: const staticClientSecret = "test-static-secret-reload"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth.test.ts:204Evidence: const staticClientSecret = "test-auth-fetch-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretclients/web/src/test/integration/mcp/inspectorClient-oauth.test.ts:437Evidence: const staticClientSecret = "test-token-injection-secret"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretcore/auth/node/file-secret-store.ts:109Evidence: export const SECRET_KEY_ENV = "MCP_INSPECTOR_SECRET_KEY"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretcore/auth/node/secret-store-selection.ts:76Evidence: export const SECRET_STORE_ENV = "MCP_INSPECTOR_SECRET_STORE"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretcore/auth/node/secret-store-selection.ts:79Evidence: export const SECRET_FILE_ENV = "MCP_INSPECTOR_SECRET_FILE"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretcore/mcp/remote/constants.ts:6Evidence: export const LEGACY_AUTH_TOKEN_ENV = "MCP_PROXY_AUTH_TOKEN"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-003 (ASI02) | Unbounded Dynamic Shell Executionscripts/lib/announced-child.mjs:51Evidence: const child = spawn(command, args, { | Strictly restrict shell execution to an immutable allowlist of binary commands with explicit argument arrays, or execute inside microVM sandboxes. |
| CRITICAL | AT-SEC-003 (ASI02) | Unbounded Dynamic Shell Executionscripts/lib/claude-cli.mjs:65Evidence: const res = spawn(command, args, options); | Strictly restrict shell execution to an immutable allowlist of binary commands with explicit argument arrays, or execute inside microVM sandboxes. |
| CRITICAL | AT-SEC-003 (ASI02) | Unbounded Dynamic Shell Executionscripts/lib/npm-scripts.mjs:17Evidence: while ((m = re.exec(command)) !== null) { | Strictly restrict shell execution to an immutable allowlist of binary commands with explicit argument arrays, or execute inside microVM sandboxes. |
| CRITICAL | AT-SEC-003 (ASI02) | Unbounded Dynamic Shell Executionscripts/lib/render-smoke.mjs:143Evidence: const child = spawn(command, args, { | Strictly restrict shell execution to an immutable allowlist of binary commands with explicit argument arrays, or execute inside microVM sandboxes. |
| CRITICAL | AT-SEC-003 (ASI02) | Unbounded Dynamic Shell Executionscripts/verify-skills-cli.mjs:104Evidence: const res = spawn(command, winShellArgs(args, platform), { | Strictly restrict shell execution to an immutable allowlist of binary commands with explicit argument arrays, or execute inside microVM sandboxes. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/cli/__tests__/relogin-revocation.test.ts:172Evidence: fs.rmSync(path.dirname(catalogPath), { recursive: true, force: true }); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/cli/__tests__/relogin-revocation.test.ts:192Evidence: fs.rmSync(path.dirname(catalogPath), { recursive: true, force: true }); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/file-lock.test.ts:451Evidence: fs.rmSync(lockPath, { recursive: true, force: true }); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/storage.test.ts:26Evidence: await fs.unlink(stateFilePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/storage.test.ts:464Evidence: await fs.unlink(persistTestPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/storage.test.ts:483Evidence: await fs.unlink(testStatePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/storage.test.ts:544Evidence: await fs.unlink(customPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/storage.test.ts:587Evidence: await fs.unlink(filePath).catch(() => {}); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/auth/node/storage.test.ts:624Evidence: await fs.unlink(customPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/mcp/inspectorClient-ema-e2e.test.ts:79Evidence: await fs.unlink(oauthTestStatePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/mcp/inspectorClient-ema-e2e.test.ts:61Evidence: const res = await fetch(url); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:89Evidence: await fs.unlink(oauthTestStatePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:1114Evidence: await fs.unlink(customPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/mcp/inspectorClient-oauth-e2e.test.ts:1133Evidence: return fetch(input, init); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/mcp/inspectorClient-oauth-fetchFn.test.ts:52Evidence: await fs.unlink(oauthTestStatePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/mcp/inspectorClient-oauth.test.ts:50Evidence: await fs.unlink(oauthTestStatePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/mcp/inspectorClient-xmcpheader-mirroring.test.ts:66Evidence: return fetch(input, init); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/mcp/inspectorClient.test.ts:3989Evidence: await fetch(url!, { | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/mcp/oauth-resource-metadata-challenge.test.ts:135Evidence: return fetch(input, init); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/mcp/oauth-resource-metadata-challenge.test.ts:202Evidence: fetch(input, init), | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationclients/web/src/test/integration/mcp/test-server-protected-resource.test.ts:57Evidence: fs.unlinkSync(invalidPath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/server/sandbox-controller.test.ts:154Evidence: const res = await fetch(url); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressclients/web/src/test/integration/server/sandbox-controller.test.ts:191Evidence: const res = await fetch(url); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egresscore/mcp/fetchTracking.ts:316Evidence: response = await baseFetch(input, init); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egresscore/mcp/node/authChallengeFetch.ts:15Evidence: const response = await baseFetch(input, init); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egresscore/mcp/node/authChallengeFetch.ts:60Evidence: const response = await baseFetch(input, init); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| HIGH | AT-SEC-005 (ASI02) | Unrestricted Recursive File Deletion / Modificationcore/storage/store-io.ts:119Evidence: await fs.unlink(filePath); | Enforce strict jail/root directories and require explicit human-in-the-loop confirmation before file deletions. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egresstest-servers/src/test-helpers.ts:185Evidence: const res = await fetch(url, { headers, signal: controller.signal }); | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingclients/web/server/web-server-config.ts:217Evidence: console.log(` Auth token: ${resolvedToken}\n`); | Implement PII/secret redaction masks before writing to log streams. |
Permissions
Scope: excessive · Shell: enabled · Network egress: yes · File deletion: enabled · Human approval: none
Provenance
License: MIT · Lockfile: yes · Security policy: yes · Signals: present (documentary, not a safety verdict)
Independently scanned by the AgentTrust registry (not self-reported by the project). Static analysis only — no code executed, findings need human triage, counts may include test/example code. Static snapshot; re-scan before relying on it: npx @eulogik/agenttrust scan https://github.com/modelcontextprotocol/inspector. Scores move with every upstream commit; pages refresh weekly. How scoring works.