Surface Contract: platform API behavior and x402 pre-payment checks
dev.workers.penny-mcamp.penny-surface-contract/surface-contractVersion 2026.10.22Surface contracts: API behavior evidence, x402 pre-payment check, MCP server preflight
Status
Responds634 msAnswered our handshake without sign-in.- Last checked
- Nov 14, 2026, 14:29 UTC
- Latency
- 634 ms
- Remotes responding
- 1 of 1
- Sign-in
- No sign-in
- Hosting
- Hosted outside the EU (detected)
- Registry data as of
- Nov 14, 2026, 22:14 UTC
Data from the official MCP Registry, checked by run.zero. How we check
Connect
Streamable HTTP
https://penny-surface-contract.penny-mcamp.workers.dev/mcpResponds634 msNo sign-in
Claude Code
claude mcp add --transport http surface-contract https://penny-surface-contract.penny-mcamp.workers.dev/mcpClaude Desktop and claude.ai
Settings > Connectors > Add custom connector
Name: surface-contract
Remote MCP server URL: https://penny-surface-contract.penny-mcamp.workers.dev/mcpCursor
{
"mcpServers": {
"surface-contract": {
"url": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
}
}
}VS Code
code --add-mcp '{"name":"surface-contract","type":"http","url":"https://penny-surface-contract.penny-mcamp.workers.dev/mcp"}'Built your own server? run.zero hosts MCP servers on European infrastructure.
Tools
7 tools
Read-only | Idempotent | Open world | ||
|---|---|---|---|---|
contribute_discrepancyReport a platform behaviour that contradicts a published claim, or a new claim, with evidence. One-line call: POST /v1/contribute with {contractId, kind, statement, evidence[], reporter, observedAt}. Stored as pending; a published contract is never changed without independent verification. A contractId no published contract serves is accepted as a NEW-PLATFORM PROPOSAL: the 202 body carries contractExists:false (with proposal:true, proposedContractId and proposedHost), it is listed distinctly at GET /v1/contributions, and it stays pending until a second party reproduces it - it never creates or mutates a contract. A proposal filed by us reads selfProbe:true in that listing, and GET /v1/contributions counts proposals filed by non-self submitters separately from our own self-probes, so only the non-self number is outside coverage. | Not declared | Not declared | Not declared | Not declared |
get_integration_recipeGet a plain-text integration recipe for a platform: the order of operations to use it, and a guard clause for every behaviour we measured going wrong, each naming the contract claim behind it. Derived from the contract, so it cannot drift from it. | Not declared | Not declared | Not declared | Not declared |
get_surface_contractGet the machine-readable surface contract for a platform host (read/write semantics, pending states, rate limits, limits, idempotency, pagination completeness, data portability), each claim carrying its evidence and its verification status. | Not declared | Not declared | Not declared | Not declared |
list_surface_contractsList the platform surface contracts published in Penny's free registry, with claim counts. | Not declared | Not declared | Not declared | Not declared |
preflight_mcp_serverRun the anonymous MCP handshake against ANY https MCP endpoint you name, right now, and get back a verdict (open / refused / unreachable / initialize-transport-error), the shape of any refusal body, whether the server is stateful (sets Mcp-Session-Id), how many tools tools/list returns, and the guard clauses that follow. Use it before wiring an MCP server into your own config. Pass `urls` (up to 5) to check a whole mcp.json in one call. When the endpoint refuses, it also reports whether the refusal advertises a credential path (an RFC 9728 resource_metadata pointer) and whether that pointer resolves to a metadata document naming an authorization server, so you learn where a token would come from without writing that parsing yourself. No credential is sent, none is obtained, and none of their tools is ever called. | Not declared | Not declared | Not declared | Not declared |
prepay_checkCheck an x402 route BEFORE you pay it. GET /v1/prepay?url=<the route> makes ONE unpaid GET with no payment header and no credential, and returns one row: the measured HTTP status, the parsed x402 v2 challenge (scheme / network / asset / amount / payTo), whether that challenge is schema-valid exact-on-Base, and whether its payTo and price agree with the seller's own card (pass `card` to read that card with one more unpaid GET). No payment is made, no credential is sent, no redirect is followed, and a transport failure on our side is reported as unknown rather than as a fact about the seller. Use it to gate a payment decision on measured terms instead of on a seller's prose. | Not declared | Not declared | Not declared | Not declared |
verify_surfaceRun the anonymous conformance checks for a contract now and return verified / failed / unknown / manual / unsupported per claim. | Not declared | Not declared | Not declared | Not declared |
Details
- Registry status
- Active
- Published
- Oct 22, 2026
- Updated
- Oct 22, 2026
- Repository
- Not given
- Categories (suggested)
- Finance and paymentsSuggested categories are assigned automatically from the registry text and may be wrong. Verified operators can correct them.
- GDPR
- Not declared