⚠️ 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
jlowin__fastmcp F
37/100 · 49 findings (22 critical) · scope excessive · Ranked #50 of 53 scanned.
Scanned 2026-09-09 · engine v0.1.0 (8 regex rules, OWASP-mapped) · upstream jlowin/fastmcp @ 0796584 (2026-09-09)
Score breakdown
Score constrained by 22 critical and 27 high-severity findings.
Fix first (49 critical/high)
| Severity | Rule | Finding | Remediation |
|---|---|---|---|
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretdocs/fastmcp-analytics.js:6Evidence: var AMPLITUDE_API_KEY = "c361ed56e7bdc1a48a38773c40120b39"; | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretfastmcp_slim/fastmcp/server/auth/oidc_proxy.py:196Evidence: client_secret="your-oidc-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 Secretfastmcp_slim/fastmcp/server/auth/providers/auth0.py:16Evidence: client_secret="your-auth0-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 Secretfastmcp_slim/fastmcp/server/auth/providers/auth0.py:76Evidence: client_secret="your-auth0-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 Secretfastmcp_slim/fastmcp/server/auth/providers/aws.py:17Evidence: client_secret="your-cognito-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 Secretfastmcp_slim/fastmcp/server/auth/providers/aws.py:116Evidence: client_secret="your-cognito-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 Secretfastmcp_slim/fastmcp/server/auth/providers/clerk.py:21Evidence: client_secret="your-clerk-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 Secretfastmcp_slim/fastmcp/server/auth/providers/clerk.py:266Evidence: client_secret="your-clerk-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 Secretfastmcp_slim/fastmcp/server/auth/providers/discord.py:15Evidence: client_secret="your-discord-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 Secretfastmcp_slim/fastmcp/server/auth/providers/discord.py:186Evidence: client_secret="discord-client-secret-abc123...", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secretfastmcp_slim/fastmcp/server/auth/providers/github.py:15Evidence: client_secret="your-github-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 Secretfastmcp_slim/fastmcp/server/auth/providers/google.py:15Evidence: client_secret="your-google-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 Secrettests/cli/deploy/test_horizon_client.py:234Evidence: secret_body = "fmcp_response_secret" | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/client/auth/test_oauth_static_client.py:203Evidence: client_secret="pre-registered-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/client/auth/test_oauth_static_client.py:216Evidence: client_secret="pre-registered-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oauth_consent_flow.py:80Evidence: upstream_client_secret="test-upstream-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oidc_proxy.py:672Evidence: client_secret="introspection-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oidc_proxy.py:709Evidence: client_secret="introspection-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oidc_proxy.py:741Evidence: client_secret="introspection-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oidc_proxy.py:773Evidence: client_secret="introspection-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oidc_proxy.py:1062Evidence: client_secret="introspection-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| CRITICAL | AT-SEC-002 (LLM02) | Hardcoded Credential or API Secrettests/server/auth/test_oidc_proxy_token.py:156Evidence: client_secret="introspection-secret", | Move credentials to secure environment variables or a key vault. Never commit API keys. |
| HIGH | AT-SEC-006 (LLM06) | Unfiltered SSRF / Arbitrary Network Egressfastmcp_slim/fastmcp/cli/cimd.py:185Evidence: doc = await fetcher.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 Egresstests/server/auth/test_cimd.py:238Evidence: doc = await fetcher.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 Egresstests/server/auth/test_cimd.py:256Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:257Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:266Evidence: async def fake_fetch(url: str, **kwargs) -> SSRFFetchResponse: | 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 Egresstests/server/auth/test_cimd.py:283Evidence: await fetcher.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 Egresstests/server/auth/test_cimd.py:303Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:304Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:337Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:338Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:371Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:372Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:400Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:401Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:434Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:435Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:472Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:473Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:474Evidence: third = await fetcher.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 Egresstests/server/auth/test_cimd.py:508Evidence: first = await fetcher.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 Egresstests/server/auth/test_cimd.py:514Evidence: second = await fetcher.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 Egresstests/server/auth/test_cimd.py:515Evidence: third = await fetcher.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 Egresstests/server/auth/test_cimd.py:540Evidence: await fetcher.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 Egresstests/server/auth/test_cimd.py:549Evidence: await fetcher.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 Egresstests/server/auth/test_cimd.py:561Evidence: await fetcher.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 Egresstests/server/auth/test_cimd.py:580Evidence: await fetcher.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 Egresstests/test_mcp_config.py:1443Evidence: def fetch(url: str) -> str: | Define an explicit egress domain allowlist and block private IP ranges (127.0.0.1, 10.0.0.0/8, 169.254.169.254). |
Permissions
Scope: excessive · Shell: enabled · Network egress: yes · File deletion: enabled · Human approval: none
Provenance
License: Apache-2.0 · Lockfile: no · Security policy: yes · Signals: unverified origin
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/jlowin/fastmcp. Scores move with every upstream commit; pages refresh weekly. How scoring works.