{
  "agent_card": {
    "capabilities": {
      "extendedAgentCard": false,
      "pushNotifications": false,
      "stateTransitionHistory": false,
      "streaming": false
    },
    "defaultInputModes": [
      "application/json"
    ],
    "defaultOutputModes": [
      "application/json"
    ],
    "description": "Registers caller-declared delivery checks, observes supplied public results and returns a verifiable retained receipt. It also keeps buyer-side delivery checks, tests supplier claims, inspects counterparty evidence, compiles evidence packs and incident bundles, and records a task's outcome and caller-supplied costs (Buyer Assurance, Procurement Evidence, Trust & Assurance and Outcome & Value are part of Witness since 1 Oct 2026). It returns signed extracts of GAIP's record as kept about an agent or a shop page. Part of GAIP Witness \u00b7 Deals \u00b7 Sign-offs (lead agent).",
    "documentationUrl": "https://www.gaipagents.com/agents/witness",
    "gaip": {
      "agentId": "witness",
      "authority": "PUBLIC_NON_PERSONAL_ZERO_PRICE_BOUNDED_NO_SPEND_NO_PAYMENT_NO_CONTRACT",
      "automaticEvidenceCredit": false,
      "discovery": {
        "aiCatalog": "https://www.gaipagents.com/.well-known/ai-catalog.json",
        "listingKit": "https://www.gaipagents.com/v1/free/discovery/listing-kit",
        "llms": "https://www.gaipagents.com/llms.txt",
        "llmsFull": "https://www.gaipagents.com/llms-full.txt",
        "mcpServerCard": "https://www.gaipagents.com/mcp/server-card",
        "openapi": "https://www.gaipagents.com/openapi.json",
        "products": "https://www.gaipagents.com/v1/free/products"
      },
      "distributionBundle": "https://www.gaipagents.com/v1/distribution/agents/witness",
      "durableReceiptRequiredBeforeSuccess": true,
      "howToCall": {
        "a2a": "POST JSON-RPC message/send (A2A 0.3) or SendMessage (A2A 1.0) to https://www.gaipagents.com/a2a/witness-agent. Put the tool name (underscores, e.g. \"witness_register_terms\") in message.metadata.gaip_tool and the input object in one data part (0.3: {\"kind\": \"data\", \"data\": {...}}; 1.0: {\"data\": {...}} with role ROLE_USER). Without gaip_tool the data part must match one of this agent's tools. Text parts are never converted into a task.",
        "allowedTools": [
          "witness_register_terms",
          "witness_delivery",
          "gaip_receipt_export",
          "verify_gaip_receipt",
          "witness_dispute_bundle",
          "gaip_watch_register",
          "gaip_watch_list",
          "gaip_watch_remove",
          "gaip_watch_events",
          "gaip_citation_witness",
          "gaip_check_sar_receipt",
          "gaip_record_extract",
          "witness_accept_terms",
          "witness_finding",
          "witness_signoff",
          "assurance_prepare",
          "assurance_complete",
          "assurance_verify",
          "gaip_verify_supplier_claims",
          "inspect_counterparty_evidence",
          "gaip_evidence_pack",
          "gaip_incident_bundle",
          "gaip_measure_outcome_value"
        ],
        "example": {
          "id": 1,
          "jsonrpc": "2.0",
          "method": "message/send",
          "params": {
            "message": {
              "kind": "message",
              "messageId": "example-1",
              "metadata": {
                "gaip_tool": "witness_register_terms"
              },
              "parts": [
                {
                  "data": {
                    "checks": [
                      {
                        "allowed": [
                          200
                        ],
                        "id": "http_status_in"
                      },
                      {
                        "id": "json_parses"
                      }
                    ],
                    "seller_ref": "example-weather-agent",
                    "service_url": "https://weather.example.com/forecast.json"
                  },
                  "kind": "data"
                }
              ],
              "role": "user"
            }
          }
        },
        "mcp": "POST tools/call to https://www.gaipagents.com/mcp/agents/witness",
        "primaryTool": "witness_register_terms"
      },
      "legal": {
        "corrections": "https://www.gaipagents.com/corrections",
        "methodology": "https://www.gaipagents.com/methodology",
        "privacyPolicy": "https://www.gaipagents.com/privacy",
        "status": "DRAFT_PENDING_LEGAL_REVIEW",
        "termsOfService": "https://www.gaipagents.com/terms"
      },
      "mcpServerCard": "https://www.gaipagents.com/mcp/agents/witness/server-card",
      "mcpUrl": "https://www.gaipagents.com/mcp/agents/witness",
      "priceGbp": 0,
      "product": {
        "foldedInto": null,
        "kind": "PRODUCT",
        "listed": true,
        "productId": "witness",
        "productName": "Witness \u00b7 Deals \u00b7 Sign-offs",
        "role": "LEAD",
        "roleLabel": "lead agent",
        "status": "PUBLIC_FREE",
        "url": "https://www.gaipagents.com/v1/free/products#witness"
      }
    },
    "iconUrl": "https://www.gaipagents.com/assets/agents/witness.svg",
    "name": "GAIP Witness Agent",
    "preferredTransport": "JSONRPC",
    "protocolVersion": "1.0",
    "provider": {
      "organization": "GAIP",
      "url": "https://www.gaipagents.com"
    },
    "securityRequirements": [],
    "securitySchemes": {},
    "skills": [
      {
        "description": "Use 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. Input: required service_url; optional checks, data_classification, research_consent, seller_ref. A2A: send message/send with metadata.gaip_tool=\"witness_register_terms\" and one data part holding the input object; MCP: tools/call name \"witness_register_terms\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}"
        ],
        "id": "witness-register-terms",
        "inputModes": [
          "application/json"
        ],
        "name": "Witness Register Terms",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required terms_id, mode; optional body, body_sha256, content_type, continuity_handle, data_classification, episode_id, http_status, independent_operator_id, research_consent, synthetic. A2A: send message/send with metadata.gaip_tool=\"witness_delivery\" and one data part holding the input object; MCP: tools/call name \"witness_delivery\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"mode\": \"PUBLIC_REPLAY\", \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_delivery\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "witness-delivery",
        "inputModes": [
          "application/json"
        ],
        "name": "Witness Delivery",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required receipt_id, format. A2A: send message/send with metadata.gaip_tool=\"gaip_receipt_export\" and one data part holding the input object; MCP: tools/call name \"gaip_receipt_export\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"format\": \"x402\", \"receipt_id\": \"<receipt_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"gaip_receipt_export\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "gaip-receipt-export",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Receipt Export",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required receipt_id; optional continuity_handle, data_classification, episode_id, independent_operator_id, synthetic. A2A: send message/send with metadata.gaip_tool=\"verify_gaip_receipt\" and one data part holding the input object; MCP: tools/call name \"verify_gaip_receipt\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"receipt_id\": \"<receipt_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"verify_gaip_receipt\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "verify-gaip-receipt",
        "inputModes": [
          "application/json"
        ],
        "name": "Verify Gaip Receipt",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required none; optional continuity_handle, receipt_format, receipt_id, terms_id. A2A: send message/send with metadata.gaip_tool=\"witness_dispute_bundle\" and one data part holding the input object; MCP: tools/call name \"witness_dispute_bundle\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"body\": \"{\\\"forecast\\\": \\\"sun\\\"}\", \"http_status\": 200, \"mode\": \"BUYER_SUBMITTED\", \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_delivery\"}, {\"agent_id\": \"witness\", \"arguments\": {\"receipt_id\": \"<receipt_id from step 2 (witness_delivery)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"witness_dispute_bundle\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "witness-dispute-bundle",
        "inputModes": [
          "application/json"
        ],
        "name": "Witness Dispute Bundle",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required continuity_handle, kind; optional data_classification, interval_hours, sla, target_url, terms_id, webhook_url. A2A: send message/send with metadata.gaip_tool=\"gaip_watch_register\" and one data part holding the input object; MCP: tools/call name \"gaip_watch_register\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"claims\": [{\"id\": \"c1\", \"text\": \"Returns JSON forecasts over MCP\"}, {\"id\": \"c2\", \"text\": \"Responds within 2 seconds\"}], \"counterparty_id\": \"example-weather-agent\", \"metadata\": {\"protocolVersion\": \"2025-06-18\", \"url\": \"https://weather.example.com/mcp\"}, \"observations\": [{\"claim_id\": \"c1\", \"detail\": \"tools/call returned valid JSON\", \"result\": \"PASS\"}, {\"claim_id\": \"c2\", \"detail\": \"p95 latency 4.8 s over 20 calls\", \"result\": \"FAIL\"}]}, \"keep_from_result\": \"continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"gaip_verify_supplier_claims\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}, \"interval_hours\": 24, \"kind\": \"DELIVERY_TERMS\", \"terms_id\": \"<terms_id from step 2 (witness_register_terms)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"gaip_watch_register\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "gaip-watch-register",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Watch Register",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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). Input: required continuity_handle. A2A: send message/send with metadata.gaip_tool=\"gaip_watch_list\" and one data part holding the input object; MCP: tools/call name \"gaip_watch_list\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"claims\": [{\"id\": \"c1\", \"text\": \"Returns JSON forecasts over MCP\"}, {\"id\": \"c2\", \"text\": \"Responds within 2 seconds\"}], \"counterparty_id\": \"example-weather-agent\", \"metadata\": {\"protocolVersion\": \"2025-06-18\", \"url\": \"https://weather.example.com/mcp\"}, \"observations\": [{\"claim_id\": \"c1\", \"detail\": \"tools/call returned valid JSON\", \"result\": \"PASS\"}, {\"claim_id\": \"c2\", \"detail\": \"p95 latency 4.8 s over 20 calls\", \"result\": \"FAIL\"}]}, \"keep_from_result\": \"continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"gaip_verify_supplier_claims\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}, \"interval_hours\": 24, \"kind\": \"DELIVERY_TERMS\", \"terms_id\": \"<terms_id from step 2 (witness_register_terms)>\"}, \"keep_from_result\": \"watch.watch_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"gaip_watch_register\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 4, \"tool\": \"gaip_watch_list\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "gaip-watch-list",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Watch List",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required continuity_handle, watch_id. A2A: send message/send with metadata.gaip_tool=\"gaip_watch_remove\" and one data part holding the input object; MCP: tools/call name \"gaip_watch_remove\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"claims\": [{\"id\": \"c1\", \"text\": \"Returns JSON forecasts over MCP\"}, {\"id\": \"c2\", \"text\": \"Responds within 2 seconds\"}], \"counterparty_id\": \"example-weather-agent\", \"metadata\": {\"protocolVersion\": \"2025-06-18\", \"url\": \"https://weather.example.com/mcp\"}, \"observations\": [{\"claim_id\": \"c1\", \"detail\": \"tools/call returned valid JSON\", \"result\": \"PASS\"}, {\"claim_id\": \"c2\", \"detail\": \"p95 latency 4.8 s over 20 calls\", \"result\": \"FAIL\"}]}, \"keep_from_result\": \"continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"gaip_verify_supplier_claims\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}, \"interval_hours\": 24, \"kind\": \"DELIVERY_TERMS\", \"terms_id\": \"<terms_id from step 2 (witness_register_terms)>\"}, \"keep_from_result\": \"watch.watch_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"gaip_watch_register\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}, \"watch_id\": \"<watch.watch_id from step 3 (gaip_watch_register)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 4, \"tool\": \"gaip_watch_remove\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "gaip-watch-remove",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Watch Remove",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required continuity_handle; optional limit, watch_id. A2A: send message/send with metadata.gaip_tool=\"gaip_watch_events\" and one data part holding the input object; MCP: tools/call name \"gaip_watch_events\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"claims\": [{\"id\": \"c1\", \"text\": \"Returns JSON forecasts over MCP\"}, {\"id\": \"c2\", \"text\": \"Responds within 2 seconds\"}], \"counterparty_id\": \"example-weather-agent\", \"metadata\": {\"protocolVersion\": \"2025-06-18\", \"url\": \"https://weather.example.com/mcp\"}, \"observations\": [{\"claim_id\": \"c1\", \"detail\": \"tools/call returned valid JSON\", \"result\": \"PASS\"}, {\"claim_id\": \"c2\", \"detail\": \"p95 latency 4.8 s over 20 calls\", \"result\": \"FAIL\"}]}, \"keep_from_result\": \"continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"gaip_verify_supplier_claims\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}, \"interval_hours\": 24, \"kind\": \"DELIVERY_TERMS\", \"terms_id\": \"<terms_id from step 2 (witness_register_terms)>\"}, \"keep_from_result\": \"watch.watch_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"gaip_watch_register\"}, {\"agent_id\": \"witness\", \"arguments\": {\"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (gaip_verify_supplier_claims)>\", \"token\": \"<continuity_handle.token from step 1 (gaip_verify_supplier_claims)>\"}, \"limit\": 10, \"watch_id\": \"<watch.watch_id from step 3 (gaip_watch_register)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 4, \"tool\": \"gaip_watch_events\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "gaip-watch-events",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Watch Events",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required citations; optional data_classification. A2A: send message/send with metadata.gaip_tool=\"gaip_citation_witness\" and one data part holding the input object; MCP: tools/call name \"gaip_citation_witness\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"citations\": [{\"claimed_title\": \"GAIP\", \"quote\": \"GAIP\", \"url\": \"https://www.gaipagents.com/\"}]}"
        ],
        "id": "gaip-citation-witness",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Citation Witness",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required sar_receipt; optional public_key. A2A: send message/send with metadata.gaip_tool=\"gaip_check_sar_receipt\" and one data part holding the input object; MCP: tools/call name \"gaip_check_sar_receipt\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"public_key\": \"Y8BpzlWPH3EPRQziEPRBeLS1lJBF4xEo9WaxTNbzNp0\", \"sar_receipt\": {\"confidence\": 1.0, \"reason_code\": \"SPEC_MATCH\", \"receipt_id\": \"sha256:17146cdeb5aba1c269130348cdc7d3d96ae55f6e048b81d3baa59d4e3f3b188b\", \"receipt_version\": \"0.1\", \"sig\": \"ogilW-bjlCbYkwwUAIrg_zm_Wuoc6EiRgeErs0RL7llP7FWyX43-LgozZFyCjCXgsViK-A4_aroOo16Q4uvTCg\", \"sig_alg\": \"Ed25519\", \"task_id_hash\": \"sha256:c8b36982316351a28e040a6520df2092c2c87a4ea611c123d04993074b2b6f1d\", \"ts\": \"2026-10-01T09:00:00Z\", \"verdict\": \"PASS\", \"verifier_kid\": \"ef654fc8b615b51c\"}}"
        ],
        "id": "gaip-check-sar-receipt",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Check Sar Receipt",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required url; optional limit, since, until. A2A: send message/send with metadata.gaip_tool=\"gaip_record_extract\" and one data part holding the input object; MCP: tools/call name \"gaip_record_extract\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"since\": \"2026-09-01\", \"url\": \"https://huggingface.co/mcp\"}"
        ],
        "id": "gaip-record-extract",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Record Extract",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required terms_id; optional acceptance_rule, agreement_cancelled, agreement_id, business_purpose_statement, consumer_contract, continuity_handle, data_classification, finding_mode, mandate_check_receipt, seller_key_proof. A2A: send message/send with metadata.gaip_tool=\"witness_accept_terms\" and one data part holding the input object; MCP: tools/call name \"witness_accept_terms\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-buyer-side-check\", \"service_url\": \"https://weather.example.com/status.json\"}, \"keep_from_result\": \"continuity_handle (the seller's own)\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"business_purpose_statement\": true, \"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 2 (witness_register_terms)>\", \"token\": \"<continuity_handle.token from step 2 (witness_register_terms)>\"}, \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"witness_accept_terms\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "witness-accept-terms",
        "inputModes": [
          "application/json"
        ],
        "name": "Witness Accept Terms",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required agreement_id; optional continuity_handle, data_classification. A2A: send message/send with metadata.gaip_tool=\"witness_finding\" and one data part holding the input object; MCP: tools/call name \"witness_finding\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-buyer-side-check\", \"service_url\": \"https://weather.example.com/status.json\"}, \"keep_from_result\": \"continuity_handle (the seller's own)\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"business_purpose_statement\": true, \"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 2 (witness_register_terms)>\", \"token\": \"<continuity_handle.token from step 2 (witness_register_terms)>\"}, \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"agreement_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"witness_accept_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"agreement_id\": \"<agreement_id from step 3 (witness_accept_terms)>\", \"business_purpose_statement\": true, \"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 1 (witness_register_terms)>\", \"token\": \"<continuity_handle.token from step 1 (witness_register_terms)>\"}, \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"event BUSINESS_PURPOSE_CONFIRMED (the buyer's own handle)\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 4, \"tool\": \"witness_accept_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"body\": \"{\\\"forecast\\\": \\\"sun\\\"}\", \"http_status\": 200, \"mode\": \"BUYER_SUBMITTED\", \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"receipt_id and verdict\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 5, \"tool\": \"witness_delivery\"}, {\"agent_id\": \"witness\", \"arguments\": {\"agreement_id\": \"<agreement_id from step 3 (witness_accept_terms)>\", \"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 2 (witness_register_terms)>\", \"token\": \"<continuity_handle.token from step 2 (witness_register_terms)>\"}}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 6, \"tool\": \"witness_finding\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "witness-finding",
        "inputModes": [
          "application/json"
        ],
        "name": "Witness Finding",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required proposal_sha256, decision; optional agent_url, agreement_id, continuity_handle, data_classification, reason_sha256, role, role_id. A2A: send message/send with metadata.gaip_tool=\"witness_signoff\" and one data part holding the input object; MCP: tools/call name \"witness_signoff\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and continuity_handle\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-buyer-side-check\", \"service_url\": \"https://weather.example.com/status.json\"}, \"keep_from_result\": \"continuity_handle (the seller's own)\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"business_purpose_statement\": true, \"continuity_handle\": {\"continuity_id\": \"<continuity_handle.continuity_id from step 2 (witness_register_terms)>\", \"token\": \"<continuity_handle.token from step 2 (witness_register_terms)>\"}, \"terms_id\": \"<terms_id from step 1 (witness_register_terms)>\"}, \"keep_from_result\": \"agreement_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 3, \"tool\": \"witness_accept_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"agreement_id\": \"<agreement_id from step 3 (witness_accept_terms)>\", \"decision\": \"APPROVED\", \"proposal_sha256\": \"a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1a3f1\", \"role\": \"APPROVER\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 4, \"tool\": \"witness_signoff\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "witness-signoff",
        "inputModes": [
          "application/json"
        ],
        "name": "Witness Signoff",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required service_url, checks, explicit_read_only_consent; optional counterparty_id, data_classification, episode_id, task_class. A2A: send message/send with metadata.gaip_tool=\"assurance_prepare\" and one data part holding the input object; MCP: tools/call name \"assurance_prepare\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"counterparty_id\": \"example-weather-agent\", \"explicit_read_only_consent\": true, \"service_url\": \"https://weather.example.com/forecast.json\", \"task_class\": \"weather_forecast\"}"
        ],
        "id": "assurance-prepare",
        "inputModes": [
          "application/json"
        ],
        "name": "Assurance Prepare",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required terms_id, mode; optional body, body_sha256, content_type, data_classification, http_status. A2A: send message/send with metadata.gaip_tool=\"assurance_complete\" and one data part holding the input object; MCP: tools/call name \"assurance_complete\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"buyer-assurance\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"counterparty_id\": \"example-weather-agent\", \"explicit_read_only_consent\": true, \"service_url\": \"https://weather.example.com/forecast.json\", \"task_class\": \"weather_forecast\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/buyer-assurance\", \"step\": 1, \"tool\": \"assurance_prepare\"}, {\"agent_id\": \"witness\", \"arguments\": {\"mode\": \"PUBLIC_REPLAY\", \"terms_id\": \"<terms_id from step 1 (assurance_prepare)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"assurance_complete\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "assurance-complete",
        "inputModes": [
          "application/json"
        ],
        "name": "Assurance Complete",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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). Input: required receipt_id. A2A: send message/send with metadata.gaip_tool=\"assurance_verify\" and one data part holding the input object; MCP: tools/call name \"assurance_verify\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"buyer-assurance\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"counterparty_id\": \"example-weather-agent\", \"explicit_read_only_consent\": true, \"service_url\": \"https://weather.example.com/forecast.json\", \"task_class\": \"weather_forecast\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/buyer-assurance\", \"step\": 1, \"tool\": \"assurance_prepare\"}, {\"agent_id\": \"witness\", \"arguments\": {\"receipt_id\": \"<receipt_id from step 1 (assurance_prepare)>\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"assurance_verify\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "assurance-verify",
        "inputModes": [
          "application/json"
        ],
        "name": "Assurance Verify",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required claims, metadata; optional continuity_handle, counterparty_id, data_classification, episode_id, independent_operator_id, observations, protocol, synthetic, task_class. A2A: send message/send with metadata.gaip_tool=\"gaip_verify_supplier_claims\" and one data part holding the input object; MCP: tools/call name \"gaip_verify_supplier_claims\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"claims\": [{\"id\": \"c1\", \"text\": \"Returns JSON forecasts over MCP\"}, {\"id\": \"c2\", \"text\": \"Responds within 2 seconds\"}], \"counterparty_id\": \"example-weather-agent\", \"metadata\": {\"protocolVersion\": \"2025-06-18\", \"url\": \"https://weather.example.com/mcp\"}, \"observations\": [{\"claim_id\": \"c1\", \"detail\": \"tools/call returned valid JSON\", \"result\": \"PASS\"}, {\"claim_id\": \"c2\", \"detail\": \"p95 latency 4.8 s over 20 calls\", \"result\": \"FAIL\"}]}"
        ],
        "id": "gaip-verify-supplier-claims",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Verify Supplier Claims",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required none; optional continuity_handle, counterparty_id, data_classification, episode_id, independent_operator_id, max_age_days, observations, synthetic, task_class. A2A: send message/send with metadata.gaip_tool=\"inspect_counterparty_evidence\" and one data part holding the input object; MCP: tools/call name \"inspect_counterparty_evidence\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"counterparty_id\": \"example-weather-agent\", \"observations\": [{\"claim\": \"Publishes a public weather_forecast skill\", \"evidence_digest\": \"3f0a9c1e5b7d2468ace013579bdf2468ace013579bdf2468ace013579bdf2468\", \"lifecycle_state\": \"observed\", \"observed_at\": \"2026-09-27T12:00:00Z\", \"source\": \"https://forecast.example.com/.well-known/agent-card.json\"}, {\"claim\": \"Returned a London forecast in 1.2 s\", \"lifecycle_state\": \"OBSERVED\", \"observed_at\": \"2026-09-27T12:05:00Z\", \"source\": \"caller_task_log\"}], \"task_class\": \"weather_forecast\"}"
        ],
        "id": "inspect-counterparty-evidence",
        "inputModes": [
          "application/json"
        ],
        "name": "Inspect Counterparty Evidence",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required subject; optional requester, scope. A2A: send message/send with metadata.gaip_tool=\"gaip_evidence_pack\" and one data part holding the input object; MCP: tools/call name \"gaip_evidence_pack\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"requester\": {\"purpose\": \"INSURER\"}, \"scope\": {\"max_items\": 50, \"since\": \"2026-09-01\"}, \"subject\": {\"counterparty_id\": \"example-weather-agent\"}}"
        ],
        "id": "gaip-evidence-pack",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Evidence Pack",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required none; optional ai_system_ref, data_classification, observations, receipt_ids, title. A2A: send message/send with metadata.gaip_tool=\"gaip_incident_bundle\" and one data part holding the input object; MCP: tools/call name \"gaip_incident_bundle\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"chain\": [{\"agent_id\": \"witness\", \"arguments\": {\"checks\": [{\"allowed\": [200], \"id\": \"http_status_in\"}, {\"id\": \"json_parses\"}], \"seller_ref\": \"example-weather-agent\", \"service_url\": \"https://weather.example.com/forecast.json\"}, \"keep_from_result\": \"terms_id and receipt_id\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 1, \"tool\": \"witness_register_terms\"}, {\"agent_id\": \"witness\", \"arguments\": {\"ai_system_ref\": \"example-weather-agent\", \"observations\": [{\"observed_at_utc\": \"2026-09-27T10:00:00Z\", \"source\": \"our uptime monitor\", \"source_type\": \"AUTOMATED_MONITOR\", \"statement\": \"HTTP 503 from the forecast endpoint for 12 minutes\"}], \"receipt_ids\": [\"<receipt_id from step 1 (witness_register_terms)>\"], \"title\": \"Forecast endpoint returned errors\"}, \"keep_from_result\": \"result\", \"mcp_endpoint\": \"https://www.gaipagents.com/mcp/agents/witness\", \"step\": 2, \"tool\": \"gaip_incident_bundle\"}], \"note\": \"Run the steps in order; replace each angle-bracket value with the named field from the result of the named earlier step.\"}"
        ],
        "id": "gaip-incident-bundle",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Incident Bundle",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      },
      {
        "description": "Use 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. Input: required episode_id, task, delivery, costs; optional baseline_cost_gbp, continuity_handle, counterparty_id, currency, data_classification, delivery_check, downstream_use, evidence_refs, fx_to_gbp, independent_operator_id, synthetic, task_class. A2A: send message/send with metadata.gaip_tool=\"gaip_measure_outcome_value\" and one data part holding the input object; MCP: tools/call name \"gaip_measure_outcome_value\" at https://www.gaipagents.com/mcp/agents/witness.",
        "examples": [
          "{\"baseline_cost_gbp\": \"12.00\", \"costs\": {\"agent_gbp\": \"0.40\", \"compute_gbp\": \"0.12\", \"human_review_gbp\": \"3.50\", \"repair_gbp\": \"0\"}, \"counterparty_id\": \"example-weather-agent\", \"delivery\": {\"receipt_id\": \"example-receipt-1\", \"status\": \"ACCEPTED\"}, \"downstream_use\": {\"evidence_ref\": \"example-ticket-4411\", \"status\": \"USED\"}, \"episode_id\": \"example-episode-1\", \"observed_at_utc\": \"2026-09-27T21:00:00Z\", \"task\": {\"acceptance_criteria\": \"Forecast JSON for London returned within 5 seconds\"}, \"task_class\": \"weather_forecast\", \"unit_label\": \"forecast\", \"units\": 7}"
        ],
        "id": "gaip-measure-outcome-value",
        "inputModes": [
          "application/json"
        ],
        "name": "Gaip Measure Outcome Value",
        "outputModes": [
          "application/json"
        ],
        "tags": [
          "delivery",
          "evidence",
          "receipts"
        ]
      }
    ],
    "supportedInterfaces": [
      {
        "protocolBinding": "JSONRPC",
        "protocolVersion": "1.0",
        "url": "https://www.gaipagents.com/a2a/witness-agent"
      }
    ],
    "url": "https://www.gaipagents.com/a2a/witness-agent",
    "version": "1.0.0"
  },
  "agent_id": "witness",
  "agentverse": {
    "a2a_agent_card": "https://www.gaipagents.com/agents/witness/.well-known/agent-card.json",
    "a2a_endpoint": "https://www.gaipagents.com/a2a/witness-agent",
    "agent_id": "witness",
    "chat_protocol_required": true,
    "description": "Registers caller-declared delivery checks, observes supplied public results and returns a verifiable retained receipt. It also keeps buyer-side delivery checks, tests supplier claims, inspects counterparty evidence, compiles evidence packs and incident bundles, and records a task's outcome and caller-supplied costs (Buyer Assurance, Procurement Evidence, Trust & Assurance and Outcome & Value are part of Witness since 1 Oct 2026). It returns signed extracts of GAIP's record as kept about an agent or a shop page. Part of GAIP Witness \u00b7 Deals \u00b7 Sign-offs (lead agent).",
    "name": "GAIP Witness Agent",
    "price_gbp": 0,
    "product": {
      "foldedInto": null,
      "kind": "PRODUCT",
      "listed": true,
      "productId": "witness",
      "productName": "Witness \u00b7 Deals \u00b7 Sign-offs",
      "role": "LEAD",
      "roleLabel": "lead agent",
      "status": "PUBLIC_FREE",
      "url": "https://www.gaipagents.com/v1/free/products#witness"
    },
    "proof_boundary": "This public profile is ready for registration; Agentverse discovery is not claimed until a registry receipt exists.",
    "protocols": [
      "A2A",
      "MCP",
      "HTTPS"
    ],
    "public": true,
    "publication_approval": "FOUNDER_GRANTED_2026-09-24",
    "registration_state": "PENDING_AGENTVERSE_IDENTITY_LINK",
    "schema_version": "gaip.agentverse.profile.v2",
    "tags": [
      "delivery",
      "evidence",
      "receipts"
    ]
  },
  "coo_reporting": "ENABLED",
  "engineering_reliability_monitoring": "ENABLED",
  "erc8004": {
    "active": true,
    "description": "Registers caller-declared delivery checks, observes supplied public results and returns a verifiable retained receipt. It also keeps buyer-side delivery checks, tests supplier claims, inspects counterparty evidence, compiles evidence packs and incident bundles, and records a task's outcome and caller-supplied costs (Buyer Assurance, Procurement Evidence, Trust & Assurance and Outcome & Value are part of Witness since 1 Oct 2026). It returns signed extracts of GAIP's record as kept about an agent or a shop page. Part of GAIP Witness \u00b7 Deals \u00b7 Sign-offs (lead agent).",
    "gaip": {
      "agent_id": "witness",
      "mainnet_claimed": false,
      "onchain_state": "PENDING_WALLET_SIGNED_REGISTRATION",
      "spend_authorized": false,
      "target_network": "BASE_SEPOLIA"
    },
    "image": "https://www.gaipagents.com/assets/agents/witness.svg",
    "name": "GAIP Witness Agent",
    "registrations": [],
    "services": [
      {
        "endpoint": "https://www.gaipagents.com/agents/witness",
        "name": "web"
      },
      {
        "endpoint": "https://www.gaipagents.com/agents/witness/.well-known/agent-card.json",
        "name": "A2A",
        "version": "1.0"
      },
      {
        "endpoint": "https://www.gaipagents.com/mcp/agents/witness",
        "name": "MCP",
        "version": "2025-06-18"
      },
      {
        "endpoint": "https://www.gaipagents.com/v1/distribution/oasf/witness.json",
        "name": "OASF",
        "version": "1.0.0"
      }
    ],
    "supportedTrust": [
      "reputation"
    ],
    "type": "https://eips.ethereum.org/EIPS/eip-8004#registration-v1",
    "x402Support": false
  },
  "external_acceptance_receipts": [
    {
      "evidence_url": "https://github.com/tjcgraham-rgb/-gaip-agent-to-art-prototype/actions/runs/36324732597",
      "name": "io.github.tjcgraham-rgb/gaip-witness",
      "surface": "OFFICIAL_MCP_REGISTRY",
      "version": "1.0.0"
    }
  ],
  "generated_at_utc": "2026-10-18T01:24:37.490701+00:00",
  "mcp": {
    "description": "Registers caller-declared delivery checks, observes supplied public results and returns a verifiable retained receipt. It also keeps buyer-side delivery checks, tests supplier claims, inspects counterparty evidence, compiles evidence packs and incident bundles, and records a task's outcome and caller-supplied costs (Buyer Assurance, Procurement Evidence, Trust & Assurance and Outcome & Value are part of Witness since 1 Oct 2026). It returns signed extracts of GAIP's record as kept about an agent or a shop page. Part of GAIP Witness \u00b7 Deals \u00b7 Sign-offs (lead agent).",
    "endpoint": "https://www.gaipagents.com/mcp/agents/witness",
    "name": "io.github.tjcgraham-rgb/gaip-witness",
    "privacyPolicy": "https://www.gaipagents.com/privacy",
    "product": {
      "foldedInto": null,
      "kind": "PRODUCT",
      "listed": true,
      "productId": "witness",
      "productName": "Witness \u00b7 Deals \u00b7 Sign-offs",
      "role": "LEAD",
      "roleLabel": "lead agent",
      "status": "PUBLIC_FREE",
      "url": "https://www.gaipagents.com/v1/free/products#witness"
    },
    "protocolVersion": "2025-06-18",
    "publication": {
      "acceptanceNotImplied": true,
      "descriptorLive": true,
      "officialMcpRegistry": "PENDING_INDIVIDUAL_REGISTRY_ACCEPTANCE"
    },
    "registryVersion": "1.5.0",
    "repository": {
      "source": "github",
      "url": "https://github.com/tjcgraham-rgb/-gaip-agent-to-art-prototype"
    },
    "schema_version": "gaip.agent-mcp-descriptor.v1",
    "serverCard": "https://www.gaipagents.com/mcp/agents/witness/server-card",
    "termsOfService": "https://www.gaipagents.com/terms",
    "title": "GAIP Witness Agent",
    "tools": [
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Register caller-declared checks for a public HTTPS service. GAIP records a terms receipt in its own history and does not contact the service. This does not verify seller agreement or payment.",
        "inputSchema": {
          "properties": {
            "checks": {
              "maxItems": 8,
              "minItems": 1,
              "type": "array"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ]
            },
            "research_consent": {
              "default": false,
              "description": "Optional, default false. true lets this record be counted, never named, in GAIP's monthly aggregate research figures (for example for insurers).",
              "type": "boolean"
            },
            "seller_ref": {
              "type": "string"
            },
            "service_url": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "seller_ref",
            "service_url",
            "checks"
          ],
          "type": "object"
        },
        "name": "witness_register_terms",
        "title": "Register delivery checks"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": true,
          "readOnlyHint": true
        },
        "description": "Compare a registered caller assertion against a later public replay or submitted public response. Unknown when evidence is unavailable; no original transaction or seller agreement proof.",
        "inputSchema": {
          "additionalProperties": true,
          "properties": {
            "body": {
              "maxLength": 32768,
              "type": "string"
            },
            "body_sha256": {
              "type": "string"
            },
            "content_type": {
              "type": "string"
            },
            "continuity_handle": {
              "additionalProperties": false,
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "episode_id": {
              "type": "string"
            },
            "http_status": {
              "type": "integer"
            },
            "independent_operator_id": {
              "type": "string"
            },
            "mode": {
              "enum": [
                "BUYER_SUBMITTED",
                "PUBLIC_REPLAY"
              ],
              "type": "string"
            },
            "research_consent": {
              "default": false,
              "description": "Optional, default false. true lets this delivery check be counted, never named, in GAIP's monthly aggregate research figures.",
              "type": "boolean"
            },
            "synthetic": {
              "type": "boolean"
            },
            "terms_id": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "terms_id",
            "mode"
          ],
          "type": "object"
        },
        "name": "witness_delivery",
        "title": "Check public delivery evidence"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Export one GAIP receipt as x402 Settlement-Attestation-style JSON, an ERC-8004 validation-response-shaped document for off-chain publication, or an unsigned W3C-VC-like JSON-LD envelope. Ed25519-signed when the runtime key is available (otherwise unsigned, with the reason); integrity also via hash chain, Merkle proof and a SHA-256 digest_manifest; no on-chain write.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "format": {
              "enum": [
                "x402",
                "erc8004",
                "vc"
              ],
              "type": "string"
            },
            "receipt_id": {
              "description": "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.",
              "maxLength": 128,
              "minLength": 1,
              "type": "string"
            }
          },
          "required": [
            "receipt_id",
            "format"
          ],
          "type": "object"
        },
        "name": "gaip_receipt_export",
        "title": "Export a GAIP receipt"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Look up a retained GAIP receipt by ID and verify its hash chain and Merkle inclusion proof without creating adoption credit.",
        "inputSchema": {
          "additionalProperties": true,
          "properties": {
            "continuity_handle": {
              "additionalProperties": false,
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "episode_id": {
              "type": "string"
            },
            "independent_operator_id": {
              "type": "string"
            },
            "receipt_id": {
              "maxLength": 128,
              "minLength": 1,
              "type": "string"
            },
            "synthetic": {
              "type": "boolean"
            }
          },
          "required": [
            "receipt_id"
          ],
          "type": "object"
        },
        "name": "verify_gaip_receipt"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Gather everything GAIP holds about one Witness agreement (terms, every delivery check, receipts with signatures, replay events, your own SLA breaches, a timeline) into one hash-stamped, no-fault bundle (Ed25519-signed when the key is available). Pass terms_id or a delivery receipt_id.",
        "inputSchema": {
          "properties": {
            "continuity_handle": {
              "description": "Optional: the continuity_handle that registered a DELIVERY_SLA watch on these terms; adds your SLA breaches.",
              "type": "object"
            },
            "receipt_format": {
              "default": "gaip",
              "description": "gaip (default) or x402_sar: also give each delivery in the x402 SAR draft shape.",
              "enum": [
                "gaip",
                "x402_sar"
              ],
              "type": "string"
            },
            "receipt_id": {
              "description": "A delivery receipt_id from witness_delivery.",
              "type": "string"
            },
            "terms_id": {
              "description": "Or the terms_id (wt_...) of the agreement.",
              "type": "string"
            }
          },
          "type": "object"
        },
        "name": "witness_dispute_bundle",
        "title": "Export a delivery evidence bundle"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": true,
          "readOnlyHint": false
        },
        "description": "Register a free watch (max 3, every 24h+) on an agent's readiness, a published card, or witness delivery terms; optional signed webhook on change.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "continuity_handle": {
              "description": "The continuity_handle from an earlier GAIP result; proves you own these watches.",
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "data_classification": {
              "default": "PUBLIC",
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "interval_hours": {
              "default": 24,
              "description": "Hours between checks: 24 minimum on the free tier; 1 for DELIVERY_SLA.",
              "maximum": 168,
              "minimum": 1,
              "type": "integer"
            },
            "kind": {
              "enum": [
                "AGENT_READINESS",
                "DELIVERY_TERMS",
                "SUPPLIER_CARD",
                "DELIVERY_SLA"
              ],
              "type": "string"
            },
            "sla": {
              "description": "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.",
              "type": "object"
            },
            "target_url": {
              "description": "Public https URL (AGENT_READINESS, SUPPLIER_CARD). No query string.",
              "format": "uri",
              "maxLength": 2048,
              "type": "string"
            },
            "terms_id": {
              "description": "DELIVERY_TERMS or DELIVERY_SLA: terms_id from witness_register_terms.",
              "type": "string"
            },
            "webhook_url": {
              "description": "Optional: your own public https endpoint for signed change events.",
              "format": "uri",
              "maxLength": 2048,
              "type": "string"
            }
          },
          "required": [
            "continuity_handle",
            "kind"
          ],
          "type": "object"
        },
        "name": "gaip_watch_register",
        "title": "Watch an agent, card or delivery"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "List your watches with last verdict, last check and next due time.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "continuity_handle": {
              "description": "The continuity_handle from an earlier GAIP result; proves you own these watches.",
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            }
          },
          "required": [
            "continuity_handle"
          ],
          "type": "object"
        },
        "name": "gaip_watch_list",
        "title": "List my watches"
      },
      {
        "annotations": {
          "destructiveHint": true,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Stop one of your watches and delete its events.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "continuity_handle": {
              "description": "The continuity_handle from an earlier GAIP result; proves you own these watches.",
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "watch_id": {
              "type": "string"
            }
          },
          "required": [
            "continuity_handle",
            "watch_id"
          ],
          "type": "object"
        },
        "name": "gaip_watch_remove",
        "title": "Remove a watch"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Read recent change events (with receipts and webhook delivery status) for your watches.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "continuity_handle": {
              "description": "The continuity_handle from an earlier GAIP result; proves you own these watches.",
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "limit": {
              "maximum": 50,
              "minimum": 1,
              "type": "integer"
            },
            "watch_id": {
              "type": "string"
            }
          },
          "required": [
            "continuity_handle"
          ],
          "type": "object"
        },
        "name": "gaip_watch_events",
        "title": "Read watch change events"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": true,
          "readOnlyHint": true
        },
        "description": "Check whether cited public web pages contain the quoted text. Pass `citations` (1-20 objects {url, quote?, claimed_title?, claimed_date?}). GAIP fetches each page once (robots.txt respected), reports QUOTE_FOUND / QUOTE_NOT_FOUND_IN_FETCHED_VERSION / SOURCE_UNREACHABLE / SOURCE_NOT_FOUND_404 / CONTENT_NOT_TEXT / ROBOTS_DISALLOWED per citation with the time, HTTP status, SHA-256 of the fetched bytes and a matched excerpt of at most 300 characters, and retains a receipt. Facts about the fetched version only; pages change. Not legal advice and not a judgement on any author.",
        "inputSchema": {
          "additionalProperties": true,
          "properties": {
            "citations": {
              "items": {
                "additionalProperties": false,
                "properties": {
                  "claimed_date": {
                    "maxLength": 64,
                    "type": "string"
                  },
                  "claimed_title": {
                    "maxLength": 500,
                    "type": "string"
                  },
                  "quote": {
                    "maxLength": 2000,
                    "type": "string"
                  },
                  "url": {
                    "format": "uri",
                    "maxLength": 2048,
                    "type": "string"
                  }
                },
                "required": [
                  "url"
                ],
                "type": "object"
              },
              "maxItems": 20,
              "minItems": 1,
              "type": "array"
            },
            "data_classification": {
              "default": "PUBLIC",
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            }
          },
          "required": [
            "citations"
          ],
          "type": "object"
        },
        "name": "gaip_citation_witness",
        "title": "Witness citations"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Check an x402 SAR-shaped receipt (draft proposal shape, issue #1195; may change): fields present, receipt_id recomputed from the core fields, and whether the Ed25519 signature checks out against a public key you supply or GAIP's published key named by verifier_kid. Fetches and keeps nothing; payment fields are not acted on.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "public_key": {
              "description": "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.",
              "oneOf": [
                {
                  "maxLength": 512,
                  "type": "string"
                },
                {
                  "type": "object"
                }
              ]
            },
            "sar_receipt": {
              "description": "The SAR receipt object (or a whole gaip_receipt_export x402 result).",
              "type": "object"
            }
          },
          "required": [
            "sar_receipt"
          ],
          "type": "object"
        },
        "name": "gaip_check_sar_receipt",
        "title": "Check an x402 SAR receipt"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Returns an extract of GAIP's record as kept about an agent card, MCP endpoint or shop product page: Observatory change-log and capture entries, shop panel changes and listing history in a date range, each with its chain position, hash and covering daily anchor, Ed25519-signed. Free preview; shows what GAIP recorded, not that it is true.",
        "inputSchema": {
          "additionalProperties": false,
          "examples": [
            {
              "since": "2026-09-01",
              "url": "https://huggingface.co/mcp"
            }
          ],
          "properties": {
            "limit": {
              "description": "Optional: most entries to return, newest kept (default 50).",
              "maximum": 200,
              "minimum": 1,
              "type": "integer"
            },
            "since": {
              "description": "Optional: start of the range (YYYY-MM-DD or RFC 3339).",
              "maxLength": 40,
              "type": "string"
            },
            "until": {
              "description": "Optional: end of the range (YYYY-MM-DD, inclusive, or RFC 3339).",
              "maxLength": 40,
              "type": "string"
            },
            "url": {
              "description": "The A2A agent card, MCP endpoint or shop product page URL, exactly as recorded.",
              "maxLength": 2048,
              "type": "string"
            }
          },
          "required": [
            "url"
          ],
          "type": "object"
        },
        "name": "gaip_record_extract",
        "title": "Extract of GAIP's record about a URL"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Deals: the second party accepts terms the buyer registered with witness_register_terms, presenting its own continuity handle. GAIP issues an agreement_id naming both parties, the terms hash, the acceptance rule (delivered_when LATEST_MET or ANY_MET, an optional deadline, who may ask for the finding) and the finding mode (EVIDENCE_ONLY; EXPERT_DETERMINATION once the buyer confirms it with the agreement_id). Businesses only: the seller passes business_purpose_statement true and the buyer confirms it with the agreement_id; no finding until both have. consumer_contract true withdraws the finding. GAIP holds no money and verifies no legal identity.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "acceptance_rule": {
              "additionalProperties": false,
              "description": "What counts as delivered, by when, and who may ask for the finding.",
              "properties": {
                "by": {
                  "description": "Deadline, RFC 3339 (optional).",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "delivered_when": {
                  "default": "LATEST_MET",
                  "enum": [
                    "LATEST_MET",
                    "ANY_MET"
                  ],
                  "type": "string"
                },
                "finding_may_be_called_by": {
                  "default": "EITHER",
                  "enum": [
                    "EITHER",
                    "BUYER",
                    "SELLER"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "agreement_cancelled": {
              "default": false,
              "description": "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).",
              "type": "boolean"
            },
            "agreement_id": {
              "description": "Only on an existing agreement: the buyer confirms business purpose or expert determination, or either party declares a consumer contract.",
              "type": "string"
            },
            "business_purpose_statement": {
              "description": "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.",
              "type": "boolean"
            },
            "consumer_contract": {
              "default": false,
              "description": "true if either party is a consumer: evidence summary only, no finding.",
              "type": "boolean"
            },
            "continuity_handle": {
              "description": "Required: your own continuity handle (continuity_id, token).",
              "type": "object"
            },
            "data_classification": {
              "description": "PUBLIC or NON_PERSONAL_PUBLIC.",
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "finding_mode": {
              "default": "EVIDENCE_ONLY",
              "description": "EVIDENCE_ONLY, or EXPERT_DETERMINATION (needs the buyer's confirmation).",
              "enum": [
                "EVIDENCE_ONLY",
                "EXPERT_DETERMINATION"
              ],
              "type": "string"
            },
            "mandate_check_receipt": {
              "description": "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.",
              "type": "object"
            },
            "seller_key_proof": {
              "description": "Optional: {jwk, jws over the terms_id, host}; GAIP checks the signature and whether the host published that key.",
              "type": "object"
            },
            "terms_id": {
              "description": "wt_... from witness_register_terms.",
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "terms_id"
          ],
          "type": "object"
        },
        "name": "witness_accept_terms",
        "title": "Accept registered terms (the other party)"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Deals: for an agreement_id, GAIP compares its own delivery records for the agreed terms against the acceptance rule and issues a signed finding record: MET, NOT_MET or INDETERMINATE, with the records relied on and nothing else, plus A-Comm evidence-artefact and Boson decideDispute export shapes. Evidence only unless both parties confirmed expert determination; never a court process, never a sum of money; a consumer contract gets the evidence summary and no finding. A party's own continuity handle is required.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "agreement_id": {
              "description": "wa_... from witness_accept_terms.",
              "type": "string"
            },
            "continuity_handle": {
              "description": "Required: a party's own continuity handle.",
              "type": "object"
            },
            "data_classification": {
              "description": "PUBLIC or NON_PERSONAL_PUBLIC.",
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "agreement_id"
          ],
          "type": "object"
        },
        "name": "witness_finding",
        "title": "Was the agreed rule met? (signed finding)"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Sign-offs: record that a role (APPROVER, REVIEWER, OWNER, OPERATOR, or your own opaque role_id, kept only as a keyed hash) recorded a decision (APPROVED, REFUSED, CHANGED) on an agent's proposal, given as its SHA-256, at the recorded time; optionally against a Deals agreement_id. Chained and Ed25519-signed with every Witness entry. It records the role's decision, never GAIP's; no free text.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "agent_url": {
              "description": "Optional: public https URL of the agent whose proposal was decided (the system identifier).",
              "maxLength": 2048,
              "type": "string"
            },
            "agreement_id": {
              "description": "Optional: the wa_... Deals agreement from witness_accept_terms this decision concerns; the finding then lists it.",
              "type": "string"
            },
            "continuity_handle": {
              "description": "Optional: your continuity handle (continuity_id, token); one is issued with the receipt when absent.",
              "type": "object"
            },
            "data_classification": {
              "description": "PUBLIC or NON_PERSONAL_PUBLIC.",
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "decision": {
              "description": "The decision as recorded: APPROVED, REFUSED or CHANGED.",
              "enum": [
                "APPROVED",
                "REFUSED",
                "CHANGED"
              ],
              "type": "string"
            },
            "proposal_sha256": {
              "description": "SHA-256 (64 hex) of what the agent proposed, computed by you; the proposal itself is never sent.",
              "maxLength": 64,
              "minLength": 64,
              "type": "string"
            },
            "reason_sha256": {
              "description": "Optional: SHA-256 (64 hex) of the reason you keep; anything but a hash is refused.",
              "maxLength": 64,
              "minLength": 64,
              "type": "string"
            },
            "role": {
              "description": "The role that decided: APPROVER, REVIEWER, OWNER or OPERATOR. Any other text is refused (ROLE_VOCABULARY); use role_id for your own id.",
              "enum": [
                "APPROVER",
                "REVIEWER",
                "OWNER",
                "OPERATOR"
              ],
              "type": "string"
            },
            "role_id": {
              "description": "Optional: your own opaque role identifier (one token, no spaces). GAIP keeps it only as a keyed hash, never in clear.",
              "maxLength": 200,
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "proposal_sha256",
            "decision"
          ],
          "type": "object"
        },
        "name": "witness_signoff",
        "title": "Record a role's decision on a proposal (sign-off)"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": true,
          "readOnlyHint": false
        },
        "description": "Preflight one buyer-selected public service and record caller-declared delivery checks. No supplier appointment, call, contract or payment.",
        "inputSchema": {
          "properties": {
            "checks": {
              "maxItems": 8,
              "minItems": 1,
              "type": "array"
            },
            "counterparty_id": {
              "type": "string"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ]
            },
            "episode_id": {
              "type": "string"
            },
            "explicit_read_only_consent": {
              "const": true
            },
            "service_url": {
              "type": "string"
            },
            "task_class": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "counterparty_id",
            "service_url",
            "task_class",
            "checks",
            "explicit_read_only_consent"
          ],
          "type": "object"
        },
        "name": "assurance_prepare",
        "title": "Prepare a buyer-side delivery check"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": false,
          "openWorldHint": true,
          "readOnlyHint": false
        },
        "description": "Check a buyer-submitted public response or later public replay against registered terms and verify the retained receipt.",
        "inputSchema": {
          "properties": {
            "body": {
              "type": "string"
            },
            "body_sha256": {
              "type": "string"
            },
            "content_type": {
              "type": "string"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ]
            },
            "http_status": {
              "type": "integer"
            },
            "mode": {
              "enum": [
                "BUYER_SUBMITTED",
                "PUBLIC_REPLAY"
              ]
            },
            "terms_id": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "terms_id",
            "mode"
          ],
          "type": "object"
        },
        "name": "assurance_complete",
        "title": "Complete a buyer-side delivery check"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Verify a retained Buyer Assurance terms or delivery receipt without assigning external-use credit.",
        "inputSchema": {
          "properties": {
            "receipt_id": {
              "type": "string"
            }
          },
          "required": [
            "receipt_id"
          ],
          "type": "object"
        },
        "name": "assurance_verify",
        "title": "Verify a Buyer Assurance receipt"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Compare supplied public claims and task observations, check declared metadata, and return dispositions with a retained receipt. No supplier approval or independent claim verification.",
        "inputSchema": {
          "additionalProperties": true,
          "properties": {
            "claims": {
              "items": {
                "type": "object"
              },
              "maxItems": 20,
              "minItems": 1,
              "type": "array"
            },
            "continuity_handle": {
              "additionalProperties": false,
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "counterparty_id": {
              "type": "string"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "episode_id": {
              "type": "string"
            },
            "independent_operator_id": {
              "type": "string"
            },
            "metadata": {
              "type": "object"
            },
            "observations": {
              "items": {
                "type": "object"
              },
              "maxItems": 30,
              "type": "array"
            },
            "protocol": {
              "enum": [
                "A2A",
                "MCP",
                "OPENAPI"
              ],
              "type": "string"
            },
            "synthetic": {
              "type": "boolean"
            },
            "task_class": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "counterparty_id",
            "task_class",
            "protocol",
            "claims",
            "metadata"
          ],
          "type": "object"
        },
        "name": "gaip_verify_supplier_claims",
        "title": "Compare supplier claims"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Inspect supplied task-specific counterparty observations without producing a universal trust score.",
        "inputSchema": {
          "additionalProperties": true,
          "properties": {
            "continuity_handle": {
              "additionalProperties": false,
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "counterparty_id": {
              "type": "string"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "episode_id": {
              "type": "string"
            },
            "independent_operator_id": {
              "type": "string"
            },
            "max_age_days": {
              "description": "Optional freshness window (default 30): GAIP history records older than this are STALE and do not count toward evidence_sufficiency.",
              "maximum": 365,
              "minimum": 1,
              "type": "integer"
            },
            "observations": {
              "items": {
                "type": "object"
              },
              "type": "array"
            },
            "synthetic": {
              "type": "boolean"
            },
            "task_class": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "counterparty_id",
            "task_class"
          ],
          "type": "object"
        },
        "name": "inspect_counterparty_evidence"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Compile GAIP's retained evidence about one agent or supplier (conformance, watch events, witness results, repair and incident receipts) with a verify URL and Merkle proof per item, a manifest of counts, time span and gaps, and a framework reference table. An evidence compilation only: not a certification, audit opinion, insurance or legal advice.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "requester": {
              "additionalProperties": false,
              "properties": {
                "continuity_handle": {
                  "properties": {
                    "continuity_id": {
                      "type": "string"
                    },
                    "token": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "continuity_id",
                    "token"
                  ],
                  "type": "object"
                },
                "purpose": {
                  "enum": [
                    "INSURER",
                    "AUDITOR",
                    "OPERATOR",
                    "BUYER",
                    "UNSPECIFIED"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "scope": {
              "additionalProperties": false,
              "properties": {
                "categories": {
                  "items": {
                    "enum": [
                      "conformance",
                      "watch",
                      "witness",
                      "repair",
                      "incident",
                      "supplier_checks"
                    ],
                    "type": "string"
                  },
                  "type": "array"
                },
                "max_items": {
                  "maximum": 200,
                  "minimum": 1,
                  "type": "integer"
                },
                "receipt_ids": {
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 50,
                  "type": "array"
                },
                "since": {
                  "type": "string"
                },
                "until": {
                  "type": "string"
                }
              },
              "type": "object"
            },
            "subject": {
              "description": "The agent or supplier: its public id or https URL. Never a person.",
              "oneOf": [
                {
                  "maxLength": 256,
                  "type": "string"
                },
                {
                  "additionalProperties": false,
                  "properties": {
                    "counterparty_id": {
                      "type": "string"
                    },
                    "ref": {
                      "type": "string"
                    },
                    "seller_ref": {
                      "type": "string"
                    },
                    "url": {
                      "format": "uri",
                      "type": "string"
                    }
                  },
                  "type": "object"
                }
              ]
            }
          },
          "required": [
            "subject"
          ],
          "type": "object"
        },
        "name": "gaip_evidence_pack",
        "title": "Build an evidence pack"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "idempotentHint": true,
          "openWorldHint": false,
          "readOnlyHint": true
        },
        "description": "Verify supplied GAIP receipts, order a timeline and attribute each observation to its source, with an EU AI Act Article 73 reference aid. No fault, liability or causation finding; not a regulatory filing or legal advice.",
        "inputSchema": {
          "additionalProperties": false,
          "properties": {
            "ai_system_ref": {
              "maxLength": 256,
              "type": "string"
            },
            "data_classification": {
              "default": "PUBLIC",
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "observations": {
              "items": {
                "additionalProperties": false,
                "properties": {
                  "observed_at_utc": {
                    "type": "string"
                  },
                  "receipt_id": {
                    "type": "string"
                  },
                  "source": {
                    "maxLength": 120,
                    "type": "string"
                  },
                  "source_type": {
                    "enum": [
                      "AUTOMATED_MONITOR",
                      "PUBLIC_RECORD",
                      "REQUESTER",
                      "THIRD_PARTY"
                    ],
                    "type": "string"
                  },
                  "statement": {
                    "maxLength": 2000,
                    "type": "string"
                  }
                },
                "required": [
                  "source",
                  "statement"
                ],
                "type": "object"
              },
              "maxItems": 50,
              "type": "array"
            },
            "receipt_ids": {
              "items": {
                "type": "string"
              },
              "maxItems": 50,
              "type": "array"
            },
            "title": {
              "maxLength": 120,
              "type": "string"
            }
          },
          "type": "object"
        },
        "name": "gaip_incident_bundle",
        "title": "Build an incident evidence bundle"
      },
      {
        "annotations": {
          "destructiveHint": false,
          "openWorldHint": false,
          "readOnlyHint": false
        },
        "description": "Independent outcome evidence for outcome-priced contracts: build a task-level delivery, downstream-use and caller-supplied cost dossier. Missing costs and unverified claims remain explicit; no ROI or causal-value claim is issued.",
        "inputSchema": {
          "additionalProperties": true,
          "properties": {
            "baseline_cost_gbp": {
              "oneOf": [
                {
                  "type": "number"
                },
                {
                  "type": "string"
                }
              ]
            },
            "continuity_handle": {
              "additionalProperties": false,
              "properties": {
                "continuity_id": {
                  "type": "string"
                },
                "token": {
                  "type": "string"
                }
              },
              "required": [
                "continuity_id",
                "token"
              ],
              "type": "object"
            },
            "costs": {
              "type": "object"
            },
            "counterparty_id": {
              "type": "string"
            },
            "currency": {
              "default": "GBP",
              "type": "string"
            },
            "data_classification": {
              "enum": [
                "PUBLIC",
                "NON_PERSONAL_PUBLIC"
              ],
              "type": "string"
            },
            "delivery": {
              "required": [
                "status"
              ],
              "type": "object"
            },
            "delivery_check": {
              "properties": {
                "checks": {
                  "items": {
                    "type": "object"
                  },
                  "maxItems": 8,
                  "minItems": 1,
                  "type": "array"
                },
                "url": {
                  "type": "string"
                }
              },
              "required": [
                "url"
              ],
              "type": "object"
            },
            "downstream_use": {
              "type": "object"
            },
            "episode_id": {
              "type": "string"
            },
            "evidence_refs": {
              "items": {
                "type": "string"
              },
              "maxItems": 20,
              "type": "array"
            },
            "fx_to_gbp": {
              "properties": {
                "as_of": {
                  "type": "string"
                },
                "rate": {
                  "type": "number"
                },
                "source": {
                  "type": "string"
                }
              },
              "required": [
                "rate",
                "as_of",
                "source"
              ],
              "type": "object"
            },
            "independent_operator_id": {
              "type": "string"
            },
            "synthetic": {
              "type": "boolean"
            },
            "task": {
              "required": [
                "acceptance_criteria"
              ],
              "type": "object"
            },
            "task_class": {
              "type": "string"
            }
          },
          "required": [
            "data_classification",
            "counterparty_id",
            "task_class",
            "episode_id",
            "task",
            "delivery",
            "costs"
          ],
          "type": "object"
        },
        "name": "gaip_measure_outcome_value",
        "title": "Measure task outcome and value"
      }
    ],
    "transport": "streamable-http",
    "version": "1.0.0"
  },
  "oasf": {
    "authors": [
      "GAIP"
    ],
    "created_at": "2026-09-24T00:00:00Z",
    "description": "Registers caller-declared delivery checks, observes supplied public results and returns a verifiable retained receipt. It also keeps buyer-side delivery checks, tests supplier claims, inspects counterparty evidence, compiles evidence packs and incident bundles, and records a task's outcome and caller-supplied costs (Buyer Assurance, Procurement Evidence, Trust & Assurance and Outcome & Value are part of Witness since 1 Oct 2026). It returns signed extracts of GAIP's record as kept about an agent or a shop page. Part of GAIP Witness \u00b7 Deals \u00b7 Sign-offs (lead agent).",
    "domains": [],
    "extensions": {
      "gaip": {
        "agent_id": "witness",
        "mcp": "https://www.gaipagents.com/mcp/agents/witness",
        "product": "witness",
        "publication_state": "PENDING_AGNTCY_DIRECTORY_RECEIPT"
      }
    },
    "locators": [
      {
        "type": "source_code",
        "urls": [
          "https://github.com/tjcgraham-rgb/-gaip-agent-to-art-prototype"
        ]
      },
      {
        "type": "documentation",
        "urls": [
          "https://www.gaipagents.com/agents/witness"
        ]
      },
      {
        "type": "a2a_agent_card",
        "urls": [
          "https://www.gaipagents.com/agents/witness/.well-known/agent-card.json"
        ]
      }
    ],
    "modules": [],
    "name": "GAIP Witness Agent",
    "schema_version": "1.0.0",
    "skills": [
      {
        "id": 1004,
        "name": "agent_orchestration/agent_coordination"
      }
    ],
    "version": "1.0.0"
  },
  "publication_truth": "OFFICIAL_MCP_REGISTRY_PUBLISHED_OTHER_EXTERNAL_ACCEPTANCE_PENDING",
  "schema_version": "gaip.ten-agent-distribution-bundle.v1"
}