Datoka API
Server Details
Signed client-declared API receipts. Free preparation/verification; issuance 0.002 USDC via x402.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 4 tools
Each of the four tools maps to a distinct lifecycle action: key retrieval, commitment preparation, receipt issuance, and receipt verification. The prepare/issue boundary is clarified by the explicit note that prepare does not persist a receipt.
All names follow a consistent verb_api_noun snake_case pattern (get_api_public_keys, issue_api_receipt, etc.). There are no deviations in style or casing.
Four tools are well-scoped for a focused receipt/trust API, each covering a necessary phase without overlap. The count is appropriate for the narrow domain.
The core prepare → issue → verify lifecycle plus public key retrieval is covered, enabling offline verification and issuance. Minor gaps exist (e.g., no retrieval or revocation of persisted receipts), but agents can work around these by handling receipts client-side.
Available Tools
4 toolsget_api_public_keysARead-onlyIdempotentInspect
Return issuer public keys. Establish issuer trust independently before offline verification.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| keys | Yes | |
| issuer | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and closed-world scope, so the safety profile is covered. The description adds a meaningful trust-model caveat (verify issuer trust independently rather than blindly trusting these keys), but says nothing about rotation, caching, or key format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the action front-loaded and the trust guidance second; every word earns its place and there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and no inputs, the description does not need to explain return values or arguments. It is nearly complete for a simple key-fetch endpoint, though it omits any note on key rotation or freshness an agent might care about.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no argument semantics to explain and the baseline is 4. The description correctly adds no redundant parameter talk.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Return issuer public keys'), which is unambiguous and clearly distinct in function from the sibling verbs issue/prepare/verify. It does not, however, explicitly reference any sibling or scope boundary, so it stops short of full differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Establish issuer trust independently before offline verification' positions the call in the workflow, implying it precedes verify_api_receipt and supports offline verification. It gives clear context for when the tool is needed but names no explicit alternative or exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
issue_api_receiptBIdempotentInspect
Persist a signed commitment to a client-declared HTTP exchange. Public price: 0.002 USDC via x402 when enabled; otherwise requires pilot issuance permission. Preserve the event, idempotency key and original payment authorization on retries. This does not prove independent observation or the truth of the response.
| Name | Required | Description | Default |
|---|---|---|---|
| event | Yes | ||
| idempotencyKey | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and openWorldHint=true, but the description adds non-obvious behavior: the cost/permission gate, the retry requirement to preserve the event, idempotency key and original payment authorization, and the scope caveat that it does not prove independent observation or response truth. That is substantive context beyond the structured fields, though it omits what happens on duplicate keys or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences, front-loaded with the core action before cost, retry and scope caveats. Every sentence carries distinct information, though the price/permission clause is slightly compressed and could be clearer.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a write tool with a deep nested schema and no output schema, the description covers cost, permissions, retry semantics and scope limits reasonably well. It still leaves open what the call returns (e.g. a receipt identifier) and how idempotency-key conflicts are handled, so an agent has gaps before invoking it confidently.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must carry parameter meaning, but it only names 'event' and 'idempotency key' generically. It never explains the event's structure (the many required hash fields, the fixed 'client_declared' attestation, encodings) and even references an 'original payment authorization' that does not appear as a parameter, adding little semantics over the schema itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource ('Persist a signed commitment to a client-declared HTTP exchange'), which clearly separates it from prepare_api_exchange and verify_api_receipt. It stops short of explicitly naming those siblings or stating how it differs from them, so it is clear but not fully differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a real availability condition ('0.002 USDC via x402 when enabled; otherwise requires pilot issuance permission') and a retry directive, which is useful usage context. However, it never states when an agent should call this versus verify_api_receipt or prepare_api_exchange, so the routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_api_exchangeBRead-onlyIdempotentInspect
Validate a client-declared HTTP exchange and compute its commitment; no receipt is persisted.
| Name | Required | Description | Default |
|---|---|---|---|
| event | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| chain | Yes | |
| event | Yes | |
| commitment | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful point beyond them — that no receipt is persisted, which matters because a sibling does persist — but says nothing about validation failure behavior or what a rejection looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One compact sentence with the core action front-loaded and the non-persistence constraint appended as a useful qualifier. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, but for a validation tool with a highly constrained nested input the description omits what the computed commitment is, whether validation errors are surfaced, and how the event attestation is required. Adequate but thin for the complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the single 'event' parameter is a deeply nested object with const version, fixed hash algorithms, timestamp patterns and enum methods. The description adds no meaning about any of these fields, leaving the agent to infer the entire payload contract from the raw schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb chain (validate ... and compute its commitment) against a named resource (a client-declared HTTP exchange). The closing clause 'no receipt is persisted' implicitly separates it from issue_api_receipt, though that sibling is not named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The non-persistence note hints at the prepare-then-issue workflow, but there is no explicit when-to-use guidance or statement of when this tool should be preferred over issue_api_receipt or verify_api_receipt. Usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_api_receiptBRead-onlyIdempotentInspect
Verify signature, trusted issuer, tenant, event commitment and API protocol semantics.
| Name | Required | Description | Default |
|---|---|---|---|
| event | Yes | ||
| receipt | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| apiId | Yes | |
| scope | Yes | |
| valid | Yes | |
| receiptId | Yes | |
| exchangeId | Yes | |
| attestation | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is fully covered. The description adds the verification scope, which is useful, but says nothing about failure behavior (throws vs. boolean result) or dependencies on key/issuer trust material.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence, front-loaded with the verb and the verification dimensions. No filler, nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema and annotations cover return values and safety, so those gaps are acceptable. However, for a deeply nested verification tool with 0% schema coverage, the description omits usage context, failure semantics, and how the event/receipt pair should be sourced.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description never maps its verification claims onto the two required parameters (event, receipt) or explains their relationship. The schema is structurally self-documenting via consts and patterns, but the description contributes no additional parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb (Verify) and enumerates the concrete dimensions checked: signature, trusted issuer, tenant, event commitment, and API protocol semantics. This clearly separates it from the issue/prepare siblings, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no prerequisites, and no alternatives named. The agent must infer that this runs after issue_api_receipt and perhaps needs get_api_public_keys, but nothing in the description says so.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
- Changed
issue_api_receipt1 field changed- changed
Output schema / (root)Previous value: -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "additionalProperties": false, - "properties": { - "event": { - "additionalProperties": false, - "properties": { - "apiId": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "attestation": { - "const": "client_declared", - "type": "string" - }, - "bodyEncoding": { - "const": "application_bytes", - "type": "string" - }, - "completedAt": { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d\\.\\d{3}(?:Z))$", - "type": "string" - }, - "exchangeId": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "headerEncoding": { - "const": "jcs-selected-headers-v1", - "type": "string" - }, - "method": { - "enum": [ - "GET", - "HEAD", - "POST", - "PUT", - "PATCH", - "DELETE", - "OPTIONS" - ], - "type": "string" - }, - "requestBodyHash": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "sha256", - "type": "string" - }, - "digest": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "algorithm", - "digest" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "requestHeadersHash": { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "sha256", - "type": "string" - }, - "digest": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "algorithm", - "digest" - ], - "type": "object" - }, - "responseBodyHash": { - "anyOf": [ - { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "sha256", - "type": "string" - }, - "digest": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "algorithm", - "digest" - ], - "type": "object" - }, - { - "type": "null" - } - ] - }, - "responseHeadersHash": { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "sha256", - "type": "string" - }, - "digest": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "algorithm", - "digest" - ], - "type": "object" - }, - "startedAt": { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d\\.\\d{3}(?:Z))$", - "type": "string" - }, - "status": { - "maximum": 599, - "minimum": 200, - "type": "integer" - }, - "targetHash": { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "sha256", - "type": "string" - }, - "digest": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - } - }, - "required": [ - "algorithm", - "digest" - ], - "type": "object" - }, - "version": { - "const": "datoka.api.exchange.v1", - "type": "string" - } - }, - "required": [ - "version", - "attestation", - "apiId", - "exchangeId", - "method", - "status", - "startedAt", - "completedAt", - "targetHash", - "requestBodyHash", - "responseBodyHash", - "requestHeadersHash", - "responseHeadersHash", - "bodyEncoding", - "headerEncoding" - ], - "type": "object" - }, - "receipt": { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "Ed25519", - "type": "string" - }, - "body": { - "additionalProperties": false, - "properties": { - "id": { - "format": "uuid", - "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", - "type": "string" - }, - "issuedAt": { - "format": "date-time", - "pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d\\.\\d{3}(?:Z))$", - "type": "string" - }, - "issuer": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "keyId": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "previous": { - "anyOf": [ - { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - { - "type": "null" - } - ] - }, - "request": { - "additionalProperties": false, - "properties": { - "chain": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "eventType": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "scope": { - "pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$", - "type": "string" - }, - "subject": { - "additionalProperties": false, - "properties": { - "algorithm": { - "const": "sha256", - "type": "string" - }, - "digest": { - "pattern": "^[a-f0-9]{64}$", - "type": "string" - }, - "encoding": { - "enum": [ - "jcs", - "bytes" - ], - "type": "string" - } - }, - "required": [ - "algorithm", - "encoding", - "digest" - ], - "type": "object" - } - }, - "required": [ - "scope", - "chain", - "eventType", - "subject" - ], - "type": "object" - }, - "sequence": { - "exclusiveMinimum": 0, - "maximum": 9007199254740991, - "type": "integer" - }, - "version": { - "const": "datoka.receipt.v1", - "type": "string" - } - }, - "required": [ - "version", - "id", - "issuer", - "keyId", - "issuedAt", - "request", - "sequence", - "previous" - ], - "type": "object" - }, - "signature": { - "pattern": "^[A-Za-z0-9_-]{86}$", - "type": "string" - } - }, - "required": [ - "body", - "algorithm", - "signature" - ], - "type": "object" - } - }, - "required": [ - "event", - "receipt" - ], - "type": "object" -}New value: +null
4 tool updates
- First observed
get_api_public_keys - First observed
issue_api_receipt - First observed
prepare_api_exchange - First observed
verify_api_receipt
Related MCP Connectors
Signed agent execution declarations. Free verification; issuance 0.002 USDC via x402 on Base.
Issue signed receipts for AI agent actions; verify any receipt offline - free, no account.
PaymentOracle — ES256K-signed receipts for x402 payments on USDC+EURC (Base) and XRP+RLUSD (XRPL).
Post-quantum, tamper-evident receipts for agent actions. Ed25519 + ML-DSA-65, offline verify.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceCryptographic receipt layer for AI inferences. Enables notarization and verification of AI outputs with on-chain proofs via x402 payment.1MIT- FlicenseNot gradedqualityBmaintenanceEnables auditing x402 payment logs against delivery logs to issue signed proof-of-delivery receipts and verify payer spend health.-
- AlicenseNot gradedqualityBmaintenanceIssue and verify signed receipts for agent actions, enabling durable, independently checkable proof of policy decisions. Supports offline verification via get_keyset and verify_receipt tools without an account.0Inno Setup
- AlicenseNot gradedqualityCmaintenanceEd25519-signed market-state receipts for 28 exchanges: is the venue open right now, as a receipt any agent can verify without trusting the operator, fail-closed (unknown is reported as closed). MCP tools: get_market_status, get_market_schedule, list_exchanges, get_payment_options. Free tier 500 calls a day with an instant key; x402 pay-per-call at 0.001 USDC on Base; Builder 99 USDC a monthMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.