# MCP servers

Two Model Context Protocol endpoints: a management control plane, and a public documentation server.

## Endpoints

| Server | URL | Authentication |
| --- | --- | --- |
| Management | /api/mcp | Bearer API key carrying management scopes |
| Documentation | /api/mcp/docs | None, public and read only |

Both speak JSON-RPC 2.0 over HTTP POST and implement `initialize`, `tools/list` and `tools/call`. Point any MCP client at them:

```json
{
  "mcpServers": {
    "xero-proxy": {
      "type": "http",
      "url": "https://xero-proxy.fullstackplus.com.au/api/mcp",
      "headers": { "Authorization": "Bearer xpk_live_<keyid>_<secret>" }
    },
    "xero-proxy-docs": {
      "type": "http",
      "url": "https://xero-proxy.fullstackplus.com.au/api/mcp/docs"
    }
  }
}
```

## Management tools

Every tool is confined to the account owning the calling key, and every write is recorded in the audit log with `origin: mcp`. A tool whose scope the key does not hold is not listed and cannot be called.

- `list_connections`, `list_organisations`: connection health and the organisations behind it.
- `list_keys`, `create_key`, `rotate_key`, `revoke_key`: the full key lifecycle, with the secret returned once on create and rotate.
- `usage_summary`, `recent_requests`: request volume, error rate and the recent request log.
- `list_alerts`, `acknowledge_alert`: the alert centre.
- `cache_status`, `purge_cache`: what caching is saving, and dropping every stored response.
- `quota_status`, `set_key_limits`: what each key is allowed and has spent, what Xero says is left, and changing a key's limits or priority. There is no tool for turning enforcement on: that is a decision a person makes, not one an agent makes to unblock itself.
- `list_event_subscriptions`, `recent_event_deliveries`, `retry_event_delivery`: the webhook fan-out, its delivery history, and re-queuing one.

## Documentation tools

- `search_docs`: ranked sections for a natural-language question.
- `get_page`: one documentation page as markdown.
- `resolve_route`: the required scope for a method and path, straight from the enforcement table.
- `list_routes`: the route reference, optionally filtered by family.
- `get_openapi`: the generated OpenAPI document.
