MCP Server Reference
For: Customers who want an AI assistant (Claude Desktop, Claude Code, or any MCP client) to manage Axemere directly, reading spend, managing credentials, reviewing approvals, via natural language instead of writing API calls.
Axemere exposes a remote Model Context Protocol server covering the same operations as the Management API, with one deliberate exception: minting and revoking API keys stays REST-only (see Keys below). Every tool call is authenticated and scope-checked exactly like the REST API: the MCP server is a thin transport over the same handlers, not a separate permission model.
Table of Contents
- Transport
- Authentication
- Session Management
- Claude Desktop Configuration
- Tools
- Resources
- Self-Hosted Mode
Transport
Streamable HTTP, per the MCP spec's 2025-03-26 transport revision.
Endpoint: https://us.api.axemere.ai/mcp
A single POST to this endpoint carries all MCP protocol messages (initialize, tool calls,
resource reads). There is no separate SSE endpoint to configure.
Authentication
Authorization: Bearer mcpk_<random>
Navigation: Create an MCP key at console.axemere.ai/automation → MCP Server tab, choosing kind
mcp, or viaPOST /mgmt/v1/keyswith"kind": "mcp".
See the Management API's key format note for the exact key
shape. Like mgk_ keys, an mcpk_ key is created with one of two access levels: Read
(["read"]) or Read + Write (["read", "write"]); there is no write-only key. A tool call
requiring a scope the key doesn't have returns the same insufficient_scope error as the REST
API, surfaced as a tool error. See Keys for the full scope model.
mgk_ and mcpk_ keys are not interchangeable by design: an mgk_ key is rejected by the
/mcp endpoint and vice versa. This keeps a compromised MCP client config from also granting
direct REST API access, and lets you revoke one surface without affecting the other.
Session Management
The server is stateful per MCP session. After initialize, the response includes an
Mcp-Session-Id header: send it back on every subsequent request in the same session.
Sessions idle out after 1 hour of inactivity; a client should re-initialize after an
invalid_session error rather than treating it as fatal.
Constraint: session state is held in-memory on a single Cloud Run instance. Under autoscaling, a long-idle session that gets routed to a new instance on its next request will see
invalid_sessionand must re-initialize. This is transparent in Claude Desktop and Claude Code, which re-initialize automatically, but matters if you're writing a custom MCP client.
Claude Desktop Configuration
Claude Desktop connects to remote MCP servers via claude_desktop_config.json:
{ "mcpServers": { "axemere": { "type": "http", "url": "https://us.api.axemere.ai/mcp", "headers": { "Authorization": "Bearer mcpk_k3jmP9xQ2vT7bN5wL8hR4dF6sA1cE0gU3iY9oZ2mX7q" } } } }
Restart Claude Desktop after editing this file. Confirm the connection by asking Claude to "list my Axemere credentials": a successful response confirms the key and transport are both working.
Tools
All tools are read-scoped unless marked write. A tool call against a key lacking the
required scope returns an MCP tool error with the same insufficient_scope semantics as the
REST API.
Records
REST equivalent: Records.
| Tool | Scope | Description |
|---|---|---|
list_records | read | Query execution records with the same filters as GET /mgmt/v1/records |
get_record | read | Get a single record by hash, including full policy trace |
Credentials
REST equivalent: Credentials.
| Tool | Scope | Description |
|---|---|---|
list_credentials | read | List credentials (no secret values) |
create_credential | write | Create or update a credential |
update_credential | write | Update a credential's default flag and workload/project scoping |
delete_credential | write | Delete a credential |
Providers
REST equivalent: Providers and Custom Connectors (BYOC).
| Tool | Scope | Description |
|---|---|---|
list_providers | read | List the org's addon catalog: one entry per provider integration mode (routing/BYOK/OAuth), plus policy presets; see Providers |
set_provider_mode | write | Enable or disable a mode for a standard provider |
list_custom_providers | read | List custom connectors (BYOC) |
create_custom_provider | write | Register a new custom connector |
update_custom_provider | write | Update a custom connector's config |
delete_custom_provider | write | Delete a custom connector |
enable_custom_provider | write | Enable routing for a custom connector |
disable_custom_provider | write | Disable routing for a custom connector |
Workloads
REST equivalent: Workloads.
| Tool | Scope | Description |
|---|---|---|
list_workloads | read | List active workloads with names, key prefixes, and creation timestamps |
create_workload | write | Create a new workload |
update_workload | write | Update an existing workload: a full replace of its config, not a partial patch |
delete_workload | write | Delete a workload by ID |
Projects
REST equivalent: Projects.
| Tool | Scope | Description |
|---|---|---|
list_projects | read | List projects for the org, optionally filtered by status |
create_project | write | Create a new project |
update_project | write | Update a project's display name, description, or status |
delete_project | write | Delete a project by ID |
Policies
REST equivalent: Policies.
| Tool | Scope | Description |
|---|---|---|
get_policy | read | Get the currently loaded policy bundle's status (bundle ID, version, source, load time) |
update_policy | write | Push a new policy bundle as raw YAML |
reload_policy | write | Reload the policy bundle from its configured source |
Rate Limits
REST equivalent: Rate Limits.
| Tool | Scope | Description |
|---|---|---|
get_ratelimit_config | read | Get the org's rate limit configuration (refill rate, max tokens, window) |
update_ratelimit_config | write | Update the org's rate limit configuration |
list_ratelimit_keys | read | List active rate limit bucket keys |
Approvals and Quarantine
REST equivalent: Approvals and Quarantine.
| Tool | Scope | Description |
|---|---|---|
list_approvals | read | Pending approval requests |
approve_request | write | Approve a pending request |
deny_request | write | Deny a pending request |
list_quarantine | read | List quarantined records awaiting review |
release_quarantine | write | Release a quarantined record |
Spend and Dashboard
REST equivalent: Spend and Billing and Dashboard and Gateway Health.
| Tool | Scope | Description |
|---|---|---|
get_spend | read | Time-bucketed allow/deny request counts for a window (1h/24h change bucketing; 7d/30d are accepted but currently bucket the same as 1h; see Spend and Billing) |
get_billing_summary | read | Get the org's billing summary for a date range |
get_dashboard | read | Aggregated gateway health: request counts, decision breakdown, active anomalies, top providers by spend |
list_dashboard_decisions | read | List recent gateway decisions (allow/deny/error) for the dashboard's decision feed |
Nodes
REST equivalent: Dashboard and Gateway Health.
| Tool | Scope | Description |
|---|---|---|
list_nodes | read | Connected gateway nodes and their status |
Attribution
REST equivalent: Attribution.
| Tool | Scope | Description |
|---|---|---|
get_attribution_summary | read | Spend and request counts by attribution field (project, account, customer, or label key) |
list_attribution_labels | read | List distinct attribution label keys and their spend/request totals |
get_attribution_label | read | Get spend/request totals broken down by value for a single attribution label key |
SIEM Export Destinations
REST equivalent: SIEM Export Destinations.
| Tool | Scope | Description |
|---|---|---|
list_export_destinations | read | List configured SIEM export destinations |
create_export_destination | write | Create an export destination |
update_export_destination | write | Update an export destination |
delete_export_destination | write | Delete an export destination |
test_export_destination | write | Send a test event and confirm delivery |
Provider Pricing
REST equivalent: Provider Pricing.
| Tool | Scope | Description |
|---|---|---|
list_provider_pricing | read | List all active pricing configs for the org's providers and models |
Read-only, on both REST and MCP.
provider_pricingis a single global table shared across every org on the managed fleet, not a per-org resource, so pricing writes are restricted to NOC operators via cert-gated admin routes; there is no write tool on MCP and no write endpoint on REST. See Provider Pricing for the full rationale.
Alert Channels
REST equivalent: Budget Alert Channels.
| Tool | Scope | Description |
|---|---|---|
list_alert_channels | read | List budget alert delivery channels (Slack, Teams, Google Chat, Discord, email) configured for the org |
get_alert_channel | read | Get a single alert channel by ID |
create_alert_channel | write | Create a new budget alert delivery channel |
update_alert_channel | write | Update an existing alert channel: only fields present in the request are changed |
delete_alert_channel | write | Delete an alert channel by ID |
test_alert_channel | write | Send a synthetic test alert through a channel to verify delivery is working |
config.webhook_url (Slack, Teams, Google Chat, Discord channels) is a secret: list_alert_channels
and get_alert_channel return it masked as "••••••••", the same convention used for credential
secret_ref. It's never returned unmasked after creation, so retain your
own copy of the webhook URL. config.to_addresses (the email kind) is not a secret and is never
masked. update_alert_channel only changes fields present in the request: to change just the name
or enabled state, omit config entirely rather than passing back a masked value, which would
overwrite the real stored URL.
Alert Subscriptions
REST equivalent: Budget Alert Subscriptions.
| Tool | Scope | Description |
|---|---|---|
list_alert_subscriptions | read | List budget-limit-to-channel alert subscriptions, optionally filtered by limit or channel |
get_alert_subscription | read | Get a single alert subscription by ID |
create_alert_subscription | write | Subscribe a budget limit's alerts to a delivery channel: both must belong to the caller's org |
update_alert_subscription | write | Enable or disable an alert subscription |
delete_alert_subscription | write | Delete an alert subscription by ID |
list_alert_history | read | List past alert delivery events with filters |
Budget Limits
REST equivalent: Budget Limits and Org Budget Config.
| Tool | Scope | Description |
|---|---|---|
list_budget_limits | read | List budget limits configured for the org, enriched with current-period spend |
create_budget_limit | write | Create a budget limit: actions defaults to ["alert"] server-side when omitted; pass an explicit empty array for a draft/no-op limit. For scope: "provider", scope_id must be a canonical provider ID or a custom:/catalog:-prefixed BYOC connector ID; bare hostnames are rejected on create |
delete_budget_limit | write | Delete a budget limit by ID |
get_org_budget_config | read | Read the org's budget enforcement posture (CP-down/Redis-down failure policy, grace period) |
Org Defaults
REST equivalent: Org Defaults.
| Tool | Scope | Description |
|---|---|---|
get_org_defaults | read | Current org-level attribution defaults |
set_org_defaults | write | Update org-level attribution defaults |
Keys
REST equivalent: Keys — the full read/write surface; MCP is list-only here (see below).
| Tool | Scope | Description |
|---|---|---|
list_keys | read | Returns a hint directing you to GET /mgmt/v1/keys; see note below |
Key mutation is deliberately excluded from MCP. This is the one place MCP does not mirror the Management API: there is no
create_keyorrevoke_keytool, on any scope. Key records also live on the control plane rather than the gateway the MCP server's other tool handlers talk to, solist_keysdoesn't proxy real metadata either: it intentionally returns only a pointer to the REST endpoint (GET /mgmt/v1/keys).This is a security boundary, not a gap to be closed: an MCP-scoped key that could mint or revoke keys could mint itself broader access, or revoke the very key restricting it: self-escalation and self-revocation. Keeping key creation and revocation REST-only means an MCP client can never be tricked (via prompt injection or a malicious tool result) into minting a new key or revoking an existing one. Ask your assistant to hit the Management API directly (or use
curl) for actual key listings, creation, or revocation.
Resources
Resources are read-only, cacheable snapshots an MCP client can attach to context without an explicit tool call, useful for grounding a conversation ("here's our current provider setup") before asking the assistant to act.
| URI | Name | Description |
|---|---|---|
providers://catalog | Provider Catalog | Flat addon catalog: one entry per provider integration mode (routing/BYOK/OAuth), plus policy presets |
providers://custom | Custom Providers | All registered custom connectors (BYOC) |
records://recent | Recent Records | Most recent execution records (last 100) |
credentials://list | Credentials | Credential metadata (no secret values) |
attribution://summary | Attribution Summary | Spend and request counts by attribution field |
nodes://status | Node Status | Connected gateway nodes and their status |
pricing://configs | Pricing Configs | All active provider pricing configs |
Self-Hosted Mode
Self-hosted customers run the MCP server as a standalone binary, mvgc-mcp, against their own
gateway: no dependency on Axemere's hosted /mcp endpoint.
# stdio transport (Claude Desktop local server config): the default when --listen is omitted mvgc-mcp --gateway-url=http://localhost:8080 --admin-token=$MVGC_ADMIN_TOKEN # or, using a management key instead of the gateway admin token mvgc-mcp --gateway-url=http://localhost:8080 --mgk=$MVGC_MGK # HTTP transport, for a remote client: setting --listen switches modes mvgc-mcp --gateway-url=http://localhost:8080 --mgk=$MVGC_MGK --listen=:8443 \ --tls-cert=cert.pem --tls-key=key.pem
--admin-token (or MVGC_ADMIN_TOKEN) grants full local access without provisioning a
management key, convenient for a single-operator self-hosted install. --mgk= (or
MVGC_MGK) is the better choice once more than one person or automation needs access; note
that in self-hosted mode the binary trusts the key holder with write access directly (there's
no control plane to validate scopes against locally: real scope enforcement is a
managed-gateway feature).
Mode is controlled by --listen / MVGC_MCP_LISTEN: omit it for stdio mode (the default, used
by a locally-spawned Claude Desktop server entry), or set it to start an HTTP server for remote
clients, optionally with --tls-cert/--tls-key for TLS termination. Other flags:
--session-ttl (default 1h, MCP session idle timeout) and --env / MVGC_ENV (dev,
stg, or prd; default dev). Run mvgc-mcp --help for the full flag and environment
variable list. See the
Management API's Self-Hosted Mode section for how to
provision an mgk_ key locally.
Claude Desktop / Claude Code config for stdio mode:
{ "mcpServers": { "axemere-local": { "command": "mvgc-mcp", "args": [ "--gateway-url=http://localhost:7080", "--mgk=mgk_dev_your_key_here" ] } } }
Related: Management API Reference | Key Types Reference | Approvals