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

GAIP keeps an independent, dated record of what AI agents, MCP servers and online shops publish.

Should I use this

Quality & Safety

A
Description quality
100%
Schema completeness
96%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~2,848Tokens (tool definitions)
~5.6 KBTypical response size
Significant attention impact (2.23% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "gaip-broker": {
      "url": "https://gaip-agent-to-art-prototype-production.up.railway.app/mcp"
    }
  }
}

Remote endpoints

https://gaip-agent-to-art-prototype-production.up.railway.app/mcpstreamable-http
https://www.gaipagents.com/mcpstreamable-http

What it can do

Tool inventory

Tools (5)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢gaip_check(agent, continuity_handle, intended_task, url, verbose)

Use this when asked whether an AI agent, MCP server or API works or has changed, e.g. before adding or paying it. Pass its `url`. Returns a verdict, fixes, dated history when observed, and a receipt. With `agent` (e.g. GPTBot): may your bot fetch it (robots.txt, AI-crawler rules)? Free, read-only, no account; inputs must be public and non-personal.

Input Schema

{
  "type": "object",
  "properties": {
    "agent": {
      "description": "Optional: ask \"may my agent fetch this url?\" instead. Your agent's user-agent token, e.g. GPTBot; GAIP reads the site's robots.txt and AI-permission files (gaip_check_permission).",
      "maxLength": 300,
      "type": "string"
    },
    "continuity_handle": {
      "additionalProperties": false,
      "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).",
      "properties": {
        "continuity_id": {
          "type": "string"
        },
        "token": {
          "type": "string"
        }
      },
      "required": [
        "continuity_id",
        "token"
      ],
      "type": "object"
    },
    "intended_task": {
      "description": "Optional: what you plan to hand it, e.g. 'weather forecast for London'. Adds task-specific evidence.",
      "maxLength": 500,
      "type": "string"
    },
    "url": {
      "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).",
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    },
    "verbose": {
      "default": false,
      "description": "Optional: true returns the full result with every underlying field. Default: a short answer.",
      "type": "boolean"
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "url": "https://www.gaipagents.com/.well-known/agent-card.json"
    }
  ]
}
🟡gaip_watch(continuity_handle, url, verbose, webhook_url)

Use this when asked to keep an eye on an agent or MCP server, or to be alerted when it changes. Pass its `url`: returns feed links and its latest dated changes; add `webhook_url` for 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.

Input Schema

{
  "type": "object",
  "properties": {
    "continuity_handle": {
      "additionalProperties": false,
      "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).",
      "properties": {
        "continuity_id": {
          "type": "string"
        },
        "token": {
          "type": "string"
        }
      },
      "required": [
        "continuity_id",
        "token"
      ],
      "type": "object"
    },
    "url": {
      "description": "Public https URL of the MCP server endpoint or agent (card) to follow. No query string.",
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    },
    "verbose": {
      "default": false,
      "description": "Optional: true returns the full result with every underlying field. Default: a short answer.",
      "type": "boolean"
    },
    "webhook_url": {
      "description": "Optional: your own public https endpoint. GAIP then registers a watch and POSTs a signed event when the result changes.",
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "url": "https://www.gaipagents.com/mcp"
    }
  ]
}
🟢gaip_diagnose(continuity_handle, error, http_status, keep_receipt, url, ...)

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) and retry_after_seconds; `keep_receipt: true` adds a dated receipt. Free, read-only, no account; inputs must be public and non-personal.

Input Schema

{
  "type": "object",
  "properties": {
    "continuity_handle": {
      "additionalProperties": false,
      "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).",
      "properties": {
        "continuity_id": {
          "type": "string"
        },
        "token": {
          "type": "string"
        }
      },
      "required": [
        "continuity_id",
        "token"
      ],
      "type": "object"
    },
    "error": {
      "description": "The error you got, as text: HTTP status line, JSON-RPC/A2A/MCP error or message. Give this and/or http_status.",
      "maxLength": 4000,
      "type": "string"
    },
    "http_status": {
      "description": "Optional: the HTTP status code you got, e.g. 429.",
      "maximum": 599,
      "minimum": 100,
      "type": "integer"
    },
    "keep_receipt": {
      "default": false,
      "description": "Optional: true keeps a dated GAIP receipt of this answer and returns a continuity handle. Default: GAIP keeps no record of the task (usage is counted without its content).",
      "type": "boolean"
    },
    "url": {
      "description": "Optional: public https URL of the agent, MCP server or API that failed.",
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    },
    "verbose": {
      "default": false,
      "description": "Optional: true returns the full result with every underlying field. Default: a short answer.",
      "type": "boolean"
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "error": "HTTP 429 Too Many Requests; Retry-After: 20",
      "http_status": 429
    }
  ]
}
⚪gaip_verify(checks, citations, claims, continuity_handle, keep_receipt, ...)

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), or `claims` with `observations`. Returns a result per item. Free, no account; only delivery keeps a record. Inputs must be public and non-personal.

Input Schema

{
  "type": "object",
  "properties": {
    "checks": {
      "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.",
      "examples": [
        [
          {
            "allowed": [
              200
            ],
            "id": "http_status_in"
          },
          {
            "id": "content_type_is",
            "value": "application/json"
          },
          {
            "id": "non_empty"
          },
          {
            "id": "json_parses"
          }
        ],
        [
          {
            "allowed": [
              200
            ],
            "id": "http_status_in"
          },
          {
            "id": "json_required_keys",
            "keys": [
              "status"
            ]
          },
          {
            "id": "json_path_equals",
            "path": "status",
            "value": "ok"
          },
          {
            "id": "max_latency_ms",
            "limit": 2000
          }
        ]
      ],
      "items": {
        "additionalProperties": false,
        "properties": {
          "allowed": {
            "description": "http_status_in: the acceptable HTTP statuses, e.g. [200].",
            "items": {
              "maximum": 599,
              "minimum": 100,
              "type": "integer"
            },
            "maxItems": 10,
            "minItems": 1,
            "type": "array"
          },
          "id": {
            "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).",
            "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"
          },
          "keys": {
            "description": "json_required_keys: top-level or dotted keys that must exist, e.g. [\"a.b\"].",
            "items": {
              "maxLength": 200,
              "type": "string"
            },
            "maxItems": 20,
            "minItems": 1,
            "type": "array"
          },
          "limit": {
            "description": "max_latency_ms: milliseconds (1-60000); max_bytes: body bytes (1-32768).",
            "maximum": 60000,
            "minimum": 1,
            "type": "integer"
          },
          "path": {
            "description": "json_path_equals: dotted path, list items by index, e.g. items.0.id.",
            "maxLength": 200,
            "type": "string"
          },
          "pattern": {
            "description": "regex: bounded pattern searched in the body; no nested quantifiers.",
            "maxLength": 200,
            "type": "string"
          },
          "value": {
            "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).",
            "maxLength": 200,
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "maxItems": 8,
      "minItems": 1,
      "type": "array"
    },
    "citations": {
      "description": "Citations to check: each {url, quote?} or just a URL. GAIP fetches each page once (robots.txt respected) and looks for the quote.",
      "items": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "object"
          }
        ]
      },
      "maxItems": 20,
      "minItems": 1,
      "type": "array"
    },
    "claims": {
      "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.",
      "items": {
        "oneOf": [
          {
            "type": "string"
          },
          {
            "type": "object"
          }
        ]
      },
      "maxItems": 20,
      "minItems": 1,
      "type": "array"
    },
    "continuity_handle": {
      "additionalProperties": false,
      "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).",
      "properties": {
        "continuity_id": {
          "type": "string"
        },
        "token": {
          "type": "string"
        }
      },
      "required": [
        "continuity_id",
        "token"
      ],
      "type": "object"
    },
    "keep_receipt": {
      "default": false,
      "description": "Optional: true keeps a dated GAIP receipt of this answer and returns a continuity handle. Default: GAIP keeps no record of the task (usage is counted without its content).",
      "type": "boolean"
    },
    "metadata": {
      "description": "Optional (claims): the published agent card, MCP or OpenAPI document.",
      "type": "object"
    },
    "observations": {
      "description": "Optional (claims): what you saw, each {claim_id, result: PASS|FAIL, detail}.",
      "items": {
        "type": "object"
      },
      "maxItems": 30,
      "type": "array"
    },
    "result": {
      "description": "Optional (delivery): the response you received. Omitted: GAIP fetches the service URL now (public replay).",
      "properties": {
        "body": {
          "maxLength": 32768,
          "type": "string"
        },
        "body_sha256": {
          "type": "string"
        },
        "content_type": {
          "type": "string"
        },
        "http_status": {
          "type": "integer"
        }
      },
      "type": "object"
    },
    "terms_id": {
      "description": "Optional (delivery): terms_id from an earlier registration, instead of url.",
      "type": "string"
    },
    "url": {
      "description": "Claims: the agent or supplier they are about. Delivery: the public https service URL that should deliver.",
      "format": "uri",
      "maxLength": 2048,
      "type": "string"
    },
    "verbose": {
      "default": false,
      "description": "Optional: true returns the full result with every underlying field. Default: a short answer.",
      "type": "boolean"
    }
  },
  "additionalProperties": false,
  "examples": [
    {
      "citations": [
        {
          "quote": "GAIP",
          "url": "https://www.gaipagents.com/"
        }
      ]
    }
  ]
}
🟢second_look_check(claim, continuity_handle, currency, in_stock, mandate_ref, ...)

Use this when a shopper is about to buy something an AI suggested, or asks if a price or stock claim is right. Pass the product page `url` and the `claim`. Returns what the page showed beside what the claim said, and a signed, dated receipt. Second Look by GAIP. Free, no account, no affiliate links; inputs must be public and non-personal.

Input Schema

{
  "type": "object",
  "properties": {
    "claim": {
      "description": "What the shopper was told, in plain words, e.g. \"89 GBP, in stock, size M\". Only the price, stock and variant are kept; the rest is discarded.",
      "maxLength": 2000,
      "type": "string"
    },
    "continuity_handle": {
      "additionalProperties": false,
      "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).",
      "properties": {
        "continuity_id": {
          "type": "string"
        },
        "token": {
          "type": "string"
        }
      },
      "required": [
        "continuity_id",
        "token"
      ],
      "type": "object"
    },
    "currency": {
      "description": "ISO currency, e.g. GBP (optional).",
      "pattern": "^[A-Za-z]{3}$",
      "type": "string"
    },
    "in_stock": {
      "description": "Claimed stock (optional).",
      "type": "boolean"
    },
    "mandate_ref": {
      "description": "Optional: your own reference to the shopper's mandate for this purchase. Kept only as a keyed hash (mandate_sha256) on the receipt, never in clear.",
      "maxLength": 200,
      "type": "string"
    },
    "price": {
      "description": "Claimed price, e.g. \"89.00\" (optional).",
      "maxLength": 20,
      "type": "string"
    },
    "url": {
      "description": "Public https link to the product page on the shop's own site.",
      "format": "uri",
      "maxLength": 2000,
      "type": "string"
    },
    "variant": {
      "description": "Claimed size, colour or option (optional).",
      "maxLength": 60,
      "type": "string"
    },
    "verbose": {
      "default": false,
      "description": "Optional: true returns the full result with every underlying field. Default: a short answer.",
      "type": "boolean"
    }
  },
  "required": [
    "url"
  ],
  "additionalProperties": false,
  "examples": [
    {
      "claim": "24 GBP, in stock",
      "url": "https://www.gaipagents.com/test-range/shop/products/demo-mug"
    }
  ]
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded5 tools
verifiedversion not recorded5 tools
verifiedversion not recorded5 tools
verifiedversion not recorded5 tools
verifiedversion not recorded5 tools
verifiedversion not recorded5 tools
verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
verifiedversion not recorded4 tools
verifiedversion not recorded7 tools