Announcing CIMD support for MCP Client registration
Learn more

Axiom MCP vs Axiom API for AI Agents (2026)

Varun Krishnan
Senior Content Marketer

Axiom gives an incident agent two ways into the same logs, traces and metrics: a hosted MCP server that signs each engineer in, and a REST API that takes scoped tokens. The MCP server now writes as well as reads, query cost caps follow whichever identity the agent carries, and the hosted server routes results through the US. This guide compares what each path lets an agent do, the credential each one puts you on, and how to run an observability agent across many customer orgs in production.

TL;DR

  • Axiom's hosted MCP server covers APL and MPL queries, dataset discovery, dashboards, monitors and notifiers. Ingest, annotations, saved-query writes, API tokens and RBAC are API-only.
  • Remote MCP defaults to OAuth and acts as the user. The REST API takes scoped advanced API tokens. Query cost caps follow that identity: per role on MCP, per token on the API.
  • The MCP surface includes create, update and delete tools for dashboards, monitors and notifiers. Scope it before an agent sees it.
  • Hosted MCP routes query results through US infrastructure; region-bound agents need the API's edge endpoints.
  • Scalekit's Axiom MCP connector handles per-user OAuth, token storage and refresh, and a Virtual MCP server exposes only the tools each agent role needs.

Two paths into the same telemetry

Your agent investigates incidents. It needs to read logs, traces and metrics in Axiom, check which monitors are firing, and point the on-call engineer at the right dashboard. Axiom ships a hosted MCP server and a full REST API, so the Axiom MCP vs Axiom API question comes up on day one. Both work. They give your agent different tool surfaces, different identities, different cost controls and different data paths. For one developer in Claude Code, the difference is small. For a B2B agent acting for hundreds of users across customer orgs, it decides your auth architecture. Here's the decision framework.

What Axiom MCP and Axiom API actually are

Both paths reach the same observability data. They differ in who maintains the interface, how the agent authenticates, and where query results travel.

The Axiom MCP server

Axiom maintains a hosted, remote MCP server over Streamable HTTP, with an SSE endpoint kept for legacy clients. Remote MCP with OAuth is Axiom's recommended setup: the user signs in through the browser, and the session acts as that user. For clients that can't complete browser OAuth, Axiom documents header-based auth with a personal access token and an x-axiom-org-id header. A local server also exists for teams that want to run it with an API token, though Axiom's prebuilt prompts don't ship with the local setup.

One detail matters for B2B agents: Axiom states the hosted server is located in the US, so query results route through US infrastructure. Official docs: Axiom MCP Server.

The Axiom REST API

The REST API is JSON over HTTPS and covers ingest, APL queries, MPL metrics queries, datasets and fields, dashboards, monitors, notifiers, annotations, saved queries, views, virtual fields, API tokens, RBAC, users and organizations.

Authentication uses two token families. Advanced API tokens carry an explicit permission set, such as query access on one dataset, and an optional expiry; basic API tokens only ingest. Personal access tokens (PATs) carry full control of the user's account and need the x-axiom-org-id header. Failed authentication returns 403. Ingest and region-pinned queries go to your edge deployment's domain; everything else goes to the global API domain. Official docs: Axiom API reference.

Comparing them where it matters for agents

The capability gap is narrower than a "read-only MCP" framing suggests, because Axiom's MCP server now writes as well as reads. The gap that remains is specific.

What your agent can actually do

Axiom's MCP tools reference lists 31 tools across query, datasets, metrics, dashboards, monitors and notifiers, a service map group that appears only when service map is enabled, and a feedback tool. Scalekit's Axiom MCP connector currently catalogs 26 of them: 15 read, 8 write and 3 destructive. The REST API covers the same resources plus the operational layer underneath them.

Query and investigation coverage

Capability
Axiom MCP
Axiom API
APL queries on events and traces
Yes
Yes
MPL queries on OTel metrics
Yes
Yes, edge endpoint
Dataset and field discovery
Yes
Yes
Saved queries
List only
Full CRUD
Service map dependency graph
Yes, when enabled
Not in API reference
Prebuilt investigation prompts
Yes, hosted server
No

Write and administration coverage

Capability
Axiom MCP
Axiom API
Ingest events
No
Yes
Create datasets
Yes
Yes
Trim, vacuum, update or delete datasets
No
Yes
Dashboards, monitors and notifiers: create, update, delete
Yes
Yes
Annotations, views, virtual fields, map fields
No
Yes
API tokens, RBAC, users, orgs
No
Yes

Where the gap bites

Ingest is the gap that matters most for agents. An agent that records its own decisions, writes investigation results back as events, or annotates a deploy on a chart needs the API, because MCP has no ingest or annotation tool. Governance is the second gap: tokens, roles, users and dataset lifecycle stay API-only, which is the right default for an agent.

The MCP server also carries things the API doesn't. Its prebuilt prompts cover anomaly detection, cross-dataset correlation and monitor health, and the service map tools walk dependency edges and latency regressions. On the API path, you write that investigation logic yourself.

The read-only label is out of date

Axiom's AI agents overview still describes the MCP server as curated, read-only operations with no risk of destructive actions. The current tools reference says otherwise: deleteDashboard, deleteMonitor and deleteNotifier are there, along with create and update tools for all three resources.

The consequence is concrete. An agent connected to the full server can silence an alert by deleting the monitor that fires it, or by calling updateMonitor with an empty notifierIds list. Treat tool scoping as a requirement, not an optimization.

The auth path each one puts you on

The two paths put your agent behind different identities. That choice decides how consent works, how cost is capped, and what you rotate.

MCP auth: OAuth that acts as the user

The remote server's OAuth flow creates a session for the user who signs in, and every tool call runs as that member with their Axiom role. Credentials never reach the agent, and the user can revoke the session from their Axiom profile.

The fallback is header auth with a PAT, which gives the agent full account control. Axiom's own token guidance says never to use PATs for agents. For a backend agent, that leaves one sound option: complete the browser consent once per user, then store and refresh the resulting token server-side. Something has to own that token.

API auth: tokens you scope yourself

Advanced API tokens are the agent-friendly option on the API path. Axiom's guidance for agents is explicit: a dedicated token per agent, query permission only on the datasets it needs, no delete or org-level rights, a short expiry, and regular rotation.

The catch is that permissions are fixed at creation. Changing scope means issuing a new token and redistributing it. In a multi-tenant product, every customer org issues its own token, so you collect, store and rotate N static secrets with no refresh flow behind them.

Query cost caps follow the identity

Axiom lets you cap query spend in dollars per hour and per day, and the identity decides where the cap lives. On the API path, the cap sits on the token, so each agent token gets its own worst-case budget. On remote MCP, OAuth sessions act as the user, so token caps don't apply. You set caps on roles instead, and those caps also cover the member's own console queries.

Either way, an exceeded cap returns 429 with a Retry-After header until the window resets: hourly caps at the top of the hour, daily caps at midnight UTC. Ingest and management calls keep working.

The per-user point that holds on both paths

Both paths require per-user credential isolation in a multi-tenant B2B agent. MCP's OAuth flow gives you a session per user. The direct API gives you a token per user or per customer org. In neither case does the path itself solve storage, rotation, or revocation. Those are infrastructure problems regardless of which path you choose.

What you own in production

Each path moves different work onto your team. The question is what breaks, what needs your attention, and who fixes it.

On the MCP path

Axiom runs the server, writes the tool descriptions and ships new tools on its own schedule. You own per-user token storage and refresh, tool scoping, and context cost. Axiom's own comparison notes that MCP loads tool definitions upfront, so every schema lands in context before the agent writes its first query.

Some tools also need sequencing the model has to get right. listDatasets returns a kind for each dataset, and that kind decides the language: APL tools for events and traces, MPL tools for otel-metrics-v1. The tool descriptions tell the model not to cross them, and a model that does wastes turns on queries that can't run.

On the API path

You own everything the MCP server abstracts: LLM-ready tool schemas, response shaping, pagination, retries and rate limits. Axiom reports request limits in X-RateLimit-* headers, scoped to the user or the organization, and returns 429 when you exceed them. Query budget headers report remaining GB-milliseconds.

The APL response is a columnar table plus status metadata such as rows and blocks examined. Pass it raw and you spend context on columns the model doesn't need. Writing the schema and the projection layer is the hard part. Not the HTTP call.

Data residency is a path decision

Axiom's hosted MCP server runs in the US, and its docs state query results route through US infrastructure. The API's global query endpoint can read any edge deployment, but its results also route through US East 1. Only the edge query endpoints keep results inside the deployment where the data lives, such as EU Central 1.

If your B2B customers chose Axiom's EU edge for residency, an agent on hosted MCP moves every query result out of that region. Region-bound agents belong on the API's edge endpoints.

When to use MCP, when to use the API

The split is clean for Axiom: investigation that a person drives fits MCP, and anything that writes, runs unattended or must stay in region fits the API.

Use Axiom MCP when

  • An engineer is in the loop in Claude Code, Cursor or an internal chat assistant, asking why p99 latency spiked after the last deploy, and browser OAuth consent is natural.
  • Your agent correlates logs, traces and OTel metrics and benefits from Axiom-maintained tool descriptions and investigation prompts.
  • You want the service map tools for dependency and latency regression analysis.
  • You're prototyping an incident agent and don't want to write APL and MPL tool schemas yet.

Use the Axiom API when

  • Your agent writes data: ingesting its own decisions, investigation results or evaluation traces, or annotating deploys.
  • Customer data sits in a non-US edge deployment and query results must stay in region.
  • You run a scheduled or headless job, such as a nightly error-budget report, on a dedicated, cost-capped token.
  • You need operations MCP doesn't expose: saved-query writes, views, virtual fields, or dataset trim and vacuum.

The credential problem that exists on both paths

The comparison above changes which token you hold. It doesn't change how many you hold, or what it takes to keep them safe.

A token per user is not a vault

Both MCP and the direct API give you a credential per user. Neither gives you a vault, rotation logic, or a revocation flow. A B2B incident agent serving 60 engineers across 12 customer orgs holds 60 Axiom OAuth sessions on the MCP path, or at least 12 advanced API tokens on the API path.

Each one needs encrypted storage, refresh or rotation before expiry, and revocation when an engineer leaves. Shared credentials are a single-user solution. They do not survive a second user. The token type differs between paths; the infrastructure required does not.

Where Scalekit fits

Scalekit's Axiom MCP connector runs each user's OAuth flow once, then stores and refreshes the tokens in a vault encrypted with a per-environment key. Your agent calls tools by user identifier, and credentials never touch the agent runtime. For the API gaps, a custom Scalekit connector stores each user's advanced API token and injects it through the API proxy. The MCP vs API decision doesn't change your auth infrastructure.

Recommended reading: What is a token vault? Secure credential management for AI agent workflows

Building the Axiom agent with Scalekit

The build below uses Python and LangChain. It follows the order that matters for a per-user agent: retrieve the tools this user's connected account can call, narrow them to what the agent role needs, then execute. It then fills the API gaps through the proxy and serves the same tools from a Virtual MCP server. Full tool reference: Axiom MCP connector docs.

Install and configure

Create an Axiom MCP connection in AgentKit > Connections. Scalekit's OAuth credentials are available for Axiom, so you don't register an OAuth app. The name you give the connection is the connection_name your code passes, and it must match the dashboard exactly. That mismatch is the most common integration error. The samples use axiommcp.

pip install scalekit-sdk-python python-dotenv langchain-openai "langchain-mcp-adapters>=0.3,<1"
# .env (values from app.scalekit.com > Developers > API Credentials) SCALEKIT_ENVIRONMENT_URL=<your-environment-url> SCALEKIT_CLIENT_ID=<your-client-id> SCALEKIT_CLIENT_SECRET=<your-client-secret> OPENAI_API_KEY=<your-openai-key>

Connect the user once

Each user authorizes Axiom one time through a Scalekit link. After that, Scalekit holds and refreshes their token. Use a stable internal ID as the identifier, not an email, because it appears in tool call logs.

import os from dotenv import load_dotenv from scalekit import ScalekitClient load_dotenv() scalekit_client = ScalekitClient( env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"), client_id=os.getenv("SCALEKIT_CLIENT_ID"), client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"), ) actions = scalekit_client.actions CONNECTION_NAME = "axiommcp" # must match AgentKit > Connections exactly identifier = "user_123" # your app's stable user ID account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier ).connected_account if account.status != "ACTIVE": link = actions.get_authorization_link( connection_name=CONNECTION_NAME, identifier=identifier ) print("Authorize Axiom:", link.link) input("Press Enter after authorizing...") account = actions.get_or_create_connected_account( connection_name=CONNECTION_NAME, identifier=identifier ).connected_account if account.status != "ACTIVE": raise RuntimeError(f"Axiom is {account.status}, not ACTIVE. Authorize and run again.")

Retrieve the tools this user can call

The agent does not load a flat connector catalog here. list_scoped_tools returns the tools this user's connected account is authorized to call, with each tool's schema and its read_only_hint and destructive_hint annotations. Those annotations let you build the agent's surface from data instead of a hand-maintained list.

from google.protobuf.json_format import MessageToDict from scalekit.v1.tools.tools_pb2 import ScopedToolFilter definitions = [] page_token = None while True: page, _ = actions.tools.list_scoped_tools( identifier=identifier, filter=ScopedToolFilter(connection_names=[CONNECTION_NAME]), page_size=100, page_token=page_token, ) definitions += [MessageToDict(t.tool)["definition"] for t in page.tools] page_token = page.next_page_token if not page_token: break read_only = [d["name"] for d in definitions if d.get("annotations", {}).get("read_only_hint")] destructive = [d["name"] for d in definitions if d.get("annotations", {}).get("destructive_hint")] print(f"{len(definitions)} tools, {len(read_only)} read-only, {len(destructive)} destructive")

Scope the agent to read-only investigation

An investigation agent needs to query and inspect, never to delete a monitor. Pass only the read-only names to actions.langchain.get_tools, which returns native LangChain StructuredTool objects backed by execute_tool. The guard matters: an empty name filter would load every tool on the connection.

from langchain_openai import ChatOpenAI if not read_only: raise RuntimeError("No read-only Axiom tools found; refusing to load the full tool surface.") tools = actions.langchain.get_tools( identifier=identifier, connection_names=[CONNECTION_NAME], tool_names=read_only, # create, update and delete tools never reach the model page_size=100, ) tool_map = {t.name: t for t in tools} llm = ChatOpenAI(model="gpt-4o").bind_tools(tools)

Run the agent loop

The system prompt encodes the one sequencing rule Axiom's tools depend on. Errors and unknown tool names go back to the model as tool results, so it can correct its APL and retry.

from langchain_core.messages import HumanMessage, SystemMessage, ToolMessage messages = [ SystemMessage( "You investigate production issues in Axiom. Call axiommcp_list_datasets first. " "Use APL tools for events and traces datasets and metrics tools for otel-metrics-v1 " "datasets. Inspect fields before writing a query." ), HumanMessage("Which monitors are firing, and what do the logs show for the last 30 minutes?"), ] while True: response = llm.invoke(messages) messages.append(response) if not response.tool_calls: print(response.content) break for tc in response.tool_calls: tool = tool_map.get(tc["name"]) result = tool.invoke(tc["args"]) if tool else f"Tool {tc['name']} is not available." messages.append(ToolMessage(content=str(result), tool_call_id=tc["id"]))

Register Axiom's REST API as a custom connector

Scalekit's catalog ships the Axiom MCP connector, not a REST one, so the API path uses a custom connector. A BEARER auth pattern lets each user supply their own advanced API token, which Scalekit stores and attaches to proxied calls. Create it once per environment, then create a connection for it in the dashboard.

TOKEN=$(curl -sS "$SCALEKIT_ENVIRONMENT_URL/oauth/token" \ -d grant_type=client_credentials \ -d client_id="$SCALEKIT_CLIENT_ID" \ -d client_secret="$SCALEKIT_CLIENT_SECRET" | jq -r .access_token) curl --fail-with-body -sS "$SCALEKIT_ENVIRONMENT_URL/api/v1/custom-providers" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{ "display_name": "Axiom API", "description": "Axiom REST API with a per-user advanced API token", "auth_patterns": [ { "type": "BEARER", "display_name": "Axiom API token", "description": "Advanced API token with query access to specific datasets", "fields": [ { "field_name": "token", "label": "Axiom API token", "input_type": "password", "hint": "Advanced API token, query permission only", "required": true } ] } ], "proxy_url": "https://api.axiom.co", "proxy_enabled": true }'

Collect each user's API token

The user authorizes the API connection the same way. For a BEARER connector, Scalekit's hosted page collects the token instead of running OAuth, and the token goes into the vault, not your database.

API_CONNECTION = "axiom-api" # must match AgentKit > Connections exactly api_account = actions.get_or_create_connected_account( connection_name=API_CONNECTION, identifier=identifier ).connected_account if api_account.status != "ACTIVE": link = actions.get_authorization_link(connection_name=API_CONNECTION, identifier=identifier) raise SystemExit(f"Ask the user to add their Axiom API token: {link.link}")

Query through the proxy

actions.request sends the call with that user's token, and the path is relative to the connector's proxy_url. This global query endpoint routes results through US East 1. For EU residency, register a second connector whose proxy_url is your edge deployment's domain and call Axiom's edge query endpoint instead.

response = actions.request( connection_name=API_CONNECTION, identifier=identifier, method="POST", path="/v1/datasets/_apl", query_params={"format": "tabular"}, body={ # Replace app-logs with a dataset the user's token can query "apl": "['app-logs'] | where level == 'error' | summarize count() by bin(_time, 5m)", "startTime": "now-1h", "endTime": "now", }, ) if response.status_code == 429: # Cost cap sets Retry-After; request rate limits set X-RateLimit-Reset print("Throttled:", response.headers.get("Retry-After"), response.headers.get("X-RateLimit-Reset")) elif response.status_code == 403: print("Token is invalid or lacks query permission on this dataset") else: response.raise_for_status() result = response.json() print([f["name"] for f in result["tables"][0]["fields"]], result["status"]["rowsMatched"])

Or serve it from a Virtual MCP server

If your agent already speaks MCP, a Virtual MCP server replaces the steps above with a fixed URL. You create one server per agent role, and it exposes only the tools you list, across one or more connections. Every user shares the URL; a session token minted per run binds it to one user's connected accounts. The endpoint is static; the identity is not.

from scalekit.actions.models.mcp_config import McpConfigConnectionToolMapping # Run once per agent role, not once per user config = actions.mcp.create_config( name="axiom-incident-investigator", description="Read-only Axiom investigation plus a Slack summary", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="axiommcp", tools=[ "axiommcp_check_monitors", "axiommcp_get_monitor_history", "axiommcp_list_datasets", "axiommcp_get_dataset_fields", "axiommcp_query_dataset", ], ), McpConfigConnectionToolMapping( connection_name="slack", # your Slack connection name; drop this mapping if you have none tools=["slack_send_message"], ), ], ).config print(config.id, config.mcp_server_url) # store both in your configuration

Mint a session token before each run

Before each run, confirm every connection on the server is active for this user, then mint a token. Session tokens last between 60 seconds and 24 hours, default to one hour, and can't be refreshed. That is the multi-tenant guarantee: one user's run can't act with another user's credentials.

from datetime import timedelta MCP_CONFIG_ID = os.environ["SCALEKIT_MCP_CONFIG_ID"] MCP_SERVER_URL = os.environ["SCALEKIT_MCP_SERVER_URL"] state = actions.mcp.list_mcp_connected_accounts( config_id=MCP_CONFIG_ID, identifier=identifier, include_auth_link=True ) pending = [ a for a in state.connected_accounts if (a.connected_account_status or "").upper() != "ACTIVE" ] if pending: for a in pending: print(f"{a.connection_name}: {a.authentication_link}") # links expire quickly raise SystemExit("Authorize the connections above, then run again.") session = actions.mcp.create_session_token( mcp_config_id=MCP_CONFIG_ID, identifier=identifier, expiry=timedelta(minutes=30), )

Connect LangChain to the server

LangChain reaches the server through langchain-mcp-adapters with the session token as a bearer header. The agent sees five Axiom tools, one Slack tool and Scalekit's connect_account helper, not 26 Axiom tools plus Slack's full catalog. The fix for tool bloat is not better prompting. It is surface reduction.

import asyncio from langchain_core.messages import HumanMessage, ToolMessage from langchain_mcp_adapters.client import MultiServerMCPClient from langchain_openai import ChatOpenAI async def run_incident_agent(question: str) -> None: client = MultiServerMCPClient( { "scalekit": { "transport": "streamable_http", "url": MCP_SERVER_URL, "headers": {"Authorization": f"Bearer {session.token}"}, } } ) mcp_tools = await client.get_tools() mcp_tool_map = {t.name: t for t in mcp_tools} mcp_llm = ChatOpenAI(model="gpt-4o").bind_tools(mcp_tools) history = [HumanMessage(question)] while True: reply = await mcp_llm.ainvoke(history) history.append(reply) if not reply.tool_calls: print(reply.content) break for tc in reply.tool_calls: tool = mcp_tool_map.get(tc["name"]) try: output = await tool.ainvoke(tc["args"]) if tool else f"Unknown tool {tc['name']}" except Exception as err: # MCP tool errors surface as exceptions output = f"Tool error: {err}" history.append(ToolMessage(content=str(output), tool_call_id=tc["id"])) asyncio.run(run_incident_agent( "Check which Axiom monitors are firing, pull the related errors from the last " "30 minutes, and post a three-line summary to #incidents." ))

Observability for multi-tool and multi-tenant agents

Axiom sees a member running queries. It doesn't see which of your users triggered the agent run, or what else that run touched. Scalekit records the agent side of that story.

Tool call logs per connected account

Every tool call Scalekit executes on a user's connected account appears in AgentKit > Logs: tool name, connection, connected account, identifier, status, error code, duration and time, kept for 90 days. Logs never contain a tool's successful response, so APL results from your customers' Axiom orgs don't land in a second store. Leave Store connector error details off unless you're debugging, because error bodies can include app data.

Stream tool calls to your SIEM

Log streaming pushes a connected_account.tool_executed event per call to Datadog, CrowdStrike or Google SecOps, alongside connected account events such as connected_account.token_refresh_failed. Each tool event carries tool_name, tool_execution_id, duration, connected_account_identifier, connection_name, status and error code, plus agent_id and agent_run_id when known. A failed refresh on one user's Axiom connection becomes an alert before the agent fails mid-incident. Availability depends on plan; setup is in the log streaming docs.

Why it compounds across connectors

An incident agent rarely stops at Axiom. Add PagerDuty tools to the server above, and one run reads the page, queries Axiom, and posts to Slack. With direct integrations, you correlate three vendors' logs by timestamp. With one Virtual MCP server and one session token per run, every call across all three connections lands in one log, keyed to the same user identifier. That answers the question an enterprise security review asks: which user's agent did what, in which tool, with whose credentials.

Recommended reading: Agent tool observability: is your agent actually working?

Which one to build against

If your agent is an engineer-facing investigator in an IDE or chat assistant, start on Axiom's MCP server: OAuth per user, Axiom-maintained tools and prompts, and a surface that keeps growing. Scope it to read tools before anything else.

If your agent writes events, serves customers on a non-US edge, or runs headless on a budget, build those paths on the API with dedicated, cost-capped advanced tokens. Most production Axiom agents end up using both: MCP for investigation, the API for ingest and region-bound queries. The credential management problem is the same either way, and that's what needs production-grade infrastructure.

FAQs

Does Axiom have an official MCP server?

Yes. Axiom hosts a remote MCP server over Streamable HTTP and recommends OAuth, where the user signs in through the browser and the session acts as that user. Header auth with a personal access token exists for clients that cannot run OAuth, and a local server can run with an API token.

Is the Axiom MCP server read-only?

No. An older overview still calls it read-only, but the current tools reference includes create, update and delete tools for dashboards, monitors and notifiers. An agent connected to the full server could silence an alert by deleting or editing the monitor behind it, so scope the tools before the agent sees them.

What can the Axiom API do that MCP cannot?

The REST API ingests events, writes annotations, manages saved queries, views, virtual fields and dataset lifecycle, and administers API tokens, roles, users and orgs. An agent that records its own decisions or marks deploys on charts needs the API, because MCP has no ingest or annotation tool.

How do Axiom query cost caps apply to agents?

Axiom caps query spend in dollars per hour and per day. On the API the cap sits on each token, so every agent token gets its own budget. On remote MCP the OAuth session acts as the user, so caps sit on roles and also cover that member's console queries. An exceeded cap returns a 429 with a retry time.

Where does an Axiom agent's query data travel?

Axiom states the hosted MCP server runs in the US, so query results route through US infrastructure, and the API's global query endpoint also routes through US East. Only the edge query endpoints keep results inside the deployment where the data lives, so region-bound agents belong on the API's edge endpoints.

How does Scalekit connect an AI agent to Axiom?

Scalekit's Axiom MCP connector runs each user's OAuth flow once, stores and refreshes the tokens in a vault, and returns only the tools that user can call, which you narrow to read-only ones. A custom connector stores each user's advanced API token for the gaps, and a virtual MCP server serves a curated tool set per agent role.

Build your Axiom agent on Scalekit

Start from the Scalekit Axiom MCP connector and its connector docs. For a working starting point, adapt the incident response agent template or the DevOps assistant agent template to put Axiom alongside PagerDuty, Slack and Linear. Plans and the free tier are on the pricing page.

Building an Axiom agent and want help with tool scoping, tenant isolation or the API gaps? Talk to us for immediate help from an engineer.

Related reading

These posts go deeper on the patterns used above.

No items found.
On this page
Share this article
Scalekit
Find us on ProductHunt

Acquire enterprise customers with
‍zero upfront cost.

Every feature unlocked. No hidden fees.