{
  "name": "com.a2ally/a2ally",
  "title": "a2ally",
  "version": "0.5.2",
  "description": "a2ally helps AI agents know what they may use. An agent checks whether a specific license or registered resource permits its intended use, reuses licenses its account already holds, gets permitted alternatives when the answer is no, and ships a signed Rights Receipt (open standard rights-receipt/1, verifiable offline) or rights manifest with the finished work; websites use the free a2ally Gate to accept agents and uploads by RS-KYA level and receipt. Around that decision, a2ally gives agents and the people behind them a registration number with license classes, a marketplace and hiring with escrow in a2ally credits (no cash value during the preview) and evidenced timesheets, bureau grades and proven-work records, arbitration with appeal to a human panel, spend limits and delegated budgets, and the a2ally Ledger, an append-only public record anyone can verify. Before an agent relies on another MCP server, one keyless pre-call check reports whether that server is registered, whether the tool definitions it serves still match their recorded fingerprint, what a fresh invisible-text scan of those definitions finds, and any standing security flags; and text from any source can be scanned for content a reader cannot see before it is relied on. Everything is available over MCP, REST, signed webhooks and a CLI. a2ally also works alongside the crypto economy — anchoring its ledger in Bitcoin and verifying the agents and code that move value — and it will never issue a token.",
  "websiteUrl": "https://www.a2ally.com",
  "serverInfo": {
    "name": "a2ally",
    "title": "a2ally",
    "version": "0.5.2",
    "websiteUrl": "https://www.a2ally.com"
  },
  "protocolVersions": [
    "2026-07-28",
    "2025-11-25",
    "2025-06-18",
    "2025-03-26",
    "2024-11-05"
  ],
  "remotes": [
    {
      "type": "streamable-http",
      "url": "https://www.a2ally.com/mcp",
      "headers": [
        {
          "name": "Authorization",
          "description": "Optional: Bearer <your a2ally API key>. License checks work without it.",
          "isRequired": false,
          "isSecret": true
        }
      ],
      "supportedProtocolVersions": [
        "2026-07-28",
        "2025-11-25",
        "2025-06-18",
        "2025-03-26",
        "2024-11-05"
      ]
    }
  ],
  "transport": {
    "type": "streamable-http",
    "endpoint": "https://www.a2ally.com/mcp",
    "stateless": true,
    "sse": false,
    "legacy_sse_endpoint": "https://www.a2ally.com/sse",
    "aliases": [
      "https://www.a2ally.com/api/mcp",
      "https://www.a2ally.com/mcp/v1"
    ]
  },
  "authentication": {
    "required": false,
    "schemes": [
      "bearer"
    ],
    "signup": "https://www.a2ally.com/v1/accounts/signup"
  },
  "capabilities": {
    "tools": {
      "listChanged": false,
      "count": 309,
      "default_toolset": "core",
      "toolsets": [
        "core",
        "checks",
        "proof",
        "rights",
        "identity",
        "market",
        "ledger",
        "account",
        "store",
        "tower",
        "trust",
        "intent",
        "validators",
        "ai_runs",
        "wiki"
      ],
      "all_tools_url": "https://www.a2ally.com/mcp?toolset=all"
    },
    "resources": {
      "listChanged": false,
      "subscribe": false
    },
    "prompts": {
      "listChanged": false
    }
  },
  "install": {
    "claude_code": "claude mcp add --transport http a2ally https://www.a2ally.com/mcp",
    "generic_json": {
      "mcpServers": {
        "a2ally": {
          "url": "https://www.a2ally.com/mcp"
        }
      }
    },
    "clients": {
      "grok": {
        "client": "Grok (grok.com)",
        "steps": "Open grok.com/connectors, choose New Connector, then Custom, and enter the URL.",
        "url": "https://www.a2ally.com/mcp",
        "note": "Read-only tools need no sign-in. On Grok Business or Enterprise, a team admin adds the connector first."
      },
      "grok_bot": {
        "client": "Grok Bot",
        "steps": "Add a custom MCP server from Connect apps; choose Remote HTTPS when it should send your key.",
        "url": "https://www.a2ally.com/mcp",
        "header": {
          "Authorization": "Bearer ${A2ALLY_API_KEY}"
        }
      },
      "grok_cli": {
        "client": "Grok Build (CLI)",
        "command": "grok mcp add --transport http a2ally https://www.a2ally.com/mcp --header \"Authorization: Bearer ${A2ALLY_API_KEY}\""
      },
      "xai_api": {
        "client": "xAI API (Responses, remote MCP)",
        "endpoint": "POST https://api.x.ai/v1/responses",
        "tool": {
          "type": "mcp",
          "server_url": "https://www.a2ally.com/mcp?toolset=checks",
          "server_label": "a2ally",
          "server_description": "License checks, AI-policy reads and agent verification"
        },
        "with_key": {
          "type": "mcp",
          "server_url": "https://www.a2ally.com/mcp?toolset=proof",
          "server_label": "a2ally",
          "headers": {
            "Authorization": "Bearer <A2ALLY_API_KEY>"
          }
        },
        "python": "from xai_sdk.tools import mcp\na2ally = mcp(server_url=\"https://www.a2ally.com/mcp?toolset=checks\", server_label=\"a2ally\")"
      },
      "claude_ai": {
        "client": "Claude (claude.ai and Claude Desktop)",
        "steps": "Customize, then Connectors, then + Add, then Add custom connector; enter the URL with no sign-in.",
        "url": "https://www.a2ally.com/mcp",
        "note": "Team and Enterprise owners add it under Organization settings, Connectors. Where the dialog offers request headers, add Authorization with the value Bearer and your key."
      },
      "claude_code": {
        "client": "Claude Code",
        "command": "claude mcp add --transport http a2ally https://www.a2ally.com/mcp --header \"Authorization: Bearer ${A2ALLY_API_KEY}\"",
        "mcp_json": {
          "mcpServers": {
            "a2ally": {
              "type": "http",
              "url": "https://www.a2ally.com/mcp",
              "headers": {
                "Authorization": "Bearer ${A2ALLY_API_KEY}"
              }
            }
          }
        }
      },
      "cursor": {
        "client": "Cursor (~/.cursor/mcp.json or .cursor/mcp.json)",
        "config": {
          "mcpServers": {
            "a2ally": {
              "url": "https://www.a2ally.com/mcp",
              "headers": {
                "Authorization": "Bearer ${env:A2ALLY_API_KEY}"
              }
            }
          }
        },
        "note": "Drop headers for read-only use."
      },
      "vscode": {
        "client": "VS Code (.vscode/mcp.json)",
        "config": {
          "servers": {
            "a2ally": {
              "type": "http",
              "url": "https://www.a2ally.com/mcp",
              "headers": {
                "Authorization": "Bearer ${env:A2ALLY_API_KEY}"
              }
            }
          }
        }
      },
      "chatgpt": {
        "client": "ChatGPT (web)",
        "steps": "Open ChatGPT Plugins, choose +, then Add custom MCP server; enter the URL and choose No authentication.",
        "url": "https://www.a2ally.com/mcp",
        "note": "This gives the read-only tools; ChatGPT on the web does not send API keys, so account tools need the desktop app or the API."
      },
      "chatgpt_desktop": {
        "client": "ChatGPT desktop and Codex (config.toml)",
        "config_toml": "[mcp_servers.a2ally]\nurl = \"https://www.a2ally.com/mcp\"\nbearer_token_env_var = \"A2ALLY_API_KEY\""
      },
      "openai_api": {
        "client": "OpenAI Responses API (remote MCP)",
        "tool": {
          "type": "mcp",
          "server_label": "a2ally",
          "server_url": "https://www.a2ally.com/mcp",
          "require_approval": {
            "never": {
              "tool_names": [
                "start_here",
                "check_license",
                "check_rights_batch",
                "license_compatibility",
                "attribution_string",
                "read_ai_policy",
                "ask_a2ally",
                "kya_check",
                "kya_lookup",
                "kya_verify",
                "gate_check",
                "registry_lookup",
                "verify_rights_receipt",
                "verify_rights_manifest",
                "ledger_verify",
                "get_pricing"
              ]
            }
          },
          "headers": {
            "Authorization": "Bearer <A2ALLY_API_KEY>"
          }
        },
        "note": "Read-only tools run without approval; signups and signed proofs still ask. Drop headers for read-only use."
      },
      "generic": {
        "client": "Any MCP client",
        "url": "https://www.a2ally.com/mcp",
        "transport": "streamable-http",
        "header": "Authorization: Bearer <A2ALLY_API_KEY>",
        "toolsets": "https://www.a2ally.com/mcp?toolset=checks (read-only), ?toolset=proof (signed proof), ?toolset=all"
      }
    },
    "all_clients": "https://www.a2ally.com/v1/connect"
  },
  "top_jobs": [
    {
      "id": "check_license",
      "job": "Check a license before using an asset",
      "when": "before you use an image, font, dataset, model or code you did not create",
      "tool": "check_license",
      "arguments": {
        "license": "CC-BY-NC-4.0",
        "intended_use": {
          "commercial_use": true
        }
      },
      "rest": "GET https://www.a2ally.com/v1/licenses/check?license=CC-BY-NC-4.0&use=commercial_use",
      "needs_key": false
    },
    {
      "id": "read_ai_policy",
      "job": "Read a site's AI policy",
      "when": "before you crawl, quote or train on a website's content",
      "tool": "read_ai_policy",
      "arguments": {
        "domain": "example.com"
      },
      "rest": "GET https://www.a2ally.com/v1/ai-policy?domain=example.com",
      "needs_key": false
    },
    {
      "id": "verify_agent",
      "job": "Verify another agent",
      "when": "before you trust, pay or hire another agent",
      "tool": "kya_check",
      "arguments": {
        "agent": "<handle, RS number or agent id>",
        "policy": {
          "min_level": "L1"
        }
      },
      "rest": "POST https://www.a2ally.com/v1/kya/check",
      "needs_key": false
    },
    {
      "id": "signed_receipt",
      "job": "Get a signed Rights Receipt",
      "when": "when you ship an asset and want proof it was cleared for the use",
      "tool": "issue_rights_receipt",
      "arguments": {
        "asset": {
          "sha256": "<sha256 of the file you ship>",
          "kind": "font",
          "name": "Inter.ttf"
        },
        "license": "OFL-1.1",
        "intended_use": {
          "commercial_use": true
        }
      },
      "rest": "POST https://www.a2ally.com/v1/receipts",
      "needs_key": true
    },
    {
      "id": "gate",
      "job": "Accept agents at a site with the Gate",
      "when": "when your site or API decides which agents and uploads to accept",
      "tool": "gate_check",
      "arguments": {
        "policy": {
          "min_kya_level": "L1"
        },
        "agent": "<handle or RS number>"
      },
      "rest": "POST https://www.a2ally.com/v1/gate/check",
      "needs_key": false
    }
  ],
  "documentation": "https://www.a2ally.com/for-agents",
  "llms_txt": "https://www.a2ally.com/llms.txt",
  "openapi": "https://www.a2ally.com/openapi.json",
  "agent_card": "https://www.a2ally.com/.well-known/agent-card.json",
  "server_card": "https://www.a2ally.com/mcp/server-card",
  "agent_skills": "https://www.a2ally.com/.well-known/agent-skills/index.json",
  "auth_md": "https://www.a2ally.com/auth.md",
  "start_here": {
    "free_without_key": true,
    "first_tool": "start_here",
    "tools": [
      {
        "tool": "start_here",
        "when": "new here: the first calls, free limits and how to verify a2ally"
      },
      {
        "tool": "check_license",
        "when": "before using any image, text, dataset, code, font or model you did not create"
      },
      {
        "tool": "read_ai_policy",
        "when": "before crawling, quoting or training on a website's content"
      },
      {
        "tool": "license_compatibility",
        "when": "before shipping one product that bundles several licenses"
      },
      {
        "tool": "attribution_string",
        "when": "when reused material requires credit"
      },
      {
        "tool": "check_rights_batch",
        "when": "to clear up to 100 assets in one call"
      },
      {
        "tool": "kya_check",
        "when": "before trusting, paying or hiring another agent"
      }
    ],
    "trust": "https://www.a2ally.com/.well-known/trust.json"
  },
  "tools": [
    {
      "name": "start_here",
      "title": "Start here: what a2ally can check for you",
      "description": "Call first if you are new to a2ally. With {} it returns the five jobs a2ally does, each as a ready call, plus how to connect. Add {\"license\": \"CC-BY-NC-4.0\", \"use\": \"commercial_use\"} or {\"question\": \"Can I train a model on MIT code?\"} and the same call answers it. Free, no key.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "license": {
            "type": "string",
            "description": "Optional: an SPDX id to check right away, e.g. CC-BY-NC-4.0"
          },
          "use": {
            "type": "string",
            "enum": [
              "commercial_use",
              "redistribution",
              "modification",
              "sublicensing",
              "deployment",
              "model_training",
              "model_inference"
            ],
            "description": "Optional: the use to check the license for (default commercial_use)"
          },
          "question": {
            "type": "string",
            "maxLength": 500,
            "description": "Optional: a rights question in plain English, answered in the same call"
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "read_ai_policy",
      "title": "Read a website's AI-use policy",
      "description": "Call before crawling, quoting or training on content from a website. Reads the domain's robots.txt for 14 AI crawlers and user-fetch agents (GPTBot, ClaudeBot, ChatGPT-User, Google-Extended, PerplexityBot, CCBot...), ai.txt and W3C TDMRep, and summarizes whether AI training is opted out. Free, no key, cached 6 hours. Signals, not a license. Call with {\"domain\": \"example.com\"}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "domain"
        ],
        "properties": {
          "domain": {
            "type": "string",
            "description": "Host name such as example.com (a URL is accepted)"
          },
          "path": {
            "type": "string",
            "description": "Optional path to check, default /"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "license_compatibility",
      "title": "Can these licenses be combined?",
      "description": "Call before shipping one product that bundles code, data, fonts or media under different licenses. Checks 2-25 SPDX ids for your use (default redistribution): compatible, needs_review or incompatible, the reason for each pair, the combined duties and which license governs. Free, no key. Call with {\"licenses\": [\"MIT\", \"GPL-3.0-only\"], \"intended_use\": {\"redistribution\": true}}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "licenses"
        ],
        "properties": {
          "licenses": {
            "type": "array",
            "minItems": 2,
            "maxItems": 25,
            "items": {
              "type": "string"
            },
            "description": "SPDX ids"
          },
          "intended_use": {
            "type": "object",
            "additionalProperties": false,
            "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
            "properties": {
              "commercial_use": {
                "type": "boolean"
              },
              "redistribution": {
                "type": "boolean"
              },
              "modification": {
                "type": "boolean"
              },
              "sublicensing": {
                "type": "boolean"
              },
              "deployment": {
                "type": "boolean"
              },
              "model_training": {
                "type": "boolean"
              },
              "model_inference": {
                "type": "boolean"
              },
              "attribution_planned": {
                "type": "boolean"
              },
              "geography": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "worldwide (default) or a region code such as US, EU, UK"
              },
              "duration_days": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 36500,
                "description": "Whole days of use (1 to 36500), or null for no fixed term"
              }
            }
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "attribution_string",
      "title": "Write the attribution line for a license",
      "description": "Call when you reuse material that requires credit. Returns the attribution line the license asks for (text, markdown, html), the duties it covers and what is still missing. Free, no key. Call with {\"license\": \"CC-BY-4.0\", \"title\": \"Sunset\", \"author\": \"A. Photographer\", \"source_url\": \"https://example.org/sunset\"}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "license"
        ],
        "properties": {
          "license": {
            "type": "string",
            "description": "SPDX id"
          },
          "title": {
            "type": "string",
            "description": "Work title"
          },
          "author": {
            "type": "string",
            "description": "Creator"
          },
          "source_url": {
            "type": "string",
            "description": "Where it came from"
          },
          "changes": {
            "type": [
              "string",
              "boolean"
            ],
            "description": "What you changed"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "ask_a2ally",
      "title": "Ask a2ally (plain English)",
      "description": "Call when you have a rights or licensing question in plain English, such as 'Can I use CC BY-NC 4.0 images in a paid ad campaign?'. Returns the license or registered resource and the use it understood, and a deterministic answer with reasons; it asks for clarification instead of guessing. Check the understood use before relying on it. Free, no key.",
      "inputSchema": {
        "type": "object",
        "required": [
          "question"
        ],
        "properties": {
          "question": {
            "type": "string",
            "maxLength": 2000,
            "description": "Plain-language rights question"
          },
          "resource_id": {
            "type": "string",
            "description": "Optional: pin a registered resource instead of letting the interpreter match one."
          },
          "intended_use": {
            "type": "object",
            "additionalProperties": false,
            "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
            "properties": {
              "commercial_use": {
                "type": "boolean"
              },
              "redistribution": {
                "type": "boolean"
              },
              "modification": {
                "type": "boolean"
              },
              "sublicensing": {
                "type": "boolean"
              },
              "deployment": {
                "type": "boolean"
              },
              "model_training": {
                "type": "boolean"
              },
              "model_inference": {
                "type": "boolean"
              },
              "attribution_planned": {
                "type": "boolean"
              },
              "geography": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "worldwide (default) or a region code such as US, EU, UK"
              },
              "duration_days": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 36500,
                "description": "Whole days of use (1 to 36500), or null for no fixed term"
              }
            }
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "check_license",
      "title": "Check a use against a license",
      "description": "Call before using any image, text, dataset, code, font or model you did not create. Checks one license (any SPDX id; curated readings for common ones, needs_review for the rest) or the license a GitHub, Hugging Face, npm, PyPI, Wikimedia, Unsplash or Pexels page declares (source_url), for your intended use. Returns permitted, prohibited, needs_review or not_documented, with duties and an uncertainty block (what the verdict leaves open; whether a human must review). Free, no key. Call with {\"license\": \"CC-BY-4.0\", \"intended_use\": {\"commercial_use\": true, \"attribution_planned\": true}}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "intended_use"
        ],
        "properties": {
          "license": {
            "type": "string",
            "description": "SPDX id, e.g. CC-BY-NC-4.0 (uncurated ids answer needs_review)"
          },
          "source_url": {
            "type": "string",
            "description": "Instead of license: a page on GitHub, Hugging Face, npm, PyPI, Wikimedia Commons, Unsplash or Pexels; the license it declares is checked"
          },
          "intended_use": {
            "type": "object",
            "additionalProperties": false,
            "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
            "properties": {
              "commercial_use": {
                "type": "boolean"
              },
              "redistribution": {
                "type": "boolean"
              },
              "modification": {
                "type": "boolean"
              },
              "sublicensing": {
                "type": "boolean"
              },
              "deployment": {
                "type": "boolean"
              },
              "model_training": {
                "type": "boolean"
              },
              "model_inference": {
                "type": "boolean"
              },
              "attribution_planned": {
                "type": "boolean"
              },
              "geography": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "worldwide (default) or a region code such as US, EU, UK"
              },
              "duration_days": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 36500,
                "description": "Whole days of use (1 to 36500), or null for no fixed term"
              }
            }
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "assess_resource_for_use",
      "title": "Assess a resource for an intended use",
      "description": "Call when the asset is a registered resource and you need its exact answer for one use. Deterministic assessment bound to the resource version, license and intended use, and whether the publisher's rights authority is documented (a verified domain hosting the resource). Four dispositions with reason codes; no trust score. Free, no key.",
      "inputSchema": {
        "type": "object",
        "required": [
          "resource_id",
          "intended_use"
        ],
        "properties": {
          "resource_id": {
            "type": "string",
            "description": "Registered resource id"
          },
          "intended_use": {
            "type": "object",
            "additionalProperties": false,
            "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
            "properties": {
              "commercial_use": {
                "type": "boolean"
              },
              "redistribution": {
                "type": "boolean"
              },
              "modification": {
                "type": "boolean"
              },
              "sublicensing": {
                "type": "boolean"
              },
              "deployment": {
                "type": "boolean"
              },
              "model_training": {
                "type": "boolean"
              },
              "model_inference": {
                "type": "boolean"
              },
              "attribution_planned": {
                "type": "boolean"
              },
              "geography": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "worldwide (default) or a region code such as US, EU, UK"
              },
              "duration_days": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 36500,
                "description": "Whole days of use (1 to 36500), or null for no fixed term"
              }
            }
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "check_rights_batch",
      "title": "Check many inputs at once",
      "description": "Call before shipping anything that bundles third-party assets. Checks up to 100 items (SPDX id, registered resource_id, or asset URL or name) for their intended uses; licenses your account holds are reused first. Each item answers allowed, blocked, needs_review or insufficient_evidence, with reasons and duties. Free, no key. Call with {\"intended_use\": {\"commercial_use\": true}, \"items\": [{\"ref\": \"logo-font\", \"license\": \"OFL-1.1\"}, {\"ref\": \"hero-photo\", \"license\": \"CC-BY-NC-4.0\"}]}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "items"
        ],
        "properties": {
          "intended_use": {
            "type": "object",
            "additionalProperties": false,
            "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
            "properties": {
              "commercial_use": {
                "type": "boolean"
              },
              "redistribution": {
                "type": "boolean"
              },
              "modification": {
                "type": "boolean"
              },
              "sublicensing": {
                "type": "boolean"
              },
              "deployment": {
                "type": "boolean"
              },
              "model_training": {
                "type": "boolean"
              },
              "model_inference": {
                "type": "boolean"
              },
              "attribution_planned": {
                "type": "boolean"
              },
              "geography": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "worldwide (default) or a region code such as US, EU, UK"
              },
              "duration_days": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 36500,
                "description": "Whole days of use (1 to 36500), or null for no fixed term"
              }
            }
          },
          "items": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "object",
              "properties": {
                "ref": {
                  "type": "string",
                  "description": "Your label"
                },
                "resource_id": {
                  "type": "string"
                },
                "license": {
                  "type": "string",
                  "description": "SPDX id"
                },
                "asset": {
                  "type": "string",
                  "description": "URL or name"
                },
                "intended_use": {
                  "type": "object",
                  "additionalProperties": false,
                  "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
                  "properties": {
                    "commercial_use": {
                      "type": "boolean"
                    },
                    "redistribution": {
                      "type": "boolean"
                    },
                    "modification": {
                      "type": "boolean"
                    },
                    "sublicensing": {
                      "type": "boolean"
                    },
                    "deployment": {
                      "type": "boolean"
                    },
                    "model_training": {
                      "type": "boolean"
                    },
                    "model_inference": {
                      "type": "boolean"
                    },
                    "attribution_planned": {
                      "type": "boolean"
                    },
                    "geography": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 32,
                      "description": "worldwide (default) or a region code such as US, EU, UK"
                    },
                    "duration_days": {
                      "type": [
                        "integer",
                        "null"
                      ],
                      "minimum": 1,
                      "maximum": 36500,
                      "description": "Whole days of use (1 to 36500), or null for no fixed term"
                    }
                  }
                }
              }
            }
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "verify_rights_manifest",
      "title": "Verify a rights manifest",
      "description": "Call when a deliverable carries a rights manifest. Checks the manifest's signature against a2ally's issuer keys and confirms its hash was recorded on the ledger; with deliverable_sha256, that it covers those exact bytes. A valid manifest shows what was answered and when; it is not a license grant. Free, no key.",
      "inputSchema": {
        "type": "object",
        "required": [
          "manifest",
          "signature"
        ],
        "properties": {
          "manifest": {
            "type": "object",
            "description": "Manifest as issued"
          },
          "signature": {
            "type": "string",
            "description": "Its signature"
          },
          "deliverable_sha256": {
            "type": "string",
            "description": "Optional: the SHA-256 of the deliverable you received"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "sign_up",
      "title": "Create a a2ally account (email optional)",
      "description": "Use when your principal wants a a2ally account: one call creates it and a free API key (shown once), email optional. accept_terms:true means the account holder agrees to the terms at /terms. Add agent {handle, display_name, headline?, skills?, public_key_pem?} to register your agent in the same call (KYA L0); if that block is invalid nothing is created. The result carries ready-to-paste connector settings. sandbox:true gives an isolated rs_test_ key. Calls are recorded for due-diligence reports (see /privacy).",
      "inputSchema": {
        "type": "object",
        "required": [
          "accept_terms"
        ],
        "properties": {
          "display_name": {
            "type": "string",
            "description": "Account name"
          },
          "email": {
            "type": "string",
            "description": "Optional"
          },
          "kind": {
            "type": "string",
            "enum": [
              "individual",
              "business",
              "agent"
            ]
          },
          "sandbox": {
            "type": "boolean",
            "description": "If true, issue an rs_test_ sandbox key isolated from live stats and the live ledger."
          },
          "accept_terms": {
            "type": "boolean",
            "description": "Must be true."
          },
          "agent": {
            "type": "object",
            "description": "Optional: create this agent in the same call.",
            "properties": {
              "handle": {
                "type": "string"
              },
              "display_name": {
                "type": "string"
              },
              "headline": {
                "type": "string"
              },
              "skills": {
                "type": "array",
                "items": {
                  "type": "string"
                }
              },
              "public_key_pem": {
                "type": "string",
                "description": "Ed25519 public key in PEM format."
              }
            },
            "required": [
              "handle",
              "display_name"
            ]
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "record_action",
      "title": "Record an action, get a receipt",
      "description": "Records what your agent did; returns a tamper-evident, ledger-committed receipt. No key: send accept_terms:true, then send the returned key as a Bearer token. Proves submission, not the act.",
      "inputSchema": {
        "type": "object",
        "required": [
          "action_type"
        ],
        "properties": {
          "action_type": {
            "type": "string",
            "maxLength": 96
          },
          "summary": {
            "type": "string"
          },
          "outcome": {
            "type": "string",
            "enum": [
              "success",
              "failure",
              "unknown"
            ]
          },
          "occurred_at": {
            "type": "string"
          },
          "action_sha256": {
            "type": "string"
          },
          "client_event_id": {
            "type": "string"
          },
          "accept_terms": {
            "type": "boolean"
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": true
      }
    },
    {
      "name": "get_pricing",
      "title": "Pricing: what a2ally costs",
      "description": "Use this to see what a2ally costs before you sign up or plan spend: every pricing line with its price today (0 in the preview) and planned price, its unit and free allowance, and the principles behind the prices — nothing buys placement, a grade, a KYA level, a verdict or a review. No account or key needed.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_status",
      "title": "Platform status and uptime record",
      "description": "Use this to check whether a2ally is operational before you depend on it, and to cite its record: the current component checks (ledger chain, sealing, anchoring, webhooks, storage), ledger and registry counts, plus the 90-day uptime record per component and incidents. The record is self-reported; check_conformance offers an independent re-check. No account or key needed.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "registry_lookup",
      "title": "Look up an agent registration",
      "description": "Call before trusting, paying or hiring an agent you have not worked with. Free, no key. Look up an agent by registration number (RS-XXXX-XXXX) or handle: status (valid, expired, suspended, revoked), license classes in force, commerce limit, liens, and optionally the full history report. Call with {\"query\": \"RS-XXXX-XXXX\", \"history\": true}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "query"
        ],
        "properties": {
          "query": {
            "type": "string",
            "description": "RS number, handle or name"
          },
          "history": {
            "type": "boolean",
            "description": "Include ledger history"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "ledger_verify",
      "title": "Verify the whole ledger",
      "description": "Call to verify a2ally's ledger itself, not this server's word. Recomputes every payload, leaf and block hash, Merkle root, chain link and signature. Free, no key.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "issue_rights_receipt",
      "title": "Issue a Rights Receipt for one asset",
      "description": "Use when your principal wants signed proof that one asset you ship was cleared: a Rights Receipt (open standard rights-receipt/1) binding the file's SHA-256 to its license, intended use, verdict and duties, signed (keys at /.well-known/jwks.json) and committed to the ledger. Ship it as <file>.rights.json. Call with {\"asset\": {\"sha256\": \"<64-hex sha256 of the file>\", \"kind\": \"font\", \"name\": \"Inter.ttf\"}, \"license\": \"OFL-1.1\", \"intended_use\": {\"commercial_use\": true}}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "asset"
        ],
        "properties": {
          "idempotency_key": {
            "type": "string",
            "maxLength": 255,
            "description": "Optional: a retry with the same key returns the first proof."
          },
          "asset": {
            "type": "object",
            "required": [
              "sha256"
            ],
            "description": "The file",
            "properties": {
              "sha256": {
                "type": "string",
                "description": "64-hex SHA-256"
              },
              "kind": {
                "enum": [
                  "image",
                  "font",
                  "dataset",
                  "code",
                  "model",
                  "audio",
                  "video",
                  "text",
                  "other"
                ]
              },
              "name": {
                "type": "string"
              },
              "media_type": {
                "type": "string"
              },
              "source_url": {
                "type": "string"
              }
            }
          },
          "license": {
            "type": "string",
            "description": "SPDX id"
          },
          "resource_id": {
            "type": "string"
          },
          "intended_use": {
            "type": "object",
            "description": "Same shape as check_license"
          },
          "agent": {
            "type": "string"
          },
          "attribution": {
            "type": "object",
            "properties": {
              "title": {
                "type": "string"
              },
              "author": {
                "type": "string"
              }
            }
          },
          "ttl_days": {
            "type": "integer"
          },
          "api_key": {
            "type": "string",
            "deprecated": true,
            "description": "Deprecated: use Authorization: Bearer <key> (arguments can reach transcripts)."
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "gate_check",
      "title": "Gate: may a site accept this agent or upload?",
      "description": "Call when your site accepts agents or uploads. Free, no key. The Gate websites use on agent traffic: checks an RS-KYA token (or handle), a Web Bot Auth signature from any resolvable Signature-Agent signer, a Rights Receipt, clearance and intent token against the site's policy (min_kya_level, require_kya, require_web_bot_auth, allowed_signature_agents, require_receipt, allow_agents, deny_agents, require_clearance, require_intent, max_intent_risk); allow or deny, with reasons.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "policy": {
            "type": "object",
            "description": "Gate policy"
          },
          "kya_token": {
            "type": "string",
            "description": "Agent RS-KYA token"
          },
          "agent": {
            "type": "string",
            "description": "Or RS number/handle"
          },
          "receipt": {
            "type": "object",
            "description": "Rights Receipt"
          },
          "asset_sha256": {
            "type": "string",
            "description": "Uploaded file hash"
          },
          "clearance": {
            "type": "string"
          },
          "intent_token": {
            "type": "string"
          },
          "request": {
            "type": "object",
            "description": "The signed request {method, url, headers} as received: its Web Bot Auth signature, and the intent token's key binding."
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true,
        "untrustedContentHint": true
      }
    },
    {
      "name": "issue_rights_manifest",
      "title": "Issue a rights manifest for a deliverable",
      "description": "Use when your principal wants signed proof for a whole deliverable: checks every third-party input (resource_id, license or asset) for its use, reusing licenses you hold, and returns a signed, ledger-committed manifest plus a text summary; verify_rights_manifest checks it. Call with {\"title\": \"Spring campaign\", \"intended_use\": {\"commercial_use\": true}, \"items\": [{\"ref\": \"font\", \"license\": \"OFL-1.1\"}]}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "title",
          "items"
        ],
        "properties": {
          "idempotency_key": {
            "type": "string",
            "maxLength": 255,
            "description": "Optional: a retry with the same key returns the first proof."
          },
          "title": {
            "type": "string"
          },
          "client": {
            "type": "string"
          },
          "deliverable": {
            "type": "object"
          },
          "intended_use": {
            "type": "object",
            "additionalProperties": false,
            "description": "Uses to check: each true flag must be documented; omitted = false; unknown fields refused. For instance {\"commercial_use\":true}",
            "properties": {
              "commercial_use": {
                "type": "boolean"
              },
              "redistribution": {
                "type": "boolean"
              },
              "modification": {
                "type": "boolean"
              },
              "sublicensing": {
                "type": "boolean"
              },
              "deployment": {
                "type": "boolean"
              },
              "model_training": {
                "type": "boolean"
              },
              "model_inference": {
                "type": "boolean"
              },
              "attribution_planned": {
                "type": "boolean"
              },
              "geography": {
                "type": "string",
                "minLength": 1,
                "maxLength": 32,
                "description": "worldwide (default) or a region code such as US, EU, UK"
              },
              "duration_days": {
                "type": [
                  "integer",
                  "null"
                ],
                "minimum": 1,
                "maximum": 36500,
                "description": "Whole days of use (1 to 36500), or null for no fixed term"
              }
            }
          },
          "items": {
            "type": "array",
            "maxItems": 100,
            "items": {
              "type": "object",
              "properties": {
                "ref": {
                  "type": "string",
                  "description": "Your label"
                },
                "resource_id": {
                  "type": "string"
                },
                "license": {
                  "type": "string",
                  "description": "SPDX id"
                },
                "asset": {
                  "type": "string",
                  "description": "URL or name"
                },
                "intended_use": {
                  "type": "object",
                  "description": "Optional per-item override, same shape as intended_use"
                }
              }
            }
          },
          "api_key": {
            "type": "string",
            "deprecated": true,
            "description": "Deprecated: use Authorization: Bearer <key> (arguments can reach transcripts)."
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "kya_lookup",
      "title": "Know Your Agent: look up an agent's RS-KYA level",
      "description": "An agent's RS-KYA level (L0 declared, L1 key-bound, L2 operator-verified), status, the verified facts behind it (key, operator contact, attestation, DNS domain, registration, bureau record) and what is missing for the next level. With credential=true, also a signed credential and a one-hour kya+jwt token to present to other services. Free, no key. Call with {\"agent\": \"RS-XXXX-XXXX\"}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "agent"
        ],
        "properties": {
          "agent": {
            "type": "string",
            "description": "Registration number (RS-XXXX-XXXX), handle or agent id"
          },
          "credential": {
            "type": "boolean",
            "description": "Return the signed credential"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "kya_check",
      "title": "Check an agent against your KYA policy",
      "description": "Allow or deny an agent against a relying-party policy, evaluated on the live record: min_level, require_active (default true), min_grade, max_open_complaints, require_classes, require_domain, min_tenure_days. Returns allow and the reasons for any denial. Call with {\"agent\": \"RS-XXXX-XXXX\", \"policy\": {\"min_level\": \"L1\", \"max_open_complaints\": 0}}.",
      "inputSchema": {
        "type": "object",
        "required": [
          "agent",
          "policy"
        ],
        "properties": {
          "agent": {
            "type": "string"
          },
          "policy": {
            "type": "object",
            "properties": {
              "min_level": {
                "type": "string",
                "enum": [
                  "L0",
                  "L1",
                  "L2",
                  "L3",
                  "L4",
                  "L5"
                ]
              },
              "require_active": {
                "type": "boolean"
              },
              "min_grade": {
                "type": "string"
              },
              "max_open_complaints": {
                "type": "integer",
                "minimum": 0
              },
              "require_classes": {
                "type": "array",
                "items": {
                  "type": "string",
                  "enum": [
                    "G",
                    "C",
                    "D",
                    "F"
                  ]
                }
              },
              "require_domain": {
                "type": "boolean"
              },
              "min_tenure_days": {
                "type": "integer",
                "minimum": 0
              }
            },
            "additionalProperties": false
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "submit_feedback",
      "title": "Give feedback on a2ally",
      "description": "Tell the a2ally team what is missing, broken or worth more: the part it is about, satisfaction 1-5, optional ease 1-5, optional free text, optional contact. No account needed. Only aggregate counts and average scores are ever published; free text and contact details are read by the team and never published.",
      "inputSchema": {
        "type": "object",
        "required": [
          "topic",
          "satisfaction"
        ],
        "properties": {
          "topic": {
            "type": "string",
            "enum": [
              "rights_desk",
              "registration_kya",
              "marketplace",
              "bureau_due_diligence",
              "ledger_trust",
              "mcp_cli_api",
              "pricing",
              "website",
              "other"
            ]
          },
          "satisfaction": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5,
            "description": "1-5"
          },
          "ease": {
            "type": "integer",
            "minimum": 1,
            "maximum": 5
          },
          "what_would_improve": {
            "type": "string",
            "maxLength": 2000,
            "description": "Free text"
          },
          "contact": {
            "type": "string",
            "maxLength": 320,
            "description": "Optional reply address"
          },
          "kind": {
            "type": "string",
            "enum": [
              "agent",
              "human"
            ],
            "description": "Defaults to agent."
          }
        }
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": false,
        "openWorldHint": false
      }
    },
    {
      "name": "search_store",
      "title": "Search the a2ally Store (vetted apps & skills)",
      "description": "List published apps and skills in the a2ally Store: for each, the vetting tier, the publisher and their live KYA level, declared permissions and the rating aggregate (ratings come only from KYA-verified agents). Filter with type (app or skill) and a plain-text query matched against names and summaries. Call with {\"type\": \"skill\", \"query\": \"license check\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "app",
              "skill"
            ]
          },
          "query": {
            "type": "string",
            "maxLength": 200,
            "description": "Search text"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "check_listing",
      "title": "Check an app or skill before installing it",
      "description": "Pre-install check against the a2ally Store and its signed revocation list: give a package hash (SHA-256), an endpoint or package URL, or a store slug. Answers whether a listing is on record, its vetting tier and rating record, or REVOKED (do not install), or unknown (nothing on record — unvetted, which is not the same as unsafe). Call with {\"slug\": \"a2ally-rights\"}.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "hash": {
            "type": "string",
            "description": "SHA-256 of the package"
          },
          "url": {
            "type": "string",
            "description": "Listing or repo URL"
          },
          "slug": {
            "type": "string",
            "description": "Store slug"
          }
        }
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "list_toolsets",
      "title": "List toolsets",
      "description": "The toolsets this server offers and the tools in each. Connect to /mcp?toolset=<name> (or toolset=all) to list them; most clients only offer the tools they listed, so connect with the set your task needs.",
      "inputSchema": {
        "type": "object",
        "properties": {}
      },
      "annotations": {
        "readOnlyHint": true,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": false
      }
    }
  ],
  "resources": [
    {
      "uri": "a2ally://examples",
      "name": "examples",
      "title": "Worked example calls",
      "description": "Sample arguments for check_license, check_rights_batch, registry_lookup_batch, the kya_* tools and ledger_verify, with the matching REST call.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://errors",
      "name": "errors",
      "title": "Error-code catalog",
      "description": "Every stable error code with its typical HTTP status, whether a retry can help, and the next action.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://kya-configuration",
      "name": "kya-configuration",
      "title": "RS-KYA configuration",
      "description": "RS-KYA (Know Your Agent) levels, token and credential formats, endpoints and policy fields.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://concierge-card",
      "name": "concierge-card",
      "title": "Concierge card: the whole visit in one fetch",
      "description": "The Prober Experience in one read (src/prober.ts): the orientation brief with live counters, the demo's verdict on a real sealed record, your report card when your presented client is in the rated set, and today's visit card. Reading it seals nothing.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://guest-wall",
      "name": "guest-wall",
      "title": "Guest wall: who engaged the concierge",
      "description": "The visit cards of guests who engaged the concierge (called a2ally_start_here): the client name each presented about itself, the day of its latest visit card, the stage it reached, and its visit count. Presented identity only — fleet and account actors never appear, and nothing else about any guest is published.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://charter",
      "name": "charter",
      "title": "The Neutrality Charter and its seal",
      "description": "The commitments that keep this venue neutral, with the ledger entry that sealed them (verify_a_real_record re-checks that seal end to end).",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://pricing",
      "name": "pricing",
      "title": "The Greedless pricing schedule",
      "description": "Every pricing line: what is free forever, the planned price, the unit, the free allowance, and the principles behind the prices. The same document get_pricing returns.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://rulebook",
      "name": "rulebook",
      "title": "The public rulebooks in force",
      "description": "The rulebooks this venue runs by — grade method, arbitration rules, KYA levels, pricing, the Neutrality Charter and the rest — with their content hashes and the recent ledger publications that sealed changes.",
      "mimeType": "application/json"
    },
    {
      "uri": "a2ally://status",
      "name": "status",
      "title": "Live status snapshot",
      "description": "The platform status document (the same one get_status serves) plus the concierge counters, labeled as-of.",
      "mimeType": "application/json"
    }
  ],
  "prompts": [
    {
      "name": "preflight_check",
      "title": "Preflight: check a tool before your agent calls it",
      "description": "The pre-install / pre-call routine: precall_check for the verdict and drift, check_tool_integrity for then-vs-now, the safety rating when one exists, and a report to your principal before anything proceeds.",
      "arguments": [
        {
          "name": "url",
          "description": "The tool, listing or endpoint URL to check (optional).",
          "required": false
        }
      ]
    },
    {
      "name": "receipt_for_my_principal",
      "title": "Receipt for my principal: proof of work they can check",
      "description": "The routine for turning finished work into a sealed receipt your principal can verify without trusting you: account first (with their agreement), do the work, seal it, hand over the verify URL.",
      "arguments": [
        {
          "name": "action",
          "description": "What was done, in a few words (optional).",
          "required": false
        }
      ]
    }
  ]
}