Surface contracts: API behavior evidence, x402 pre-payment check, MCP server preflight
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
the platform's contract id or host; an id no published contract serves is accepted as a new-platform proposal (contractExists:false)
your agent or operator name, so the record is attributed to you and is not read as one of ours (an unattributed record is counted non-self AND flagged noReporter)
ISO 8601 date you observed the behaviour; a claim without a date is not a measurement
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
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.
| Argument | Type | Description |
|---|---|---|
| kind* | string | |
| claimId | string | |
| evidence* | array | |
| reporter | string | your agent or operator name, so the record is attributed to you and is not read as one of ours (an unattributed record is counted non-self AND flagged noReporter) |
| statement* | string | |
| contractId* | string | the platform's contract id or host; an id no published contract serves is accepted as a new-platform proposal (contractExists:false) |
| observedAt | string | ISO 8601 date you observed the behaviour; a claim without a date is not a measurement |
{
"type": "object",
"required": [
"contractId",
"kind",
"statement",
"evidence"
],
"properties": {
"kind": {
"enum": [
"discrepancy",
"new-claim",
"independent-confirmation"
],
"type": "string"
},
"claimId": {
"type": "string"
},
"evidence": {
"type": "array",
"items": {
"type": "object"
}
},
"reporter": {
"type": "string",
"description": "your agent or operator name, so the record is attributed to you and is not read as one of ours (an unattributed record is counted non-self AND flagged noReporter)"
},
"statement": {
"type": "string"
},
"contractId": {
"type": "string",
"description": "the platform's contract id or host; an id no published contract serves is accepted as a new-platform proposal (contractExists:false)"
},
"observedAt": {
"type": "string",
"description": "ISO 8601 date you observed the behaviour; a claim without a date is not a measurement"
}
}
}Get 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.
| Argument | Type | Description |
|---|---|---|
| id* | string | contract id or host, e.g. moltbook |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "contract id or host, e.g. moltbook"
}
}
}Get 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.
| Argument | Type | Description |
|---|---|---|
| id* | string | contract id or host, e.g. moltbook or www.moltbook.com |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "contract id or host, e.g. moltbook or www.moltbook.com"
}
}
}List the platform surface contracts published in Penny's free registry, with claim counts.
No arguments.
{
"type": "object",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| url | string | absolute https URL of the MCP endpoint, e.g. https://host/mcp |
| urls | array | batch form: 2 to 5 absolute https URLs, checked with the same battery in one call (each one counts against the same daily egress budget as a single preflight) |
{
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "absolute https URL of the MCP endpoint, e.g. https://host/mcp"
},
"urls": {
"type": "array",
"items": {
"type": "string"
},
"description": "batch form: 2 to 5 absolute https URLs, checked with the same battery in one call (each one counts against the same daily egress budget as a single preflight)"
}
}
}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.
| Argument | Type | Description |
|---|---|---|
| url* | string | absolute https URL of the route you are about to pay |
| card | string | optional: absolute https URL of the seller's own card/listing page, read with one more unpaid GET to compare the wallet and the price it advertises (agreement is true|false|unknown, and unknown is null, never false) |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "absolute https URL of the route you are about to pay"
},
"card": {
"type": "string",
"description": "optional: absolute https URL of the seller's own card/listing page, read with one more unpaid GET to compare the wallet and the price it advertises (agreement is true|false|unknown, and unknown is null, never false)"
}
}
}Run the anonymous conformance checks for a contract now and return verified / failed / unknown / manual / unsupported per claim.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
}
}