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

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 via POST /mgmt/v1/keys with "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_session and 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.

ToolScopeDescription
list_recordsreadQuery execution records with the same filters as GET /mgmt/v1/records
get_recordreadGet a single record by hash, including full policy trace

Credentials

REST equivalent: Credentials.

ToolScopeDescription
list_credentialsreadList credentials (no secret values)
create_credentialwriteCreate or update a credential
update_credentialwriteUpdate a credential's default flag and workload/project scoping
delete_credentialwriteDelete a credential

Providers

REST equivalent: Providers and Custom Connectors (BYOC).

ToolScopeDescription
list_providersreadList the org's addon catalog: one entry per provider integration mode (routing/BYOK/OAuth), plus policy presets; see Providers
set_provider_modewriteEnable or disable a mode for a standard provider
list_custom_providersreadList custom connectors (BYOC)
create_custom_providerwriteRegister a new custom connector
update_custom_providerwriteUpdate a custom connector's config
delete_custom_providerwriteDelete a custom connector
enable_custom_providerwriteEnable routing for a custom connector
disable_custom_providerwriteDisable routing for a custom connector

Workloads

REST equivalent: Workloads.

ToolScopeDescription
list_workloadsreadList active workloads with names, key prefixes, and creation timestamps
create_workloadwriteCreate a new workload
update_workloadwriteUpdate an existing workload: a full replace of its config, not a partial patch
delete_workloadwriteDelete a workload by ID

Projects

REST equivalent: Projects.

ToolScopeDescription
list_projectsreadList projects for the org, optionally filtered by status
create_projectwriteCreate a new project
update_projectwriteUpdate a project's display name, description, or status
delete_projectwriteDelete a project by ID

Policies

REST equivalent: Policies.

ToolScopeDescription
get_policyreadGet the currently loaded policy bundle's status (bundle ID, version, source, load time)
update_policywritePush a new policy bundle as raw YAML
reload_policywriteReload the policy bundle from its configured source

Rate Limits

REST equivalent: Rate Limits.

ToolScopeDescription
get_ratelimit_configreadGet the org's rate limit configuration (refill rate, max tokens, window)
update_ratelimit_configwriteUpdate the org's rate limit configuration
list_ratelimit_keysreadList active rate limit bucket keys

Approvals and Quarantine

REST equivalent: Approvals and Quarantine.

ToolScopeDescription
list_approvalsreadPending approval requests
approve_requestwriteApprove a pending request
deny_requestwriteDeny a pending request
list_quarantinereadList quarantined records awaiting review
release_quarantinewriteRelease a quarantined record

Spend and Dashboard

REST equivalent: Spend and Billing and Dashboard and Gateway Health.

ToolScopeDescription
get_spendreadTime-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_summaryreadGet the org's billing summary for a date range
get_dashboardreadAggregated gateway health: request counts, decision breakdown, active anomalies, top providers by spend
list_dashboard_decisionsreadList recent gateway decisions (allow/deny/error) for the dashboard's decision feed

Nodes

REST equivalent: Dashboard and Gateway Health.

ToolScopeDescription
list_nodesreadConnected gateway nodes and their status

Attribution

REST equivalent: Attribution.

ToolScopeDescription
get_attribution_summaryreadSpend and request counts by attribution field (project, account, customer, or label key)
list_attribution_labelsreadList distinct attribution label keys and their spend/request totals
get_attribution_labelreadGet spend/request totals broken down by value for a single attribution label key

SIEM Export Destinations

REST equivalent: SIEM Export Destinations.

ToolScopeDescription
list_export_destinationsreadList configured SIEM export destinations
create_export_destinationwriteCreate an export destination
update_export_destinationwriteUpdate an export destination
delete_export_destinationwriteDelete an export destination
test_export_destinationwriteSend a test event and confirm delivery

Provider Pricing

REST equivalent: Provider Pricing.

ToolScopeDescription
list_provider_pricingreadList all active pricing configs for the org's providers and models

Read-only, on both REST and MCP. provider_pricing is 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.

ToolScopeDescription
list_alert_channelsreadList budget alert delivery channels (Slack, Teams, Google Chat, Discord, email) configured for the org
get_alert_channelreadGet a single alert channel by ID
create_alert_channelwriteCreate a new budget alert delivery channel
update_alert_channelwriteUpdate an existing alert channel: only fields present in the request are changed
delete_alert_channelwriteDelete an alert channel by ID
test_alert_channelwriteSend 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.

ToolScopeDescription
list_alert_subscriptionsreadList budget-limit-to-channel alert subscriptions, optionally filtered by limit or channel
get_alert_subscriptionreadGet a single alert subscription by ID
create_alert_subscriptionwriteSubscribe a budget limit's alerts to a delivery channel: both must belong to the caller's org
update_alert_subscriptionwriteEnable or disable an alert subscription
delete_alert_subscriptionwriteDelete an alert subscription by ID
list_alert_historyreadList past alert delivery events with filters

Budget Limits

REST equivalent: Budget Limits and Org Budget Config.

ToolScopeDescription
list_budget_limitsreadList budget limits configured for the org, enriched with current-period spend
create_budget_limitwriteCreate 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_limitwriteDelete a budget limit by ID
get_org_budget_configreadRead the org's budget enforcement posture (CP-down/Redis-down failure policy, grace period)

Org Defaults

REST equivalent: Org Defaults.

ToolScopeDescription
get_org_defaultsreadCurrent org-level attribution defaults
set_org_defaultswriteUpdate org-level attribution defaults

Keys

REST equivalent: Keys — the full read/write surface; MCP is list-only here (see below).

ToolScopeDescription
list_keysreadReturns 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_key or revoke_key tool, on any scope. Key records also live on the control plane rather than the gateway the MCP server's other tool handlers talk to, so list_keys doesn'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.

URINameDescription
providers://catalogProvider CatalogFlat addon catalog: one entry per provider integration mode (routing/BYOK/OAuth), plus policy presets
providers://customCustom ProvidersAll registered custom connectors (BYOC)
records://recentRecent RecordsMost recent execution records (last 100)
credentials://listCredentialsCredential metadata (no secret values)
attribution://summaryAttribution SummarySpend and request counts by attribution field
nodes://statusNode StatusConnected gateway nodes and their status
pricing://configsPricing ConfigsAll 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