firecrawl / firecrawl/firecrawl-mcp-server
Missing or incorrect PRM
- Dominant language
- JavaScript
- Stars
- 7.5k
- Forks
- 884
- Avg merge
- 1d 11h
- Merged PRs (30d)
- 14
Description
```
Command: authprobe scan --llm-max-tokens=1080 --openai-api-key=***REDACTED*** http://localhost:8021/mcp
Scanning: http://localhost:8021/mcp
Scan time: Feb 20, 2026 06:51:34 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 [+] PASS
initialize -> 200
notifications/initialized -> 202
tools/list -> 200 (tools: firecrawl_scrape, firecrawl_map,
firecrawl_search, firecrawl_crawl, +8 more)
[3] PRM fetch matrix [X] FAIL
PRM unreachable or unusable; OAuth discovery unavailable
[4] Auth server metadata [-] SKIP
auth not required
[5] Token endpoint readiness (heuristics) [-] SKIP
auth not required
[6] Dynamic client registration (RFC 7591) [-] SKIP
auth not required
┌───────────────────────┤ CALL TRACE ├───────────────────────┐
Call Trace Using: https://github.com/authprobe/authprobe
┌────────────┐ ┌────────────┐
│ authprobe │ │ MCP Server │
└─────┬──────┘ └─────┬──────┘
│ │
│ ╔═══ Step 1: MCP probe ═══════╪═══════════════════╗
│ GET http://localhost:8021/mcp
│ Reason: 401 + WWW-Authenticate discovery
│ Accept: text/event-stream
│ Host: localhost:8021
├─────────────────────────────────────────────────────────────────►│
│ 405 Method Not Allowed
│ Connection: keep-alive
│ Date: Fri, 20 Feb 2026 06:51:31 GMT
│ Keep-Alive: timeout=5
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ ╔═══ Step 2: MCP initialize ═══════╪═══════════════════╗
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (pre-init tools/list)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 200 OK
│ Cache-Control: no-cache
│ Connection: keep-alive
│ Content-Type: text/event-stream
│ Date: Fri, 20 Feb 2026 06:51:31 GMT
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (initialize)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 200 OK
│ Cache-Control: no-cache
│ Connection: keep-alive
│ Content-Type: text/event-stream
│ Date: Fri, 20 Feb 2026 06:51:32 GMT
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (notifications/initialized)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 202 Accepted
│ Connection: keep-alive
│ Content-Type: text/plain; charset=UTF-8
│ Date: Fri, 20 Feb 2026 06:51:32 GMT
│ Keep-Alive: timeout=5
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (null id probe)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 400 Bad Request
│ Connection: keep-alive
│ Content-Length: 101
│ Content-Type: application/json
│ Date: Fri, 20 Feb 2026 06:51:32 GMT
│ Keep-Alive: timeout=5
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (notification id probe)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 200 OK
│ Cache-Control: no-cache
│ Connection: keep-alive
│ Content-Type: text/event-stream
│ Date: Fri, 20 Feb 2026 06:51:32 GMT
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (origin probe)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
│ Origin: http://invalid.example
├─────────────────────────────────────────────────────────────────►│
│ 200 OK
│ Cache-Control: no-cache
│ Connection: keep-alive
│ Content-Type: text/event-stream
│ Date: Fri, 20 Feb 2026 06:51:33 GMT
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (protocol version probe)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: invalid
├─────────────────────────────────────────────────────────────────►│
│ 400 Bad Request
│ Connection: keep-alive
│ Content-Length: 195
│ Content-Type: application/json
│ Date: Fri, 20 Feb 2026 06:51:34 GMT
│ Keep-Alive: timeout=5
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
│ │
│ POST http://localhost:8021/mcp
│ Reason: Step 2: MCP initialize + tools/list (tools/list)
│ Accept: application/json, text/event-stream
│ Content-Type: application/json
│ Host: localhost:8021
│ Mcp-Protocol-Version: 2025-11-25
├─────────────────────────────────────────────────────────────────►│
│ 200 OK
│ Cache-Control: no-cache
│ Connection: keep-alive
│ Content-Type: text/event-stream
│ Date: Fri, 20 Feb 2026 06:51:34 GMT
│ X-Powered-By: Express
│◄─────────────────────────────────────────────────────────────────┤
▼ ▼
```
┌──────────────────┤ ROOT-CAUSE ANALYSIS ├───────────────────┐
The AuthProbe scan of the MCP OAuth server at `http://localhost:8021/mcp` exhibits a few key compliance and protocol behavior issues. I will analyze the failure in detail with respect to the MCP 2025-11-25 specification and relevant RFCs (RFC 9728 on MCP, RFC 8414 on OAuth Discovery, JSON-RPC 2.0 on messaging, RFC 7591 on dynamic client registration as applicable).
---
## Summary of Scan Outcome
| Step | Result | Notes |
|-|-|-|
| [1] MCP probe (401 + WWW-Authenticate) | SKIP (405 error) | Server responded with 405 Method Not Allowed, not 401 + WWW-Authenticate as expected for OAuth authentication challenge |
| [2] MCP initialize + tools/list | PASS | Server accepted initialize request and tools/list correctly returned available tools |
| [3] PRM fetch matrix | FAIL | Personal Resource Manager (PRM) endpoint was unreachable or unusable, OAuth discovery unavailable |
| [4],[5],[6] | SKIP | Auth not required, so OAuth-specific endpoints and registration steps were skipped |
---
## Detailed Analysis
### 1. **PRM Fetch Failure (OAuth Discovery Unavailable)**
- **Failure Description:** Step [3] failed because the PRM (Personal Resource Manager) endpoint, which serves as OAuth discovery matrix (per MCP 2025-11-25 §6.4 and RFC 8414), was unreachable or unusable.
- **Spec Reference:**
- MCP 2025-11-25 §6.4 mandates that for an OAuth-secured MCP server, the PRM must provide OAuth discovery metadata consistent with RFC 8414 (OAuth 2.0 Authorization Server Metadata).
- RFC 8414 requires the authorization server to expose a JSON document at a well-known location or discoverable URL that contains OAuth endpoints (`authorization_endpoint`, `token_endpoint`, etc.). Without this metadata, clients cannot dynamically discover OAuth parameters or initiate authorization/authentication.
- **Correct Server Behavior:**
- The MCP server MUST implement a reachable PRM endpoint serving valid OAuth metadata conforming to RFC 8414.
- The metadata must be in JSON format and accessible at a standard discovery URI (e.g., `/.well-known/oauth-authorization-server` or equivalent PRM URL).
- Failure to provide this endpoint prevents OAuth dynamic discovery and blocks OAuth flows, justifying the failure.
### 2. **MCP_INITIALIZE_ORDERING_NOT_ENFORCED (Info)**
- **Issue:** The scan observed that tools/list returned 200 *before* an MCP `initialize` request was made.
- **Spec Reference:**
- MCP 2025-11-25 §3.2 requires the client to send an `initialize` request as the very first interaction. Servers MUST reject or ignore other method calls until initialization is confirmed.
- This ordering ensures server state is correctly set up and authenticated context established before other operations.
- **Correct Server Behavior:**
- The server SHOULD reject or return errors (e.g., HTTP 400 or JSON-RPC error) to any request except `initialize` until initialization completes.
- Returning a 200 response on tools/list *before* initialization violates the protocol enforcement.
### 3. **MCP_PROTOCOL_VERSION_MISMATCH (Medium Severity)**
- **Issue:** There is a protocol version mismatch: the client requested `"2025-11-25"` version, but the server responded with `"2025-06-18"`.
- **Spec Reference:**
- MCP 2025-11-25 §3.1 requires explicit and consistent version negotiation in the `initialize` request and response to avoid incompatibility.
- Clients specify `protocolVersion` while initializing, and the server must agree or reject.
- **Correct Server Behavior:**
- The server MUST either support the requested protocol version or respond with an error indicating version incompatibility.
- Returning a different, possibly older, version without negotiation may cause protocol inconsistencies and interoperability issues.
- Proper version compatibility negotiation or explicit rejection per MCP is required.
### 4. **MCP_ORIGIN_NOT_VALIDATED (Low Severity)**
- **Issue:** The server accepted requests from origins without validating the `Origin` header.
- **Spec Reference:**
- MCP 2025-11-25 §7.2 recommends validating the HTTP `Origin` header to mitigate DNS rebinding and cross-origin attacks.
- Servers should respond with HTTP 403 Forbidden to invalid or untrusted origins.
- **Correct Server Behavior:**
- The server should check the `Origin` header for known trusted origins.
- Reject requests (403) or at least log warnings for suspicious origins.
- Accepting all origins without validation increases security risk but may be acceptable in best-effort mode.
---
## Conclusion: Is the Failure Valid and Justified?
Yes, the failure is **valid and justified**, primarily because:
- The **PRM endpoint is unreachable or missing**, violating the MCP OAuth discovery requirement (MCP 2025-11-25 §6.4 and RFC 8414). Without this, OAuth flows are non-functional.
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.