Axiom's MCP server makes the full Axiom experience available to agents. Query your data, build dashboards, and set up monitors — all through natural language prompts with your preferred agentic client.
Protocol
MCP 2025-11-25
Server version
0.1.3
Supports
Tools
Prompts
Overall score
B
Overall quality score: 84 out of 10084/100
Server metadata
3 of 8 fields30/1003 / 10 pts
Identity, discovery, and usage metadata advertised during the MCP handshake.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description98/100
Search official Axiom documentation and return the top matching pages as Markdown with source URLs. Use when you need current product details, unfamiliar APL/MPL syntax, troubleshooting guidance, or requested documentation. Use specific keywords to narrow results. Reuse relevant pages already in context and cite their URLs when relying on them. Call readAxiomDoc with a known page path or a linked .md URL to read another page. Each page defaults to a 12,000-character excerpt; set truncate: false to read the complete fetched pages.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Maximum number of matching docs pages to open and return (default 3).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
query
Natural-language or keyword query against Axiom product docs (APL, MPL, monitors, ingest, API, Console).
Clear enough to supply this argument.
truncate
Return page excerpts by default. Set false for complete page contents. The search limit still controls how many pages are fetched, and fetch size limits still apply.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "searchAxiomDocs",
"description": "Search official Axiom documentation and return the top matching pages as Markdown with source URLs. Use when you need current product details, unfamiliar APL/MPL syntax, troubleshooting guidance, or requested documentation. Use specific keywords to narrow results. Reuse relevant pages already in context and cite their URLs when relying on them. Call readAxiomDoc with a known page path or a linked .md URL to read another page. Each page defaults to a 12,000-character excerpt; set truncate: false to read the complete fetched pages.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 5,
"minimum": 1,
"description": "Maximum number of matching docs pages to open and return (default 3)."
},
"query": {
"type": "string",
"maxLength": 512,
"minLength": 1,
"description": "Natural-language or keyword query against Axiom product docs (APL, MPL, monitors, ingest, API, Console)."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Return page excerpts by default. Set false for complete page contents. The search limit still controls how many pages are fetched, and fetch size limits still apply."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search Axiom Docs",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Read one official Axiom docs page as Markdown with its source URL. Pass a path or URL under axiom.co/docs, preferably a .md URL returned by searchAxiomDocs. Use searchAxiomDocs when you do not know the page path. Reuse relevant pages already in context and cite the source URL when relying on this page. Pages default to a 12,000-character excerpt; set truncate: false to read the complete fetched page.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
path
Docs page path or URL under axiom.co/docs, for example /docs/getting-started.md or https://axiom.co/docs/apl/overview.md.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
truncate
Return a page excerpt by default. Set false for the complete page contents. Fetch size limits still apply.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "readAxiomDoc",
"description": "Read one official Axiom docs page as Markdown with its source URL. Pass a path or URL under axiom.co/docs, preferably a .md URL returned by searchAxiomDocs. Use searchAxiomDocs when you do not know the page path. Reuse relevant pages already in context and cite the source URL when relying on this page. Pages default to a 12,000-character excerpt; set truncate: false to read the complete fetched page.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"maxLength": 1024,
"minLength": 1,
"description": "Docs page path or URL under axiom.co/docs, for example /docs/getting-started.md or https://axiom.co/docs/apl/overview.md."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Return a page excerpt by default. Set false for the complete page contents. Fetch size limits still apply."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Read Axiom Doc",
"readOnlyHint": true,
"openWorldHint": true,
"idempotentHint": true,
"destructiveHint": false
}
}
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "listOrganizations",
"description": "List organizations the current credentials can access. Use an id as orgId on other tools to override the session's default organization.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
},
"annotations": {
"title": "List Organizations",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description69/100
List all available datasets with exact, unquoted names. Tools by dataset kind:
- events / otel.traces / other: getDatasetFields() for fields (set includeMetadata: true for dataset metadata); queryDataset() for APL queries; runSpotlight() for differences between event populations, with automatic field discovery or an explicit field list.
- otel:metrics:v1 / otel-metrics-v1: getDatasetFields({ datasetName, includeMetadata: true }) for dataset metadata; listMetrics(), queryMetrics(), searchMetrics(), listMetricTags(), and getMetricTagValues() for metrics. queryDataset() and runSpotlight() do not support metrics.
Datasets with the same "correlationGroup" are linked for cross-signal investigation (logs, traces, metrics). When investigating one dataset, query the others listed under the same group in correlation-groups.csv below.
Describe the returned information so the agent knows whether it will answer the request.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "listDatasets",
"description": "List all available datasets with exact, unquoted names. Tools by dataset kind:\n- events / otel.traces / other: getDatasetFields() for fields (set includeMetadata: true for dataset metadata); queryDataset() for APL queries; runSpotlight() for differences between event populations, with automatic field discovery or an explicit field list.\n- otel:metrics:v1 / otel-metrics-v1: getDatasetFields({ datasetName, includeMetadata: true }) for dataset metadata; listMetrics(), queryMetrics(), searchMetrics(), listMetricTags(), and getMetricTagValues() for metrics. queryDataset() and runSpotlight() do not support metrics.\n\nDatasets with the same \"correlationGroup\" are linked for cross-signal investigation (logs, traces, metrics). When investigating one dataset, query the others listed under the same group in correlation-groups.csv below.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Datasets",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Create a new dataset in the current organization (POST /v2/datasets). Use this when the user asks to create a dataset or when a needed dataset does not exist yet. Does not create API tokens.
Kinds (optional `kind`, defaults to axiom:events:v1) — same two options as the Axiom Console:
- axiom:events:v1 (Events) — logs or traces; getDatasetFields() for fields, queryDataset() for APL queries.
- otel:metrics:v1 (Metrics) — OTel metrics; getDatasetFields({ datasetName, includeMetadata: true }) for dataset metadata, listMetrics() and queryMetrics() for metrics.
Optional `retentionDays`: custom retention period in days. Omit to use the organization default. Subject to plan limits.
Dataset names must be 1-80 characters, start and end with a letter or number, and may contain letters, numbers, underscores, dots, and hyphens. Ingest requires a separate API token created in the Axiom UI.
The description explains the capability, when to use it, and what to expect.
Inputs85/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
description
Optional human-readable description for the dataset.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
kind
Dataset kind. Defaults to "axiom:events:v1" (Events — logs/traces). Use "otel:metrics:v1" for Metrics.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
name
Unique dataset name (1-80 characters). Must start and end with a letter or number; may contain letters, numbers, underscores, dots, and hyphens.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
retentionDays
Optional custom retention period in days. Omit to use the organization default. Subject to plan limits — values longer than the plan allows are rejected.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "createDataset",
"description": "Create a new dataset in the current organization (POST /v2/datasets). Use this when the user asks to create a dataset or when a needed dataset does not exist yet. Does not create API tokens.\n\nKinds (optional `kind`, defaults to axiom:events:v1) — same two options as the Axiom Console:\n- axiom:events:v1 (Events) — logs or traces; getDatasetFields() for fields, queryDataset() for APL queries.\n- otel:metrics:v1 (Metrics) — OTel metrics; getDatasetFields({ datasetName, includeMetadata: true }) for dataset metadata, listMetrics() and queryMetrics() for metrics.\n\nOptional `retentionDays`: custom retention period in days. Omit to use the organization default. Subject to plan limits.\n\nDataset names must be 1-80 characters, start and end with a letter or number, and may contain letters, numbers, underscores, dots, and hyphens. Ingest requires a separate API token created in the Axiom UI.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"kind": {
"enum": [
"axiom:events:v1",
"otel:metrics:v1"
],
"type": "string",
"default": "axiom:events:v1",
"description": "Dataset kind. Defaults to \"axiom:events:v1\" (Events — logs/traces). Use \"otel:metrics:v1\" for Metrics."
},
"name": {
"type": "string",
"pattern": "^[a-zA-Z0-9]([a-zA-Z0-9_.-]*[a-zA-Z0-9])?$",
"maxLength": 80,
"minLength": 1,
"description": "Unique dataset name (1-80 characters). Must start and end with a letter or number; may contain letters, numbers, underscores, dots, and hyphens."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"description": {
"type": "string",
"maxLength": 255,
"description": "Optional human-readable description for the dataset."
},
"retentionDays": {
"type": "integer",
"description": "Optional custom retention period in days. Omit to use the organization default. Subject to plan limits — values longer than the plan allows are rejected.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Dataset",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get observed field names, types, and descriptions as CSV for an events or traces dataset. Set includeMetadata: true to also return complete dataset metadata. Metadata and guidance are compact JSON. Metrics datasets return guidance instead of fields; for metric definitions and dimensions, use listMetrics() and listMetricTags().
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
includeMetadata
Include complete dataset metadata alongside fields. Also applies to metrics datasets.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getDatasetFields",
"description": "Get observed field names, types, and descriptions as CSV for an events or traces dataset. Set includeMetadata: true to also return complete dataset metadata. Metadata and guidance are compact JSON. Metrics datasets return guidance instead of fields; for metric definitions and dimensions, use listMetrics() and listMetricTags().",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
},
"includeMetadata": {
"type": "boolean",
"default": false,
"description": "Include complete dataset metadata alongside fields. Also applies to metrics datasets."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Dataset Fields",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
# Instructions
1. Query Axiom datasets using Axiom Processing Language (APL). The query must be a valid APL query string.
For comparative investigations, use runSpotlight() to discover distinguishing dimensions or investigate a shortlist; it handles field eligibility and query batching. Use queryDataset() to verify leads with focused counts and rates, or to write a custom comparison.
**Only use this for `events`, `otel.traces`, and similar datasets. Do NOT use for `otel-metrics-v1` datasets — use `queryMetrics()` instead.**
2. ALWAYS understand schema before substantive queries—do not guess column names or types. Prefer `getDatasetFields()` or APL
`| where _time > ago(5m) | getschema` on a narrow window (use dataset names from `listDatasets`); use `take 1` or project specific columns for sample values.
Before you `where` or `summarize` by a field, estimate cardinality on recent data: `| where _time > ago(5m) | summarize count() by <field> | top 10 by count_`.
Avoid `project *` or projecting all fields on very wide datasets unless deliberately mapping shape (see item 5). Skipping probes causes wrong field names, bad types, and expensive re-runs.
3. Keep in mind that there's a maximum row limit of 65000 rows per query.
4. Prefer aggregations over non aggregating queries when possible to reduce the amount of data returned.
5. Be selective in what you project in each query (unless otherwise needed, like for discovering the schema). It's expensive to project all fields.
6. ALWAYS restrict `startTime`/`endTime` to the narrowest window that answers the question—every query scans data and consumes resources.
Prefer the smallest APL per step; widen time or complexity only after probing (item 2).
7. When filtering for a specific term or value, put it on the right field—use `has`/`has_cs`/`contains` there after item 2. See **Avoid `search`** under Query performance rules.
8. **`map[string]` columns (e.g. `attributes`, `attributes.custom`, `resource` in OTel-style data)** — `getDatasetFields` and
in-query `getschema` show the type but **not** the keys inside the map. You must **sample** (`take`, `project` the map
column, or `mv-expand` + `summarize` to list keys) to learn the structure, then use bracket access
(e.g. `['attributes']['http.method']`, `['attributes.custom']['http.response.status_code']`). Do not assume key names
across services or SDK versions.
9. Query cost limits may apply to your credentials. When configured, each result ends with a budget footer (query cost and remaining hourly/daily budget, in GB-hours — GBhr, the unit limits are enforced in) — heed its warnings.
Exceeding a limit rejects further queries until the window resets (fixed UTC hour/day boundaries); the error says when.
10. Use searchAxiomDocs() or readAxiomDoc() to verify unfamiliar APL operators, functions, or product behavior before querying.
### Query performance rules
1. **Narrow `startTime`/`endTime`** — These bound how much data is scanned. Do not rely on in-query `_time` filters alone; keep the API window as tight as your question allows.
2. **`_time` first in APL** — When you filter on `_time` in the query text, put `where _time between (...)` before other filters. This keeps extra in-query narrowing fast.
3. **Most selective `where` first** — Axiom does not reorder predicates; put the filter that removes the most rows earliest.
4. **`project` early and narrowly** — Avoid pulling all columns from very wide datasets (expensive payloads; risk of failures on huge rows).
5. **Prefer fast string ops** — Use `_cs` (case-sensitive) variants when possible; prefer `startswith`/`endswith` over `contains` when applicable; `matches regex` only as a last resort.
6. **Use `has`/`has_cs` for unique-looking strings** — IDs, UUIDs, trace IDs, error codes, session tokens. `has` leverages full-text indexes when available and is much faster than `contains` for high-entropy terms. Use `contains` only when you need true substring matching (e.g., partial paths).
7. **Duration literals** — e.g. `duration > 10s`, not manual conversion.
8. **Avoid search** — scans ALL fields. Use `has`/`has_cs`/`contains` on specific fields.
9. **Avoid heavy `parse_json()` in hot paths** — Filter/narrow first when possible.
10. **Avoid pack(*)** — creates dict of ALL fields per row. Use pack with named fields only.
11. Limit results—use take 10 or top 20 instead of default 1000 when exploring.
12. **Field quoting**—quote identifiers with dots/dashes/spaces: ['geo.country']. For map field keys, use index notation: ['attributes.custom']['http.protocol'].
# Examples
Basic:
- Filter: ['logs'] | where ['severity'] == "error" or ['duration'] > 500ms
- Time range: ['logs'] | where ['_time'] > ago(2h) and ['_time'] < now()
- Project rename: ['logs'] | project-rename responseTime=['duration'], path=['url']
Aggregations:
- Count by: ['logs'] | summarize count() by bin(['_time'], 5m), ['status']
- Multiple aggs: ['logs'] | summarize count(), avg(['duration']), max(['duration']), p95=percentile(['duration'], 95) by ['endpoint']
- Compare populations: use runSpotlight() for discovery and focused comparisons; for custom APL, ['logs'] | summarize spotlight(['isError'], ['endpoint'])
- Histograms: ['logs'] | summarize histogram(['responseTime'], 100) by ['endpoint']
- Distinct: ['logs'] | summarize dcount(['userId']) by bin_auto(['_time'])
Text matching & Parse:
- Match on known fields (avoid full-row `search`): ['logs'] | where ['message'] has_cs "error" or ['message'] has_cs "exception"
- Parse logs: ['logs'] | parse-kv ['message'] as (duration:long, error:string) with (pair_delimiter=",")
- Regex extract: ['logs'] | extend errorCode = extract("error code ([0-9]+)", 1, ['message'])
- Contains ops: ['logs'] | where ['message'] contains_cs "ERROR" or ['message'] startswith "FATAL"
Data Shaping:
- Extend & Calculate: ['logs'] | extend duration_s = ['duration']/1000, success = ['status'] < 400
- Dynamic: ['logs'] | extend props = parse_json(['properties']) | where ['props.level'] == "error"
- Pack/Unpack: ['logs'] | extend fields = pack("status", ['status'], "duration", ['duration'])
- Arrays: ['logs'] | where ['url'] in ("login", "logout", "home") | where array_length(['tags']) > 0
Advanced:
- Union: union ['logs-app*'] | where ['severity'] == "error"
- Case: ['logs'] | extend level = case(['status'] >= 500, "error", ['status'] >= 400, "warn", "info")
Time Operations:
- Bin & Range: ['logs'] | where ['_time'] between(datetime(2024-01-01)..now())
- Multiple time bins: ['logs'] | summarize count() by bin(['_time'], 1h), bin(['_time'], 1d)
- Time shifts: ['logs'] | extend prev_hour = ['_time'] - 1h
String Operations:
- String funcs: ['logs'] | extend domain = tolower(extract("://([^/]+)", 1, ['url']))
- Concat: ['logs'] | extend full_msg = strcat(['level'], ": ", ['message'])
- Replace: ['logs'] | extend clean_msg = replace_regex("(password=)[^&]*", "\1***", ['message'])
Common Patterns:
- Error analysis: ['logs'] | where ['severity'] == "error" | summarize error_count=count() by ['error_code'], ['service']
- Status codes: ['logs'] | summarize requests=count() by ['status'], bin_auto(['_time']) | where ['status'] >= 500
- Latency tracking: ['logs'] | summarize p50=percentile(['duration'], 50), p90=percentile(['duration'], 90) by ['endpoint']
- User activity: ['logs'] | summarize user_actions=count() by ['userId'], ['action'], bin(['_time'], 1h)
The description explains the capability, when to use it, and what to expect.
Inputs80/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
apl
The APL query to execute
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "queryDataset",
"description": "# Instructions\n1. Query Axiom datasets using Axiom Processing Language (APL). The query must be a valid APL query string.\n For comparative investigations, use runSpotlight() to discover distinguishing dimensions or investigate a shortlist; it handles field eligibility and query batching. Use queryDataset() to verify leads with focused counts and rates, or to write a custom comparison.\n **Only use this for `events`, `otel.traces`, and similar datasets. Do NOT use for `otel-metrics-v1` datasets — use `queryMetrics()` instead.**\n2. ALWAYS understand schema before substantive queries—do not guess column names or types. Prefer `getDatasetFields()` or APL\n `| where _time > ago(5m) | getschema` on a narrow window (use dataset names from `listDatasets`); use `take 1` or project specific columns for sample values.\n Before you `where` or `summarize` by a field, estimate cardinality on recent data: `| where _time > ago(5m) | summarize count() by <field> | top 10 by count_`.\n Avoid `project *` or projecting all fields on very wide datasets unless deliberately mapping shape (see item 5). Skipping probes causes wrong field names, bad types, and expensive re-runs.\n3. Keep in mind that there's a maximum row limit of 65000 rows per query.\n4. Prefer aggregations over non aggregating queries when possible to reduce the amount of data returned.\n5. Be selective in what you project in each query (unless otherwise needed, like for discovering the schema). It's expensive to project all fields.\n6. ALWAYS restrict `startTime`/`endTime` to the narrowest window that answers the question—every query scans data and consumes resources.\n Prefer the smallest APL per step; widen time or complexity only after probing (item 2).\n7. When filtering for a specific term or value, put it on the right field—use `has`/`has_cs`/`contains` there after item 2. See **Avoid `search`** under Query performance rules.\n8. **`map[string]` columns (e.g. `attributes`, `attributes.custom`, `resource` in OTel-style data)** — `getDatasetFields` and\n in-query `getschema` show the type but **not** the keys inside the map. You must **sample** (`take`, `project` the map\n column, or `mv-expand` + `summarize` to list keys) to learn the structure, then use bracket access\n (e.g. `['attributes']['http.method']`, `['attributes.custom']['http.response.status_code']`). Do not assume key names\n across services or SDK versions.\n9. Query cost limits may apply to your credentials. When configured, each result ends with a budget footer (query cost and remaining hourly/daily budget, in GB-hours — GBhr, the unit limits are enforced in) — heed its warnings.\n Exceeding a limit rejects further queries until the window resets (fixed UTC hour/day boundaries); the error says when.\n10. Use searchAxiomDocs() or readAxiomDoc() to verify unfamiliar APL operators, functions, or product behavior before querying.\n\n### Query performance rules\n\n1. **Narrow `startTime`/`endTime`** — These bound how much data is scanned. Do not rely on in-query `_time` filters alone; keep the API window as tight as your question allows.\n2. **`_time` first in APL** — When you filter on `_time` in the query text, put `where _time between (...)` before other filters. This keeps extra in-query narrowing fast.\n3. **Most selective `where` first** — Axiom does not reorder predicates; put the filter that removes the most rows earliest.\n4. **`project` early and narrowly** — Avoid pulling all columns from very wide datasets (expensive payloads; risk of failures on huge rows).\n5. **Prefer fast string ops** — Use `_cs` (case-sensitive) variants when possible; prefer `startswith`/`endswith` over `contains` when applicable; `matches regex` only as a last resort.\n6. **Use `has`/`has_cs` for unique-looking strings** — IDs, UUIDs, trace IDs, error codes, session tokens. `has` leverages full-text indexes when available and is much faster than `contains` for high-entropy terms. Use `contains` only when you need true substring matching (e.g., partial paths).\n7. **Duration literals** — e.g. `duration > 10s`, not manual conversion.\n8. **Avoid search** — scans ALL fields. Use `has`/`has_cs`/`contains` on specific fields.\n9. **Avoid heavy `parse_json()` in hot paths** — Filter/narrow first when possible.\n10. **Avoid pack(*)** — creates dict of ALL fields per row. Use pack with named fields only.\n11. Limit results—use take 10 or top 20 instead of default 1000 when exploring.\n12. **Field quoting**—quote identifiers with dots/dashes/spaces: ['geo.country']. For map field keys, use index notation: ['attributes.custom']['http.protocol'].\n\n# Examples\nBasic:\n- Filter: ['logs'] | where ['severity'] == \"error\" or ['duration'] > 500ms\n- Time range: ['logs'] | where ['_time'] > ago(2h) and ['_time'] < now()\n- Project rename: ['logs'] | project-rename responseTime=['duration'], path=['url']\n\nAggregations:\n- Count by: ['logs'] | summarize count() by bin(['_time'], 5m), ['status']\n- Multiple aggs: ['logs'] | summarize count(), avg(['duration']), max(['duration']), p95=percentile(['duration'], 95) by ['endpoint']\n- Compare populations: use runSpotlight() for discovery and focused comparisons; for custom APL, ['logs'] | summarize spotlight(['isError'], ['endpoint'])\n- Histograms: ['logs'] | summarize histogram(['responseTime'], 100) by ['endpoint']\n- Distinct: ['logs'] | summarize dcount(['userId']) by bin_auto(['_time'])\n\nText matching & Parse:\n- Match on known fields (avoid full-row `search`): ['logs'] | where ['message'] has_cs \"error\" or ['message'] has_cs \"exception\"\n- Parse logs: ['logs'] | parse-kv ['message'] as (duration:long, error:string) with (pair_delimiter=\",\")\n- Regex extract: ['logs'] | extend errorCode = extract(\"error code ([0-9]+)\", 1, ['message'])\n- Contains ops: ['logs'] | where ['message'] contains_cs \"ERROR\" or ['message'] startswith \"FATAL\"\n\nData Shaping:\n- Extend & Calculate: ['logs'] | extend duration_s = ['duration']/1000, success = ['status'] < 400\n- Dynamic: ['logs'] | extend props = parse_json(['properties']) | where ['props.level'] == \"error\"\n- Pack/Unpack: ['logs'] | extend fields = pack(\"status\", ['status'], \"duration\", ['duration'])\n- Arrays: ['logs'] | where ['url'] in (\"login\", \"logout\", \"home\") | where array_length(['tags']) > 0\n\nAdvanced:\n- Union: union ['logs-app*'] | where ['severity'] == \"error\"\n- Case: ['logs'] | extend level = case(['status'] >= 500, \"error\", ['status'] >= 400, \"warn\", \"info\")\n\nTime Operations:\n- Bin & Range: ['logs'] | where ['_time'] between(datetime(2024-01-01)..now())\n- Multiple time bins: ['logs'] | summarize count() by bin(['_time'], 1h), bin(['_time'], 1d)\n- Time shifts: ['logs'] | extend prev_hour = ['_time'] - 1h\n\nString Operations:\n- String funcs: ['logs'] | extend domain = tolower(extract(\"://([^/]+)\", 1, ['url']))\n- Concat: ['logs'] | extend full_msg = strcat(['level'], \": \", ['message'])\n- Replace: ['logs'] | extend clean_msg = replace_regex(\"(password=)[^&]*\", \"\\1***\", ['message'])\n\nCommon Patterns:\n- Error analysis: ['logs'] | where ['severity'] == \"error\" | summarize error_count=count() by ['error_code'], ['service']\n- Status codes: ['logs'] | summarize requests=count() by ['status'], bin_auto(['_time']) | where ['status'] >= 500\n- Latency tracking: ['logs'] | summarize p50=percentile(['duration'], 50), p90=percentile(['duration'], 90) by ['endpoint']\n- User activity: ['logs'] | summarize user_actions=count() by ['userId'], ['action'], bin(['_time'], 1h)\n",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"apl"
],
"properties": {
"apl": {
"type": "string",
"description": "The APL query to execute"
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Query Dataset",
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description82/100
Read saved/starred APL queries as CSV with name, dataset, full query, author, and end time.
The description explains the capability, when to use it, and what to expect.
Inputs98/100
Input documentation gives an agent enough context to populate the arguments.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Read deployment, incident, and other event annotations to correlate with data changes. Returns annotations, total and omitted counts, and guidance for partial results. Shortened descriptions are marked. A total of zero means no matches.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
datasets
Dataset names to filter annotations by. Omit to include all datasets. Use exact, unquoted names from listDatasets().
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Clear enough to supply this argument.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getAnnotations",
"description": "Read deployment, incident, and other event annotations to correlate with data changes. Returns annotations, total and omitted counts, and guidance for partial results. Shortened descriptions are marked. A total of zero means no matches.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"datasets": {
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
},
"minItems": 1,
"description": "Dataset names to filter annotations by. Omit to include all datasets. Use exact, unquoted names from listDatasets()."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Annotations",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
Use the APL spotlight() aggregation to find dimensions that distinguish a comparison population from its baseline. Use for "what changed?", slow versus normal requests, or errors versus successful requests after identifying a dataset and focused time scope.
Provide datasetName, fixed startTime/endTime, and an APL scalar boolean predicate: true=comparison, false=baseline, null=excluded. Bounds are start inclusive and end exclusive. For a comparison between time intervals, use a predicate over _time and bounds covering both populations. Optional filter applies to both populations. Use fixed RFC3339 timestamps with at most millisecond precision. Expressions cannot contain pipelines, statements, comments, raw/prefixed/adjacent strings, now(), or ago().
Omit fields to explore all eligible dimensions without enumerating the schema yourself; supply exact field names when you already have a shortlist. Both paths read the dataset schema and apply the same eligibility checks. The tool excludes maps, arrays, system time fields, and direct predicate references, quotes identifiers, counts both cohorts once, and runs sequential batches of at most 50 dimensions. Inspect indirect references yourself. It separates null-only and empty typed populations into insufficientData before ranking comparable findings. Each list is independently bounded by limit, with separate totals and omission counts. Categorical values are ordered by combined baseline/comparison frequency, then absolute frequency change, bounded by valueLimit. Prefer relevant dimensions over IDs/free text when narrowing an investigation.
Returns precise JSON typed statistics, raw dimensions plus schema-matched fieldName for reuse in fields, cohort counts, excluded fields, generated APL, diagnostics, query budgets, and coverage of completed/pending fields. Empty cohorts stop after counting. Before each batch, a budget header reporting zero remaining stops the next query. Missing headers do not establish exhaustion. A failed/partial/estimated batch stops execution; findings from completed batches remain available with incomplete coverage. Fixed bounds do not freeze ingestion between queries.
delta_score only ranks leads; scores, p-values, and normalized ratios are not causal confidence or ordinary percent changes. Validate leads with queryDataset counts/rates and an independent window. For otel:metrics:v1 datasets use the metrics tools.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
datasetName
Exact, unquoted events or traces dataset name from listDatasets.
Clear enough to supply this argument.
endTime
Exclusive end of the overall query scope.
Clear enough to supply this argument.
fields
Optional exact, unquoted dimension names for a focused comparison. Omit to let the tool discover all eligible fields. Both paths validate against the schema, exclude ineligible fields, and query batches of at most 50.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
filter
Optional APL scalar boolean expression applied to BOTH cohorts before comparison.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Maximum comparable typed findings returned, ranked by delta_score as a heuristic. A separate insufficientData list uses the same limit.
Clear enough to supply this argument.
predicate
APL scalar boolean expression: true selects comparison, false selects baseline, null excludes the event. Directly referenced fields are excluded from dimensions.
Clear enough to supply this argument.
startTime
Inclusive start of the overall query scope.
Clear enough to supply this argument.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
valueLimit
Maximum categorical differences per result, ordered by combined baseline/comparison frequency, then absolute frequency change. Omitted counts are reported.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "runSpotlight",
"description": "Use the APL spotlight() aggregation to find dimensions that distinguish a comparison population from its baseline. Use for \"what changed?\", slow versus normal requests, or errors versus successful requests after identifying a dataset and focused time scope.\nProvide datasetName, fixed startTime/endTime, and an APL scalar boolean predicate: true=comparison, false=baseline, null=excluded. Bounds are start inclusive and end exclusive. For a comparison between time intervals, use a predicate over _time and bounds covering both populations. Optional filter applies to both populations. Use fixed RFC3339 timestamps with at most millisecond precision. Expressions cannot contain pipelines, statements, comments, raw/prefixed/adjacent strings, now(), or ago().\nOmit fields to explore all eligible dimensions without enumerating the schema yourself; supply exact field names when you already have a shortlist. Both paths read the dataset schema and apply the same eligibility checks. The tool excludes maps, arrays, system time fields, and direct predicate references, quotes identifiers, counts both cohorts once, and runs sequential batches of at most 50 dimensions. Inspect indirect references yourself. It separates null-only and empty typed populations into insufficientData before ranking comparable findings. Each list is independently bounded by limit, with separate totals and omission counts. Categorical values are ordered by combined baseline/comparison frequency, then absolute frequency change, bounded by valueLimit. Prefer relevant dimensions over IDs/free text when narrowing an investigation.\nReturns precise JSON typed statistics, raw dimensions plus schema-matched fieldName for reuse in fields, cohort counts, excluded fields, generated APL, diagnostics, query budgets, and coverage of completed/pending fields. Empty cohorts stop after counting. Before each batch, a budget header reporting zero remaining stops the next query. Missing headers do not establish exhaustion. A failed/partial/estimated batch stops execution; findings from completed batches remain available with incomplete coverage. Fixed bounds do not freeze ingestion between queries.\ndelta_score only ranks leads; scores, p-values, and normalized ratios are not causal confidence or ordinary percent changes. Validate leads with queryDataset counts/rates and an independent window. For otel:metrics:v1 datasets use the metrics tools.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName",
"endTime",
"predicate",
"startTime"
],
"properties": {
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum comparable typed findings returned, ranked by delta_score as a heuristic. A separate insufficientData list uses the same limit."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"fields": {
"type": "array",
"items": {
"type": "string",
"minLength": 1
},
"minItems": 1,
"description": "Optional exact, unquoted dimension names for a focused comparison. Omit to let the tool discover all eligible fields. Both paths validate against the schema, exclude ineligible fields, and query batches of at most 50."
},
"filter": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "Optional APL scalar boolean expression applied to BOTH cohorts before comparison."
},
"endTime": {
"type": "string",
"format": "date-time",
"description": "Exclusive end of the overall query scope."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
},
"predicate": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "APL scalar boolean expression: true selects comparison, false selects baseline, null excludes the event. Directly referenced fields are excluded from dimensions."
},
"startTime": {
"$ref": "#/properties/endTime",
"description": "Inclusive start of the overall query scope."
},
"valueLimit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1,
"description": "Maximum categorical differences per result, ordered by combined baseline/comparison frequency, then absolute frequency change. Omitted counts are reported."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "Exact, unquoted events or traces dataset name from listDatasets."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Run Spotlight",
"readOnlyHint": true,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description73/100
List all available dashboards. Shows user-created dashboards with their metadata.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
Get detailed information about a specific dashboard by UID.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
dashboardUid
The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getDashboard",
"description": "Get detailed information about a specific dashboard by UID.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"dashboardUid"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"dashboardUid": {
"type": "string",
"description": "The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Dashboard",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description80/100
Create a new dashboard from a JSON document. Include name, owner, charts, layout, refreshTime, schemaVersion (2), timeWindowStart, and timeWindowEnd. Add sections with a top-level sections array in display order. Give each section a unique UUID id, a non-empty title, and optional defaultCollapsed. Assign a chart to a section with chart.sectionId set to that section id. Omit sectionId for ungrouped charts. Keep SmartFilter charts ungrouped. owner controls visibility: X-AXIOM-EVERYONE for a shared dashboard visible to all organization members, or me for a private dashboard owned by the current user (the server substitutes the user id). Org API tokens have no user and cannot own a private dashboard; use X-AXIOM-EVERYONE for those. Metrics/MPL charts: set chart.query.mpl to the MPL pipeline text (do not put MPL under chart.query.apl). Events/APL charts: set chart.query.apl.
Describe the returned information so the agent knows whether it will answer the request.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dashboardJson
The full dashboard document as a JSON string. Include name, owner (X-AXIOM-EVERYONE for shared, or me for a private dashboard owned by the signed-in user), charts (array), layout (array), refreshTime (15, 60, or 300), schemaVersion (2), timeWindowStart (e.g. qr-now-1h), and timeWindowEnd (qr-now). Optional: Add sections as an ordered array of {id, title, defaultCollapsed?}. Use a unique UUID for each section id. Assign charts with chart.sectionId. Omit sectionId for ungrouped charts and all SmartFilter charts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
message
Optional audit/change note for this operation.
Clear enough to supply this argument.
uid
Optional custom UID for the dashboard. If omitted, the server generates one.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "createDashboard",
"description": "Create a new dashboard from a JSON document. Include name, owner, charts, layout, refreshTime, schemaVersion (2), timeWindowStart, and timeWindowEnd. Add sections with a top-level sections array in display order. Give each section a unique UUID id, a non-empty title, and optional defaultCollapsed. Assign a chart to a section with chart.sectionId set to that section id. Omit sectionId for ungrouped charts. Keep SmartFilter charts ungrouped. owner controls visibility: X-AXIOM-EVERYONE for a shared dashboard visible to all organization members, or me for a private dashboard owned by the current user (the server substitutes the user id). Org API tokens have no user and cannot own a private dashboard; use X-AXIOM-EVERYONE for those. Metrics/MPL charts: set chart.query.mpl to the MPL pipeline text (do not put MPL under chart.query.apl). Events/APL charts: set chart.query.apl.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"dashboardJson"
],
"properties": {
"uid": {
"type": "string",
"description": "Optional custom UID for the dashboard. If omitted, the server generates one."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"message": {
"type": "string",
"description": "Optional audit/change note for this operation."
},
"dashboardJson": {
"type": "string",
"minLength": 1,
"description": "The full dashboard document as a JSON string. Include name, owner (X-AXIOM-EVERYONE for shared, or me for a private dashboard owned by the signed-in user), charts (array), layout (array), refreshTime (15, 60, or 300), schemaVersion (2), timeWindowStart (e.g. qr-now-1h), and timeWindowEnd (qr-now). Optional: Add sections as an ordered array of {id, title, defaultCollapsed?}. Use a unique UUID for each section id. Assign charts with chart.sectionId. Omit sectionId for ungrouped charts and all SmartFilter charts."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Dashboard",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Update an existing dashboard by UID. Provide the full dashboard JSON document. To create, rename, reorder, or delete sections, call getDashboard, edit the top-level sections array, and preserve or update each chart.sectionId reference. Section order controls display order. Each section id is a unique UUID. Keep SmartFilter charts ungrouped. Keep the existing owner from getDashboard unless the user asks to change visibility; owner controls visibility: X-AXIOM-EVERYONE for a shared dashboard visible to all organization members, or me for a private dashboard owned by the current user (the server substitutes the user id). Org API tokens have no user and cannot own a private dashboard; use X-AXIOM-EVERYONE for those. Use overwrite=true to skip version conflict checks, or provide the current version number for optimistic concurrency control. Metrics/MPL charts: keep chart.query.mpl as MPL (do not rewrite into chart.query.apl). Events/APL charts: use chart.query.apl.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dashboardJson
The full dashboard document as a JSON string. Include name, owner (X-AXIOM-EVERYONE for shared, or me for a private dashboard owned by the signed-in user), charts (array), layout (array), refreshTime (15, 60, or 300), schemaVersion (2), timeWindowStart (e.g. qr-now-1h), and timeWindowEnd (qr-now). Optional: Add sections as an ordered array of {id, title, defaultCollapsed?}. Use a unique UUID for each section id. Assign charts with chart.sectionId. Omit sectionId for ungrouped charts and all SmartFilter charts.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dashboardUid
The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool.
Clear enough to supply this argument.
message
Optional audit/change note for this operation.
Clear enough to supply this argument.
overwrite
When true (default), bypasses version checks and applies last-write-wins. When false, the version parameter is required.
Clear enough to supply this argument.
version
The current dashboard version number. Required when overwrite is false. Get this from getDashboard().
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "updateDashboard",
"description": "Update an existing dashboard by UID. Provide the full dashboard JSON document. To create, rename, reorder, or delete sections, call getDashboard, edit the top-level sections array, and preserve or update each chart.sectionId reference. Section order controls display order. Each section id is a unique UUID. Keep SmartFilter charts ungrouped. Keep the existing owner from getDashboard unless the user asks to change visibility; owner controls visibility: X-AXIOM-EVERYONE for a shared dashboard visible to all organization members, or me for a private dashboard owned by the current user (the server substitutes the user id). Org API tokens have no user and cannot own a private dashboard; use X-AXIOM-EVERYONE for those. Use overwrite=true to skip version conflict checks, or provide the current version number for optimistic concurrency control. Metrics/MPL charts: keep chart.query.mpl as MPL (do not rewrite into chart.query.apl). Events/APL charts: use chart.query.apl.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"dashboardJson",
"dashboardUid"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"message": {
"type": "string",
"description": "Optional audit/change note for this operation."
},
"version": {
"type": "number",
"description": "The current dashboard version number. Required when overwrite is false. Get this from getDashboard()."
},
"overwrite": {
"type": "boolean",
"default": true,
"description": "When true (default), bypasses version checks and applies last-write-wins. When false, the version parameter is required."
},
"dashboardUid": {
"type": "string",
"description": "The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool."
},
"dashboardJson": {
"type": "string",
"minLength": 1,
"description": "The full dashboard document as a JSON string. Include name, owner (X-AXIOM-EVERYONE for shared, or me for a private dashboard owned by the signed-in user), charts (array), layout (array), refreshTime (15, 60, or 300), schemaVersion (2), timeWindowStart (e.g. qr-now-1h), and timeWindowEnd (qr-now). Optional: Add sections as an ordered array of {id, title, defaultCollapsed?}. Use a unique UUID for each section id. Assign charts with chart.sectionId. Omit sectionId for ungrouped charts and all SmartFilter charts."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update Dashboard",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description85/100
Patch a single chart in an existing dashboard by chart ID. Provide only the chart fields to change. Set sectionId to an existing section UUID to move the chart into that section. Set sectionId to null to make the chart ungrouped. Keep SmartFilter charts ungrouped. Use updateDashboard first to create, rename, reorder, or delete sections. Use overwrite=true to skip version conflict checks, or provide the current dashboard version for optimistic concurrency control. Metrics/MPL charts: set query.mpl (do not rewrite MPL into query.apl).
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
chartId
The chart ID inside the dashboard charts array.
Clear enough to supply this argument.
chartPatchJson
A JSON merge-patch object for a single dashboard chart. Include only fields to change. Set sectionId to an existing section UUID to move the chart into that section, or set sectionId to null to make it ungrouped. Keep SmartFilter charts ungrouped. If id is present, it matches chartId.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dashboardUid
The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool.
Clear enough to supply this argument.
message
Optional audit/change note for this operation.
Clear enough to supply this argument.
overwrite
When true (default), bypasses version checks and applies last-write-wins. When false, the version parameter is required.
Clear enough to supply this argument.
version
The current dashboard version number. Required when overwrite is false. Get this from getDashboard().
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "updateDashboardChart",
"description": "Patch a single chart in an existing dashboard by chart ID. Provide only the chart fields to change. Set sectionId to an existing section UUID to move the chart into that section. Set sectionId to null to make the chart ungrouped. Keep SmartFilter charts ungrouped. Use updateDashboard first to create, rename, reorder, or delete sections. Use overwrite=true to skip version conflict checks, or provide the current dashboard version for optimistic concurrency control. Metrics/MPL charts: set query.mpl (do not rewrite MPL into query.apl).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"chartId",
"chartPatchJson",
"dashboardUid"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"chartId": {
"type": "string",
"minLength": 1,
"description": "The chart ID inside the dashboard charts array."
},
"message": {
"type": "string",
"description": "Optional audit/change note for this operation."
},
"version": {
"type": "number",
"description": "The current dashboard version number. Required when overwrite is false. Get this from getDashboard()."
},
"overwrite": {
"type": "boolean",
"default": true,
"description": "When true (default), bypasses version checks and applies last-write-wins. When false, the version parameter is required."
},
"dashboardUid": {
"type": "string",
"description": "The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool."
},
"chartPatchJson": {
"type": "string",
"minLength": 1,
"description": "A JSON merge-patch object for a single dashboard chart. Include only fields to change. Set sectionId to an existing section UUID to move the chart into that section, or set sectionId to null to make it ungrouped. Keep SmartFilter charts ungrouped. If id is present, it matches chartId."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update Dashboard Chart",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description90/100
Delete a dashboard by its UID. This action is irreversible.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
dashboardUid
The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "deleteDashboard",
"description": "Delete a dashboard by its UID. This action is irreversible.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"dashboardUid"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"dashboardUid": {
"type": "string",
"description": "The dashboard UID (stable external identifier). You can find UIDs using the `listDashboards()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete Dashboard",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description77/100
Get alert history for a monitor from the public /v2/monitors/{id}/history endpoint. Use the checkMonitors() tool to list all monitors.
Describe the returned information so the agent knows whether it will answer the request.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
monitorId
The monitor ID. You can find an list of monitors using the `checkMonitors()` tool.
Clear enough to supply this argument.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getMonitorHistory",
"description": "Get alert history for a monitor from the public /v2/monitors/{id}/history endpoint. Use the checkMonitors() tool to list all monitors.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"monitorId"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"monitorId": {
"type": "string",
"description": "The monitor ID. You can find an list of monitors using the `checkMonitors()` tool."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Monitor History",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Get a single monitor's full definition by ID, including the complete APL or MPL query text. Use checkMonitors() to find monitor IDs.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
monitorId
The monitor ID. You can find an list of monitors using the `checkMonitors()` tool.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getMonitor",
"description": "Get a single monitor's full definition by ID, including the complete APL or MPL query text. Use checkMonitors() to find monitor IDs.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"monitorId"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"monitorId": {
"type": "string",
"description": "The monitor ID. You can find an list of monitors using the `checkMonitors()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Monitor",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description76/100
Create a new Axiom monitor using a JSON payload for Threshold, MatchEvent, or AnomalyDetection. Provide name, type, intervalMinutes, rangeMinutes, notifierIds, and at least one of aplQuery or mplQuery. MatchEvent monitors have extra constraints: the server always runs them with intervalMinutes and rangeMinutes of 1 (any other values are ignored), the query must not contain aggregations, only the where, project (project-away/keep/rename/reorder), extend, extend-valid, union, and parse operators are allowed, and metrics (MPL) queries are not supported.
Describe the returned information so the agent knows whether it will answer the request.
Inputs77/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
monitorJson
The full monitor configuration as a JSON string. Must include name, type, intervalMinutes, rangeMinutes, and at least one of aplQuery or mplQuery. Include notifierIds to set notifiers; omit notifierIds during update to keep existing notifiers. For MatchEvent monitors the server ignores intervalMinutes and rangeMinutes and always uses 1 for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "createMonitor",
"description": "Create a new Axiom monitor using a JSON payload for Threshold, MatchEvent, or AnomalyDetection. Provide name, type, intervalMinutes, rangeMinutes, notifierIds, and at least one of aplQuery or mplQuery. MatchEvent monitors have extra constraints: the server always runs them with intervalMinutes and rangeMinutes of 1 (any other values are ignored), the query must not contain aggregations, only the where, project (project-away/keep/rename/reorder), extend, extend-valid, union, and parse operators are allowed, and metrics (MPL) queries are not supported.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"monitorJson"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"monitorJson": {
"type": "string",
"minLength": 1,
"description": "The full monitor configuration as a JSON string. Must include name, type, intervalMinutes, rangeMinutes, and at least one of aplQuery or mplQuery. Include notifierIds to set notifiers; omit notifierIds during update to keep existing notifiers. For MatchEvent monitors the server ignores intervalMinutes and rangeMinutes and always uses 1 for both."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Monitor",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description83/100
Update an existing Axiom monitor by ID using a full monitor JSON payload. Omit notifierIds to keep the monitor's existing notifiers, or set notifierIds to [] to remove them. Use checkMonitors() to find monitor IDs before updating.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
monitorId
The monitor ID. You can find an list of monitors using the `checkMonitors()` tool.
Clear enough to supply this argument.
monitorJson
The full monitor configuration as a JSON string. Must include name, type, intervalMinutes, rangeMinutes, and at least one of aplQuery or mplQuery. Include notifierIds to set notifiers; omit notifierIds during update to keep existing notifiers. For MatchEvent monitors the server ignores intervalMinutes and rangeMinutes and always uses 1 for both.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "updateMonitor",
"description": "Update an existing Axiom monitor by ID using a full monitor JSON payload. Omit notifierIds to keep the monitor's existing notifiers, or set notifierIds to [] to remove them. Use checkMonitors() to find monitor IDs before updating.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"monitorId",
"monitorJson"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"monitorId": {
"type": "string",
"description": "The monitor ID. You can find an list of monitors using the `checkMonitors()` tool."
},
"monitorJson": {
"type": "string",
"minLength": 1,
"description": "The full monitor configuration as a JSON string. Must include name, type, intervalMinutes, rangeMinutes, and at least one of aplQuery or mplQuery. Include notifierIds to set notifiers; omit notifierIds during update to keep existing notifiers. For MatchEvent monitors the server ignores intervalMinutes and rangeMinutes and always uses 1 for both."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update Monitor",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description87/100
Delete a monitor by its ID. This action is irreversible.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
monitorId
The monitor ID. You can find an list of monitors using the `checkMonitors()` tool.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "deleteMonitor",
"description": "Delete a monitor by its ID. This action is irreversible.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"monitorId"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"monitorId": {
"type": "string",
"description": "The monitor ID. You can find an list of monitors using the `checkMonitors()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete Monitor",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description95/100
List all monitors and open alerts in their recent history, with explicit coverage for unavailable or empty histories. Historical alerts do not establish current health. Returns a compact overview with truncated query text; set truncate: false for complete query text, or use getMonitor() for a monitor's full definition.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "checkMonitors",
"description": "List all monitors and open alerts in their recent history, with explicit coverage for unavailable or empty histories. Historical alerts do not establish current health. Returns a compact overview with truncated query text; set truncate: false for complete query text, or use getMonitor() for a monitor's full definition.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Check Monitors",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
List all configured notifiers. Use this to find available alert destinations and notifier IDs for monitor notifierIds.
Describe the returned information so the agent knows whether it will answer the request.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "listNotifiers",
"description": "List all configured notifiers. Use this to find available alert destinations and notifier IDs for monitor notifierIds.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Notifiers",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description75/100
Create a new Axiom notifier using a JSON payload. The payload must include name and properties; configure one notification channel such as email, slack, webhook, customWebhook, pagerduty, opsgenie, discord, discordWebhook, or microsoftTeams. For custom webhooks, use properties.customWebhook with required url and body, plus optional headers and secretHeaders; body supports Go-template variables such as .Action, .MonitorID, .Body, .Title, and .Value.
Describe the returned information so the agent knows whether it will answer the request.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notifierJson
The full notifier configuration as a JSON string. Must include name and properties. Configure one channel inside properties, such as email, slack, webhook, customWebhook, pagerduty, opsgenie, discord, discordWebhook, or microsoftTeams. For customWebhook, include required url and body, plus optional headers and secretHeaders; body supports Go-template variables such as .Action, .MonitorID, .Body, .Title, and .Value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "createNotifier",
"description": "Create a new Axiom notifier using a JSON payload. The payload must include name and properties; configure one notification channel such as email, slack, webhook, customWebhook, pagerduty, opsgenie, discord, discordWebhook, or microsoftTeams. For custom webhooks, use properties.customWebhook with required url and body, plus optional headers and secretHeaders; body supports Go-template variables such as .Action, .MonitorID, .Body, .Title, and .Value.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notifierJson"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"notifierJson": {
"type": "string",
"minLength": 1,
"description": "The full notifier configuration as a JSON string. Must include name and properties. Configure one channel inside properties, such as email, slack, webhook, customWebhook, pagerduty, opsgenie, discord, discordWebhook, or microsoftTeams. For customWebhook, include required url and body, plus optional headers and secretHeaders; body supports Go-template variables such as .Action, .MonitorID, .Body, .Title, and .Value."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Create Notifier",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description71/100
Update an existing notifier by ID using a full notifier JSON payload. The payload must include name and properties; configure one channel inside properties.
Explain mutations, irreversible effects, or prerequisites that matter before calling this tool.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
notifierId
The notifier ID. You can find notifier IDs using the `listNotifiers()` tool.
Clear enough to supply this argument.
notifierJson
The full notifier configuration as a JSON string. Must include name and properties. Configure one channel inside properties, such as email, slack, webhook, customWebhook, pagerduty, opsgenie, discord, discordWebhook, or microsoftTeams. For customWebhook, include required url and body, plus optional headers and secretHeaders; body supports Go-template variables such as .Action, .MonitorID, .Body, .Title, and .Value.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "updateNotifier",
"description": "Update an existing notifier by ID using a full notifier JSON payload. The payload must include name and properties; configure one channel inside properties.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notifierId",
"notifierJson"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"notifierId": {
"type": "string",
"minLength": 1,
"description": "The notifier ID. You can find notifier IDs using the `listNotifiers()` tool."
},
"notifierJson": {
"type": "string",
"minLength": 1,
"description": "The full notifier configuration as a JSON string. Must include name and properties. Configure one channel inside properties, such as email, slack, webhook, customWebhook, pagerduty, opsgenie, discord, discordWebhook, or microsoftTeams. For customWebhook, include required url and body, plus optional headers and secretHeaders; body supports Go-template variables such as .Action, .MonitorID, .Body, .Title, and .Value."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Update Notifier",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description86/100
Delete a notifier by its ID. This action is irreversible.
The description explains the capability, when to use it, and what to expect.
Inputs99/100
Input documentation gives an agent enough context to populate the arguments.
notifierId
The notifier ID. You can find notifier IDs using the `listNotifiers()` tool.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "deleteNotifier",
"description": "Delete a notifier by its ID. This action is irreversible.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notifierId"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"notifierId": {
"type": "string",
"minLength": 1,
"description": "The notifier ID. You can find notifier IDs using the `listNotifiers()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Delete Notifier",
"readOnlyHint": false,
"openWorldHint": false,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
Fetch the current MPL (Metrics Processing Language) specification, standard-library reference, and examples for a metrics dataset. Use before writing unfamiliar MPL or to resolve syntax errors. datasetName selects the dataset's regional backend. Reuse the returned guidance for subsequent queries in the same investigation.
The description explains the capability, when to use it, and what to expect.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getMetricsSpec",
"description": "Fetch the current MPL (Metrics Processing Language) specification, standard-library reference, and examples for a metrics dataset. Use before writing unfamiliar MPL or to resolve syntax errors. datasetName selects the dataset's regional backend. Reuse the returned guidance for subsequent queries in the same investigation.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Metrics Specification",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description89/100
# Instructions
1. Query OpenTelemetry metrics stored in Axiom using MPL (Metrics Processing Language). NOT APL.
2. The query targets a metrics dataset (kind "otel-metrics-v1").
3. Use listMetrics() to discover available metric names and inspect metric type, temporality, and unit before querying whenever query semantics matter.
4. Use listMetricTags() and getMetricTagValues() with metricName to discover filtering dimensions for the metric you will query.
5. ALWAYS restrict the time range to the smallest possible range that meets your needs.
6. NEVER guess metric names or tag values. Always discover them first.
7. Query cost limits may apply to your credentials. When configured, each result ends with a budget footer (query cost and remaining hourly/daily budget, in GB-hours — GBhr, the unit limits are enforced in) — heed its warnings.
Exceeding a limit rejects further queries until the window resets (fixed UTC hour/day boundaries); the error says when.
8. Use getMetricsSpec({ datasetName }) for current MPL syntax, functions, and examples before writing unfamiliar queries. Use searchAxiomDocs() or readAxiomDoc() for additional metric semantics or product behavior.
9. Results include query metadata as compact JSON before the series. Heed backend warnings and preserve the order of group_keys when interpreting groups. custom_unit overrides unit; when ignore_unit is true, only custom_unit applies, if supplied. Do not infer a unit when none applies. Metadata describes the returned values; do not rescale them just to apply a unit label.
# MPL Query Syntax
A query has three parts: source, filtering, and transformation. Filters must appear before transformations.
## Source
```
<dataset>:<metric>
```
Backtick-escape identifiers containing special characters: ``my-dataset``:``http.server.duration``
## Filtering (where)
Chain filters with `|`. Use `where` (not `filter`, which is deprecated).
```
| where <tag> <op> <value>
```
Operators: ==, !=, >, <, >=, <=
Values: "string", 42, 42.0, true, /regexp/
Combine with: and, or, not, parentheses
## Transformations
### Aggregation (align) — aggregate data over time windows
```
| align to <interval> using <function>
```
Functions: avg, sum, min, max, count, last
Intervals: 5m, 1h, 1d, etc.
### Grouping (group) — group series by tags
```
| group by <tag1>, <tag2> using <function>
```
Functions: avg, sum, min, max, count
Without `by`: combines all series: `| group using sum`
### Mapping (map) — transform values in place
```
| map rate // per-second rate of change
| map increase // increase between datapoints
| map + 5 // arithmetic: +, -, *, /
| map abs // absolute value
| map fill::prev // fill gaps with previous value
| map fill::const(0) // fill gaps with constant
| map filter::lt(0.4) // remove datapoints >= 0.4
| map filter::gt(100) // remove datapoints <= 100
| map is::gte(0.5) // set to 1.0 if >= 0.5, else 0.0
```
### Computation (compute) — combine two metrics
```
(
`dataset`:`errors_total` | group using sum,
`dataset`:`requests_total` | group using sum;
)
| compute error_rate using /
```
Functions: +, -, *, /, min, max, avg
### Bucketing (bucket) — for histograms
```
| bucket by method, path to 5m using histogram(count, 0.5, 0.9, 0.99)
| bucket by method to 5m using interpolate_delta_histogram(0.90, 0.99)
| bucket by method to 5m using interpolate_cumulative_histogram(rate, 0.90, 0.99)
```
### Prometheus compatibility
```
| align to 5m using prom::rate // Prometheus-style rate
```
## Identifiers
Use backticks for names with special characters: ``my-dataset``, ``service.name``, ``http.request.duration``
# Query Planning With Metric Definitions
Inspect the `type` and `temporality` fields returned by listMetrics() before choosing query strategy. Treat the following as guidance rather than strict rules, and prioritize the user's intent when appropriate.
- If `type` is `Gauge`, use current values or an aggregation appropriate to the question; do not apply a rate unless the user asks for the change in that gauge.
- If `type` is `CounterNonMonotonic`, clarify whether the user wants its current value or its change over time before choosing a rate or delta.
- If `type` is `CounterMonotonic` and `temporality` is `cumulative`, treat it as a cumulative counter. `rate`, `prom::rate`, or `increase` are often more appropriate than raw values for questions about changes over time.
- If `type` is `CounterMonotonic` and `temporality` is `delta`, treat samples as per-collection-interval increments, not instantaneous gauge values.
- If `type` is `Histogram`, use bucket functions for count, average, sum, and percentile queries. Choose `interpolate_delta_histogram(...)` for delta temporality and `interpolate_cumulative_histogram(...)` for cumulative temporality.
- If `type` is `Summary`, do not treat it like histogram buckets.
- If `type` or `temporality` is missing or ambiguous, generate the most conservative query and explicitly note any assumptions.
# Parameters and Chart Resolution
Bind declared MPL parameters using bare names and MPL literal values: `params: { svc: '"frontend"', window: '5m' }` (no `$` or `param__` prefix).
Optional `chartWidth` and `pixelPerPoint` guide automatic `$__interval` resolution; fixed intervals such as `5m` are unchanged.
# Examples
Basic query:
`my-metrics`:`http.server.duration` | align to 5m using avg
Filtered:
`my-metrics`:`http.server.duration` | where `service.name` == "frontend" | align to 5m using avg
Grouped:
`my-metrics`:`http.server.duration` | align to 5m using avg | group by endpoint using sum
Rate:
`my-metrics`:`http.requests.total` | align to 5m using prom::rate | group by method, path, code using sum
Error rate (compute):
(
`my-metrics`:`http.requests.total` | where code >= 400 | group by method, path using sum,
`my-metrics`:`http.requests.total` | group by method, path using sum;
)
| compute error_rate using /
| align to 5m using avg
SLI (error budget):
(
`my-metrics`:`http.requests.total` | where code >= 500 | align to 1h using prom::rate | group using sum,
`my-metrics`:`http.requests.total` | align to 1h using prom::rate | group using sum;
)
| compute error_rate using /
| map is::lt(0.2)
| align to 7d using avg
Set truncate: false to return the complete metrics-v2 JSON in structuredContent and text, including every series, sample, summary, tag, and metadata field received from the backend. Use structuredContent when saving results for charts or other programs; the text can include a query-budget footer.
Histogram percentiles:
`my-metrics`:`http.request.duration.seconds.bucket` | bucket by method, path to 5m using interpolate_delta_histogram(0.90, 0.99)
Fill gaps:
`my-metrics`:`cpu.usage` | map fill::prev | align to 1m using avg
The description explains the capability, when to use it, and what to expect.
Inputs89/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
chartWidth
Target chart width in pixels for backend $__interval resolution.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
mpl
The metrics query string. Format: <dataset>:<metric> | <operations>
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
params
MPL parameter bindings by bare name, without $ or param__. Values are MPL literals, e.g. {"svc":"\"frontend\"","window":"5m"}.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
pixelPerPoint
Pixels per data point for backend $__interval resolution.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Clear enough to supply this argument.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "queryMetrics",
"description": "# Instructions\n1. Query OpenTelemetry metrics stored in Axiom using MPL (Metrics Processing Language). NOT APL.\n2. The query targets a metrics dataset (kind \"otel-metrics-v1\").\n3. Use listMetrics() to discover available metric names and inspect metric type, temporality, and unit before querying whenever query semantics matter.\n4. Use listMetricTags() and getMetricTagValues() with metricName to discover filtering dimensions for the metric you will query.\n5. ALWAYS restrict the time range to the smallest possible range that meets your needs.\n6. NEVER guess metric names or tag values. Always discover them first.\n7. Query cost limits may apply to your credentials. When configured, each result ends with a budget footer (query cost and remaining hourly/daily budget, in GB-hours — GBhr, the unit limits are enforced in) — heed its warnings.\n Exceeding a limit rejects further queries until the window resets (fixed UTC hour/day boundaries); the error says when.\n8. Use getMetricsSpec({ datasetName }) for current MPL syntax, functions, and examples before writing unfamiliar queries. Use searchAxiomDocs() or readAxiomDoc() for additional metric semantics or product behavior.\n9. Results include query metadata as compact JSON before the series. Heed backend warnings and preserve the order of group_keys when interpreting groups. custom_unit overrides unit; when ignore_unit is true, only custom_unit applies, if supplied. Do not infer a unit when none applies. Metadata describes the returned values; do not rescale them just to apply a unit label.\n\n# MPL Query Syntax\nA query has three parts: source, filtering, and transformation. Filters must appear before transformations.\n\n## Source\n```\n<dataset>:<metric>\n```\nBacktick-escape identifiers containing special characters: ``my-dataset``:``http.server.duration``\n\n## Filtering (where)\nChain filters with `|`. Use `where` (not `filter`, which is deprecated).\n```\n| where <tag> <op> <value>\n```\nOperators: ==, !=, >, <, >=, <=\nValues: \"string\", 42, 42.0, true, /regexp/\nCombine with: and, or, not, parentheses\n\n## Transformations\n\n### Aggregation (align) — aggregate data over time windows\n```\n| align to <interval> using <function>\n```\nFunctions: avg, sum, min, max, count, last\nIntervals: 5m, 1h, 1d, etc.\n\n### Grouping (group) — group series by tags\n```\n| group by <tag1>, <tag2> using <function>\n```\nFunctions: avg, sum, min, max, count\nWithout `by`: combines all series: `| group using sum`\n\n### Mapping (map) — transform values in place\n```\n| map rate // per-second rate of change\n| map increase // increase between datapoints\n| map + 5 // arithmetic: +, -, *, /\n| map abs // absolute value\n| map fill::prev // fill gaps with previous value\n| map fill::const(0) // fill gaps with constant\n| map filter::lt(0.4) // remove datapoints >= 0.4\n| map filter::gt(100) // remove datapoints <= 100\n| map is::gte(0.5) // set to 1.0 if >= 0.5, else 0.0\n```\n\n### Computation (compute) — combine two metrics\n```\n(\n `dataset`:`errors_total` | group using sum,\n `dataset`:`requests_total` | group using sum;\n)\n| compute error_rate using /\n```\nFunctions: +, -, *, /, min, max, avg\n\n### Bucketing (bucket) — for histograms\n```\n| bucket by method, path to 5m using histogram(count, 0.5, 0.9, 0.99)\n| bucket by method to 5m using interpolate_delta_histogram(0.90, 0.99)\n| bucket by method to 5m using interpolate_cumulative_histogram(rate, 0.90, 0.99)\n```\n\n### Prometheus compatibility\n```\n| align to 5m using prom::rate // Prometheus-style rate\n```\n\n## Identifiers\nUse backticks for names with special characters: ``my-dataset``, ``service.name``, ``http.request.duration``\n\n# Query Planning With Metric Definitions\nInspect the `type` and `temporality` fields returned by listMetrics() before choosing query strategy. Treat the following as guidance rather than strict rules, and prioritize the user's intent when appropriate.\n\n- If `type` is `Gauge`, use current values or an aggregation appropriate to the question; do not apply a rate unless the user asks for the change in that gauge.\n\n- If `type` is `CounterNonMonotonic`, clarify whether the user wants its current value or its change over time before choosing a rate or delta.\n\n- If `type` is `CounterMonotonic` and `temporality` is `cumulative`, treat it as a cumulative counter. `rate`, `prom::rate`, or `increase` are often more appropriate than raw values for questions about changes over time.\n\n- If `type` is `CounterMonotonic` and `temporality` is `delta`, treat samples as per-collection-interval increments, not instantaneous gauge values.\n\n- If `type` is `Histogram`, use bucket functions for count, average, sum, and percentile queries. Choose `interpolate_delta_histogram(...)` for delta temporality and `interpolate_cumulative_histogram(...)` for cumulative temporality.\n\n- If `type` is `Summary`, do not treat it like histogram buckets.\n\n- If `type` or `temporality` is missing or ambiguous, generate the most conservative query and explicitly note any assumptions.\n\n# Parameters and Chart Resolution\nBind declared MPL parameters using bare names and MPL literal values: `params: { svc: '\"frontend\"', window: '5m' }` (no `$` or `param__` prefix).\n\nOptional `chartWidth` and `pixelPerPoint` guide automatic `$__interval` resolution; fixed intervals such as `5m` are unchanged.\n\n# Examples\nBasic query:\n `my-metrics`:`http.server.duration` | align to 5m using avg\n\nFiltered:\n `my-metrics`:`http.server.duration` | where `service.name` == \"frontend\" | align to 5m using avg\n\nGrouped:\n `my-metrics`:`http.server.duration` | align to 5m using avg | group by endpoint using sum\n\nRate:\n `my-metrics`:`http.requests.total` | align to 5m using prom::rate | group by method, path, code using sum\n\nError rate (compute):\n (\n `my-metrics`:`http.requests.total` | where code >= 400 | group by method, path using sum,\n `my-metrics`:`http.requests.total` | group by method, path using sum;\n )\n | compute error_rate using /\n | align to 5m using avg\n\nSLI (error budget):\n (\n `my-metrics`:`http.requests.total` | where code >= 500 | align to 1h using prom::rate | group using sum,\n `my-metrics`:`http.requests.total` | align to 1h using prom::rate | group using sum;\n )\n | compute error_rate using /\n | map is::lt(0.2)\n | align to 7d using avg\n\nSet truncate: false to return the complete metrics-v2 JSON in structuredContent and text, including every series, sample, summary, tag, and metadata field received from the backend. Use structuredContent when saving results for charts or other programs; the text can include a query-budget footer.\n\nHistogram percentiles:\n `my-metrics`:`http.request.duration.seconds.bucket` | bucket by method, path to 5m using interpolate_delta_histogram(0.90, 0.99)\n\nFill gaps:\n `my-metrics`:`cpu.usage` | map fill::prev | align to 1m using avg\n",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName",
"mpl"
],
"properties": {
"mpl": {
"type": "string",
"minLength": 1,
"description": "The metrics query string. Format: <dataset>:<metric> | <operations>"
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"params": {
"type": "object",
"description": "MPL parameter bindings by bare name, without $ or param__. Values are MPL literals, e.g. {\"svc\":\"\\\"frontend\\\"\",\"window\":\"5m\"}.",
"additionalProperties": {
"type": "string"
}
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
},
"chartWidth": {
"type": "integer",
"description": "Target chart width in pixels for backend $__interval resolution.",
"exclusiveMinimum": 0
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
},
"pixelPerPoint": {
"type": "integer",
"description": "Pixels per data point for backend $__interval resolution.",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
},
"annotations": {
"title": "Query Metrics",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description93/100
List metric names, types, temporality, and units as CSV in a metrics dataset (kind "otel-metrics-v1"). Start here when query semantics matter to choose between avg, rate, increase, histogram bucketing, and related query strategies.
The description explains the capability, when to use it, and what to expect.
Inputs94/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "listMetrics",
"description": "List metric names, types, temporality, and units as CSV in a metrics dataset (kind \"otel-metrics-v1\"). Start here when query semantics matter to choose between avg, rate, increase, histogram bucketing, and related query strategies.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Metrics",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description91/100
List available tags (dimensions) as one-column CSV in a metrics dataset (kind `otel-metrics-v1`). Supply metricName from listMetrics or searchMetrics to discover tags for that specific metric; omit it to list tags across the dataset. Tags can be used to filter and group metrics queries.
Describe the returned information so the agent knows whether it will answer the request.
Inputs97/100
Input documentation gives an agent enough context to populate the arguments.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
metricName
Exact metric name from listMetrics or searchMetrics. Restricts discovery to that metric; omit for dataset-wide discovery.
Clear enough to supply this argument.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "listMetricTags",
"description": "List available tags (dimensions) as one-column CSV in a metrics dataset (kind `otel-metrics-v1`). Supply metricName from listMetrics or searchMetrics to discover tags for that specific metric; omit it to list tags across the dataset. Tags can be used to filter and group metrics queries.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
},
"metricName": {
"type": "string",
"minLength": 1,
"description": "Exact metric name from listMetrics or searchMetrics. Restricts discovery to that metric; omit for dataset-wide discovery."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "List Metric Tags",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description100/100
Start here when the user mentions a specific service, host, or entity name and you need to work with metrics data.
Searches tag values across all metrics in a dataset and returns the metric names that are associated with the given entity. This is the fastest way to go from a known entity name (e.g. "checkout-service", "api-gateway", "us-east-1") to a concrete list of metric names you can actually query.
Returns CSV with metric name, matched tags, type, temporality, and unit. The matchedTags cell contains a JSON array of tag names.
**Time range:** Use a window of at least 3 hours. Recently-ingested data can take up to 2 hours to become searchable here, so narrow windows may return empty results even when data exists. For recent data, default to `now-3h` / `now`. For historical data, use whatever window covers the period you care about — e.g. `now-14d` / `now-7d` is valid.
**Workflow:**
1. Call this tool with the entity name to get relevant metric names.
2. Use listMetricTags() / getMetricTagValues() with metricName to discover filter dimensions for a specific matching metric.
3. Call queryMetrics() with an MPL query targeting the specific metric and filters.
Use listMetrics() instead when you have no entity name to search by and need a full catalogue of what's in the dataset.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Input documentation gives an agent enough context to populate the arguments.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Clear enough to supply this argument.
value
The entity name to search for across all tag values (e.g. a service name "checkout-service", a host "prod-worker-1", a region "us-east-1"). The search matches this exact string against tag values — use the canonical name as it appears in your infrastructure.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "searchMetrics",
"description": "Start here when the user mentions a specific service, host, or entity name and you need to work with metrics data.\n\nSearches tag values across all metrics in a dataset and returns the metric names that are associated with the given entity. This is the fastest way to go from a known entity name (e.g. \"checkout-service\", \"api-gateway\", \"us-east-1\") to a concrete list of metric names you can actually query.\n\nReturns CSV with metric name, matched tags, type, temporality, and unit. The matchedTags cell contains a JSON array of tag names.\n\n**Time range:** Use a window of at least 3 hours. Recently-ingested data can take up to 2 hours to become searchable here, so narrow windows may return empty results even when data exists. For recent data, default to `now-3h` / `now`. For historical data, use whatever window covers the period you care about — e.g. `now-14d` / `now-7d` is valid.\n\n**Workflow:**\n1. Call this tool with the entity name to get relevant metric names.\n2. Use listMetricTags() / getMetricTagValues() with metricName to discover filter dimensions for a specific matching metric.\n3. Call queryMetrics() with an MPL query targeting the specific metric and filters.\n\nUse listMetrics() instead when you have no entity name to search by and need a full catalogue of what's in the dataset.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName",
"value"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"value": {
"type": "string",
"minLength": 1,
"description": "The entity name to search for across all tag values (e.g. a service name \"checkout-service\", a host \"prod-worker-1\", a region \"us-east-1\"). The search matches this exact string against tag values — use the canonical name as it appears in your infrastructure."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Search Metrics by Entity",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description92/100
List values for a tag as one-column CSV in a metrics dataset (kind `otel-metrics-v1`). Supply metricName from listMetrics or searchMetrics to discover values for that specific metric and tag; omit it to list values across the dataset. Useful for discovering filter values before querying.
The description explains the capability, when to use it, and what to expect.
Inputs96/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
datasetName
The dataset name. You can find an list of datasets using the `listDatasets()` tool.
Clear enough to supply this argument.
endTime
End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now".
Clear enough to supply this argument.
metricName
Exact metric name from listMetrics or searchMetrics. Restricts discovery to that metric; omit for dataset-wide discovery.
Clear enough to supply this argument.
startTime
Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to "now-30m".
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
tag
The tag name to list values for.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "getMetricTagValues",
"description": "List values for a tag as one-column CSV in a metrics dataset (kind `otel-metrics-v1`). Supply metricName from listMetrics or searchMetrics to discover values for that specific metric and tag; omit it to list values across the dataset. Useful for discovering filter values before querying.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"datasetName",
"tag"
],
"properties": {
"tag": {
"type": "string",
"minLength": 1,
"description": "The tag name to list values for."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"endTime": {
"type": "string",
"default": "now",
"description": "End time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now\"."
},
"startTime": {
"type": "string",
"default": "now-30m",
"description": "Start time for the query range. A fixed (RFC3339) or relative (now, now-5m) time value. Defaults to \"now-30m\"."
},
"metricName": {
"type": "string",
"minLength": 1,
"description": "Exact metric name from listMetrics or searchMetrics. Restricts discovery to that metric; omit for dataset-wide discovery."
},
"datasetName": {
"type": "string",
"minLength": 1,
"description": "The dataset name. You can find an list of datasets using the `listDatasets()` tool."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Metric Tag Values",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description84/100
Share feedback about your experience with the Axiom MCP server. Use this when:
- A tool description was misleading, unclear, or led you to call the wrong tool
- A tool result or error message was confusing, unhelpful, or hard to parse
- A capability you needed was missing
- Something worked particularly well and should not change
IMPORTANT: Never include sensitive information. Do not include log or query contents, dataset values, credentials, API tokens, personal data, or anything else from the user's environment or conversation. Describe the issue generically — e.g. "the startTime default on queryDataset was unclear", not actual query results. Feedback is stored and reviewed by the Axiom team.
The description explains the capability, when to use it, and what to expect.
Inputs88/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
category
The kind of feedback: tool-description (misleading/unclear description), tool-result (confusing or unhelpful output), error-message (error did not help recovery), missing-capability (something you needed does not exist), performance (slow or resource-heavy), praise (something worked well), or other.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
feedback
The feedback itself. Keep it generic and actionable. NEVER include sensitive information: no log or query contents, dataset values, credentials, tokens, personal data, or anything from the user's environment.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
toolName
Optional: the name of the MCP tool the feedback is about, e.g. queryDataset.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "sendFeedback",
"description": "Share feedback about your experience with the Axiom MCP server. Use this when:\n- A tool description was misleading, unclear, or led you to call the wrong tool\n- A tool result or error message was confusing, unhelpful, or hard to parse\n- A capability you needed was missing\n- Something worked particularly well and should not change\n\nIMPORTANT: Never include sensitive information. Do not include log or query contents, dataset values, credentials, API tokens, personal data, or anything else from the user's environment or conversation. Describe the issue generically — e.g. \"the startTime default on queryDataset was unclear\", not actual query results. Feedback is stored and reviewed by the Axiom team.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"category",
"feedback"
],
"properties": {
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"category": {
"enum": [
"tool-description",
"tool-result",
"error-message",
"missing-capability",
"performance",
"praise",
"other"
],
"type": "string",
"description": "The kind of feedback: tool-description (misleading/unclear description), tool-result (confusing or unhelpful output), error-message (error did not help recovery), missing-capability (something you needed does not exist), performance (slow or resource-heavy), praise (something worked well), or other."
},
"feedback": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The feedback itself. Keep it generic and actionable. NEVER include sensitive information: no log or query contents, dataset values, credentials, tokens, personal data, or anything from the user's environment."
},
"toolName": {
"type": "string",
"maxLength": 200,
"description": "Optional: the name of the MCP tool the feedback is about, e.g. queryDataset."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Send Feedback",
"readOnlyHint": false,
"openWorldHint": true,
"destructiveHint": true
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description99/100
START HERE for any question about service topology, dependencies, or system-wide health. Returns the whole service dependency graph Stitch observed, in one call — every edge (service→service, database, messaging, external) with call volume, error rate and approximate p50/p99 — so no discovery ladder is needed: do not list services or operations first, just call this. Every edge carries a confidence value qualifying how the dependency was established: `confirmed_*` edges come from directly linked spans and can be trusted as real, `inferred_*` edges were reconstructed heuristically and should be treated as hypotheses to verify. Rows with an empty `dst` are node rows — a service's own request-handling metrics, not a dependency. Exemplar trace ids are returned for erroring and unusually slow edges so you can jump straight to a trace; use services-getChanges for what changed recently (new or disappeared dependencies, p99 regressions), and services-getEdgeHistory once you have a suspect edge, to see when it regressed and whether the shape is a deploy-like step or a gradual drift. Pass `view: "services"` for one row per service — call volume, error rate, latency and dependency counts — when the question is which service is unhealthy rather than which dependency.
The description explains the capability, when to use it, and what to expect.
Inputs92/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
limit
Maximum number of edges returned, ordered by call volume.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
minutes
Lookback window in minutes for the service map. Defaults to 60; max 10080 (7 days).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
service
Optional service name to narrow the map to edges where this service is the source or destination. The default (unset) returns the whole graph — no discovery call is needed first.
Clear enough to supply this argument.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
view
Row shape of the returned map. `edges` (the default) returns one row per dependency — the whole graph, with exemplar trace ids. `services` returns one row per service — its own call volume, error rate and latency plus how many dependencies it has in each direction — for system-health overviews. Both shapes come from the same query and both carry the topology block.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "services-getMap",
"description": "START HERE for any question about service topology, dependencies, or system-wide health. Returns the whole service dependency graph Stitch observed, in one call — every edge (service→service, database, messaging, external) with call volume, error rate and approximate p50/p99 — so no discovery ladder is needed: do not list services or operations first, just call this. Every edge carries a confidence value qualifying how the dependency was established: `confirmed_*` edges come from directly linked spans and can be trusted as real, `inferred_*` edges were reconstructed heuristically and should be treated as hypotheses to verify. Rows with an empty `dst` are node rows — a service's own request-handling metrics, not a dependency. Exemplar trace ids are returned for erroring and unusually slow edges so you can jump straight to a trace; use services-getChanges for what changed recently (new or disappeared dependencies, p99 regressions), and services-getEdgeHistory once you have a suspect edge, to see when it regressed and whether the shape is a deploy-like step or a gradual drift. Pass `view: \"services\"` for one row per service — call volume, error rate, latency and dependency counts — when the question is which service is unhealthy rather than which dependency.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"view": {
"enum": [
"edges",
"services"
],
"type": "string",
"default": "edges",
"description": "Row shape of the returned map. `edges` (the default) returns one row per dependency — the whole graph, with exemplar trace ids. `services` returns one row per service — its own call volume, error rate and latency plus how many dependencies it has in each direction — for system-health overviews. Both shapes come from the same query and both carry the topology block."
},
"limit": {
"type": "integer",
"default": 500,
"maximum": 1000,
"minimum": 1,
"description": "Maximum number of edges returned, ordered by call volume."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"minutes": {
"type": "integer",
"default": 60,
"maximum": 10080,
"minimum": 1,
"description": "Lookback window in minutes for the service map. Defaults to 60; max 10080 (7 days)."
},
"service": {
"type": "string",
"minLength": 1,
"description": "Optional service name to narrow the map to edges where this service is the source or destination. The default (unset) returns the whole graph — no discovery call is needed first."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Service Map",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Report what changed in the service dependency graph: dependencies that appeared, dependencies that disappeared, and edges whose p99 latency regressed against a trailing 6h baseline. Every kind sits behind conservative volume and confidence gates, so silence here means nothing crossed the bar rather than nothing was checked. Novelty is suppressed when the rollup does not reach back past the novelty window, because a fresh dataset or short retention would make every edge look new. Use services-getMap for the current shape of the graph; this tool only answers what moved.
The description explains the capability, when to use it, and what to expect.
Inputs95/100
Input documentation gives an agent enough context to populate the arguments.
baseline
Novelty window: an edge first seen inside this window counts as new. APL duration, defaults to "7d".
Clear enough to supply this argument.
env
Optional filter on the rollup `env` column (the environment attribute of the customer's own spans). Unset means all environments.
Clear enough to supply this argument.
kinds
Which change kinds to compute. Omit for all three: new dependencies, disappeared dependencies, p99 latency regressions.
Clear enough to supply this argument.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
window
Recent window to inspect for changes, as an APL duration (e.g. "24h", "6h"). Defaults to "24h".
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "services-getChanges",
"description": "Report what changed in the service dependency graph: dependencies that appeared, dependencies that disappeared, and edges whose p99 latency regressed against a trailing 6h baseline. Every kind sits behind conservative volume and confidence gates, so silence here means nothing crossed the bar rather than nothing was checked. Novelty is suppressed when the rollup does not reach back past the novelty window, because a fresh dataset or short retention would make every edge look new. Use services-getMap for the current shape of the graph; this tool only answers what moved.",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"env": {
"type": "string",
"minLength": 1,
"description": "Optional filter on the rollup `env` column (the environment attribute of the customer's own spans). Unset means all environments."
},
"kinds": {
"type": "array",
"items": {
"enum": [
"new",
"gone",
"latency"
],
"type": "string"
},
"default": [
"new",
"gone",
"latency"
],
"description": "Which change kinds to compute. Omit for all three: new dependencies, disappeared dependencies, p99 latency regressions."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"window": {
"type": "string",
"default": "24h",
"description": "Recent window to inspect for changes, as an APL duration (e.g. \"24h\", \"6h\"). Defaults to \"24h\"."
},
"baseline": {
"type": "string",
"default": "7d",
"description": "Novelty window: an edge first seen inside this window counts as new. APL duration, defaults to \"7d\"."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Service Map Changes",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
The title clearly communicates the tool’s action and subject. Keep it concise.
Description96/100
Charts one service's edges over time: a per-bucket time series of calls, errors and approximate p50/p99 for every edge where the named service is the source or the destination (pass `dst` to narrow to a single directed edge). Use it after services-getMap flags a slow or erroring edge, to answer when it got slow and whether the shape is a step — deploy-shaped, a jump between two adjacent buckets — or a gradual drift, and to find the bucket where it started. This tool reports raw per-bucket numbers with no gating: use services-getMap for the whole graph as it stands now, and services-getChanges for gated change detection (new or disappeared dependencies, p99 regressions that clear the volume gates).
The description explains the capability, when to use it, and what to expect.
Inputs93/100
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
bucketMinutes
Width of each time bucket in minutes. Defaults to 15; min 1, max 1440 (1 day). Smaller buckets pinpoint when a change started; larger ones smooth out low-traffic noise.
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
dst
Optional destination service, database, queue or external host. Set it to narrow the history to the single directed edge `service` -> `dst` instead of every edge touching `service`.
Clear enough to supply this argument.
env
Optional filter on the rollup `env` column (the environment attribute of the customer's own spans). Unset means all environments.
Clear enough to supply this argument.
minutes
Lookback window in minutes for the history. Defaults to 1440 (24 hours); max 10080 (7 days).
Remove validation rules already expressed in this field’s schema; describe its meaning and usage instead.
service
Service whose edges are charted over time. Required: every edge where this service is the source or the destination is returned, one row per time bucket. Use services-getMap first if you do not know the service names.
Clear enough to supply this argument.
truncate
Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply.
Clear enough to supply this argument.
orgId
Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access.
Clear enough to supply this argument.
Annotations75/100
Declare idempotentHint based on the tool’s actual behavior.
No output schema is declared. Add one for structured results so clients can interpret returned fields.
Not declared
Original tool metadata
{
"name": "services-getEdgeHistory",
"description": "Charts one service's edges over time: a per-bucket time series of calls, errors and approximate p50/p99 for every edge where the named service is the source or the destination (pass `dst` to narrow to a single directed edge). Use it after services-getMap flags a slow or erroring edge, to answer when it got slow and whether the shape is a step — deploy-shaped, a jump between two adjacent buckets — or a gradual drift, and to find the bucket where it started. This tool reports raw per-bucket numbers with no gating: use services-getMap for the whole graph as it stands now, and services-getChanges for gated change detection (new or disappeared dependencies, p99 regressions that clear the volume gates).",
"inputSchema": {
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"service"
],
"properties": {
"dst": {
"type": "string",
"minLength": 1,
"description": "Optional destination service, database, queue or external host. Set it to narrow the history to the single directed edge `service` -> `dst` instead of every edge touching `service`."
},
"env": {
"type": "string",
"minLength": 1,
"description": "Optional filter on the rollup `env` column (the environment attribute of the customer's own spans). Unset means all environments."
},
"orgId": {
"type": "string",
"minLength": 1,
"description": "Override the session's default organization. Omit to use the org chosen at connect (or x-axiom-org-id). Call listOrganizations() to list organizations you can access."
},
"minutes": {
"type": "integer",
"default": 1440,
"maximum": 10080,
"minimum": 1,
"description": "Lookback window in minutes for the history. Defaults to 1440 (24 hours); max 10080 (7 days)."
},
"service": {
"type": "string",
"minLength": 1,
"description": "Service whose edges are charted over time. Required: every edge where this service is the source or the destination is returned, one row per time bucket. Use services-getMap first if you do not know the service names."
},
"truncate": {
"type": "boolean",
"default": true,
"description": "Whether to shorten tool output (default true). Set false for complete returned data, including all rows, fields, samples, and descriptions. Built-in output count limits are ignored, but backend query limits and budgets still apply."
},
"bucketMinutes": {
"type": "integer",
"default": 15,
"maximum": 1440,
"minimum": 1,
"description": "Width of each time bucket in minutes. Defaults to 15; min 1, max 1440 (1 day). Smaller buckets pinpoint when a change started; larger ones smooth out low-traffic noise."
}
},
"additionalProperties": false
},
"annotations": {
"title": "Get Service Edge History",
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}
}
Loading score analytics…
Put your MCP to the test
A few tasks worth trying with this server, chosen from its reviewed tools. These have not been run.
01Search Axiom DocsSearch official Axiom documentation and return the top matching pages as Markdown with source URLs.
02Get Service MapSTART HERE for any question about service topology, dependencies, or system-wide health.
03List DatasetsList all available datasets with exact, unquoted names.
04Check MonitorsList all monitors and open alerts in their recent history, with explicit coverage for unavailable or empty histories.
05Get Saved QueriesRead saved/starred APL queries as CSV with name, dataset, full query, author, and end time.
Want to run these tasks against your MCP server with us?
checkMonitorscreateDashboardcreateMonitorcreateNotifierdeleteDashboarddeleteMonitordeleteNotifierexportDashboardgetDashboardgetDatasetFieldsgetMetricTagValuesgetMonitorHistory+14 more
Axiom MCP Server setup, tools, quality score, publishing readiness, and alternatives.
How do I add Axiom MCP Server to Claude, ChatGPT, or Cursor?
Add Axiom MCP Server to Claude, ChatGPT, or Cursor by connecting its remote MCP URL in each client's MCP settings. In Claude, add a custom connector. In ChatGPT, add an MCP app. In Cursor, add an MCP server under Settings. The MCP URL is https://mcp.axiom.co/mcp. This server requires OAuth, so complete the login prompt after you connect.
Is Axiom MCP Server MCP ready for ChatGPT and Claude?
As of October 14, 2026, Axiom MCP Server scores 96/100 on Manufact's MCP publishing checklist. The scan meets ChatGPT publishing checks and meets Claude publishing checks. Passing these checks does not guarantee marketplace approval.
How clear is Axiom MCP Server's MCP tool documentation?
As of October 14, 2026, Axiom MCP Server scores 82/100 in Manufact's review of tool titles, descriptions, input and output schemas, and behavior annotations. The review covers 36 of 36 discovered tools. The quality score measures documentation clarity; runtime behavior and marketplace readiness require separate checks.
What tools does the Axiom MCP Server MCP server provide?
Axiom MCP Server lists 26 MCP tools, including checkMonitors, createDashboard, createMonitor, createNotifier, deleteDashboard, deleteMonitor, deleteNotifier, exportDashboard, getDashboard, getDatasetFields, getMetricTagValues, and getMonitorHistory.
What are the best alternatives to Axiom MCP Server?
As of October 20, 2026, alternatives to Axiom MCP Server in data-analytics on the Manufact MCP leaderboard include Epicure, Newsflash, Point Topic, Pricing Optimizer AI, and StatCite.
Does Axiom MCP Server MCP require authentication?
Axiom MCP Server requires authentication. Connect it in Claude, ChatGPT, or Cursor and complete the OAuth login prompt.
How can Axiom MCP Server improve its MCP documentation?
createMonitor is the lowest-scoring reviewed tool at 75/100. No output schema is declared. Add one for structured results so clients can interpret returned fields. Open its review for feedback and a copyable fix prompt, then rerun the documentation review after updating your tool metadata.
Who develops Axiom MCP Server?
Axiom MCP Server is developed by Axiom. It is listed as community on the Claude connector directory.
Not your MCP?
Review any public or OAuth MCP server for protocol compatibility, tool documentation, and ChatGPT and Claude publishing readiness. No account required.