docs(catalog): Commerce MCP — sandbox test merchants, get_service requestShape, pay_service method - #411
Conversation
892293f to
e82493b
Compare
|
👀 pr-review-bot (fallback) picking this up. |
eruizgar91
left a comment
There was a problem hiding this comment.
Reviewed the diff against this PR's own base (docs/3394-cimd-trust-overlay), not main — 4 files, +21/-11. Every factual claim was checked against the shipped system rather than for internal consistency: the seed migration (libs/database/src/migrations/1800001300000-SeedSandboxTestnetMerchants.ts), the MCP source (apps/mcp/src/mcp/{request-shape,pay-service,mcp.server}.ts), the argocd MCP Applications, and live read-only probes of api.sandbox.nevermined.app and mcp.sandbox.nevermined.app.
4 findings posted inline (3 MEDIUM, 1 LOW). All are bounded one- or two-sentence edits inside products/catalog/mcp.mdx; nothing needs a follow-up issue.
Verified correct (live evidence, so these can be treated as settled):
- Both rows exist on prod sandbox and are absent from live (404 on both slugs at
api.live.nevermined.app).mpp-dev-paid-ping—protocol: mpp,network: "Tempo Moderato (testnet)",priceLabel: "$0.10 (testnet pathUSD)", one endpoint{path:"/", method:"GET"};x402-org-protected—protocol: x402,"Base Sepolia (testnet)","$0.01 (testnet USDC)", one endpoint{path:"/", method:"GET"}. BothisListed: true, both taggedtestnet. - "listed last" holds: both carry
tier: 4while every other row defaults totier: 3, and the default listing orderstier ASCfirst — fetched page 2 of the sandbox catalog and they are positions 72 and 73 of 73. (It is a property of the default view only; an explicitsortByopts out. Not worth qualifying on the page.) - "
pay_servicewith just theslugsettles against either" — correct: each has a single root endpoint, andmatchEndpointwith nopathresolves the root entry, somethodSourceiscatalogand the method isGET. https://mcp.sandbox.nevermined.app/mcpis a real deployed host (production-mcp-sandbox.yaml,service.hostname: mcp.sandbox.nevermined.app);initializeanswers 200.MCP_EMBED_BASE_URL/MCP_EMBED_NETWORKare set on it, sosetup_delegationworks there too.requestShape/bodySchema: null/ theunknown — the catalog holds no request schemanote (a correct prefix ofREQUEST_SHAPE_UNKNOWN_NOTE), therequestblock's four key names, the threemethodSourceliteralscaller/catalog/default, the method-resolution order,searchvspath,maxTotalCents, and the removal ofnativeEndpoint(thepayable:falsebranch really does return exactlypayable/protocol/priceLabel/network/note) — all match the code.- The three qualifier edits in
discover.mdx,router/quickstart.mdxandfrom-a-harness.mdxare accurate, and the/products/catalog/mcp#1-connect-your-hostanchor resolves to the### 1. Connect your hostheading on the head revision.
Considered and discarded:
requestShape.endpoints[]carries more keys than the page names (description,pathParams, and optionallyinvokePath,requestExample,responseFields,contractEvidence,endpointCheck) — the bullet is a prose summary, not a schema, and naming the load-bearing three is the right altitude. Not a defect.payServiceArgsomitspathfor a root endpoint — matches what the tool emits; the next paragraph explains bare-slug calls.- Quoting only the prefix of the "unknown" note — the quoted fragment is literally how the string starts, and the page does not claim it is the whole note.
- An unlisted / pending row returns
service_not_found, notpayable:false(the public catalog read filters onisListed: true) — true, but the page does not claim otherwise; out of scope here.
On the merge-timing caveat in the PR description: it is already satisfied. Both rows are live on api.sandbox.nevermined.app today (createdAt: 2026-09-16T07:59:10Z), so the tip no longer describes rows that are not there yet.
eruizgar91
left a comment
There was a problem hiding this comment.
🟡 Approved with comments — no blockers; 3 should-fix, 1 nit(s) left inline.
Inline review: #411 (review)
b0f18c5 to
c6cd1f7
Compare
e82493b to
199385f
Compare
1b6c6df to
51e26cf
Compare
…uestShape, pay_service method resolution The sandbox Catalog now carries two free testnet test merchants (`mpp-dev-paid-ping`, `x402-org-protected`), so the "Live-only for payment, nothing payable on sandbox" statements are qualified on every page that made them (MCP, discover, Router quickstart, from-a-harness) and the MCP quickstart gets a Sandbox row + a tip on how to rehearse the whole loop for free. `get_service` now returns a `requestShape` (per-endpoint path/method/price with exact `payServiceArgs`, and an honest `bodySchema: null`); `pay_service` takes its `method` from the catalog endpoint matching `path` (POST only when the catalog records none) and echoes a `request` block. The stale `nativeEndpoint` signpost example is corrected — no upstream URL is returned. Companion to nevermined-io/nvm-monorepo#3547 (nevermined-io/nvm-monorepo#3528). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…eds), sandbox still needs a funded testnet Delegation, the three POST-fallback cases, priceLabel + request-block scope on the example Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
199385f to
ddfb0d9
Compare
Description
Companion to nevermined-io/nvm-monorepo#3547 (issue nevermined-io/nvm-monorepo#3528).
products/catalog/mcp.mdx— a Sandbox row in the environments table, a tip on the two free testnet test merchants the sandbox Catalog carries (mpp-dev-paid-ping— MPP, Tempo Moderato,GET, $0.10 testnet pathUSD;x402-org-protected— x402, Base Sepolia,GET, $0.01 testnet USDC), theget_servicerequestShapeblock (per-endpoint path / method / price with exactpayServiceArgs;bodySchema: nullbecause the Catalog holds no request-body schema),pay_servicemethod resolution (caller → catalog endpoint matchingpath→ POST) and its echoedrequestblock. The stalenativeEndpointsignpost example is corrected: no upstream URL is returned since the opaque broker.discover.mdx,router/quickstart.mdx,from-a-harness.mdx— the "Live-only for payment / nothing payable on sandbox" statements are qualified with the test-merchant exception and a link to the MCP page, so they stop being false the day the seed lands.SeedSandboxTestnetMerchantsmigration. Until that release is deployed toapi.sandbox.nevermined.app, the tip describes rows that are not there yet — hold this PR until then (or merge #3547 first and wait for the release).mintlify broken-links: no broken links found.🤖 Generated with Claude Code
2026-09-21 — out of draft. Production is enabled and in effect (argocd#646 merged + synced;
connect/details→["commerce"]on both prod tiers), so the gate these drafts waited on is met. Stacked PR: base = #409 (docs/3394-cimd-trust-overlay); #414 follows. Rebased onto the current pages (main restructuredfor-agents.mdx/overview.mdxand grewmcp.mdxmeanwhile);mintlify broken-linksgreen. Merge in order — GitHub retargets each base tomainas the previous one lands.