fix(mcp): serve resources/list on the anonymous discovery path (orank mcp-resource-listing)#4719
Merged
Merged
Conversation
… mcp-resource-listing) orank scans the MCP server anonymously. Since #4698 `initialize` is public and its handshake advertises the `resources` capability, but `resources/list` was gated behind auth — so the anonymous probe 401'd and orank scored `mcp-resource-listing` FAIL 0/3 ("advertises resources capability but resources/list returned none"), cascading `mcp-resource-quality` to NA 0/3. `resources/list` is a catalog-enumeration method returning only metadata (URIs/names/descriptions — no data, no quota), exactly like the already-public `tools/list`. Add it to PUBLIC_MCP_METHODS so an anonymous scanner that reads the advertised `resources` capability can enumerate it. `resources/read` stays gated (spends the Pro daily quota symmetrically with tools/call) — the data-leak protection is untouched. There is no orank prompts-exposed check, so `prompts/list` stays gated per the deliberate minimal-discovery choice from #4698. - api/mcp/handler.ts: add 'resources/list' to PUBLIC_MCP_METHODS + comments - docs/mcp-server.mdx: list resources/list under public discovery - tests/mcp.test.mjs: anonymous resources/list → 200 with >=1 resource - tests/live-api-cache-auth-regression.test.mjs: deploy-gated live probe Expected: mcp-resource-listing 0/3 -> 3/3, mcp-resource-quality unlocked; Access layer +3 (up to +6). Post-deploy: POST https://ora.ai/api/scan {"url":"worldmonitor.app"}. Claude-Session: https://claude.ai/code/session_01Cj9KjCX7H3anaRhKVw1RfE
Contributor
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Contributor
This was referenced Jul 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
orank (ora.ai agent-readiness scanner) scores worldmonitor.app 66/100 (C). On the Access layer,
mcp-resource-listingis a FAIL (0/3): "Server advertises resources but resources/list returned none", which also cascadesmcp-resource-qualityto NA (0/3).Root cause: orank scans the MCP server anonymously. Since #4698,
initializeis a public discovery method and its handshake advertises theresourcescapability — butresources/listwas not inPUBLIC_MCP_METHODS, so the anonymous probe got 401'd. orank read the advertisedresourcescapability as advertised-but-empty.Fix
resources/listis a catalog-enumeration method returning only metadata (URIs / names / descriptions / mimeType — no data, no quota, uses no authcontext), exactly like the already-publictools/list. Add it toPUBLIC_MCP_METHODSso an anonymous scanner that reads the advertisedresourcescapability can enumerate it.resources/readstays gated (never a public method) — it routes throughdispatchToolsCalland spends the Pro daily quota symmetrically withtools/call. The data-leak protection is untouched.prompts/liststays gated — the live orank scan confirms there is no prompts-exposed check, so this respects the deliberate minimal-discovery choice from feat(mcp): public discovery + JSON /api errors + server-card fields (orank Access gaps) #4698.Changes
api/mcp/handler.ts'resources/list'toPUBLIC_MCP_METHODS+ update the two governing commentsdocs/mcp-server.mdxresources/listunder public discovery (leaveprompts/list,logging/setLevelgated)tests/mcp.test.mjsresources/list→ 200 with ≥1 resource (mirrors orank's check)tests/live-api-cache-auth-regression.test.mjsresources/listQuota-exemption docs (server-card notes, error catalog, per-minute wording) are unchanged —
resources/listwas and remains quota-exempt.Tests
174 pass across
mcp.test.mjs,mcp-resources.test.mjs,mcp-capability-parity.test.mjs,mcp-protocol-conformance.test.mjs,mcp-transport-conformance.test.mjs,mcp-prompts.test.mjs. The capability-parity and resources tests callresources/listwith a valid key, so they still pass (public methods still validate a presented credential).Expected orank delta (post-deploy)
mcp-resource-listing0/3 → 3/3;mcp-resource-qualityunlocked (up to +6 on Access).Verify after deploy:
POST https://ora.ai/api/scan {"url":"worldmonitor.app"}/GET https://ora.ai/api/score/worldmonitor.app.Sibling orank Access work: #4698 (public discovery), #4711 (bare-GET → 405 handshake).
https://claude.ai/code/session_01Cj9KjCX7H3anaRhKVw1RfE