Skip to main content

Surface Contract: platform API behavior and x402 pre-payment checks

dev.workers.penny-mcamp.penny-surface-contract/surface-contractVersion 2026.10.22

Surface contracts: API behavior evidence, x402 pre-payment check, MCP server preflight

Status

Responds634 msAnswered our handshake without sign-in.

Registry data may be out of date

We could not refresh it, so this page shows the last copy.
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 ms
No sign-in

Claude Code

claude mcp add --transport http surface-contract https://penny-surface-contract.penny-mcamp.workers.dev/mcp

Claude Desktop and claude.ai

Settings > Connectors > Add custom connector
Name: surface-contract
Remote MCP server URL: https://penny-surface-contract.penny-mcamp.workers.dev/mcp

Cursor

{
  "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.

Host your own MCP server on run.zero

Tools

7 tools

Tools of Surface Contract: platform API behavior and x402 pre-payment checks
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 declaredNot declaredNot declaredNot 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 declaredNot declaredNot declaredNot 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 declaredNot declaredNot declaredNot declared
list_surface_contractsList the platform surface contracts published in Penny's free registry, with claim counts.Not declaredNot declaredNot declaredNot 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 declaredNot declaredNot declaredNot 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 declaredNot declaredNot declaredNot declared
verify_surfaceRun the anonymous conformance checks for a contract now and return verified / failed / unknown / manual / unsupported per claim.Not declaredNot declaredNot declaredNot 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

Are you the operator? Claim this listing