The Betterstack MCP connector routes your AI agent's tool calls to Betterstack's own MCP server through Scalekit. Each user signs in to Betterstack once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 130 tools.
- Tools
- 130
- What they doRead · write · destructive
- 50 · 68 · 1250 read68 write12 destructive
- Users sign in with
- OAuth
- OAuth app
- Scalekit's or your own
Setup
Install the SDK
Terminal window npm install @scalekit-sdk/node dotenvTerminal window pip install scalekit-sdk-python python-dotenvSet your credentials
Add your Scalekit credentials to your
.envfile. Find values in app.scalekit.com > Developers > API Credentials..env SCALEKIT_ENVIRONMENT_URL=<your-environment-url>SCALEKIT_CLIENT_ID=<your-client-id>SCALEKIT_CLIENT_SECRET=<your-client-secret>Create the Betterstack MCP connection
In AgentKit > Connections, create a Betterstack MCP connection. The name you give it is the
connection_nameyour code passes. See Configure connections.Scalekit credentials are available for Betterstack MCP server, so you don't need to register an OAuth app.
Authorize a user and make your first call
quickstart.mts import { ScalekitClient } from '@scalekit-sdk/node'import 'dotenv/config'import { createInterface } from 'node:readline/promises'const scalekit = new ScalekitClient(process.env.SCALEKIT_ENVIRONMENT_URL,process.env.SCALEKIT_CLIENT_ID,process.env.SCALEKIT_CLIENT_SECRET,)const actions = scalekit.actionsconst connector = 'betterstackmcp'const identifier = 'user_123'// Generate an authorization link for the userconst { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })console.log('Authorize Betterstack MCP:', link)const rl = createInterface({ input: process.stdin, output: process.stdout })await rl.question('Press Enter after authorizing...')rl.close()// Make your first callconst result = await actions.executeTool({connector,identifier,toolName: 'betterstackmcp_applications',toolInput: {},})console.log(result)Terminal window npx tsx quickstart.mtsquickstart.py import osfrom scalekit import ScalekitClientfrom dotenv import load_dotenvload_dotenv()scalekit_client = ScalekitClient(env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),client_id=os.getenv("SCALEKIT_CLIENT_ID"),client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),)actions = scalekit_client.actionsconnection_name = "betterstackmcp"identifier = "user_123"# Generate an authorization link for the userlink_response = actions.get_authorization_link(connection_name=connection_name,identifier=identifier,)print("Authorize Betterstack MCP:", link_response.link)input("Press Enter after authorizing...")# Make your first callresult = actions.execute_tool(tool_input={},tool_name="betterstackmcp_applications",connection_name=connection_name,identifier=identifier,)print(result)Terminal window python quickstart.pyEach user signs in once. See Authorize a user for the full flow and statuses.
Tools
Pass the exact name toexecute_toolbetterstackmcp_applicationsList all available applications in a paginated table format.Read-onlyApplications
List all available applications in a paginated table format. Returns application ID, name, platform type, team, status (active/paused), data region, and creation date
Inputs
namestring- Filter applications by name (case-insensitive partial match)
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter applications by team ID (use teams to get team IDs)
betterstackmcp_chart_alert_helpGet instructions for creating and configuring chart alerts, including alert types, operators, configuration fields, supported chart types, and common mistakes.Read-onlyChart Alert Help
Get instructions for creating and configuring chart alerts, including alert types, operators, configuration fields, supported chart types, and common mistakes. Call this before creating or editing chart alerts
Inputs
This tool takes no inputs.
betterstackmcp_chart_alertsList chart alerts with optional filtering by team, chart, or dashboard.Read-onlyChart Alerts
List chart alerts with optional filtering by team, chart, or dashboard. Returns alert ID, name, type, chart, dashboard, and status
Inputs
chart_idinteger- Filter to alerts on a specific chart
dashboard_idinteger- Filter to alerts on charts in a specific dashboard
pageinteger- Page number for pagination (default: 1, 25 per page)
team_idinteger- Filter alerts by team ID (use teams to get team IDs)
betterstackmcp_chart_building_helpGet comprehensive instructions for building charts and dashboards, including chart types, units, axis settings, column mapping, legend placement, layout tips, and common mistakes.Read-onlyChart Building Help
Get comprehensive instructions for building charts and dashboards, including chart types, units, axis settings, column mapping, legend placement, layout tips, and common mistakes. Call this before creating or editing charts
Inputs
This tool takes no inputs.
betterstackmcp_clustersList all available storage clusters for a specific team.Read-onlyClusters
List all available storage clusters for a specific team. Returns a table with cluster IDs, names, and regions. Used primarily for creating cloud connections to query logs and metrics data directly via ClickHouse
Inputs
team_idintegerrequired- The ID of the team (use teams to get team IDs)
betterstackmcp_dashboard_query_helpGet instructions for writing a ClickHouse query to use inside a Better Stack Dashboard chart (or chart alert).Read-onlyDashboard Query Help
Get instructions for writing a ClickHouse query to use inside a Better Stack Dashboard chart (or chart alert). The query uses template variables (`{{source}}`, `{{time}}`, `{{start_time}}`, `{{end_time}}`) and runs against the source's metrics collection — it is meant to be saved as a dashboard chart via `add_chart_to_dashboard` / `edit_chart`, NOT run directly. To instead write an ad-hoc query you will run directly via `query` or `render_chart`, use `metrics_query_help`.
Inputs
source_idintegerrequired- The ID of the source to get query instructions for
betterstackmcp_dashboard_templatesList all available dashboard templates in a paginated table format.Read-onlyDashboard Templates
List all available dashboard templates in a paginated table format. Returns template ID, name, description, and other metadata
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_dashboardsList all available dashboards in a paginated table format.Read-onlyDashboards
List all available dashboards in a paginated table format. Returns dashboard ID, name, creation date, and last updated date
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
resource_group_idinteger- Filter dashboards by dashboard group ID (use dashboard_groups to get group IDs)
team_idinteger- Filter dashboards by team ID (use teams to get team IDs)
betterstackmcp_data_regionsList all available data regions and clusters for application and source creation.Read-onlyData Regions
List all available data regions and clusters for application and source creation. Returns a table with region IDs (to use when creating applications or sources), display names, types (Region or Cluster), and geographical locations. Includes usage instructions for both standard regions and custom clusters
Inputs
This tool takes no inputs.
betterstackmcp_documentationSearch for relevant documentation articles and return their contentsRead-onlyDocumentation
Search for relevant documentation articles and return their contents
Inputs
querystring- The search query to find relevant documentation articles
urlstring- Direct URL to a specific documentation article
betterstackmcp_errorGet comprehensive details of a specific error including its type, message, call site information, first occurrence, current state (unhandled, unresolved, ignored, resolved, or reoccurred), and linked Linear/Jira issuesRead-onlyError
Get comprehensive details of a specific error including its type, message, call site information, first occurrence, current state (unhandled, unresolved, ignored, resolved, or reoccurred), and linked Linear/Jira issues
Inputs
application_idintegerrequired- The ID of the application
patternstringrequired- The error pattern identifier
betterstackmcp_errorsList error patterns for an application with occurrence counts, affected users, current state, and links.Read-onlyErrors
List error patterns for an application with occurrence counts, affected users, current state, and links. Defaults to unresolved errors and supports filtering by state. For specialized error analytics or custom SQL, use errors_query_help instead.
Inputs
application_idintegerrequired- The ID of the application
end_timestring- End of time range (e.g. 'now'). Default: 'now'
environmentstring- Filter by environment (for example, 'production' or 'staging')
order_bystring- Sort order. Default: 'last_seen'one of
last_seenfirst_seenexceptions_countusers_count pageinteger- Page number for pagination (starts at 1)
querystring- Search by error type or message
releasestring- Filter by release version
start_timestring- Start of time range (e.g. 'now-3d', '2024-01-01T00:00:00Z'). Default: 'now-3d'
statestring- Filter by error state. Defaults to 'unresolved'. 'unresolved' includes reoccurred errors and errors not yet triaged.one of
allnewunresolvedignoredresolvedreoccurredunhandled
betterstackmcp_errors_query_helpGet comprehensive instructions for building SQL ClickHouse queries for error tracking, including both error patterns (metrics) and individual exceptions.Read-onlyErrors Query Help
Get comprehensive instructions for building SQL ClickHouse queries for error tracking, including both error patterns (metrics) and individual exceptions. Explains when to use each source and provides examples for common use cases
Inputs
application_idintegerrequired- The application (source) ID
betterstackmcp_escalation_policiesList all escalation policies with their steps and configurationRead-onlyEscalation Policies
List all escalation policies with their steps and configuration
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter by team ID (use teams to get team IDs)
betterstackmcp_explore_logs_query_helpGet instructions for writing a ClickHouse query to use inside the Better Stack Explore logs page (and live-tail charts) for log and span data.Read-onlyExplore Logs Query Help
Get instructions for writing a ClickHouse query to use inside the Better Stack Explore logs page (and live-tail charts) for log and span data. The query uses template variables and reads fields from the raw JSON column — it is meant to be used in the Explore UI, NOT run directly. To instead write an ad-hoc logs/spans query you will run directly via query, use query_help.
Inputs
source_idintegerrequired- The ID of the source to get query instructions for
source_typestring- Type of source data to query (default: logs)one of
logsspans
betterstackmcp_heartbeatGet details of a specific heartbeatRead-onlyHeartbeat
Get details of a specific heartbeat
Inputs
idintegerrequired- The ID of the heartbeat
betterstackmcp_heartbeat_availabilityGet availability summary for a specific heartbeatRead-onlyHeartbeat Availability
Get availability summary for a specific heartbeat
Inputs
idintegerrequired- The ID of the heartbeat
fromstring- Start date (YYYY-MM-DD format)
tostring- End date (YYYY-MM-DD format)
betterstackmcp_heartbeatsList all heartbeats with filtering and pagination optionsRead-onlyHeartbeats
List all heartbeats with filtering and pagination options
Inputs
namestring- Filter by heartbeat name
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
statusstring- Filter by status (paused, pending, up, down)
team_idinteger- Filter by team ID (use teams to get team IDs)
betterstackmcp_incidentsList incidents with filtering and pagination optionsRead-onlyIncidents
List incidents with filtering and pagination options
Inputs
acknowledgedboolean- List only acknowledged incidents (true) or unacknowledged incidents (false).
causestring- Filter by a substring of the incident cause (case-insensitive).
escalation_policy_idsarray- Filter to incidents associated with any of these escalation policies.
fromstring- Return incidents from a specific date (ISO 8601 format)
has_commentsboolean- true: only incidents with comments; false: only incidents without comments.
has_jira_taskboolean- true: only incidents linked to a Jira issue; false: only those without.
has_linear_taskboolean- true: only incidents linked to a Linear issue; false: only those without.
has_postmortemboolean- true: only incidents with a post-mortem comment; false: only those without.
heartbeat_idinteger- Filter incidents for a specific heartbeat
incident_group_idinteger- Filter to incidents within a specific incident group.
max_duration_minutesinteger- Only incidents that lasted shorter than this many minutes.
metadataobject- Filter by metadata key/value.
min_duration_minutesinteger- Only incidents that lasted longer than this many minutes.
monitor_idinteger- Filter incidents for a specific monitor
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 10, max: 50)
resolvedboolean- List only resolved incidents (true) or unresolved incidents (false).
statusarray- Filter by current lifecycle status. Pass an array to match any of them.
team_idinteger- Filter by team ID (use teams to get team IDs)
tostring- Return incidents until a specific date (ISO 8601 format)
betterstackmcp_metricGet comprehensive details about a specific metric.Read-onlyMetric
Get comprehensive details about a specific metric. Returns metric overview (data points, active series, available aggregations), definition (SQL expression or JSON path), example queries for different aggregation functions, and Prometheus tags (for pure metrics). Essential for understanding how to query and use a metric
Inputs
metric_namestringrequired- The name of the metric
source_idintegerrequired- The ID of the source
betterstackmcp_metric_expressionsList the metric expressions (extract-metrics-from-logs rules) on a source.Read-onlyMetric Expressions
List the metric expressions (extract-metrics-from-logs rules) on a source. Returns the rule ID, name, kind (metric vs label), ClickHouse type, SQL expression, and aggregations. IDs use a short prefixed form that feeds straight into update_metric_expression / delete_metric_expression
Inputs
source_idintegerrequired- The ID of the source (use sources to get source IDs)
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_metrics_query_helpGet instructions for building SQL ClickHouse queries for metrics (available metrics, aggregations, examples) to run directly via the query tools (query / render_chart), using concrete remote(...) / s3Cluster(...) collection names and explicit time filters.Read-onlyMetrics Query Help
Get instructions for building SQL ClickHouse queries for metrics (available metrics, aggregations, examples) to run directly via the query tools (query / render_chart), using concrete remote(...) / s3Cluster(...) collection names and explicit time filters. To instead write a query for use inside a Dashboard chart, use dashboard_query_help. Pass context: 'chart_query' when the query will be saved as a dashboard chart or chart alert.
Inputs
source_idintegerrequired- The ID of the source to get query instructions for
contextstring- Where the query will run. 'direct_query' (default) â running directly via query or render_chart; prompt uses templates the query tools expand from their source_type/start_time/end_time arguments. 'chart_query' â query will be saved as a dashboard chart or chart alert; prompt uses {{source}}/{{time}}/{{start_time}}/{{end_time}} template variables throughout.one of
direct_querychart_query
betterstackmcp_metrics_schemaGet metrics and cardinality for a source.Read-onlyMetrics Schema
Get metrics and cardinality for a source. Returns a paginated table of available metrics (user-defined and ingested) ordered by active series (highest cardinality first), with their names, types, storage layout, data points count, and active series count. Sources with many metrics are paginated — use the page argument to read the rest
Inputs
idintegerrequired- The ID of the source
name_filterstring- Filter metrics by name. Supports wildcards: 'rabbitmq*' (starts with), '*queue*' (contains), '*_total' (ends with), or an exact name. Case-insensitive
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_monitor_availabilityGet availability (SLA) summary for a specific monitorRead-onlyMonitor Availability
Get availability (SLA) summary for a specific monitor
Inputs
idintegerrequired- The ID of the monitor
fromstring- Start date (YYYY-MM-DD format)
tostring- End date (YYYY-MM-DD format)
betterstackmcp_monitor_response_timesGet response time metrics for a specific monitorRead-onlyMonitor Response Times
Get response time metrics for a specific monitor
Inputs
idintegerrequired- The ID of the monitor
betterstackmcp_monitorsList monitors with optional filtering and paginationRead-onlyMonitors
List monitors with optional filtering and pagination
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
pronounceable_namestring- Filter monitors by name
team_idinteger- Filter by team ID (use teams to get team IDs)
urlstring- Filter monitors by URL
betterstackmcp_on_callGet detailed information about a specific on-call calendar or the default calendarRead-onlyOn Call
Get detailed information about a specific on-call calendar or the default calendar
Inputs
idintegerrequired- The ID of the on-call calendar
datestring- ISO-8601 formatted date/time to look up who is on-call at that time
betterstackmcp_on_call_eventGet detailed information about a specific on-call eventRead-onlyOn Call Event
Get detailed information about a specific on-call event
Inputs
calendar_idintegerrequired- The ID of the on-call calendar
event_idintegerrequired- The ID of the event to retrieve
betterstackmcp_on_call_eventsList all on-call schedule events for a specific calendarRead-onlyOn Call Events
List all on-call schedule events for a specific calendar
Inputs
idintegerrequired- The ID of the on-call calendar
betterstackmcp_on_call_rotationGet on-call rotation configuration for a specific calendarRead-onlyOn Call Rotation
Get on-call rotation configuration for a specific calendar
Inputs
idintegerrequired- The ID of the on-call calendar
betterstackmcp_on_callsList all on-call calendars for the teamRead-onlyOn Calls
List all on-call calendars for the team
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter by team ID (use teams to get team IDs)
betterstackmcp_queryExecute a ClickHouse SQL query to retrieve logs, traces/spans, errors, and metrics from telemetry data.Read-onlyQuery
Execute a ClickHouse SQL query to retrieve logs, traces/spans, errors, and metrics from telemetry data. - **IMPORANT**: Use `query_help` to get instructions on how to create the correct query for logs and spans - **IMPORANT**: Use `errors_query_help` to get instructions on how to create the correct query for errors - **IMPORANT**: Use `metrics_query_help` to get instructions on how to create the correct query for metrics
Inputs
querystringrequired- The SQL query to execute: a template using `{{source}}`, or SQL naming its collections
source_idintegerrequired- Source ID
tablestringrequired- Required for SQL without template variables: the table name, ie. `t123.my_source`. A template reads it from the source and ignores this
end_timestring- Required with template variables: 'now' (or 'now-15m', an ISO 8601 datetime, epoch digits); must be after start_time
source_typestring- Required with `{{source}}`: which data `{{source}}` reads. `web_events` = browser/RUM events from the JS tag; `exceptions` = raw exception events of Errors sources (both queried like logs)one of
logsspansmetricsweb_eventsexceptions start_timestring- Required with template variables: the start of `{{start_time}}`..`{{end_time}}`. Relative preferred, it cannot misresolve: 'now-3h', 'now-1d'. Or an ISO 8601 datetime '2025-11-29T17:00:00Z', or epoch digits '1787668915598000'
betterstackmcp_query_helpGet instructions for building SQL ClickHouse queries for logs and spans (fields, aggregations, examples) to run directly via the query tools (query / render_chart) against the ClickHouse proxy.Read-onlyQuery Help
Get instructions for building SQL ClickHouse queries for logs and spans (fields, aggregations, examples) to run directly via the query tools (query / render_chart) against the ClickHouse proxy. To instead write a query for use inside the Explore logs UI, use explore_logs_query_help.
Inputs
source_idintegerrequired- The ID of the source to get query instructions for
source_typestringrequired- The type of source (logs or spans)one of
logsspans
betterstackmcp_query_windowsSize an S3 query before running it: how many rows its time range holds and, when that is more than one `query` call reads (50,000,000 rows, 60 seconds), the time windows that fit one call each.Read-onlyQuery Windows
Size an S3 query before running it: how many rows its time range holds and, when that is more than one `query` call reads (50,000,000 rows, 60 seconds), the time windows that fit one call each. Pass the same arguments you would pass to `query` (`query`, `source_id`, and `table` for SQL without template variables or `source_type`, `start_time` and `end_time` for a template). Nothing is read from S3; the answer comes from the source's row counts in well under a second. All timestamps are UTC; when `server_timezone` is not UTC, write each bound as toDateTime('<value>', 'UTC') rather than as a bare literal, which would be parsed in the server's timezone. Returns `decision`: - `run` â the range fits one call; run the query as written - `windows` â Run the query once per window, newest first, with `dt >= '<from>' AND dt < '<to>'` in place of its time filter, and merge the results yourself: rows concatenate; `count()` and `sum()` add up; `min()` and `max()` combine; an average needs `sum()` and `count()` per window; `quantile(...)`, `uniq(...)`, `count(DISTINCT ...)` and `topK(...)` do not merge across windows, so keep those to one window or add filters. For a template whose time filter is `{{start_time}}`/`{{end_time}}`, pass each window as `start_time` = `from` and `end_time` = `to` instead. At most 200 windows are returned; `more_windows` counts the older ones the range still holds. More windows than you will run means the range needs rethinking: narrow the time filter, add filters on `raw` before extracting JSON, or set `sampling=` to `suggested_sampling` to estimate rather than measure. A window marked `oversized` holds more than the budget in a single second: add filters or `sampling=` for it - `unsized` â the query's shape cannot be sized; `explanation` says what to change With `run` or `windows`: - `hot_tail` (never for a `{{source}}` template or a query that reads the hot collection itself with `remote()`) â the newest rows of the range are still in the hot collection, which `s3Cluster` holds only once they leave it: `from` is the oldest row still there (Live tail's first row on disk), `estimated_rows` how many of the range's rows that is, `collection` the hot collection to read them from when the row type names one; the top-level `estimated_rows` and the windows count S3 rows only. Run the same query against `remote(<collection>)` with the time filter unchanged and no `_row_type` filter, and merge it in as one more window. The windows deliberately read past `from`, so a row uploaded to S3 since then is in both legs: add `AND dt < <from>` to them when the merged `count()` or `sum()` has to be exact. Without `from` the boundary could not be probed and the range merely reaches into the last hours - `suggested_sampling` â with more windows than you will run, the `sampling=` rate at which the whole range fits one call
Inputs
querystringrequired- The SQL query you are about to run through `query` or `render_chart`, unchanged
source_idintegerrequired- Source ID
end_timestring- Required with template variables: 'now' (or 'now-15m', an ISO 8601 datetime, epoch digits); must be after start_time
source_typestring- Required with `{{source}}`: which data `{{source}}` reads. `web_events` = browser/RUM events from the JS tag; `exceptions` = raw exception events of Errors sources (both queried like logs)one of
logsspansmetricsweb_eventsexceptions start_timestring- Required with template variables: the start of `{{start_time}}`..`{{end_time}}`. Relative preferred, it cannot misresolve: 'now-3h', 'now-1d'. Or an ISO 8601 datetime '2025-11-29T17:00:00Z', or epoch digits '1787668915598000'
tablestring- Required for SQL without template variables: the table name, ie. `t123.my_source`. A template reads it from the source and ignores this
betterstackmcp_releasesList all releases for a specific application in a paginated table format.Read-onlyReleases
List all releases for a specific application in a paginated table format. Returns release reference, environments, first seen, and last seen timestamps
Inputs
application_idintegerrequired- The ID of the application to list releases for
orderstring- Sort order: 'asc' or 'desc' (default: 'desc')one of
ascdesc pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_replays_query_helpGet comprehensive instructions for building SQL ClickHouse queries for session replays.Read-onlyReplays Query Help
Get comprehensive instructions for building SQL ClickHouse queries for session replays. Explains data structure, provides examples for listing replays, finding replays linked to errors, and filtering by user/environment
Inputs
application_idintegerrequired- The application (source) ID
betterstackmcp_severitiesList all severities (urgency levels) with their notification settingsRead-onlySeverities
List all severities (urgency levels) with their notification settings
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter by team ID (use teams to get team IDs)
betterstackmcp_sourceGet comprehensive details of a specific source including its configuration, retention settings, ingestion details, custom bucket settings (if configured)Read-onlySource
Get comprehensive details of a specific source including its configuration, retention settings, ingestion details, custom bucket settings (if configured)
Inputs
idintegerrequired- The ID of the source
betterstackmcp_source_fieldsGet complete field catalog for a logs or spans source.Read-onlySource Fields
Get complete field catalog for a logs or spans source. Returns a table of all queryable fields with their paths and data types. Essential for understanding what fields can be queried for building custom queries
Inputs
idintegerrequired- The ID of the source
source_typestring- Type of source data to query (default: logs)one of
logsspans
betterstackmcp_sourcesList all available sources in a paginated table format.Read-onlySources
List all available sources in a paginated table format. Returns source ID, name, platform type, team, status (active/paused), data region, and creation date
Inputs
namestring- Filter sources by name (case-insensitive partial match)
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter sources by team ID (use teams to get team IDs)
betterstackmcp_status_pageGet details of a specific status pageRead-onlyStatus Page
Get details of a specific status page
Inputs
idintegerrequired- The ID of the status page
betterstackmcp_status_page_report_updateGet details of a specific status page report updateRead-onlyStatus Page Report Update
Get details of a specific status page report update
Inputs
report_idintegerrequired- The ID of the status report
status_page_idintegerrequired- The ID of the status page
update_idintegerrequired- The ID of the status update
betterstackmcp_status_page_report_updatesList status updates for a specific status reportRead-onlyStatus Page Report Updates
List status updates for a specific status report
Inputs
report_idintegerrequired- The ID of the status report
status_page_idintegerrequired- The ID of the status page
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_status_page_reportsList status reports (incidents/maintenance) for a specific status pageRead-onlyStatus Page Reports
List status reports (incidents/maintenance) for a specific status page
Inputs
status_page_idintegerrequired- The ID of the status page
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter by team ID (use teams to get team IDs)
betterstackmcp_status_page_resourcesGet resources (monitors/heartbeats) for a specific status pageRead-onlyStatus Page Resources
Get resources (monitors/heartbeats) for a specific status page
Inputs
status_page_idintegerrequired- The ID of the status page
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_status_page_sectionsList the sections (resource groups) of a status page.Read-onlyGet Status Page Sections
List the sections (resource groups) of a status page.
Inputs
status_page_idintegerrequired- The ID of the status page
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_status_pagesList all status pages with filtering and pagination optionsRead-onlyStatus Pages
List all status pages with filtering and pagination options
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
betterstackmcp_team_membersList the members of a Better Stack team, including pending invitations.Read-onlyList Team Members
List the members of a Better Stack team, including pending invitations. Returns each member's email, name, role and the mobile app platforms they have signed in on. Supports the same email filter and pagination as the REST team-members API. If the token can reach more than one team, pass team_id (or team_name) to pick one; call it without a team first to see the list of accessible teams. Useful for auditing who has access — e.g. offboarding.
Inputs
emailstring- Return only the member or pending invitation with this exact email address.
pageinteger- Page number (1-based). Defaults to 1.
per_pageinteger- Results per page. Defaults to 50, maximum 250.
team_idinteger- ID of the team to list members for. Required when the token can access more than one team.
team_namestring- Name of the team to list members for (alternative to team_id).
betterstackmcp_team_rolesList the roles defined in a Better Stack organization, including their role_id and system-role identifier (admin, billing_admin, team_lead, responder, member, or "custom").Read-onlyList Organization Roles
List the roles defined in a Better Stack organization, including their role_id and system-role identifier (admin, billing_admin, team_lead, responder, member, or "custom"). Use this to discover valid role_id values for interpreting team member roles. If the token can reach more than one team/organization, pass team_id (or team_name) to choose one.
Inputs
team_idinteger- ID of a team in the target organization. Required when the token can access more than one team.
team_namestring- Name of a team in the target organization (alternative to team_id).
betterstackmcp_teamsList all available teams in Better Stack Logs.Read-onlyTeams
List all available teams in Better Stack Logs. Returns a table with team IDs and names, grouped by organization
Inputs
searchstring- Filter teams by name (case-insensitive partial match)
betterstackmcp_acknowledge_incidentAcknowledge an ongoing incidentWriteAcknowledge Incident
Acknowledge an ongoing incident
Inputs
idintegerrequired- The ID of the incident to acknowledge
acknowledged_bystring- User email or identifier of who acknowledged the incident. Optional - when omitted, the action is attributed to the authenticated OAuth user (or "API" for team/organisation API tokens). Only pass this if the user has explicitly told you who acknowledged the incident on their behalf.
betterstackmcp_add_chart_to_dashboardAdd a new chart to a dashboard.WriteAdd Chart To Dashboard
Add a new chart to a dashboard. Use the `section` parameter to organize charts into named sections — sections are auto-created if they don't exist, and charts are auto-positioned within them. **REQUIRED**: the `query` MUST contain `{{source}}` in the FROM clause — queries without a source variable are rejected. Dashboard chart queries run against the metrics collection: use `sum(logs_count)` (or the matching `sum(<row_type>_count)` for the source), `avgMerge(value_avg)`, `label('tag')`. Do NOT use `JSONExtract(raw, …)` — that is for live-tail charts and `query` only; dashboards have no `raw` column. Call `metrics_query_help` with the source ID **and `context: 'chart_query'`** for available metrics/labels and chart-query-style examples.
Inputs
chart_typestringrequired- Type of chart to createone of
line_chartbar_chartnumber_charttable_chartpie_chartheatmap_chartscatter_chartgauge_chartmap_charthierarchy_chartstatic_text_chart dashboard_idintegerrequired- The ID of the dashboard to add the chart to
namestringrequired- Name/title for the chart
querystringrequired- SQL query. MUST contain {{source}} in FROM (hardcoded collection names are rejected). Use {{start_time}}/{{end_time}} in the time filter and {{time}} for bucketing.
explanationstring- Short description of the chart.
heightinteger- Chart height in grid units (default: 8)
sectionstring- Section name — chart is auto-placed within it. Section auto-created if it doesn't exist.
settingsobject- Chart display settings
widthinteger- Chart width in grid units (1-12, default: 6)
betterstackmcp_add_dashboard_sectionAdd a section divider to a dashboard.WriteAdd Dashboard Section
Add a section divider to a dashboard. Sections span the full width and help organize charts into groups. Charts and sections at or below the insertion point are shifted down to make room
Inputs
dashboard_idintegerrequired- The ID of the dashboard
namestringrequired- Section title (e.g., 'Memory Metrics', 'Network')
yintegerrequired- Y position (row) where section should appear
explanationstring- Short description of the section, shown as a tooltip next to section name in the UI. Use rarely, when wanting to show more context for non-obvious sections.
betterstackmcp_applicationGet comprehensive details of a specific application including its configuration, retention settings, ingestion details, custom bucket settings (if configured)WriteApplication
Get comprehensive details of a specific application including its configuration, retention settings, ingestion details, custom bucket settings (if configured)
Inputs
idintegerrequired- The ID of the application
betterstackmcp_available_incident_escalation_policiesGet available escalation policies for an incidentWriteAvailable Incident Escalation Policies
Get available escalation policies for an incident
Inputs
idintegerrequired- The ID of the incident
searchstring- Filter options by text (searches in names, emails, and other text fields)
typestring- Filter by escalation type. Possible values: user, team, policy, schedule, organisation
betterstackmcp_catalog_relationShow one catalog relation with its records, one column per attribute, paginated.WriteCatalog Relation
Show one catalog relation with its records, one column per attribute, paginated. Objects read as `Platform (Team 123)`, so a record can name them again by `name` or `item_id`. See `catalog_relations` for how the catalog works.
Inputs
relation_idintegerrequired- The ID of the catalog relation (from catalog_relations)
pageinteger- Page of records (starts at 1)
per_pageinteger- Number of records per page (default: 50, max: 250)
betterstackmcp_catalog_relationsList the catalog's relations with their primary and added attributes and how many records each holds.WriteCatalog Relations
List the catalog's relations with their primary and added attributes and how many records each holds. ## How the catalog works The catalog adds business context to incidents through lookup tables. - A **relation** is a table. Its **primary attributes** are the key columns, its **added attributes** are the columns it adds, and each **record** is a row. - A primary attribute is named after a metadata key incidents already carry, set by a monitor, an integration, the reporter or another relation. When an incident's value for that key equals a record's primary value exactly, the record's added values are copied onto the incident as metadata, where escalation policies can act on them. - With several primary attributes, the relation's matching decides: `any` matches a record when one of its primary values matches, `all` only when every primary attribute does, an empty primary cell matching anything there. A record with every primary cell empty is the relation's fallback, used only when no other record matches. - A value is text, or a Better Stack object: `Team`, `User` (a team member), `Policy` (an escalation policy), `Schedule` (an on-call calendar), `Endpoint` (a monitor) and more. Reference an object by `name` (a team member by `email`) or by the `item_id` that `catalog_relation` shows, a monitor by `item_id` only; the team IDs other tools take are a different number. - An added attribute named like another relation's primary attribute chains the lookup: the value it adds is looked up in that relation next. - Three added attributes draw the Dependencies map on Integrations â Catalog: - `Dependencies`: the records this one needs, named by their primary value. An incident on any of them marks this record as affected too. - `Connections`: the records this one talks to, drawn without passing incidents on. - `Type`: Database, Storage, Frontend, Backend, Mobile app or Desktop app, which sets the record's icon. Read one relation's records with `catalog_relation`.
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of relations per page (default: 50, max: 250)
betterstackmcp_change_team_member_roleChange a team member's role.WriteChange Team Member Role
Change a team member's role. Identify the member by email or user_id (from team_members) and pass the target role_id (from team_roles). The admin role cannot be assigned, and an existing admin's role cannot be changed, via the API. Pending invitations can't have their role changed — cancel and re-invite instead. If the token can reach more than one team, pass team_id (or team_name).
- Idempotent
Inputs
role_idintegerrequired- ID of the role to assign (use team_roles to look up ids).
emailstring- E-mail of the member whose role to change (alternative to user_id).
team_idinteger- ID of the team the member belongs to. Required when the token can access more than one team.
team_namestring- Name of the team (alternative to team_id).
user_idinteger- ID of the member whose role to change (alternative to email).
betterstackmcp_chartGet detailed information about a specific chart including its SQL queries, configuration, and settings.WriteChart
Get detailed information about a specific chart including its SQL queries, configuration, and settings. Use dashboard first to find the chart ID
Inputs
idintegerrequired- The ID of the chart to retrieve
betterstackmcp_chart_alertGet detailed information about a specific chart alert including its configuration, SQL queries, status, and current incident info.WriteChart Alert
Get detailed information about a specific chart alert including its configuration, SQL queries, status, and current incident info. Use chart_alerts first to find the alert ID
Inputs
idintegerrequired- The ID of the chart alert to retrieve
betterstackmcp_create_applicationCreate a new application in Better Stack.WriteCreate Application
Create a new application in Better Stack. Returns the created application details including ID, ingestion token, ingesting host URL, retention settings, and platform-specific integration documentation links with next steps for configuration
Inputs
namestringrequired- The name of the application
platformstringrequired- The platform of the applicationone of
dot_net_errorsdot_net_maui_errorsdot_net_http_errorsaiohttp_errorsasgi_errorsasp_dot_net_errorsasp_dot_net_core_errorsaws_lambda_dot_net_errorsaws_lambda_node_errorsaws_lambda_python_errorsandroid_errorsangular_errorsastro_errorsazure_functions_node_errorsbottle_errorsjavascript_errorsbun_errorscli_errorscelery_errorschalice_errorscloudflare_pages_errorsconnect_errorsdart_errorsdeno_errorsdjango_errorsecho_errorselectron_errorselixir_errorsember_errorsexpress_errorsfasthttp_errorsfalcon_errorsfastapi_errorsfastify_errorsfiber_errorsflask_errorsflutter_errorsgo_errorsgatsby_errorsgin_errorsgodot_errorsgoogle_cloud_function_dot_net_errorsgoogle_cloud_function_node_errorsgoogle_cloud_function_python_errorshapi_errorsiris_errorsjava_errorskoa_errorskotlin_errorslaravel_errorslog4j_errorslogback_errorsminidump_errorsnative_errorsnegroni_errorsnest_js_errorsnext_js_errorsnode_errorsnuxt_errorsphp_errorspowershell_errorspyramid_errorspython_errorsqt_errorsquart_errorsrq_errorsrack_middleware_errorsrails_errorsreact_errorsreact_native_errorsreact_router_framework_errorsremix_errorsruby_errorsrust_errorssanic_errorsserverless_python_errorssolid_errorssolidstart_errorsspring_errorsspring_boot_errorsstarlette_errorssvelte_errorssveltekit_errorssymfony_errorstanstack_start_react_errorstornado_errorstryton_errorsunity_errorsunreal_engine_errorsvue_errorswpf_errorswsgi_errorswindows_forms_errorsios_errorsmacos_errors team_idintegerrequired- The ID of the team to create the application in (use teams to get team IDs)
correlate_with_source_idinteger- The ID of an existing telemetry source in the same team (use sources to find it) to correlate this application's errors with its logs and traces. The errors are stored with that source, in its data region, so leave data_region empty. Can't be changed after creation.
data_regionstring- The data region for the application. Use 'data_regions' tool to see available options for your organization. Common values for most plans: us_east, germany, singapore. Ask the user if unsure.
ingesting_pausedboolean- Whether to start with ingesting paused (default: false). A correlated application pauses with its source instead.
betterstackmcp_create_catalog_relationCreate a catalog relation with its primary and added attributes in one call.WriteCreate Catalog Relation
Create a catalog relation with its primary and added attributes in one call. Add records with `upsert_catalog_records` afterwards. See `catalog_relations` for how the catalog works. Propose the relation to the user first (its name, matching, attributes and a few example records) and create it once they agree. For a relation describing services, add `Dependencies`, `Connections` and `Type` as added attributes, so the Dependencies map can draw its records. ## Rules - Name primary attributes after metadata keys incidents really carry. Check recent incidents' metadata with `incidents` and `incident` first: a key no incident carries never matches. - Reference teams, team members, escalation policies and other Better Stack objects as objects, like `{"type": "Team", "name": "Platform"}`, never as their names in text. - Never invent records. Every row comes from a source the user pointed you to (code, Terraform, Kubernetes, a Backstage catalog, the service map) or from the user. - Prefer `upsert_catalog_records` to removing records and adding them again: it keeps every record it doesn't name, while removing them all empties the relation.
Inputs
namestringrequired- The relation's name, like "Services"
primary_attributesarrayrequired- The key columns, each named exactly like a metadata key incidents carry, like ["service"]
added_attributesarray- The columns copied onto matching incidents, like ["Owner", "Dependencies", "Connections", "Type"]
descriptionstring- What the relation holds and where its records come from
match_modestring- With several primary attributes: any = a record matches when one primary value matches, all = when every primary attribute does. Defaults to anyone of
anyall team_idinteger- A team ID of the organisation to create the relation in. Needed only when the API token reaches several organisations
betterstackmcp_create_chart_alertCreate a new chart alert on an existing chart.WriteCreate Chart Alert
Create a new chart alert on an existing chart. The chart must support alerts (line_chart, bar_chart, number_chart, or tail_chart with time variables). Call chart_alert_help for configuration reference. Use chart or dashboard first to find the chart ID
Inputs
alert_typestringrequired- Alert type: 'threshold' (fixed value), 'relative' (percentage change), 'anomaly_rrcf' (ML-based anomaly detection)one of
thresholdrelativeanomaly_rrcf chart_idintegerrequired- The ID of the chart to add the alert to
namestringrequired- Name of the alert
operatorstringrequired- Comparison operator. For relative type also: increases_by, decreases_by, changes_byone of
equalhigher_thanhigher_than_or_equallower_thanlower_than_or_equalincreases_bydecreases_bychanges_by additional_conditionsarray- Up to 4 extra conditions ANDed onto the alert's own: it fires only when every condition breaches in the same time bucket. Give an anomaly_rrcf alert a threshold floor in the chart's units (e.g. CPU higher_than 0.8 on a 0-1 chart) so it fires only when the metric is both unusual and bad. See chart_alert_help
aggregation_intervalinteger- Data range for threshold alerts on line/bar charts ('on data from' in UI, default: 60s)one of
306012030060018003600720010800216004320086400 anomaly_sensitivityinteger- Anomaly significance threshold (1-10, default 5), shown as 'Significance' in the UI. Higher = larger deviation required to fire, so FEWER alerts; lower = more sensitive, more alerts. Only for anomaly_rrcf alerts
anomaly_training_range_daysinteger- How many days of data the anomaly model is first trained on (1-30, default 7), shown as 'Initial training data range' in the UI. A full week (7) captures daily and weekly pattern shifts. Only for anomaly_rrcf alerts
anomaly_triggerstring- Anomaly trigger direction: 'any' (default), 'higher', 'lower'. Only for anomaly_rrcf alertsone of
anyhigherlower callboolean- Phone notifications (default: false)
check_periodinteger- How often to run the alert check (seconds). Max 3600 for query-period-based alertsone of
306012030060018003600720010800216004320086400 confirmation_periodinteger- How long the condition must persist before creating an incident (seconds, default: 60)one of
0306012030060018003600720014400 emailboolean- Email notifications (default: true)
escalation_targetstring- 'current_team' (default) or a GID like gid://uptime/Policy/123 or gid://uptime/Team/456
metadataobject- Tags for the alert, e.g. {"severity": "critical", "owner": ["payments"]}: each value a string or a list of strings. The alert's incidents carry them
pushboolean- Push notifications (default: false)
query_periodinteger- Seconds to look back for relative alerts and tail/table chartsone of
306012030060018003600 recovery_periodstring- How long the condition must be resolved before auto-resolving (seconds, default: 60). null means never auto-resolve; the incident stays open until resolved manually
series_namesarray- Specific series to monitor. Empty = all series. Mutually exclusive with series_names_except
series_names_exceptarray- Series to exclude; alert fires on every other series. Mutually exclusive with series_names
shown_intervalinteger- Anomaly chart aggregation interval (seconds). Only for anomaly_rrcf alertsone of
306012030060018003600720010800216004320086400 smsboolean- SMS notifications (default: false)
valuenumber- Threshold value (required for threshold/relative types). For relative type, this is a percentage (e.g., 50 means 50%)
variable_valuesarray- Per-alert overrides for the dashboard's variables ({{name}} in the chart query). The alert is evaluated with these values while the chart keeps the dashboard's; variables not listed keep the dashboard values. Omit to evaluate the alert with the dashboard values. See chart_alert_help
betterstackmcp_create_cloud_connectionCreate a secure cloud connection for direct ClickHouse query access to logs, spans, and metrics data.WriteCreate Cloud Connection
Create a secure cloud connection for direct ClickHouse query access to logs, spans, and metrics data. Returns connection credentials (host, port, username, password), sample queries for each data type, and cURL command examples. Connections expire after 1 hour by default
Inputs
team_idintegerrequired- The ID of the team (use teams to get team IDs)
cluster_idinteger- The ID of the cluster to use (required, when source_id is empty)
notestring- Optional note for the connection
source_idinteger- The ID of the source (required, when cluster_id is empty)
betterstackmcp_create_collectorCreate a Better Stack Collector, the agent that collects logs, metrics and traces from a Docker host, a Docker Swarm or a Kubernetes cluster.WriteCreate Collector
Create a Better Stack Collector, the agent that collects logs, metrics and traces from a Docker host, a Docker Swarm or a Kubernetes cluster. Returns the collector details, the collector secret needed to install it, the ID of the source its data goes to, and the installation guide for its platform
Inputs
namestringrequired- The name of the collector
platformstringrequired- Where the collector runs: docker (a Docker host), swarm (a Docker Swarm) or kubernetes (a Kubernetes cluster). Can't be changed after creation.one of
dockerswarmkubernetes team_idintegerrequired- The ID of the team to create the collector in (use teams to get team IDs)
data_regionstring- The data region for the collector's data. Can't be changed after creation. Use 'data_regions' tool to see available options for your organization. Common values for most plans: us_east, germany, singapore. Ask the user if unsure.
ingesting_pausedboolean- Whether to start with ingesting paused (default: false)
logs_retentioninteger- Logs retention in days. The plan decides which values are allowed, usually some of 7, 30, 60, 90, 180, 365, 730, 1095, 1460 or 1825, and rejects any other with the ones it allows; omit it to use the plan's default.
metrics_retentioninteger- Metrics retention in days. The plan decides which values are allowed, usually some of 7, 30, 60, 90, 180, 365, 730, 1095, 1460 or 1825, and rejects any other with the ones it allows; omit it to use the plan's default.
notestring- A note to help team members recognize the collector, for example where it's deployed
betterstackmcp_create_dashboardCreate a new dashboard.WriteCreate Dashboard
Create a new dashboard. Optionally use a template to start with pre-configured charts. Call chart_building_help for guidance on dashboard structure and layout. Optionally specify a source_id to preconfigure the dashboard with that source. Returns the new dashboard ID which can be used with add_chart_to_dashboard to add charts
Inputs
namestringrequired- Name for the new dashboard
team_idintegerrequired- The ID of the team to create the dashboard in (use teams to get team IDs)
resource_group_namestring- Optional resource group name to place the dashboard in. If a group with this name already exists for the team it will be reused; otherwise a new group is created.
source_idinteger- Optional source ID to preconfigure dashboard with that source's metrics
template_idinteger- Optional template ID to create dashboard from (use dashboard_templates to see available templates)
betterstackmcp_create_error_commentPost a comment on an error so the findings land in the conversation the team reads in Better Stack.WriteCreate Error Comment
Post a comment on an error so the findings land in the conversation the team reads in Better Stack. The comment is written as the user whose token made the call and marked as posted via MCP, so a team member can tell it apart from one typed in the app; a call made with an API token is attributed to the API instead. When the error is linked to a Linear issue whose integration syncs comments, the comment is posted on that issue too. Use error_comments to read the conversation back.
Inputs
application_idintegerrequired- The ID of the application
contentstringrequired- The comment body (Markdown is supported for formatting)
patternstringrequired- The error pattern identifier
betterstackmcp_create_error_issueCreate an issue for an error in Linear, or a work item in Jira, through the team's integration and link the two.WriteCreate Error Issue
Create an issue for an error in Linear, or a work item in Jira, through the team's integration and link the two. The issue gets Better Stack's standard body (error type, message, call site, stack trace, occurrence counts and a link back) and the integration's configured defaults for team or space, work type, assignee, labels and priority. Better Stack then posts every change to the error state as a comment on the issue. An error that already has an issue through the integration is reported, not duplicated; use link_error_issue to attach an issue that already exists.
Inputs
application_idintegerrequired- The ID of the application
patternstringrequired- The error pattern identifier
integration_idinteger- The Better Stack integration to create the issue through. Only needed when the team has more than one Linear or Jira integration, in which case this tool answers with the IDs to choose from.
notesstring- Extra context for whoever picks the issue up, placed above the standard error details in the issue body
titlestring- Issue title. Defaults to Better Stack's standard one: [application] error type: message
betterstackmcp_create_heartbeatCreate a new heartbeat that expects a periodic request from a cron job, worker, or other background task, and alerts when that request stops arriving.WriteCreate Heartbeat
Create a new heartbeat that expects a periodic request from a cron job, worker, or other background task, and alerts when that request stops arriving. Provide a name for the heartbeat. The heartbeat reports down once no request is received within period seconds plus the grace window. Use the returned heartbeat URL as the endpoint your job pings on every successful run.
Inputs
namestringrequired- Human-friendly name for the heartbeat.
callboolean- Call the on-call person when the heartbeat goes down.
critical_alertboolean- Send critical push notifications that ignore the device mute switch and Do Not Disturb.
emailboolean- Send e-mail alerts when the heartbeat goes down.
graceinteger- Extra seconds to wait after the period elapses before reporting the heartbeat as down. Defaults to 300.
heartbeat_group_idinteger- ID of the heartbeat group to add this heartbeat to.
maintenance_daysarray- Days the maintenance window applies to (e.g. ["mon", "tue", "wed"]).
maintenance_fromstring- Start of a daily maintenance window during which alerts are paused (e.g. "01:00:00").
maintenance_timezonestring- Timezone for the maintenance window (e.g. "UTC", "Europe/Berlin"). Defaults to UTC.
maintenance_tostring- End of the daily maintenance window (e.g. "03:00:00").
pausedboolean- Create the heartbeat in a paused state, so it expects no requests and raises no incidents until resumed.
periodinteger- How often you expect a request, in seconds. The heartbeat reports down if no request arrives within this window plus the grace period. Defaults to 86400 (one day).
policy_idinteger- ID of the escalation policy to use for alerting.
pushboolean- Send push notification alerts when the heartbeat goes down.
smsboolean- Send SMS alerts when the heartbeat goes down.
sort_indexinteger- Position of the heartbeat in the list, set to NULL to sort by creation date.
team_idinteger- The ID of the team to create the heartbeat in (use list_heartbeats to see team IDs). Required only when the API token has access to multiple teams.
team_waitinteger- Seconds to wait before escalating to the whole team.
betterstackmcp_create_incidentCreate a new incident providing a summary of the issue, requester email, and other optional detailsWriteCreate Incident
Create a new incident providing a summary of the issue, requester email, and other optional details
Inputs
summarystringrequired- Brief incident summary
team_idintegerrequired- The ID of the team (use teams to get team IDs)
callboolean- Call on-call person
critical_alertboolean- Send critical push notification
descriptionstring- Full incident description
emailboolean- Send email to on-call person
metadataobject- Additional incident key-value metadata
namestring- Short incident name
policy_idstring- Escalation policy ID
requester_emailstring- Email of the incident requester. Optional when authenticated via OAuth - defaults to the OAuth user. Required when using a team or organisation API token.
smsboolean- Send SMS to on-call person
team_waitinteger- Seconds to wait before escalating to team
betterstackmcp_create_incident_commentCreate a comment on an incidentWriteCreate Incident Comment
Create a comment on an incident
Inputs
contentstringrequired- The content of the comment (Markdown is supported for formatting)
incident_idintegerrequired- The ID of the incident to comment on
betterstackmcp_create_metric_expressionCreate a new metric expression (extract-metrics-from-logs rule) on a source.WriteCreate Metric Expression
Create a new metric expression (extract-metrics-from-logs rule) on a source. `sql_expression` runs against each log row; log fields live inside the `raw` JSON column — use `JSONExtract(raw, 'path', 'Nullable(Type)')`. The `Nullable(...)` wrapper is required. Nested paths use positional args: `JSONExtract(raw, 'request', 'headers', 'user-agent', 'Nullable(String)')`. Call `source_fields` to see what fields exist. Pass `aggregations` (e.g. `["avg", "count"]`) for an aggregated metric, or omit / pass `[]` for a label (group-by column). Prefer `build_type: new_data` (default). `historical_logs` re-runs the rule over every stored log — expensive; only when the user explicitly asks.
Inputs
namestringrequired- Metric name. Letters, numbers, and underscores only
source_idintegerrequired- The ID of the source (use sources to get source IDs)
sql_expressionstringrequired- ClickHouse SQL expression evaluated against each log row (e.g. "JSONExtractInt(raw, 'status')")
typestringrequired- ClickHouse storage type for the extracted valueone of
stringstring_low_cardinalityint64_deltaint64uint64_deltauint64float64_deltadatetime64_deltaboolean aggregationsarray- Aggregations to compute for this metric (e.g. ['avg', 'count']). Omit or pass [] to store the value as a label (group-by column) instead of an aggregated metric
build_typestring- How to process existing data: 'new_data' (default, cheap) only applies to new logs; 'historical_logs' rebuilds metrics from existing logsone of
new_datahistorical_logs
betterstackmcp_create_monitorCreate a new monitor that tracks the availability of a website, host, or service.WriteCreate Monitor
Create a new monitor that tracks the availability of a website, host, or service. Provide the `url` to monitor. For ping, TCP, UDP, SMTP, POP, IMAP, and DNS monitors this is the host (e.g. `example.com`) rather than a full URL. The monitor starts checking immediately unless `paused` is set to true.
Inputs
urlstringrequired- URL to monitor (e.g. https://example.com). For ping, TCP, UDP, SMTP, POP, IMAP, and DNS monitors, provide the host instead (e.g. example.com).
callboolean- Call the on-call person when the monitor goes down.
check_frequencyinteger- How often to check the monitor, in seconds (e.g. 30, 180).
confirmation_periodinteger- Seconds to wait and re-check before confirming the monitor is down.
critical_alertboolean- Send critical push notifications that ignore the device mute switch and Do Not Disturb.
emailboolean- Send e-mail alerts when the monitor goes down.
expected_status_codesarray- HTTP status codes considered healthy. Used with the expected_status_code monitor type.
follow_redirectsboolean- Follow HTTP redirects when checking the monitor.
http_methodstring- HTTP method to use for the check (e.g. get, post, head).
monitor_group_idinteger- ID of the monitor group to add this monitor to.
monitor_typestring- What kind of check to run. Defaults to 'status' (HTTP up/down).one of
statusexpected_status_codekeywordkeyword_absencepingtcpudpsmtppopimapdnsplaywright pausedboolean- Create the monitor in a paused state, so it performs no checks until resumed.
policy_idinteger- ID of the escalation policy to use for alerting.
portinteger- Port to check. Used for tcp, udp, smtp, pop, and imap monitors.
pronounceable_namestring- Human-friendly name for the monitor. Defaults to the URL host.
pushboolean- Send push notification alerts when the monitor goes down.
recovery_periodinteger- Seconds the monitor must stay healthy before a related incident is resolved.
regionsarray- Regions to check from (e.g. ["us", "eu", "as", "au"]).
request_bodystring- Request body to send with the check.
request_headersarray- Custom request headers to send with the check.
request_timeoutinteger- How long to wait for a response before the check times out, in seconds.
required_keywordstring- Keyword to search for in the response body. Required for the keyword and keyword_absence monitor types.
smsboolean- Send SMS alerts when the monitor goes down.
team_idinteger- The ID of the team to create the monitor in. Required only when the API token has access to multiple teams.
team_waitinteger- Seconds to wait before escalating to the whole team.
verify_sslboolean- Verify the SSL certificate when checking HTTPS URLs.
betterstackmcp_create_releaseRegister a release for an errors application, so it appears the moment it deploys instead of when its first error arrives.WriteCreate Release
Register a release for an errors application, so it appears the moment it deploys instead of when its first error arrives. Returns the release ID, usable with remove_release
Inputs
application_idintegerrequired- The ID of the errors application to register the release for
versionstringrequired- Release version or commit ref, e.g. 'v1.2.3'
environmentsarray- Environments this release was deployed to, e.g. ['production']
betterstackmcp_create_sourceCreate a new log source in Better Stack.WriteCreate Source
Create a new log source in Better Stack. Returns the created source details including ID, ingestion token, ingesting host URL, retention settings, and platform-specific integration documentation links with next steps for configuration
Inputs
namestringrequired- The name of the source
platformstringrequired- The platform for the source (e.g., nginx, docker, kubernetes, http, vector)one of
apache2datadog_agentdockerhaproxykubernetesnginxopen_telemetryubuntuvectorvercel_integrationdokkufly_ioherokudotnetawsaws_elbaws_fargateaws_cloudwatchaws_ecsazureazure_logscloudflare_workercloudflare_logpusherlangfastlyfilebeatgcpgojavajavascriptphppythonrubywinlogbeatelasticsearchmongodbmysqlpostgresqlrabbitmqredistraefikgoogle_cloud_pubsubhttpdigitaloceanfluentbitfluentdlogstashrsyslogrendersyslog-ngcloudflare_prometheus_exporterminioprometheusprometheus_scrapeflights team_idintegerrequired- The ID of the team to create the source in (use teams to get team IDs)
data_regionstring- The data region for the source. Use 'data_regions' tool to see available options for your organization. Common values for most plans: us_east, germany, singapore. Ask the user if unsure.
ingesting_pausedboolean- Whether to start with ingesting paused (default: false)
logs_retentioninteger- Log retention in days. The plan decides which values are allowed, usually some of 7, 30, 60, 90, 180, 365, 730, 1095, 1460 or 1825, and rejects any other with the ones it allows; omit it to use the plan's default.
betterstackmcp_create_status_page_reportCreate a new status page reportWriteCreate Status Page Report
Create a new status page report
Inputs
messagestringrequired- The initial status update message
status_page_idintegerrequired- The ID of the status page
titlestringrequired- The title of the status report
affected_resourcesarray- Array of affected resources with status_page_resource_id and status
ends_atstring- End time for the report (ISO 8601 format, required for maintenance reports)
notify_subscribersboolean- Whether to notify subscribers via email (default: false)
published_atstring- When the report should be published (ISO 8601 format, default: now)
report_typestring- Type of report - manual (incident) or maintenance (default: manual)one of
manualmaintenance starts_atstring- Start time for the report (ISO 8601 format)
team_idinteger- Optional team ID (use teams to get team IDs). Status pages belong to organizations, so this is only needed to narrow the lookup to one team's organization
betterstackmcp_create_status_page_report_updateCreate a new status update for an existing status page reportWriteCreate Status Page Report Update
Create a new status update for an existing status page report
Inputs
affected_resourcesarrayrequired- Array of affected resources with status_page_resource_id and status
report_idintegerrequired- The ID of the status report
status_page_idintegerrequired- The ID of the status page
messagestring- The status update message
notify_subscribersboolean- Whether to notify subscribers via email (default: false)
published_atstring- When the update should be published (ISO 8601 format, default: now)
betterstackmcp_create_status_page_resourceAdd a resource (monitor, heartbeat, or group) to a status page.WriteCreate Status Page Resource
Add a resource (monitor, heartbeat, or group) to a status page. Provide the resource_type and resource_id of the thing to display, plus a public_name shown to visitors (usually the resource's own name). Use status_page_sections to find the section to place it in; when omitted the resource is added to the status page's first section.
Inputs
public_namestringrequired- Name shown to visitors, usually the resource name
resource_idintegerrequired- The ID of the monitor, heartbeat, or group to add
resource_typestringrequired- What kind of resource to addone of
MonitorHeartbeatMonitorGroupHeartbeatGroup status_page_idintegerrequired- The ID of the status page
explanationstring- Optional description shown under the resource
positioninteger- Zero-based position of the resource within its section
status_page_section_idinteger- The ID of the section to add the resource to (use status_page_sections to list them). Defaults to the first section.
team_idinteger- The ID of the team that owns the status page. Required only when the API token has access to multiple teams.
widget_typestring- How the resource is displayed. "history" shows the daily uptime bar, "plain" hides it.one of
plainhistoryintraday_historyresponse_timesintraday_response_timeschart_only
betterstackmcp_create_status_page_sectionCreate a section (resource group) on a status page to group resources under a heading.WriteCreate Status Page Section
Create a section (resource group) on a status page to group resources under a heading.
Inputs
namestringrequired- The section heading shown to visitors
status_page_idintegerrequired- The ID of the status page
positioninteger- Zero-based position of the section on the status page
team_idinteger- The ID of the team that owns the status page. Required only when the API token has access to multiple teams.
betterstackmcp_dashboardGet detailed information about a specific dashboard including its charts, sections, layout, and configuration.WriteDashboard
Get detailed information about a specific dashboard including its charts, sections, layout, and configuration. Use this to understand a dashboard structure before modifying it
Inputs
idintegerrequired- The ID of the dashboard to retrieve
betterstackmcp_dashboard_groupsList the dashboard groups dashboards are organized into, with how many dashboards each one holds.WriteDashboard Groups
List the dashboard groups dashboards are organized into, with how many dashboards each one holds. Use this to find the exact name of an existing group before calling create_dashboard with resource_group_name, which creates a new group whenever the name does not match one
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
querystring- Optional search query to filter dashboard groups by name
team_idinteger- Filter dashboard groups by team ID (use teams to get team IDs)
betterstackmcp_edit_applicationEdit an existing application in Better Stack — rename it, pause or resume ingesting, or set its VRL transformations, including the exception grouping program.WriteEdit Application
Edit an existing application in Better Stack — rename it, pause or resume ingesting, or set its VRL transformations, including the exception grouping program. Only provide the fields you want to change. Use applications or application first to find the application ID.
Inputs
idintegerrequired- The ID of the application to edit
ingesting_pausedboolean- Set to true to temporarily pause data ingesting for this application, false to resume it
namestring- New name for the application
vrl_transformation_exceptionsstring- VRL transformation applied to exceptions during ingestion. This is what controls how exceptions are grouped into errors: it should set the ._pattern grouping key. Set to an empty string to remove a custom program, omit to leave unchanged.
vrl_transformation_logsstring- VRL transformation applied to logs during ingestion. Set to an empty string to remove, omit to leave unchanged.
vrl_transformation_replaysstring- VRL transformation applied to session replays during ingestion. Set to an empty string to remove, omit to leave unchanged.
vrl_transformation_spansstring- VRL transformation applied to traces (spans) during ingestion. Set to an empty string to remove, omit to leave unchanged.
vrl_transformation_web_eventsstring- VRL transformation applied to web events (page views and web vitals) during ingestion. Set to an empty string to remove, omit to leave unchanged.
betterstackmcp_edit_chartEdit an existing chart name, query, type, or settings.WriteEdit Chart
Edit an existing chart name, query, type, or settings. Only provide the fields you want to change. If changing the query: the new query MUST contain `{{source}}` in the FROM clause (queries without a source variable are rejected). Dashboard chart queries run against the metrics collection: use `sum(logs_count)` (or the matching `sum(<row_type>_count)` for the source), `avgMerge(value_avg)`, `label('tag')`. `JSONExtract(raw, …)` only works in live-tail charts — dashboards have no `raw` column. Verify the new query with `render_chart` or `query` before saving. Call `chart_building_help` for chart/settings reference.
Inputs
idintegerrequired- The ID of the chart to edit
chart_typestring- New chart typeone of
line_chartbar_chartnumber_charttable_chartpie_chartheatmap_chartscatter_chartgauge_chartmap_charthierarchy_chartstatic_text_chart explanationstring- Short description of the chart. Set to empty string to clear.
heightinteger- New height in grid units (1-50).
namestring- New name for the chart
querystring- New SQL query. MUST contain {{source}} in FROM (hardcoded collection names are rejected). Use {{start_time}}/{{end_time}} in the time filter and {{time}} for bucketing.
settingsobject- Chart display settings
widthinteger- New width in grid units (1-12). Grid is 12 columns wide.
betterstackmcp_edit_chart_alertEdit an existing chart alert configuration.WriteEdit Chart Alert
Edit an existing chart alert configuration. Only provide the fields you want to change. Call chart_alert_help for configuration reference. Use chart_alerts or chart_alert first to find the alert ID
Inputs
idintegerrequired- The ID of the chart alert to edit
additional_conditionsarray- Up to 4 extra conditions ANDed onto the alert's own; replaces the alert's current ones as a whole. Omit to leave them unchanged. Pass [] to remove them. See chart_alert_help
aggregation_intervalinteger- Data range for threshold alerts ('on data from' in UI)one of
306012030060018003600720010800216004320086400 alert_typestring- New alert typeone of
thresholdrelativeanomaly_rrcf anomaly_sensitivityinteger- Anomaly significance threshold (1-10, default 5), shown as 'Significance' in the UI. Higher = larger deviation required to fire, so FEWER alerts; lower = more sensitive, more alerts
anomaly_training_range_daysinteger- How many days of data the anomaly model is first trained on (1-30, default 7), shown as 'Initial training data range' in the UI
anomaly_triggerstring- Anomaly trigger: 'any', 'higher', 'lower'one of
anyhigherlower callboolean- Phone notifications
check_periodinteger- How often to run the alert check (seconds)one of
306012030060018003600720010800216004320086400 confirmation_periodinteger- How long the condition must persist before creating an incident (seconds)one of
0306012030060018003600720014400 emailboolean- Email notifications
escalation_targetstring- 'current_team' or a GID like gid://uptime/Policy/123 or gid://uptime/Team/456
incident_per_seriesboolean- When true, each alerting series opens its own incident instead of one shared incident
metadataobject- Tags for the alert, each value a string or a list of strings; replaces the alert's current metadata as a whole. Omit to leave it unchanged. Pass {} to remove it
namestring- New name for the alert
operatorstring- New comparison operatorone of
equalhigher_thanhigher_than_or_equallower_thanlower_than_or_equalincreases_bydecreases_bychanges_by pushboolean- Push notifications
query_periodinteger- Seconds to look back for relative alertsone of
306012030060018003600 recovery_periodstring- How long the condition must be resolved before auto-resolving (seconds). null means never auto-resolve; the incident stays open until resolved manually
series_namesarray- Specific series to monitor. Mutually exclusive with series_names_except
series_names_exceptarray- Series to exclude; alert fires on every other series. Mutually exclusive with series_names
shown_intervalinteger- Anomaly chart aggregation interval (seconds)one of
306012030060018003600720010800216004320086400 smsboolean- SMS notifications
valuenumber- New threshold value
variable_valuesarray- Per-alert overrides for the dashboard's variables ({{name}} in the chart query); replaces the alert's current overrides as a whole. Omit to leave them unchanged. Pass [] to clear them so the alert follows the dashboard values again. See chart_alert_help
betterstackmcp_edit_dashboardEdit an existing dashboard's name or source eligibility.WriteEdit Dashboard
Edit an existing dashboard's name or source eligibility. Only provide the fields you want to change. Use dashboard first to find the dashboard ID.
Inputs
idintegerrequired- The ID of the dashboard to edit
namestring- New name for the dashboard
source_eligibility_sqlstring- Source eligibility SQL — the ClickHouse query that decides which sources (and services) the dashboard applies to.
betterstackmcp_edit_dashboard_sectionEdit an existing dashboard section.WriteEdit Dashboard Section
Edit an existing dashboard section. Only provide the fields you want to change. Use dashboard first to find the section ID
Inputs
idintegerrequired- The ID of the section to edit
collapsedboolean- Whether the section is collapsed (true = folded, false = expanded)
explanationstring- Short description shown as a tooltip next to the section name. Pass an empty string to clear it.
namestring- New section title
betterstackmcp_edit_slack_integrationChange the settings of a Slack integration, as on Integrations ⺠Slack ⺠Configure.WriteEdit Slack Integration
Change the settings of a Slack integration, as on Integrations ⺠Slack ⺠Configure. Only the parameters you pass change. channel_invitees, alert_options and status_page_update_resources replace the whole list
Inputs
idintegerrequired- The ID of the Slack integration (from slack_integrations)
ai_sre_on_mentionboolean- Start an AI SRE conversation when Better Stack is tagged
alert_all_teams_and_policiesboolean- true: Slack users can alert all teams and escalation policies. false: only those in alert_options
alert_optionsarray- Who Slack users can alert, with the channels used per team. Replaces the list
channel_display_namestring- The name Better Stack shows for the connected Slack channel, instead of its own name
channel_inviteesarray- Channel per incident: who to always invite into each incident channel. Replaces the list; a private channel needs at least one
direct_message_on_mentionboolean- Direct message team members when they are tagged in comments
integration_typestring- Notification type: verbose = single channel, thread = a thread per incident, channel = a new channel per incident. thread and channel need a plan with advanced Slack featuresone of
verbosethreadchannel invite_new_slack_usersboolean- Invite new Slack users into your Better Stack team as responders
notify_alongside_primary_responderboolean- Notify the channel alongside the primary responder in escalation policies that notify the on-call person
notify_on_pauseboolean- Notify when a resource is paused
notify_on_resolveboolean- Notify when an incident is resolved
on_call_notificationsboolean- Notify the channel when the primary responder changes
post_incident_metadataboolean- Post incident metadata
post_status_page_updatesboolean- Post status page updates
post_timeline_eventsboolean- Post incident timeline events about e-mails, phone calls, and integrations
private_channelboolean- Channel per incident: make the incident channels private
restrict_incident_creation_to_channelboolean- Allow creating incidents only by the members of the channel
status_page_update_resourcesarray- Which affected resources to post status page updates for. Replaces the list; an empty list means all
betterstackmcp_error_commentsRead the conversation on an error: comments left in the app, comments posted by an agent over MCP, replies written in the error Slack thread, and comments synced in from a linked Linear issue.WriteError Comments
Read the conversation on an error: comments left in the app, comments posted by an agent over MCP, replies written in the error Slack thread, and comments synced in from a linked Linear issue. Every entry names its author and, when it did not come from the app, how it was posted; a comment left on one occurrence of the error names that event.
Inputs
application_idintegerrequired- The ID of the application
patternstringrequired- The error pattern identifier
betterstackmcp_escalate_incidentEscalate an ongoing incident to a user, team, schedule, or policyWriteEscalate Incident
Escalate an ongoing incident to a user, team, schedule, or policy
Inputs
escalation_typestringrequired- Who to escalate toone of
UserPolicyTeamScheduleOrganization idintegerrequired- The ID of the incident to escalate
callboolean- Notify by phone call
critical_alertboolean- Notify by critical push notification
emailboolean- Notify by e-mail
policy_idinteger- Define which escalation policy to escalate to. Required when escalating to Policy.
pushboolean- Notify by push notification
schedule_idinteger- Define which on-call calendar to escalate to. Required when escalating to Schedule.
smsboolean- Notify by SMS
team_idinteger- Define which team to escalate to. Either team_name or team_id required when escalating to Team.
team_namestring- Define which team to escalate to. Either team_name or team_id required when escalating to Team.
user_emailstring- Define which team member to escalate to. Either user_email or user_id required when escalating to User.
user_idinteger- Define which team member to escalate to. Either user_email or user_id required when escalating to User.
betterstackmcp_escalation_policyGet detailed information about a specific escalation policyWriteEscalation Policy
Get detailed information about a specific escalation policy
Inputs
idintegerrequired- The ID of the escalation policy
betterstackmcp_explorationGet detailed information about a specific exploration (saved Explore query) including its sources, chart type, template variables, saved time range, and query.WriteExploration
Get detailed information about a specific exploration (saved Explore query) including its sources, chart type, template variables, saved time range, and query. Use this to understand an exploration before modifying its source or variables
Inputs
idintegerrequired- The ID of the exploration to retrieve
betterstackmcp_explorationsList saved explorations (saved Explore queries) in a paginated table.WriteExplorations
List saved explorations (saved Explore queries) in a paginated table. Returns exploration ID, name, chart type, sources, group, and last updated date. Use this to discover explorations before viewing or modifying one
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
querystring- Optional search query to filter explorations by name
team_idinteger- Filter explorations by team ID (use teams to get team IDs)
betterstackmcp_export_dashboardExport a dashboard configuration as JSON.WriteExport Dashboard
Export a dashboard configuration as JSON. Returns the complete dashboard data structure including charts, sections, presets, and settings
Inputs
idintegerrequired- The ID of the dashboard or dashboard template to export
betterstackmcp_import_dashboardImport a dashboard from JSON configuration.WriteImport Dashboard
Import a dashboard from JSON configuration. Creates a new dashboard with the provided data structure
Inputs
datastringrequired- The dashboard data as returned by export_dashboard, either the JSON object itself or its JSON string form. Over about 50 KB, pass `url` instead
namestringrequired- The name for the new dashboard
team_idintegerrequired- The ID of the team to import the dashboard into (use teams to get team IDs)
urlstring- A URL that returns the dashboard data as returned by export_dashboard, downloadable without credentials, up to 2 MB. Use it instead of `data` when the JSON is over about 50 KB
betterstackmcp_incidentGet detailed information about a specific incidentWriteIncident
Get detailed information about a specific incident
Inputs
idintegerrequired- The ID of the incident to retrieve
betterstackmcp_incident_commentsGet comments for an incidentWriteIncident Comments
Get comments for an incident
Inputs
incident_idintegerrequired- The ID of the incident
betterstackmcp_incident_timelineGet the timeline of events for an incidentWriteIncident Timeline
Get the timeline of events for an incident
Inputs
idintegerrequired- The ID of the incident
betterstackmcp_invite_team_memberInvite someone to a Better Stack team by e-mail address.WriteInvite Team Member
Invite someone to a Better Stack team by e-mail address. Optionally set their role by system-role name (role: responder, member, team_lead, billing_admin) or by role_id (use team_roles to look up ids). Defaults to responder. The admin role cannot be assigned via the API. Someone who already belongs to the organization is added to the team directly, with no invitation to accept; an organization-wide role they hold (Admin, Billing admin) is kept. If the token can reach more than one team, pass team_id (or team_name).
Inputs
emailstringrequired- E-mail address of the person to invite.
rolestring- System-role name: responder, member, team_lead, or billing_admin. Defaults to responder. 'admin' is not allowed.
role_idinteger- ID of the role to assign (alternative to role; supports custom roles). Use team_roles to look up ids.
team_idinteger- ID of the team to invite into. Required when the token can access more than one team.
team_namestring- Name of the team to invite into (alternative to team_id).
betterstackmcp_link_error_issueLink an error to an issue or work item that already exists in Linear or Jira.WriteLink Error Issue
Link an error to an issue or work item that already exists in Linear or Jira. Better Stack then posts every change to the error state as a comment on the issue. For Linear, resolving the issue also resolves the error when auto-resolve is turned on for that integration; Jira has no status sync back. Create the issue in Linear or Jira first, then pass its identifier, key, or URL here.
Inputs
application_idintegerrequired- The ID of the application
issuestringrequired- The issue to link: a Linear issue identifier (ENG-123), a Jira work item key (PROJ-45), or the issue URL from either
patternstringrequired- The error pattern identifier
integration_idinteger- The Better Stack integration to link through. Only needed when more than one of the team's integrations could hold the issue, in which case this tool answers with the IDs to choose from.
betterstackmcp_monitorGet details of a specific monitorWriteMonitor
Get details of a specific monitor
Inputs
idintegerrequired- The ID of the monitor
betterstackmcp_move_chartsMove one or more charts to new positions on a dashboard.WriteMove Charts
Move one or more charts to new positions on a dashboard. Validates the final layout for overlaps, allowing swaps and complex rearrangements. All moves are applied atomically - if any move is invalid, none are applied. Grid is 12 columns wide
Inputs
dashboard_idintegerrequired- The ID of the dashboard
movesarrayrequired- Array of chart moves
betterstackmcp_render_chartExecute a ClickHouse SQL query and visualize the result as a chart.WriteRender Chart
Execute a ClickHouse SQL query and visualize the result as a chart. Use `chart_type` to choose the visualization: - `line` (default) — trends over time. Alias columns as `time`, `value`, and optional `series`. - `bar` — magnitude over time or across buckets. Uses the same columns as `line`; set `stacked: true` to stack the series. - `pie` — share of a total across categories. Alias a categorical column `AS series` (the slice label) and a numeric column `AS value` (the slice size).
Inputs
querystringrequired- The SQL query to execute: a template using `{{source}}`, or SQL naming its collections
source_idintegerrequired- Source ID
tablestringrequired- Required for SQL without template variables: the table name, ie. `t123.my_source`. A template reads it from the source and ignores this
chart_typestring- How to visualize the result: `line` (trends over time, default), `bar` (magnitude over time or across buckets), or `pie` (share of a total across categories).one of
linebarpie end_timestring- Required with template variables: 'now' (or 'now-15m', an ISO 8601 datetime, epoch digits); must be after start_time
namestring- Optional name/title for the chart (e.g., "Log Volume Over Time")
source_typestring- Required with `{{source}}`: which data `{{source}}` reads. `web_events` = browser/RUM events from the JS tag; `exceptions` = raw exception events of Errors sources (both queried like logs)one of
logsspansmetricsweb_eventsexceptions stackedboolean- Stack the series on top of each other. Applies to `line` and `bar` charts.
start_timestring- Required with template variables: the start of `{{start_time}}`..`{{end_time}}`. Relative preferred, it cannot misresolve: 'now-3h', 'now-1d'. Or an ISO 8601 datetime '2025-11-29T17:00:00Z', or epoch digits '1787668915598000'
betterstackmcp_reopen_incidentReopen a resolved incident (must be within 24 hours of resolution)WriteReopen Incident
Reopen a resolved incident (must be within 24 hours of resolution)
Inputs
idintegerrequired- The ID of the incident to reopen
reopened_bystring- User email or identifier of who reopened the incident.
betterstackmcp_resolve_incidentResolve an ongoing incidentWriteResolve Incident
Resolve an ongoing incident
Inputs
idintegerrequired- The ID of the incident to resolve
resolved_bystring- User email or identifier of who resolved the incident.
betterstackmcp_set_dashboard_variableCreate or update a dashboard template variable — a user-facing filter in the dashboard toolbar, referenced in chart SQL as {{name}} (required — the chart errors until it resolves to a value) or [[ AND col = {{name}} ]] (optional — the whole [[ ...WriteSet Dashboard Variable
Create or update a dashboard template variable — a user-facing filter in the dashboard toolbar, referenced in chart SQL as {{name}} (required — the chart errors until it resolves to a value) or [[ AND col = {{name}} ]] (optional — the whole [[ ... ]] clause is dropped while the variable is empty). Saving a chart auto-creates a plain text variable (or a source variable when the name contains 'source') for any undefined required {{name}}, but it starts empty — use this tool to give it a typed definition or a default value so the chart resolves without manual input. Fields per type: select_value (Static list) uses default_values (first = default selection); select_with_sql (Dynamic list) uses an option-yielding expression in sql_definition, e.g. label('_host'); both list types accept allow_multiple_values to let users pick several options at once; select_predefined_sql (Query per value) uses named full-query SQL filters in `filters`, default picked via selected_label; string/number/boolean use default_values as [default]; sql_expression uses default_values as [raw SQL] spliced unescaped; source uses source_ids to pick which sources the variable resolves to; date/datetime use an ISO date in default_values. SQL-backed types are validated at save time by running their SQL against the dashboard's source. The names source, start_time, end_time, and time are reserved.
Inputs
dashboard_idintegerrequired- The ID of the dashboard
namestringrequired- Variable name used as {{name}} in chart queries
variable_typestringrequired- The variable typeone of
stringnumberbooleansql_expressiondatedatetimesourceselect_valueselect_with_sqlmulti_select_with_sqlselect_predefined_sql allow_multiple_valuesboolean- select_value / select_with_sql: let users pick several options at once; the variable then interpolates as a quoted regex used with match(), never IN. Ignored for other types.
default_valuesarray- select_value: the options (first = default). string/number/boolean: [default]. sql_expression: [raw SQL]. date/datetime: [ISO date], e.g. ['2026-07-23T14:30:00Z'].
filtersarray- select_predefined_sql: named SQL filters. Unlike sql_definition, each sql is a FULL query returning one column, whose rows are injected into the chart as an IN-list. Filter time with dt BETWEEN {{start_time}} AND {{end_time}}, never {{time}}.
selected_labelstring- select_predefined_sql: the default filter label.
source_idsarray- source: the source IDs this variable resolves to (must be accessible to the dashboard's team). Ignored for other types.
sql_definitionstring- select_with_sql / multi_select_with_sql: an expression (NOT a full query) yielding the option values — interpolated as SELECT DISTINCT <sql_definition> AS option FROM {{source}} WHERE dt BETWEEN {{start_time}} AND {{end_time}} LIMIT 50. Example: label('_host').
betterstackmcp_set_exploration_variableCreate or update a variable on an exploration (saved Explore query), referenced in its query as `{{name}}`.WriteSet Exploration Variable
Create or update a variable on an exploration (saved Explore query), referenced in its query as `{{name}}`. The most common use is setting the exploration's source: name it `source`, type `source`, and pass the source IDs in `source_ids` â the query then runs against those sources. Fields per type: - `source` â the source IDs in `source_ids`. Name it `source` to set the exploration's own source, or use a custom name for an extra source variable the query references in its FROM (e.g. `FROM {{name}}`). - `select_value` â the options in `default_values` (first = default selection) - `select_with_sql` / `multi_select_with_sql` â an option-yielding expression (NOT a full query) in `sql_definition`, e.g. `label('_host')` - `select_predefined_sql` â named SQL filters in `filters` (each a full query), default picked via `selected_label` - `string` / `number` / `boolean` â `[default]` in `default_values` - `sql_expression` â `[raw SQL]` in `default_values`, spliced into the query unescaped - `date` / `datetime` â an ISO date in `default_values`, e.g. `['2026-07-23']` or `['2026-07-23T14:30:00Z']` SQL-backed types are validated at save time by running their SQL against the exploration's source â the save is refused when it fails. The names `start_time`, `end_time`, and `time` are reserved (they come from the time picker). `source` is the exception: set it as a source-type variable to change the exploration's source. Use `exploration` to list an exploration's variables.
- Idempotent
Inputs
exploration_idintegerrequired- The ID of the exploration
namestringrequired- Variable name used as {{name}} in the query. Use 'source' to set the exploration's own source.
variable_typestringrequired- The variable typeone of
stringnumberbooleansql_expressiondatedatetimesourceselect_valueselect_with_sqlmulti_select_with_sqlselect_predefined_sql default_valuesarray- select_value: the options (first = default). string/number/boolean: [default]. sql_expression: [raw SQL]. date/datetime: [ISO date], e.g. ['2026-07-23T14:30:00Z'].
filtersarray- select_predefined_sql: named SQL filters. Each sql is a FULL query returning one column, whose rows are injected as an IN-list. Filter time with `dt BETWEEN {{start_time}} AND {{end_time}}`.
selected_labelstring- select_predefined_sql: the default filter label.
source_idsarray- source: the source IDs this variable resolves to (must be accessible to the exploration's team). Ignored for other types.
sql_definitionstring- select_with_sql / multi_select_with_sql: an expression (NOT a full query) yielding the option values â the platform interpolates it as `SELECT DISTINCT <sql_definition> AS option FROM {{source}} WHERE dt BETWEEN {{start_time}} AND {{end_time}} LIMIT 500`. Example: label('_host').
betterstackmcp_severityGet detailed information about a specific severity (urgency level)WriteSeverity
Get detailed information about a specific severity (urgency level)
Inputs
idintegerrequired- The ID of the severity
betterstackmcp_slack_integrationGet every setting of a Slack integration: notification type, channel invitees, who Slack users can alert, and the notification optionsWriteSlack Integration
Get every setting of a Slack integration: notification type, channel invitees, who Slack users can alert, and the notification options
Inputs
idintegerrequired- The ID of the Slack integration (from slack_integrations)
betterstackmcp_slack_integrationsList the Slack integrations (one per connected channel) with their channel and notification typeWriteSlack Integrations
List the Slack integrations (one per connected channel) with their channel and notification type
Inputs
pageinteger- Page number for pagination (starts at 1)
per_pageinteger- Number of results per page (default: 50, max: 250)
team_idinteger- Filter by team ID (use teams to get team IDs)
betterstackmcp_toggle_chart_alert_pausePause or unpause a chart alert.WriteToggle Chart Alert Pause
Pause or unpause a chart alert. When paused, the alert will not trigger any incidents
Inputs
idintegerrequired- The ID of the chart alert
pausedbooleanrequired- Set to true to pause, false to unpause
betterstackmcp_unlink_error_issueRemove the link between an error and an issue in Linear, Jira, or GitLab.WriteUnlink Error Issue
Remove the link between an error and an issue in Linear, Jira, or GitLab. Better Stack stops syncing the two; the issue itself is left untouched.
Inputs
application_idintegerrequired- The ID of the application
issuestringrequired- The linked issue to unlink, by the label the error tool prints for it (ENG-123, PROJ-45, #42) or by issue URL
patternstringrequired- The error pattern identifier
betterstackmcp_update_catalog_relationChange a catalog relation: rename it, change its description or matching, add attributes or remove them.WriteUpdate Catalog Relation
Change a catalog relation: rename it, change its description or matching, add attributes or remove them. Only what you pass changes. Removing an attribute removes its values from every record. See `catalog_relations` for how the catalog works. ## Rules - Name primary attributes after metadata keys incidents really carry. Check recent incidents' metadata with `incidents` and `incident` first: a key no incident carries never matches. - Reference teams, team members, escalation policies and other Better Stack objects as objects, like `{"type": "Team", "name": "Platform"}`, never as their names in text. - Never invent records. Every row comes from a source the user pointed you to (code, Terraform, Kubernetes, a Backstage catalog, the service map) or from the user. - Prefer `upsert_catalog_records` to removing records and adding them again: it keeps every record it doesn't name, while removing them all empties the relation.
Inputs
relation_idintegerrequired- The ID of the catalog relation (from catalog_relations)
add_attributesarray- Attributes to add
descriptionstring- The relation's new description
match_modestring- any = a record matches when one primary value matches, all = when every primary attribute does. Before switching to any, make sure no two records share a primary valueone of
anyall namestring- The relation's new name
remove_attributesarray- Names of the attributes to remove, with their values
betterstackmcp_update_error_stateUpdate the state of a specific error (mark as resolved, ignored, or unresolved)WriteUpdate Error State
Update the state of a specific error (mark as resolved, ignored, or unresolved)
Inputs
application_idintegerrequired- The ID of the application
patternstringrequired- The error pattern identifier
statestringrequired- The target stateone of
ignoredresolvedunresolved ignore_next_countinteger- Number of next occurrences to ignore (only valid when state is 'ignored'). Must be 1, 10, 100, or 1000one of
1101001000 notify_every_exceptionboolean- Whether to notify for every occurrence of this error
resolve_in_releasestring- Pin the resolution to the application's latest release. The error will only re-open if it appears in a strictly newer release. Only valid when state is 'resolved'.one of
current
betterstackmcp_update_metric_expressionUpdate an existing metric expression.WriteUpdate Metric Expression
Update an existing metric expression. Call `metric_expressions` first to get the ID. At least one of `name`, `sql_expression`, `type`, `aggregations` must be provided — `build_type` alone is not a change and will be rejected. Prefer `build_type: new_data` (default). `historical_logs` re-runs the rule over every stored log — expensive; only when the user explicitly asks.
Inputs
idstringrequired- The metric expression ID returned by metric_expressions, e.g. "m-123" or "g-456"
source_idintegerrequired- The ID of the source (use sources to get source IDs)
aggregationsarray- New set of aggregations. Pass [] to convert to a label (group-by column)
build_typestring- How to process existing data: 'new_data' (default) only applies to new logs; 'historical_logs' rebuilds metrics from existing logsone of
new_datahistorical_logs namestring- New metric name. Letters, numbers, and underscores only
sql_expressionstring- New ClickHouse SQL expression
typestring- New ClickHouse storage typeone of
stringstring_low_cardinalityint64_deltaint64uint64_deltauint64float64_deltadatetime64_deltaboolean
betterstackmcp_update_status_pageUpdate the settings of a status page (company name, contact URL, theme, layout, and more).WriteUpdate Status Page
Update the settings of a status page (company name, contact URL, theme, layout, and more).
Inputs
idintegerrequired- The ID of the status page
announcementstring- Announcement banner text shown at the top of the page
company_namestring- Company name shown as the status page title
company_urlstring- URL the company name links to
contact_urlstring- URL or mailto link for the contact/support button
custom_domainstring- Custom CNAME domain for the status page
hide_from_search_enginesboolean- Hide the status page from search engines
layoutstring- Resource layoutone of
verticalhorizontal publishedboolean- Whether the status page is published (publicly visible)
subdomainstring- Subdomain the page is served on (e.g. "acme" for acme.betteruptime.com)
subscribableboolean- Whether visitors can subscribe to updates
themestring- Color themeone of
lightdarksystem timezonestring- Timezone used to display times (e.g. "Europe/Prague")
betterstackmcp_update_status_page_resourceUpdate a resource on a status page.WriteUpdate Status Page Resource
Update a resource on a status page. Change its public name, description, widget type (e.g. show or hide the uptime history), or move it by setting position (zero-based) and/or status_page_section_id. Use status_page_resources to find resource IDs.
Inputs
resource_idintegerrequired- The ID of the status page resource to update (from status_page_resources)
status_page_idintegerrequired- The ID of the status page
explanationstring- Description shown under the resource
positioninteger- Zero-based position of the resource within its section
public_namestring- Name shown to visitors
status_page_section_idinteger- Move the resource to this section (use status_page_sections to list them)
widget_typestring- How the resource is displayed. "history" shows the daily uptime bar, "plain" hides it.one of
plainhistoryintraday_historyresponse_timesintraday_response_timeschart_only
betterstackmcp_update_status_page_sectionRename a status page section or move it by setting its position.WriteUpdate Status Page Section
Rename a status page section or move it by setting its position.
Inputs
section_idintegerrequired- The ID of the section to update (from status_page_sections)
status_page_idintegerrequired- The ID of the status page
namestring- The section heading shown to visitors
positioninteger- Zero-based position of the section on the status page
betterstackmcp_upsert_catalog_recordsAdd or update a catalog relation's records, keyed by their primary values, so running the same sync again updates instead of duplicating.WriteUpsert Catalog Records
Add or update a catalog relation's records, keyed by their primary values, so running the same sync again updates instead of duplicating. A record whose primary values equal a row's is updated: the added attributes the row names are replaced, the others are left alone. A row no record matches becomes a new record. One invalid row fails the whole call and writes nothing. Up to 100 records per call. See `catalog_relations` for how the catalog works. Name `Dependencies` and `Connections` by the other records' primary values. ## Rules - Name primary attributes after metadata keys incidents really carry. Check recent incidents' metadata with `incidents` and `incident` first: a key no incident carries never matches. - Reference teams, team members, escalation policies and other Better Stack objects as objects, like `{"type": "Team", "name": "Platform"}`, never as their names in text. - Never invent records. Every row comes from a source the user pointed you to (code, Terraform, Kubernetes, a Backstage catalog, the service map) or from the user. - Prefer `upsert_catalog_records` to removing records and adding them again: it keeps every record it doesn't name, while removing them all empties the relation.
Inputs
recordsarrayrequired- Each record maps attribute names to values: text, an object like {"type": "Team", "name": "Platform"}, or a list of them; an empty list, null or blank text is an empty cell. Like [{"service": "checkout", "Owner": {"type": "Team", "name": "Payments"}, "Dependencies": ["payments-db"], "Type": "Backend"}]
relation_idintegerrequired- The ID of the catalog relation (from catalog_relations)
betterstackmcp_delete_catalog_recordsRemove catalog records by their primary values, or every record of a relation with `all: true`.DestructiveDelete Catalog Records
Remove catalog records by their primary values, or every record of a relation with `all: true`. A record is removed when its primary values equal a given row's, as `upsert_catalog_records` matches them; a row matching several records removes none of them. See `catalog_relations` for how the catalog works. ## Rules - Name primary attributes after metadata keys incidents really carry. Check recent incidents' metadata with `incidents` and `incident` first: a key no incident carries never matches. - Reference teams, team members, escalation policies and other Better Stack objects as objects, like `{"type": "Team", "name": "Platform"}`, never as their names in text. - Never invent records. Every row comes from a source the user pointed you to (code, Terraform, Kubernetes, a Backstage catalog, the service map) or from the user. - Prefer `upsert_catalog_records` to removing records and adding them again: it keeps every record it doesn't name, while removing them all empties the relation.
Inputs
relation_idintegerrequired- The ID of the catalog relation (from catalog_relations)
allboolean- true removes every record of the relation instead
recordsarray- The records to remove, each as its primary attributes and values, like [{"service": "checkout"}]. A primary attribute left out is an empty cell
betterstackmcp_delete_chart_alertDelete a chart alert permanently.DestructiveDelete Chart Alert
Delete a chart alert permanently. This will also clean up any associated incidents and anomaly models. This action cannot be undone. Use chart_alerts or chart_alert first to find the alert ID
Inputs
idintegerrequired- The ID of the chart alert to delete
betterstackmcp_delete_metric_expressionDelete a metric expression from a source.DestructiveDelete Metric Expression
Delete a metric expression from a source. This action cannot be undone. Call `metric_expressions` first to get the ID. `build_type: new_data` (default) stops the rule from applying to future logs but leaves already-extracted data. `build_type: historical_logs` also rebuilds the source's metrics without this rule — expensive.
Inputs
idstringrequired- The metric expression ID returned by metric_expressions, e.g. "m-123" or "g-456"
source_idintegerrequired- The ID of the source (use sources to get source IDs)
build_typestring- How to process existing data: 'new_data' (default) only stops new data; 'historical_logs' also rebuilds historical metrics without this ruleone of
new_datahistorical_logs
betterstackmcp_remove_chartRemove a chart from its dashboard permanently.DestructiveRemove Chart
Remove a chart from its dashboard permanently. This action cannot be undone and will also remove any alerts associated with the chart. Use dashboard first to find the chart ID
Inputs
idintegerrequired- The ID of the chart to remove
betterstackmcp_remove_dashboardRemove a dashboard permanently.DestructiveRemove Dashboard
Remove a dashboard permanently. This action cannot be undone
Inputs
idintegerrequired- The ID of the dashboard to remove
betterstackmcp_remove_dashboard_sectionRemove a section divider from a dashboard permanently.DestructiveRemove Dashboard Section
Remove a section divider from a dashboard permanently. This action cannot be undone. Charts are not affected - only the section header is removed. Use dashboard first to find the section ID
Inputs
idintegerrequired- The ID of the section to remove
betterstackmcp_remove_dashboard_variableRemove a dashboard template variable by name.DestructiveRemove Dashboard Variable
Remove a dashboard template variable by name. Cannot remove the automatic variables source, start_time, end_time, or time. A chart still referencing a removed variable as a required {{name}} errors until it is redefined (the next chart save auto-creates it again, empty). Use dashboard first to see the defined variables.
Inputs
dashboard_idintegerrequired- The ID of the dashboard
namestringrequired- Name of the variable to remove
betterstackmcp_remove_exploration_variableRemove a variable from an exploration (saved Explore query) by name.DestructiveRemove Exploration Variable
Remove a variable from an exploration (saved Explore query) by name. Cannot remove the automatic variables source, start_time, end_time, or time. A query still referencing a removed variable as a required {{name}} errors until it is redefined. Use exploration first to see the defined variables.
Inputs
exploration_idintegerrequired- The ID of the exploration
namestringrequired- Name of the variable to remove
betterstackmcp_remove_releaseRemove a release permanently.DestructiveRemove Release
Remove a release permanently. A release still receiving error events is re-detected automatically when its next event arrives. Use the releases tool to find release IDs
Inputs
release_idintegerrequired- The ID of the release to remove (listed by the releases tool)
betterstackmcp_remove_status_page_resourceRemove a resource from a status page.DestructiveRemove Status Page Resource
Remove a resource from a status page.
Inputs
resource_idintegerrequired- The ID of the status page resource to remove (from status_page_resources)
status_page_idintegerrequired- The ID of the status page
betterstackmcp_remove_status_page_sectionRemove a section from a status page.DestructiveRemove Status Page Section
Remove a section from a status page. Resources in the section are removed with it.
Inputs
section_idintegerrequired- The ID of the section to remove (from status_page_sections)
status_page_idintegerrequired- The ID of the status page
betterstackmcp_remove_team_memberRemove a member from a Better Stack team, or cancel a pending invitation.DestructiveRemove Team Member
Remove a member from a Better Stack team, or cancel a pending invitation. Identify them by email or user_id (from team_members). Admins cannot be removed via the API, and the organization's last member cannot be removed. If the token can reach more than one team, pass team_id (or team_name). This permanently removes the person's access to the team.
Inputs
emailstring- E-mail of the member to remove, or of a pending invitation to cancel (alternative to user_id).
team_idinteger- ID of the team to remove from. Required when the token can access more than one team.
team_namestring- Name of the team (alternative to team_id).
user_idinteger- ID of the member to remove, or of a pending invitation to cancel — the id column from team_members (alternative to email).
No tools match.