MCP Server

GAIP — evidence on AI agents before and after you call them

io.github.tjcgraham-rgb/gaip-broker

What this MCP does

Assesses agent and service metadata, prepares delegation evidence, verifies receipts and task results, checks governance boundaries, and supports read-only governed agent workflows.

gaip_check
Check an AI agent, MCP server or API
Use this when asked whether an AI agent, MCP server or API works, is valid or has changed. Pass its `url` (agent card, MCP endpoint or OpenAPI document). Returns a one-line verdict, the fixes, dated history when GAIP observes it, and a receipt. Free, read-only, no account; inputs must be public and non-personal.
Read only Open world Idempotent
Input schema
{'type': 'object', 'examples': [{'url': 'https://www.gaipagents.com/.well-known/agent-card.json'}], 'required': ['url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'Public https link to the agent, its A2A agent card, MCP server endpoint or OpenAPI document. GAIP fetches, validates and reach-tests it; an MCP endpoint gets a read-only handshake (initialize, tools/list).'}, 'verbose': {'type': 'boolean', 'default': False, 'description': 'Optional: true returns the full result with every underlying field. Default: a short answer.'}, 'intended_task': {'type': 'string', 'maxLength': 500, 'description': "Optional: what you plan to hand it, e.g. 'weather forecast for London'. Adds task-specific evidence."}, 'continuity_handle': {'type': 'object', 'required': ['continuity_id', 'token'], 'properties': {'token': {'type': 'string'}, 'continuity_id': {'type': 'string'}}, 'description': 'Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones (needed to see or remove your watches later).', 'additionalProperties': False}}, 'additionalProperties': False}
gaip_diagnose
Why did my agent or API call fail?
Use this when an agent, MCP or API call failed. Paste the `error` text and/or `http_status`; add the service `url` if known. Returns the cause, the exact fix (e.g. the missing argument), retry_after_seconds and a receipt. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Input schema
{'type': 'object', 'examples': [{'error': 'HTTP 429 Too Many Requests; Retry-After: 20', 'http_status': 429}], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'Optional: public https URL of the agent, MCP server or API that failed.'}, 'error': {'type': 'string', 'maxLength': 4000, 'description': 'The error you got, as text: HTTP status line, JSON-RPC/A2A/MCP error or message. Give this and/or http_status.'}, 'verbose': {'type': 'boolean', 'default': False, 'description': 'Optional: true returns the full result with every underlying field. Default: a short answer.'}, 'http_status': {'type': 'integer', 'maximum': 599, 'minimum': 100, 'description': 'Optional: the HTTP status code you got, e.g. 429.'}, 'continuity_handle': {'type': 'object', 'required': ['continuity_id', 'token'], 'properties': {'token': {'type': 'string'}, 'continuity_id': {'type': 'string'}}, 'description': 'Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones (needed to see or remove your watches later).', 'additionalProperties': False}}, 'additionalProperties': False}
gaip_verify
Verify a delivery or citations
Use this when asked whether a service delivered what was promised or whether cited pages contain the quoted text. Pass `citations`, or a service `url` (+ `checks`, the `result` you got); `claims` are compared with `observations` you supply. Free, no account; records a GAIP receipt only. Inputs must be public and non-personal.
Open world
Input schema
{'type': 'object', 'examples': [{'citations': [{'url': 'https://www.gaipagents.com/', 'quote': 'GAIP'}]}], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'Claims: the agent or supplier they are about. Delivery: the public https service URL that should deliver.'}, 'checks': {'type': 'array', 'items': {'type': 'object', 'required': ['id'], 'properties': {'id': {'enum': ['http_status_in', 'content_type_is', 'non_empty', 'json_parses', 'json_required_keys', 'json_path_equals', 'max_latency_ms', 'max_bytes', 'text_contains', 'regex'], 'type': 'string', 'description': 'http_status_in (allowed), content_type_is (value), non_empty, json_parses, json_required_keys (keys), json_path_equals (path, value), max_latency_ms (limit), max_bytes (limit), text_contains (value), regex (pattern).'}, 'keys': {'type': 'array', 'items': {'type': 'string', 'maxLength': 200}, 'maxItems': 20, 'minItems': 1, 'description': 'json_required_keys: top-level or dotted keys that must exist, e.g. ["a.b"].'}, 'path': {'type': 'string', 'maxLength': 200, 'description': 'json_path_equals: dotted path, list items by index, e.g. items.0.id.'}, 'limit': {'type': 'integer', 'maximum': 60000, 'minimum': 1, 'description': 'max_latency_ms: milliseconds (1-60000); max_bytes: body bytes (1-32768).'}, 'value': {'type': 'string', 'maxLength': 200, 'description': 'content_type_is: media type, e.g. application/json; text_contains: case-sensitive text; json_path_equals: the expected value (GAIP also accepts a number, boolean, null, array or object).'}, 'allowed': {'type': 'array', 'items': {'type': 'integer', 'maximum': 599, 'minimum': 100}, 'maxItems': 10, 'minItems': 1, 'description': 'http_status_in: the acceptable HTTP statuses, e.g. [200].'}, 'pattern': {'type': 'string', 'maxLength': 200, 'description': 'regex: bounded pattern searched in the body; no nested quantifiers.'}}, 'additionalProperties': False}, 'examples': [[{'id': 'http_status_in', 'allowed': [200]}, {'id': 'content_type_is', 'value': 'application/json'}, {'id': 'non_empty'}, {'id': 'json_parses'}], [{'id': 'http_status_in', 'allowed': [200]}, {'id': 'json_required_keys', 'keys': ['status']}, {'id': 'json_path_equals', 'path': 'status', 'value': 'ok'}, {'id': 'max_latency_ms', 'limit': 2000}]], 'maxItems': 8, 'minItems': 1, 'description': 'Optional (delivery): what a good response is, e.g. [{"id": "http_status_in", "allowed": [200]}, {"id": "json_parses"}]. Default: HTTP 200 and a non-empty body.'}, 'claims': {'type': 'array', 'items': {'oneOf': [{'type': 'string'}, {'type': 'object'}]}, 'maxItems': 20, 'minItems': 1, 'description': 'Claims to record about `url`: each a sentence or {id, text}. Each is compared with the `observations` you supply; without them it stays UNTESTED.'}, 'result': {'type': 'object', 'properties': {'body': {'type': 'string', 'maxLength': 32768}, 'body_sha256': {'type': 'string'}, 'http_status': {'type': 'integer'}, 'content_type': {'type': 'string'}}, 'description': 'Optional (delivery): the response you received. Omitted: GAIP fetches the service URL now (public replay).'}, 'verbose': {'type': 'boolean', 'default': False, 'description': 'Optional: true returns the full result with every underlying field. Default: a short answer.'}, 'metadata': {'type': 'object', 'description': 'Optional (claims): the published agent card, MCP or OpenAPI document.'}, 'terms_id': {'type': 'string', 'description': 'Optional (delivery): terms_id from an earlier registration, instead of url.'}, 'citations': {'type': 'array', 'items': {'oneOf': [{'type': 'string'}, {'type': 'object'}]}, 'maxItems': 20, 'minItems': 1, 'description': 'Citations to check: each {url, quote?} or just a URL. GAIP fetches each page once (robots.txt respected) and looks for the quote.'}, 'observations': {'type': 'array', 'items': {'type': 'object'}, 'maxItems': 30, 'description': 'Optional (claims): what you saw, each {claim_id, result: PASS|FAIL, detail}.'}, 'continuity_handle': {'type': 'object', 'required': ['continuity_id', 'token'], 'properties': {'token': {'type': 'string'}, 'continuity_id': {'type': 'string'}}, 'description': 'Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones (needed to see or remove your watches later).', 'additionalProperties': False}}, 'additionalProperties': False}
gaip_watch
Watch an agent or MCP server for changes
Use this when asked to keep an eye on an agent or MCP server, or to be alerted when it changes. Pass its `url` for no-account feed links and its latest dated changes; add `webhook_url` to register a free watch (checked every 24 h, signed webhook on change). Free, no account; with a webhook it records a watch. Inputs must be public and non-personal.
Open world
Input schema
{'type': 'object', 'examples': [{'url': 'https://www.gaipagents.com/mcp'}], 'required': ['url'], 'properties': {'url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'Public https URL of the MCP server endpoint or agent (card) to follow. No query string.'}, 'verbose': {'type': 'boolean', 'default': False, 'description': 'Optional: true returns the full result with every underlying field. Default: a short answer.'}, 'webhook_url': {'type': 'string', 'format': 'uri', 'maxLength': 2048, 'description': 'Optional: your own public https endpoint. GAIP then registers a watch and POSTs a signed event when the result changes.'}, 'continuity_handle': {'type': 'object', 'required': ['continuity_id', 'token'], 'properties': {'token': {'type': 'string'}, 'continuity_id': {'type': 'string'}}, 'description': 'Optional: the continuity_handle from an earlier GAIP result; links this call to your earlier ones (needed to see or remove your watches later).', 'additionalProperties': False}}, 'additionalProperties': False}
Changed
gaip_verify
Oct. 2, 2026, 2:41 a.m.
Changed
gaip_diagnose
Oct. 2, 2026, 2:41 a.m.
Changed
gaip_watch
Oct. 2, 2026, 2:41 a.m.
Changed
gaip_check
Oct. 2, 2026, 2:41 a.m.
Removed
witness_register_terms
Sept. 30, 2026, 2:41 a.m.
Removed
witness_dispute_bundle
Sept. 30, 2026, 2:41 a.m.
Removed
witness_delivery
Sept. 30, 2026, 2:41 a.m.
Removed
verify_gaip_receipt
Sept. 30, 2026, 2:41 a.m.
Removed
gaip_verify_supplier_claims
Sept. 30, 2026, 2:41 a.m.
Removed
gaip_diagnose_integration_failure
Sept. 30, 2026, 2:41 a.m.
Removed
gaip_compare_supplier_snapshots
Sept. 30, 2026, 2:41 a.m.
Removed
evaluate_public_art_evidence
Sept. 30, 2026, 2:41 a.m.
Removed
check_agent_conformance
Sept. 30, 2026, 2:41 a.m.
Removed
assurance_verify
Sept. 30, 2026, 2:41 a.m.
Removed
assurance_prepare
Sept. 30, 2026, 2:41 a.m.
Removed
assurance_complete
Sept. 30, 2026, 2:41 a.m.
Added
gaip_verify
Sept. 30, 2026, 2:41 a.m.
Added
gaip_diagnose
Sept. 30, 2026, 2:41 a.m.
Added
gaip_watch
Sept. 30, 2026, 2:41 a.m.
Added
gaip_check
Sept. 30, 2026, 2:41 a.m.
Added
assurance_verify
Sept. 28, 2026, 2:41 a.m.
Added
assurance_complete
Sept. 28, 2026, 2:41 a.m.
Added
assurance_prepare
Sept. 28, 2026, 2:41 a.m.
Added
witness_dispute_bundle
Sept. 28, 2026, 2:41 a.m.
Added
witness_register_terms
Sept. 28, 2026, 2:41 a.m.
Added
gaip_compare_supplier_snapshots
Sept. 26, 2026, 2:41 a.m.
Added
gaip_diagnose_integration_failure
Sept. 26, 2026, 2:41 a.m.
Added
gaip_verify_supplier_claims
Sept. 26, 2026, 2:41 a.m.
Removed
verify_task_result
Sept. 24, 2026, 2:41 a.m.
Removed
verify_before_call
Sept. 24, 2026, 2:41 a.m.