Install
$ agentstack add mcp-authprobe-authprobe Open-source listing — not yet scanned by AgentStack. Follow the source repository for install instructions.
Security review
⚠ Flagged1 finding(s); flagged for manual review. · v0.1.0 How review works →
- • Prompt-injection patterns
- • Secret / credential exfiltration
- • Dangerous shell & filesystem operations
- • Untrusted network calls
- • Known-malicious package signatures
- high Pipes remote content directly into a shell (remote code execution).
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
authprobe — MCP OAuth Diagnostics
[](https://github.com/authprobe/authprobe/actions/workflows/go.yml) [](https://snyk.io/test/github/authprobe/authprobe) [](https://discord.gg/ZYRjaZEsNV) [](https://github.com/codespaces/new?hidereposelect=true&repo=authprobe/authprobe)
authprobe pinpoints MCP OAuth failures.
MCP + OAuth breaks for mundane reasons like missing headers, wrong content types, malformed metadata. authprobe scan walks the discovery flow and reports exactly where it diverges from spec.
┌──────────────────────────────────────────────────────────────────────────────────────┐
│ AuthProbe Scan Funnel │
├──────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ [1] Discovery ──► [2] MCP Init ──► [3] PRM ──► [4] Auth Server ──► [5] Token ──► [6] DCR
│ │ │ │ │ │ │ │
│ ▼ ▼ ▼ ▼ ▼ ▼ │
│ 401 + WWW- initialize + Fetch PRM Fetch issuer POST DCR │
│ Authenticate tools/list metadata metadata probe probe │
└──────────────────────────────────────────────────────────────────────────────────────┘
See [docs/funnel.md](docs/funnel.md) for the full breakdown of what gets checked and why. See [ARCHITECTURE.md](docs/ARCHITECTURE.md) for the code map and design invariants.
Specs involved: MCP, RFC 9728, RFC 8414, RFC 8707, RFC 7636, RFC 7591, RFC 7517, RFC 3986, RFC 9110.
Who this is for
- MCP server authors validating OAuth discovery and protected-resource metadata behavior.
- MCP client implementers debugging where auth flows diverge from RFC 9728 / RFC 8414.
- Platform, security, and infra teams triaging auth regressions in CI before rollout.
- API teams that need reproducible evidence bundles for handoff across org boundaries.
Quickstart
2-minute demo
# Fast install (no sudo, installs into ~/.local/bin)
curl -fsSL https://raw.githubusercontent.com/authprobe/authprobe/main/scripts/install.sh | sh
# Run a real scan
~/.local/bin/authprobe scan https://mcp.example.com/mcp --json -
Expected output (trimmed):
Funnel
[1] MCP probe (401 + WWW-Authenticate) [✓] PASS
[2] MCP initialize + tools/list [X] FAIL
[3] PRM fetch matrix [✓] PASS
Demo GIF:
AuthProbe MCP Server
AuthProbe runs as an MCP server via authprobe mcp --transport stdio.
Configure
{
"mcpServers": {
"authprobe": {
"command": "authprobe",
"args": ["mcp", "--transport", "stdio"]
}
}
}
See docs/mcp-server.md for the full OAuth-assist flow and security notes.
Used in the wild
- Anthropic MCP Python SDK (
modelcontextprotocol/python-sdk) used AuthProbe in issue triage to validate OAuth discovery behavior in the wild and capture actionable protocol diagnostics for maintainers (Issue #2057). - Sentry MCP (
getsentry/sentry-mcp) used AuthProbe to identify and fix RFC 9728 Protected Resource Metadata compliance gaps formcp.sentry.dev(PR #799, merged Feb 10, 2026; [details](docs/case-studies/sentry-mcp.md)). - Kiro (
kirodotdev/Kiro) used AuthProbe to help pinpoint an MCP server metadata/authorization detection issue after a CLI update; details - Yargı MCP (
saidsurucu/yargi-mcp) used AuthProbe to surface a protocol-compliance bug where JSON-RPC request IDs withnullwere accepted (Issue #18, opened Feb 12, 2026); details - Borsa MCP (
saidsurucu/borsa-mcp) used AuthProbe during integration testing to catch a JSON-RPC protocol compliance bug; the follow-up fix tightened request validation to reject invalididvalues and align behavior with MCP expectations (Issue #6, fix commit). - Rival Search MCP (
damionrashford/RivalSearchMCP) used AuthProbe to surface a protocol-compliance bug where JSON-RPC request IDs withnullwere accepted (Issue #5); details
Mentions are factual references, not endorsements. If you are using authprobe, drop us a note. Like authprobe? toss a ⭐ - it's our caffine shot.
Install (fast paths)
# Option A: Go toolchain
go install github.com/authprobe/authprobe/cmd/authprobe@latest
# Option B: Install script (latest GitHub release asset)
curl -fsSL https://raw.githubusercontent.com/authprobe/authprobe/main/scripts/install.sh | sh
Install (Docker)
docker pull ghcr.io/authprobe/authprobe:latest
docker run --rm ghcr.io/authprobe/authprobe:latest scan https://mcp.example.com/mcp
docker run --rm ghcr.io/authprobe/authprobe:latest scan \
https://compute.googleapis.com/mcp --openai-api-key=
Install (release binary fallback)
Download the latest release binary from GitHub Releases and put it on your PATH.
Install (Clone Repository)
git clone https://github.com/authprobe/authprobe.git && \
cd authprobe && \
go run cmd/authprobe/main.go scan https://mcp.example.com/mcp
Check version
authprobe --version
authprobe 0.4.0 (commit 92d5fada10399cd96da6521536ed746464592c93, built 2026-02-09T05:48:13Z)
Isolating Failure using authprobe
AuthProbe helps you isolate failures by capturing network traces for failed probe steps and optionally using an LLM to explain RFC compliance gaps.
Run Basic Scan
authprobe scan https://mcp.example.com/mcp
Embed as a Go package
AuthProbe also exposes a small public Go wrapper for services that need typed scan reports without starting the CLI:
import authprobescan "authprobe/pkg/scan"
result, err := authprobescan.Run(authprobescan.Options{
TargetURL: "https://mcp.example.com/mcp",
MCPMode: authprobescan.MCPModeStrict,
RFCMode: authprobescan.RFCModeBestEffort,
Timeout: 8 * time.Second,
AllowPrivateIssuers: false,
})
if err != nil {
return err
}
_ = result.Report.Findings
Scan stdio MCP servers via local bridge
AuthProbe can launch a stdio MCP command and bridge it to a local HTTP endpoint automatically:
authprobe scan --stdio-command 'npx -y @modelcontextprotocol/server-everything' --tool-list
This bridge lets existing HTTP scan checks run against stdio servers.
Get an RFC-based explanation of the failure
authprobe scan https://mcp.example.com/mcp --explain
Get verbose output for failure
Shows the complete trace of request/response that went on the wire to help understand failure
authprobe scan https://mcp.example.com/mcp --explain --trace-failure
Have a LLM model explain failure
Use a LLM to request analysis of failure. llm-max-tokens defaults to 600 if a value isn't provided
export OPENAI_API_KEY=
authprobe scan https://mcp.example.com/mcp --explain --trace-failure --llm-max-tokens=1080
To use Anthropic
export ANTHROPIC_API_KEY=
authprobe scan https://mcp.example.com/mcp --explain --trace-failure --llm-max-tokens=1080
What you get
The scan produces a funnel view output and an LLM explanation of spec expectations if an Anthropic or OpenAI API key is provided.
1) Funnel view (what broke, where)
$ go run cmd/authprobe/main.go scan https://aws-mcp.us-east-1.api.aws/mcp --trace-failure
Command: authprobe scan --trace-failure https://aws-mcp.us-east-1.api.aws/mcp
Scanning: https://aws-mcp.us-east-1.api.aws/mcp
Scan time: Feb 09, 2026 04:44:41 UTC
Github: https://github.com/authprobe/authprobe
Funnel
[1] MCP probe (401 + WWW-Authenticate) [-] SKIP
probe returned 405; checking PRM for OAuth config
[2] MCP initialize + tools/list [X] FAIL
initialize -> 401 (error: Authentication failed: Unable to verify your
user identity. Please ensure you are properly authenticated and try
again.)
[3] PRM fetch matrix [X] FAIL
https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource
-> 405
https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource/mcp
-> 405
PRM unreachable or unusable; OAuth discovery unavailable
[4] Auth server metadata [-] SKIP
no authorization_servers in PRM
[5] Token endpoint readiness (heuristics) [-] SKIP
no token_endpoint in metadata
[6] Dynamic client registration (RFC 7591) [-] SKIP
no registration_endpoint in metadata
Primary Finding (HIGH): AUTH_REQUIRED_BUT_NOT_ADVERTISED (confidence 1.00)
Evidence:
initialize -> 401
initialize error: Authentication failed: Unable to verify your user identity. Please
ensure you are properly authenticated and try again.
WWW-Authenticate: (missing)
https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource -> 405
https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource/mcp -> 405
PRM unreachable or unusable; OAuth discovery unavailable
Auth appears required but OAuth discovery was not advertised. Next steps: add
WWW-Authenticate + PRM for OAuth/MCP discovery, or document the required non-OAuth auth
(e.g., SigV4).
┌─────────────────────┤ RFC RATIONALE ├──────────────────────┐
Explain (RFC 9728 rationale)
1) MCP probe
- AuthProbe sends an unauthenticated GET to https://aws-mcp.us-east-1.api.aws/mcp.
- RFC 9728 discovery hinges on a 401 with WWW-Authenticate that includes resource_metadata.
- resource_metadata hint: (none)
2) MCP initialize + tools/list
- AuthProbe sends an MCP initialize request followed by tools/list to enumerate server tools.
3) Protected Resource Metadata (PRM) discovery
- RFC 9728 defines PRM URLs by inserting /.well-known/oauth-protected-resource between the host and path.
- https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource (root)
- https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource/mcp (path-suffix)
- Because the resource has a path, the path-suffix PRM endpoint is required by RFC 9728.
- PRM responses must be JSON objects with a resource that matches the target URL; trailing-slash mismatches are warned for compatibility.
- authorization_servers is required for OAuth discovery; it lists issuer URLs.
4) Authorization server metadata
- No authorization_servers found in PRM, so AuthProbe skips metadata fetches.
5) Token endpoint readiness (heuristics)
- AuthProbe sends a safe, invalid grant request to the token endpoint to observe error response behavior.
- It flags non-JSON responses or HTTP 200 responses that still contain error payloads.
┌───────────────────────┤ CALL TRACE ├───────────────────────┐
Call Trace Using: https://github.com/authprobe/authprobe
┌────────────┐ ┌────────────┐
│ authprobe │ │ MCP Server │
└─────┬──────┘ └─────┬──────┘
│ │
│ ╔═══ Step 1: MCP probe ═══════╪═══════════════════╗
│ GET https://aws-mcp.us-east-1.api.aws/mcp
│ Reason: 401 + WWW-Authenticate discovery
│ Accept: text/event-stream
│ Host: aws-mcp.us-east-1.api.aws
├─────────────────────────────────────────────────────────────────►│
│ 405 Method Not Allowed
│ Allow: POST
│ Content-Length: 102
│ Date: Mon, 09 Feb 2026 04:44:41 GMT
│ Server: CloudFront
│ Via: 1.1 6269ff653a8a0b71d436afa999909318.cloudfront.net (CloudFront)
│ X-Amz-Cf-Id: hFriapAaoBgVX_B09D4MbK1-SDPg9l6VwvOw67mrScOeCh5N2ywTWA==
│ X-Amz-Cf-Pop: SFO53-P7
│ X-Cache: LambdaGeneratedResponse from cloudfront
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ ╔═══ Step 2: MCP initialize ═══════╪═══════════════════╗
│ POST https://aws-mcp.us-east-1.api.aws/mcp
│ Reason: Step 2: MCP initialize + tools/list (pre-init tools/list)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: aws-mcp.us-east-1.api.aws
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 401 Unauthorized
│ Content-Length: 194
│ Date: Mon, 09 Feb 2026 04:44:41 GMT
│ Server: CloudFront
│ Via: 1.1 6269ff653a8a0b71d436afa999909318.cloudfront.net (CloudFront)
│ X-Amz-Cf-Id: b-ejOK7BHXqcZ_OFbQHqbli8XnA6ZqH160dnpSlKzCbYcuMBG7aLJQ==
│ X-Amz-Cf-Pop: SFO53-P7
│ X-Cache: LambdaGeneratedResponse from cloudfront
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST https://aws-mcp.us-east-1.api.aws/mcp
│ Reason: Step 2: MCP initialize + tools/list (initialize)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: aws-mcp.us-east-1.api.aws
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 401 Unauthorized
│ Content-Length: 194
│ Date: Mon, 09 Feb 2026 04:44:41 GMT
│ Server: CloudFront
│ Via: 1.1 6269ff653a8a0b71d436afa999909318.cloudfront.net (CloudFront)
│ X-Amz-Cf-Id: OfTZxhdf7sBGylO_uwnubF6Ug8I6t2hhJtNf3Y2cKY9JJFDKQf8Umg==
│ X-Amz-Cf-Pop: SFO53-P7
│ X-Cache: LambdaGeneratedResponse from cloudfront
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ ╔═══ Step 3: PRM Discovery ═══════╪═══════════════════╗
│ GET https://aws-mcp.us-east-1.api.aws/.well-known/oauth-protected-resource
│ Reason: Step 3: PRM fetch matrix
│ Accept: application/json
│ Host: aws-mcp.us-east-1.api.aws
├─────────────────────────────────────────────────────────────────►│
│ 405 Method Not Allowed
│ Allow: POST
│ Content-Length: 102
│ Date: Mon, 09 Feb 2026 04:44:41 GMT
│ Server: CloudFront
│ Via: 1.1 6269ff653a8a0b71d436afa999909318.cloudfront.net (CloudFront)
│ X-Amz-Cf-Id: T7
…
## Source & license
This open-source MCP server is cataloged on AgentStack and links to its original source — we do not rehost the code.
- **Author:** [authprobe](https://github.com/authprobe)
- **Source:** [authprobe/authprobe](https://github.com/authprobe/authprobe)
- **License:** Apache-2.0
- **Homepage:** https://authprobe.com
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.