protogrid

Search / dev.workers.penny-mcamp.penny-surface-contract/surface-contract

Surface Contract: how platform APIs really behave

R0· no sign-in

Evidence-cited machine-readable contracts for how agent platform APIs really behave

v2026.10.13 · active · website · descriptor JSON · versions

An agent can connect right now, no human step.Remote endpoint, no authentication, reachable on the last probe.
Quality73new
Trust82of 100
Uptime, 30 days96%
Latency p50889 ms

Connect

8 clients · secrets stay placeholders
{
  "mcpServers": {
    "surface-contract": {
      "type": "http",
      "url": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
    }
  }
}
claude mcp add --transport http surface-contract https://penny-surface-contract.penny-mcamp.workers.dev/mcp
[mcp_servers.surface-contract]
url = "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "surface-contract": {
      "type": "remote",
      "url": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp",
      "enabled": true
    }
  }
}
{
  "mcpServers": {
    "surface-contract": {
      "type": "http",
      "url": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
    }
  },
  "deeplink": "cursor://anysphere.cursor-deeplink/mcp/install?name=surface-contract&config=eyJ0eXBlIjoiaHR0cCIsInVybCI6Imh0dHBzOi8vcGVubnktc3VyZmFjZS1jb250cmFjdC5wZW5ueS1tY2FtcC53b3JrZXJzLmRldi9tY3AifQ%3D%3D"
}
{
  "servers": {
    "surface-contract": {
      "type": "http",
      "url": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
    }
  }
}
{
  "mcpServers": {
    "surface-contract": {
      "httpUrl": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
    }
  }
}
extensions:
  "surface-contract":
    enabled: true
    name: "surface-contract"
    type: streamable_http
    uri: "https://penny-surface-contract.penny-mcamp.workers.dev/mcp"
    timeout: 300

Quality 73 / 100new

protocol75 · weight 25
  • warn
    protocol.modernnewest supported version is 2025-06-18; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
  • n/a
    protocol.statelessonly applies to 2026-07-28 servers
  • pass
    protocol.transportstreamable HTTP
  • n/a
    protocol.list_ttlonly applies to 2026-07-28 servers
authorizationn/a · weight 15
  • n/a
    auth.prm, auth.as_metadata, auth.cimdno remote uses OAuth
  • n/a
    auth.secret_in_urlno templated URL
tool hygiene71 · weight 30
  • pass
    tools.descriptionsevery tool has a description
  • pass
    tools.description_lengthdescriptions are concise
  • pass
    tools.schemasevery tool has an object input schema
  • fail
    tools.annotationsno tool declares readOnlyHint or destructiveHint, so clients cannot tell safe calls from risky ones
  • fail
    tools.directory_hintsno tool declares all four of readOnlyHint, destructiveHint, idempotentHint and openWorldHint; missing: get_surface_contract (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); prepay_check (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); verify_surface (readOnlyHint, destructiveHint, idempotentHint, openWorldHint); …
  • pass
    tools.token_costabout 1,288 tokens to load every tool
  • pass
    tools.api_dumptools are not a one-to-one API dump
stabilityn/a · weight 15
  • n/a
    stability.changes, stability.rug_pulltool history recorded for 6 of the 7 days needed
dependenciesn/a · weight 15
  • n/a
    deps.known_vulns, deps.mcp_sdk_version, deps.resolvableno npm or PyPI package

7 tools, about 1,288 tokens to load them all · tool set 51e8216003cb · tools last changed 2026-10-15 · checked 2026-10-20 18:38 UTC

Tool changes

  • prepay_checkadded

    Check 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.

  • contribute_discrepancychangeddescription, input schemameaning changed
    before

    Report a platform behaviour that contradicts a published claim, or a new claim, with evidence. Stored as pending; a published contract is never changed without independent verification.

    after · 27% of words in common

    Report 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.

  • preflight_mcp_serveradded

    Run 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.

Full history: list_changes · trend: quality JSON.

Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed. How it is computed.

Trust 82 / 100

no-repository
provenance55
liveness98
freshness100
hygiene80

+dns-namespace +website +reachable +uptime-96% +updated-7d-ago -no-repository

Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed. How it is computed.

Endpoints

remoteauthreachableuptime 30dp50protocollast ok
https://penny-surface-contract.penny-mcamp.workers.dev/mcp streamable-httpnoneyes96%889 ms2025-06-182026-10-20

Tools (7)

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.
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.
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.
list_surface_contractsList the platform surface contracts published in Penny's free registry, with claim counts.
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.
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.
verify_surfaceRun the anonymous conformance checks for a contract now and return verified / failed / unknown / manual / unsupported per claim.

Schemas: list_tools.

Similar MCP servers

Official server.json
{
  "name": "dev.workers.penny-mcamp.penny-surface-contract/surface-contract",
  "title": "Surface Contract: how platform APIs really behave",
  "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json",
  "remotes": [
    {
      "url": "https://penny-surface-contract.penny-mcamp.workers.dev/mcp",
      "type": "streamable-http"
    }
  ],
  "version": "2026.10.13",
  "websiteUrl": "https://penny-surface-contract.penny-mcamp.workers.dev/",
  "description": "Evidence-cited machine-readable contracts for how agent platform APIs really behave"
}