GAIP Witness Agent
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Witness: agreed terms, delivery checks, signed receipts, dispute bundles and evidence packs.
| Author | io.github.tjcgraham-rgb |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 3110 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"GAIP Witness Agent": {
"url": "https://www.gaipagents.com/mcp/agents/witness",
"transport": "streamable-http"
}
}
}
Measured tools (23)
witness_register_termsUse this when about to depend on a public HTTPS service and you want neutral evidence of what it delivers. Pass `service_url`; `checks` default to HTTP 200 and a non-empty body (also JSON keys, latency, size, regex). Returns a `terms_id`; then call witness_delivery. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
service_url(required) — string — Public https URL of the service.checks— array — 1-8 checks, each {"id": "http_status_in", "allowed": [200]}, {"id": "content_type_is", "value": "application/json"}, {"id": "non_empty"}, {"id": "json_parses"}, {"id": "json_required_keys", "keys": ["a.b"]}, {"id": "json_path_equals", "path": "a.b", "value": 1}, {"id": "max_latency_ms", "limit": 2000}, {"id": "max_bytes", "limit": 20000}, {"id": "text_contains", "value": "ok"} or {"id": "regex", "pattern": "ok|up"}.seller_ref— string — Optional: name of the supplier. Defaults to the host of service_url.research_consent— boolean — Optional, default false. true lets this record be counted, never named, in GAIP's monthly aggregate research figures (for example for insurers).data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only no · destructive no · idempotent no · open-world no
witness_deliveryread-onlyUse this when asked whether a service delivered what was agreed ("did the supplier deliver?"). Pass the `terms_id` from witness_register_terms and mode PUBLIC_REPLAY (GAIP fetches it) or BUYER_SUBMITTED. Returns PASS / FAIL / UNKNOWN per check, what changed since last time, and a receipt. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
terms_id(required) — string — The terms_id returned when the terms were registered.mode(required) — string — PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in.body— string — BUYER_SUBMITTED: the response body you received (max 32 KiB).synthetic— boolean — Optional: true marks a test call.episode_id— string — Optional: your own id to group related calls.body_sha256— string — BUYER_SUBMITTED: SHA-256 of the body, instead of the body.http_status— integer — BUYER_SUBMITTED: the HTTP status you received.content_type— string — BUYER_SUBMITTED: the Content-Type you received.research_consent— boolean — Optional, default false. true lets this delivery check be counted, never named, in GAIP's monthly aggregate research figures.continuity_handle— object — Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.independent_operator_id— string — Optional: your operator id (recorded as a claim, not verified).
Hints: read-only yes · destructive no · idempotent yes · open-world yes
gaip_receipt_exportread-onlyUse this when you need a GAIP receipt in another format. Pass `receipt_id` and `format`: x402 (attestation style), erc8004 (validation-response shape) or vc (W3C-VC-like JSON-LD). Ed25519-signed when the runtime key is available; hash chain and Merkle proof; no on-chain write. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
receipt_id(required) — string — The receipt_id exactly as an earlier GAIP result returned it. Have none? Call with any id: the refusal lists example_receipt_ids from GAIP's own public records.format(required) — string — x402, erc8004 or vc.
Hints: read-only yes · destructive no · idempotent yes · open-world no
verify_gaip_receiptread-onlyUse this when you hold a GAIP receipt_id and want to confirm it ("is this receipt genuine?"). Returns the retained record, hash chain and Merkle inclusion proof. Integrity only: it does not make the underlying claim true. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
receipt_id(required) — string — A receipt_id returned by an earlier GAIP call.synthetic— boolean — Optional: true marks a test call.episode_id— string — Optional: your own id to group related calls.continuity_handle— object — Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.independent_operator_id— string — Optional: your operator id (recorded as a claim, not verified).
Hints: read-only yes · destructive no · idempotent yes · open-world no
witness_dispute_bundleread-onlyUse this when a witnessed delivery failed and you must hand the facts to the other party or a resolver. Pass `terms_id` or a delivery `receipt_id`. Returns one hash-stamped bundle: terms, every check, receipts, timeline, summary. No judgement of who is right. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
terms_id— string — Or the terms_id (wt_...) of the agreement.receipt_id— string — A delivery receipt_id from witness_delivery.receipt_format— string — gaip (default) or x402_sar: also give each delivery in the x402 SAR draft shape.continuity_handle— object — Optional: the continuity_handle that registered a DELIVERY_SLA watch on these terms; adds your SLA breaches.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_watch_registerUse this when asked to keep an eye on an agent or MCP server ("tell me if it changes or goes down"). Pass the `continuity_handle` from any GAIP result, `kind` and `target_url`. GAIP re-checks every 24 hours (3 free watches), receipts each change and can call your webhook. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
continuity_handle(required) — object — The continuity_handle from an earlier GAIP result; proves you own these watches.kind(required) — string — AGENT_READINESS (agent URL), SUPPLIER_CARD (published card), DELIVERY_TERMS (terms_id) or DELIVERY_SLA (terms_id plus sla terms).sla— object — DELIVERY_SLA only: service-level terms checked on every observation, any of min_uptime_pct, max_latency_ms, required_fields (JSON key paths), freshness_field + max_age_seconds; optional uptime_window_hours, min_observations. Results go only to you.terms_id— string — DELIVERY_TERMS or DELIVERY_SLA: terms_id from witness_register_terms.target_url— string — Public https URL (AGENT_READINESS, SUPPLIER_CARD). No query string.webhook_url— string — Optional: your own public https endpoint for signed change events.interval_hours— integer — Hours between checks: 24 minimum on the free tier; 1 for DELIVERY_SLA.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only no · destructive no · idempotent no · open-world yes
gaip_watch_listread-onlyUse this when asked which agents or services you are watching. Pass your `continuity_handle`. Returns each watch's kind, target, last verdict, last and next check and webhook endpoint (never the secret). Free, read-only, no account; inputs must be public and non-personal.
Parameters:
continuity_handle(required) — object — The continuity_handle from an earlier GAIP result; proves you own these watches.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_watch_removedestructiveUse this when asked to stop watching an agent or service. Pass your `continuity_handle` and the `watch_id`. Its stored events are deleted; retained receipts stay verifiable. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
continuity_handle(required) — object — The continuity_handle from an earlier GAIP result; proves you own these watches.watch_id(required) — string — The watch_id returned by gaip_watch_register.
Hints: read-only no · destructive yes · idempotent yes · open-world no
gaip_watch_eventsread-onlyUse this when asked what changed on a watched agent or service. Pass your `continuity_handle` and optionally a `watch_id`. Returns recent change events: verdict before and after, a change summary, the receipt and webhook delivery status. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
continuity_handle(required) — object — The continuity_handle from an earlier GAIP result; proves you own these watches.limit— integer — Optional: maximum events to return.watch_id— string — The watch_id returned by gaip_watch_register.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_citation_witnessread-onlyUse this when asked to verify citations or quotes ("do these sources really say this?"). Pass `citations` (1-20 {url, quote}). GAIP fetches each page once (robots.txt respected); returns QUOTE_FOUND / QUOTE_NOT_FOUND_IN_FETCHED_VERSION / SOURCE_UNREACHABLE..., an excerpt and a receipt. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
citations(required) — array — 1-20 citations, each {url, quote?, claimed_title?, claimed_date?}.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only yes · destructive no · idempotent no · open-world yes
gaip_check_sar_receiptread-onlyUse this when handed an x402 SAR-shaped receipt (draft proposal shape; may change). Pass `sar_receipt`, optionally the issuer's `public_key`. Returns missing fields, whether receipt_id matches the core and whether the signature checks out against that key. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
sar_receipt(required) — object — The SAR receipt object (or a whole gaip_receipt_export x402 result).public_key— Optional: the issuer's Ed25519 public key, raw 32 bytes base64url or a JWK {kty: OKP, crv: Ed25519, x}. Omit to use GAIP's published keys.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_record_extractread-onlyUse this when you need proof of what an agent or shop page declared on a date. Pass its `url` (optional `since`, `until`). Returns an extract of GAIP's record as kept: entries with chain positions, hashes, daily anchors and a signature. Free preview. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
url(required) — string — The A2A agent card, MCP endpoint or shop product page URL, exactly as recorded.limit— integer — Optional: most entries to return, newest kept (default 50).since— string — Optional: start of the range (YYYY-MM-DD or RFC 3339).until— string — Optional: end of the range (YYYY-MM-DD, inclusive, or RFC 3339).
Hints: read-only yes · destructive no · idempotent yes · open-world no
witness_accept_termsUse this when you are the other party to terms a buyer registered. Pass the `terms_id`, your own `continuity_handle` and `business_purpose_statement` true (businesses only); the buyer confirms it with the `agreement_id`. Returns an `agreement_id` naming both parties. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
terms_id(required) — string — wt_... from witness_register_terms.agreement_id— string — Only on an existing agreement: the buyer confirms business purpose or expert determination, or either party declares a consumer contract.finding_mode— string — EVIDENCE_ONLY, or EXPERT_DETERMINATION (needs the buyer's confirmation).acceptance_rule— object — What counts as delivered, by when, and who may ask for the finding.seller_key_proof— object — Optional: {jwk, jws over the terms_id, host}; GAIP checks the signature and whether the host published that key.consumer_contract— boolean — true if either party is a consumer: evidence summary only, no finding.continuity_handle— object — Required: your own continuity handle (continuity_id, token).agreement_cancelled— boolean — Only with agreement_id: either party records that it cancelled the agreement (recorded as that party's statement and published in GAIP's revocation feed).data_classification— string — PUBLIC or NON_PERSONAL_PUBLIC.mandate_check_receipt— object — Optional: the gaip_check_mandate receipt you obtained (or {receipt_sha256, state}) if you act for a person; its state is recorded beside the acceptance as a fact and shown in the finding.business_purpose_statement— boolean — Required true from the seller at acceptance and from the buyer (with agreement_id): you act for purposes relating to your trade, business, craft or profession and the deal is not with a consumer. No finding until both parties have stated it.
Hints: read-only no · destructive no · idempotent no · open-world no
witness_findingUse this when deliveries exist for an agreement and you want GAIP's signed finding. Pass the `agreement_id` and your `continuity_handle`. Returns MET, NOT_MET or INDETERMINATE on the agreed rule with the records relied on. Evidence only; no sum of money. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
agreement_id(required) — string — wa_... from witness_accept_terms.continuity_handle— object — Required: a party's own continuity handle.data_classification— string — PUBLIC or NON_PERSONAL_PUBLIC.
Hints: read-only no · destructive no · idempotent no · open-world no
witness_signoffUse this when a role (APPROVER, REVIEWER, OWNER, OPERATOR or a hashed role_id) decided on an agent's proposal. Pass `proposal_sha256`, `decision` (APPROVED, REFUSED, CHANGED), optionally `agreement_id`. Returns a chained, signed entry of the role's decision, never GAIP's. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
proposal_sha256(required) — string — SHA-256 (64 hex) of what the agent proposed, computed by you; the proposal itself is never sent.decision(required) — string — The decision as recorded: APPROVED, REFUSED or CHANGED.role— string — The role that decided: APPROVER, REVIEWER, OWNER or OPERATOR. Any other text is refused (ROLE_VOCABULARY); use role_id for your own id.role_id— string — Optional: your own opaque role identifier (one token, no spaces). GAIP keeps it only as a keyed hash, never in clear.agent_url— string — Optional: public https URL of the agent whose proposal was decided (the system identifier).agreement_id— string — Optional: the wa_... Deals agreement from witness_accept_terms this decision concerns; the finding then lists it.reason_sha256— string — Optional: SHA-256 (64 hex) of the reason you keep; anything but a hash is refused.continuity_handle— object — Optional: your continuity handle (continuity_id, token); one is issued with the receipt when absent.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only no · destructive no · idempotent no · open-world no
assurance_prepareUse this when you, the buyer, chose a public service and want its delivery checked end to end. Pass `service_url`, `checks` and explicit_read_only_consent=true. GAIP preflights it and records your checks; returns a `terms_id` for assurance_complete. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
service_url(required) — string — Public https URL of the service.checks(required) — array — 1-8 checks, each {"id": "http_status_in", "allowed": [200]}, {"id": "content_type_is", "value": "application/json"}, {"id": "non_empty"}, {"id": "json_parses"}, {"id": "json_required_keys", "keys": ["a.b"]}, {"id": "json_path_equals", "path": "a.b", "value": 1}, {"id": "max_latency_ms", "limit": 2000}, {"id": "max_bytes", "limit": 20000}, {"id": "text_contains", "value": "ok"} or {"id": "regex", "pattern": "ok|up"}.explicit_read_only_consent(required) — Must be true: you consent to a public, read-only check.episode_id— string — Optional: your own id to group related calls.task_class— string — Optional: short name of the task, e.g. weather_forecast.counterparty_id— string — Name or URL of the agent or service.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only no · destructive no · idempotent no · open-world yes
assurance_completeUse this when finishing a Buyer Assurance check. Pass the `terms_id` from assurance_prepare and mode PUBLIC_REPLAY (GAIP replays the service) or BUYER_SUBMITTED. Returns PASS / FAIL / UNKNOWN per check and a delivery receipt. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
terms_id(required) — string — The terms_id returned when the terms were registered.mode(required) — PUBLIC_REPLAY: GAIP fetches the public URL itself. BUYER_SUBMITTED: check a response you pass in.body— string — BUYER_SUBMITTED: the response body you received (max 32 KiB).body_sha256— string — BUYER_SUBMITTED: SHA-256 of the body, instead of the body.http_status— integer — BUYER_SUBMITTED: the HTTP status you received.content_type— string — BUYER_SUBMITTED: the Content-Type you received.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only no · destructive no · idempotent no · open-world yes
assurance_verifyread-onlyUse this when you hold a Buyer Assurance terms or delivery receipt_id and want to confirm it. Returns the retained record and its integrity proof (integrity only). Free, read-only, no account; inputs must be public and non-personal.
Parameters:
receipt_id(required) — string — A receipt_id returned by an earlier GAIP call.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_verify_supplier_claimsUse this to check what an agent, API or supplier claims. Pass `claims` (each with an `id`; add `check_url` and GAIP tests it now), your `observations` and `metadata`. Returns per claim what GAIP saw, what you reported and whether they agree. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
claims(required) — array — Claims to check, each {id, text}.metadata(required) — object — The published agent card, MCP server description or OpenAPI document (as JSON).protocol— string — Counterparty protocol. Inferred from metadata when omitted, otherwise MCP.synthetic— boolean — Optional: true marks a test call.episode_id— string — Optional: your own id to group related calls.task_class— string — Optional: short name of the task, e.g. weather_forecast.observations— array — Optional: what you saw, each {claim_id, result: PASS|FAIL, detail}.counterparty_id— string — Name or URL of the agent/service. Optional.continuity_handle— object — Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.independent_operator_id— string — Optional: your operator id (recorded as a claim, not verified).
Hints: read-only no · destructive no · idempotent no · open-world yes
inspect_counterparty_evidenceread-onlyUse this when asked what evidence exists about an agent before delegating to it. Pass its `counterparty_id` and any `observations`. Returns task-specific evidence coverage, conflicts, gaps and GAIP's own earlier checks of it, with a receipt. Never a trust score or recommendation. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
synthetic— boolean — Optional: true marks a test call.episode_id— string — Optional: your own id to group related calls.task_class— string — Task you want evidence for. Optional.max_age_days— integer — Optional freshness window (default 30): GAIP history records older than this are STALE and do not count toward evidence_sufficiency.observations— array — Optional: observations about it, each {source, observed_at, evidence_digest, lifecycle_state, claim}.counterparty_id— string — Name or URL of the agent or service.continuity_handle— object — Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.independent_operator_id— string — Optional: your operator id (recorded as a claim, not verified).
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_evidence_packread-onlyUse this when an insurer, auditor or buyer asks what evidence exists about an agent or supplier. Pass its `subject` (public id or https URL). Returns conformance, watch, witness, repair and incident records with Merkle proofs, plus gaps. A compilation, not certification or advice. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
subject(required) — The agent or supplier: its public id or https URL. Never a person.scope— object — Optional: {receipt_ids, since, until, categories, max_items}.requester— object — Optional: {purpose, continuity_handle} to include your own receipts.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_incident_bundleread-onlyUse this when something went wrong with an agent and you need the facts in order. Pass the `receipt_ids` you hold and attributed `observations`. Returns a verified, source-attributed timeline with an EU AI Act Art. 73 reference aid. No fault, cause or liability finding. Free, read-only, no account; inputs must be public and non-personal.
Parameters:
title— string — Optional: short incident title.receipt_ids— array — GAIP receipt ids you hold about the incident.observations— array — Attributed observations, each {source, statement, observed_at_utc}.ai_system_ref— string — Optional: public id or URL of the AI system involved; given alone, GAIP starts the timeline from its own public records of that system.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.
Hints: read-only yes · destructive no · idempotent yes · open-world no
gaip_measure_outcome_valueUse this when asked whether an outcome-priced task delivered and what it cost. Pass `episode_id`, `task` (acceptance_criteria), `delivery`, `costs`; `delivery_check` {url, checks} has GAIP test delivery now. Returns a dossier, running totals and a receipt. No ROI claim. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Parameters:
episode_id(required) — string — Optional: your own id to group related calls.task(required) — object — The task: {acceptance_criteria}.delivery(required) — object — What was delivered: {status, receipt_id?}.costs(required) — object — Caller-stated costs in GBP: agent_gbp, compute_gbp, human_review_gbp, repair_gbp.currency— string — Optional: ISO 4217 code of the cost amounts (default GBP).fx_to_gbp— object — Optional: {rate, as_of, source} - your GBP rate; GBP equivalents are then reported, labelled with it. GAIP never uses built-in rates.synthetic— boolean — Optional: true marks a test call.task_class— string — Optional: short name of the task, e.g. weather_forecast.evidence_refs— array — Optional: references to your own evidence (ids or URLs).delivery_check— object — Optional: {url, checks} - GAIP tests the delivery at this public https URL now with Witness checks; its verdict sets delivery.status.downstream_use— object — Optional: {status: USED|NOT_USED, evidence_ref}.counterparty_id— string — Name or URL of the agent or service.baseline_cost_gbp— Optional: what the task cost before, in GBP.continuity_handle— object — Optional: the continuity_handle from an earlier GAIP result; adds running totals over your own earlier tasks.data_classification— string — PUBLIC (default) or NON_PERSONAL_PUBLIC. Never send personal data.independent_operator_id— string — Optional: your operator id (recorded as a claim, not verified).
Hints: read-only no · destructive no · idempotent no · open-world yes
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.