⚠️ 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__typescript-sdk D
40/100 · 78 findings (4 critical) · scope excessive · Ranked #47 of 53 scanned.
Scanned 2026-09-09 · engine v0.1.0 (8 regex rules, OWASP-mapped) · upstream modelcontextprotocol/typescript-sdk @ 5119ee7 (2026-09-03)
Score breakdown
Score constrained by 4 critical and 59 high-severity findings.
Fix first (63 critical/high)
| Severity | Rule | Finding | Remediation |
|---|---|---|---|
| CRITICAL | AT-SEC-003 (ASI02) | Unbounded Dynamic Shell Executionpackages/codemod/src/bin/batchTest.ts:220Evidence: const stdout = execSync(cmd, { | 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/examples/run-examples.ts:80Evidence: const child = spawn(cmd, args, { cwd: opts.cwd, env: { ...process.env, ...opts.env } }); | Strictly restrict shell execution to an immutable allowlist of binary commands with explicit argument arrays, or execute inside microVM sandboxes. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettest/e2e/scenarios/client-auth.test.ts:1024Evidence: const CLIENT_SECRET = 'machine-client-secret'; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettest/e2e/scenarios/client-auth.test.ts:1581Evidence: const REGISTERED_SECRET = 'auth-method-client-secret'; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressexamples/bearer-auth/client.ts:12Evidence: const unauth = 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 Egressexamples/bearer-auth-web/client.ts:13Evidence: const unauth = 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 Egressexamples/guides/advanced/gateway.examples.ts:59Evidence: return realFetch(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 Egressexamples/guides/advanced/gateway.examples.ts:162Evidence: 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 Egressexamples/guides/clients/connect.examples.ts:48Evidence: return realFetch(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 Egressexamples/guides/get-started/firstServer.examples.ts:40Evidence: const res = await fetch(url, { headers: { 'User-Agent': 'mcp-weather-tutorial/1.0' } }); | 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 Egressexamples/guides/get-started/realHost.examples.ts:46Evidence: const res = await fetch(url, { headers: { 'User-Agent': 'mcp-weather-tutorial/1.0' } }); | 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 Egressexamples/guides/get-started/src/index.ts:40Evidence: const res = await fetch(url, { headers: { 'User-Agent': 'mcp-weather-tutorial/1.0' } }); | 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 Egressexamples/guides/protocolVersions.examples.ts:56Evidence: return realFetch(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 Egressexamples/json-response/client.ts:21Evidence: const probe = 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 Egressexamples/oauth-client-credentials/client.ts:21Evidence: const unauth = 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 Egressexamples/server-quickstart/src/index.ts:19Evidence: const response = await fetch(url, { headers }); | 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 Egresspackages/client/test/client/sse.dpop.test.ts:132Evidence: const esFetch = vi.fn<FetchLike>((url, init) => fetch(url, 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 Egresspackages/client/test/client/sse.test.ts:259Evidence: return fetch(url.toString(), { ...init, headers }); | 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 Egresspackages/client/test/client/sse.test.ts:280Evidence: return fetch(url.toString(), { ...init, headers }); | 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 Egresspackages/client/test/client/sse.test.ts:1344Evidence: return originalFetch(url.toString(), 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 Egresspackages/core-internal/src/shared/transport.ts:44Evidence: return baseFetch(url, mergedInit); | 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 Egresspackages/core-internal/test/shared/transport.test.ts:138Evidence: await wrappedFetch(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 Egresspackages/middleware/node/test/streamableHttp.test.ts:2521Evidence: const deleteResponse1 = await fetch(url1, { | 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 Egresspackages/middleware/node/test/streamableHttp.test.ts:2534Evidence: const deleteResponse2 = await fetch(url2, { | 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 Egresspackages/server/src/server/mcp.examples.ts:138Evidence: 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 Egressscripts/fetch-schema-twins.ts:44Evidence: const response = 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 Egressscripts/fetch-spec-examples.ts:46Evidence: const response = 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 Egressscripts/fetch-spec-examples.ts:55Evidence: const response = 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 Egressscripts/fetch-spec-examples.ts:69Evidence: const response = 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 Egressscripts/fetch-spec-types.ts:54Evidence: const response = 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 Egressscripts/fetch-spec-types.ts:70Evidence: const response = 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 Egresstest/conformance/src/everythingClient.ts:380Evidence: 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 Egresstest/e2e/scenarios/client-auth.test.ts:326Evidence: return baseFetch(url, 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 Egresstest/e2e/scenarios/client-auth.test.ts:369Evidence: const response = await baseFetch(url, 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 Egresstest/e2e/scenarios/client-auth.test.ts:1038Evidence: return baseFetch(url, 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 Egresstest/e2e/scenarios/client-auth.test.ts:1450Evidence: return baseFetch(url, 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 Egresstest/e2e/scenarios/client-auth.test.ts:2341Evidence: return noTokensBaseFetch(url, 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 Egresstest/e2e/scenarios/client-auth.test.ts:2379Evidence: return noRefreshBaseFetch(url, 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:27Evidence: const initRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:51Evidence: const notifRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:200Evidence: const postRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:227Evidence: const getRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:288Evidence: const postRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:308Evidence: const resumeRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:349Evidence: const initRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:368Evidence: 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:380Evidence: const getRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:414Evidence: const resumeRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:479Evidence: const unmappedRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:487Evidence: const failedRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:517Evidence: const postRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:591Evidence: const initRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:610Evidence: 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:620Evidence: const getRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:656Evidence: const postRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:676Evidence: const resumeRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:725Evidence: const livePostRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:798Evidence: const standaloneRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:805Evidence: const postRes = 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 Egresstest/e2e/scenarios/hosting-resume.test.ts:831Evidence: const resumeRes = 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 Egresstest/integration/test/client/discoverRoundtrip.test.ts:31Evidence: 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 Egresstest/integration/test/client/versionNegotiation.test.ts:48Evidence: const response = await 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 Egresstest/integration/test/server/createMcpHandler.test.ts:105Evidence: 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). |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/guides/advanced/wire-schemas.examples.ts:77Evidence: console.log(metadata.token_endpoint); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/oauth/simpleOAuthClient.ts:54Evidence: console.log(`🌐 Opening browser for authorization: ${url}`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/oauth/simpleOAuthClient.ts:96Evidence: console.log(`✅ Authorization code received: ${code?.slice(0, 10)}...`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/oauth/simpleOAuthClient.ts:112Evidence: console.log(`❌ Authorization error: ${error}`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/oauth/simpleOAuthClient.ts:124Evidence: console.log(`❌ No authorization code or error in callback`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/oauth/simpleOAuthClient.ts:153Evidence: console.log('🔐 OAuth required - waiting for authorization...'); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/oauth/simpleOAuthClient.ts:158Evidence: console.log('🔐 Authorization code received:', callbackParams.get('code')); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/repl/client.ts:680Evidence: console.log(`Using resumption token: ${notificationsToolLastEventId || 'none'}`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/repl/client.ts:684Evidence: console.log(`Updated resumption token: ${event}`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/shared/src/auth.ts:158Evidence: console.log(`[Auth] Password: ${DEMO_USER_CREDENTIALS.password}`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/shared/src/authServer.ts:328Evidence: console.log(`OAuth Authorization Server listening on port ${authPort}`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/shared/src/authServer.ts:329Evidence: console.log(` Authorization: ${authServerUrl}api/auth/mcp/authorize`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/shared/src/authServer.ts:330Evidence: console.log(` Token: ${authServerUrl}api/auth/mcp/token`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingexamples/shared/src/authServer.ts:331Evidence: console.log(` Metadata: ${authServerUrl}.well-known/oauth-authorization-server`); | Implement PII/secret redaction masks before writing to log streams. |
| MEDIUM | AT-SEC-007 (LLM02) | Raw Secret Leakage in Debug Loggingtest/conformance/src/authTestServer.ts:244Evidence: console.log(`Fetching authorization server metadata from ${AUTH_SERVER_URL}...`); | 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/typescript-sdk. Scores move with every upstream commit; pages refresh weekly. How scoring works.