# How to connect Better Stack to Grok Bot

```json
{
  "title": "How to connect Better Stack to Grok Bot",
  "toolkit": "Better Stack MCP",
  "toolkit_slug": "better_stack_mcp",
  "framework": "Grok Bot",
  "framework_slug": "grok-bot",
  "url": "https://composio.dev/toolkits/better_stack_mcp/framework/grok-bot",
  "markdown_url": "https://composio.dev/toolkits/better_stack_mcp/framework/grok-bot.md",
  "updated_at": "2026-11-11T06:01:07.747Z"
}
```

## Introduction

Grok is xAI's assistant, and its bot builder lets you create a personal agent that holds context, runs skills, and connects to the apps you already use through plugins.
This guide explains how to connect Better Stack to a Grok bot using Composio Connect, which handles OAuth, token refresh, and reliability so you do not have to. You add Composio as a plugin, authenticate once, then ask your bot to work with Better Stack in plain language.
For exact tool slugs and parameter tables, see the [tool catalog in the Composio docs](https://docs.composio.dev/toolkits/better_stack_mcp).

## Also integrate Better Stack MCP with

- [ChatGPT](https://composio.dev/toolkits/better_stack_mcp/framework/chatgpt)
- [Claude Cowork](https://composio.dev/toolkits/better_stack_mcp/framework/claude-cowork)
- [Hermes](https://composio.dev/toolkits/better_stack_mcp/framework/hermes-agent)
- [Atomic Agent](https://composio.dev/toolkits/better_stack_mcp/framework/atomic-agent)

## TL;DR

Composio exposes 1,700+ apps to your Grok bot through a single connection, so you get:
- Connect to 1,700+ apps with on-demand tool loading, so you do not fill your context window with unnecessary tool definitions.
- Use programmatic tool calling through a remote workbench, letting the model write its own code to handle complex tool chaining. This reduces back-and-forth for frequent tool calls.
- Handle large tool responses outside the model context to keep conversations lean.

## Connect Better Stack MCP to Grok Bot

### Connecting Better Stack to Grok Bot
Once Grok Bot is set up, you connect Better Stack entirely from its interface, and the whole flow takes under a minute.
### Set up Grok Bot
Get access. Grok Bot is included with Cursor Ultra, Cursor Premium Teams, and SuperGrok Heavy. Get the desktop app for macOS or Windows from [x.ai/bot](https://x.ai/bot) and sign in. An iPhone companion app is also available, and your bots sync across devices.
Create a bot. Pick a suggested role or define your own, then give it a short name, one primary job, and a short description of how it should work. Focused bots work best, because a clear role gives the bot more useful context over time.
### Connect Better Stack
### 1. Add the Composio plugin
Click the button. The Composio listing on x.ai opens and launches Grok Bot for you. If the app does not open on its own, click Add to Grok Bot.
[Add to Grok Bot](https://x.ai/bot/plugin/32661537)
Grok Bot opens the Composio plugin, showing its connector and skills. Click Add.
### 2. Authenticate
Go to the Installed section and click the Composio entry. You'll see its connector and skills listed.
Click Authenticate. You'll be taken to the Composio consent screen. Review the access it requests and click Authorize. Composio handles the OAuth handshake for you, so you never touch API keys or tokens.
### 3. Connect your Better Stack account
Back in the chat, ask your bot to connect to Better Stack or give it any Better Stack task.
For example, ask it to:
- "List active monitors with recent failures"
- "Show unresolved incidents from the last 24h"
- "Search logs for 'database connection' errors"
It will prompt you to authenticate and authorize access.
That's it. Composio's tools are now available in your Grok bot, and your Better Stack account is ready to use.

## What is Grok Bot?

Grok is xAI's assistant, available as a chat interface and a bot builder for creating personal agents that run skills and connect to external apps.
With Composio Connect, your Grok bot can securely access apps like Better Stack through MCP without you sharing account credentials directly with the agent.

## What is the Better Stack MCP server, and what's possible with it?

The Better Stack MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Better Stack account. It provides structured and secure access to your observability applications, dashboards, monitors, alerts, incidents, and log sources, so your agent can inspect observability data, build dashboards, configure monitoring, manage incidents, and publish status updates on your behalf.
- Application and log source management: Have your agent review applications, create or edit applications, configure log sources, and define metric expressions from logs.
- Dashboards and charts: Let the agent create dashboards, add charts and sections, inspect chart queries and settings, or update existing charts.
- Monitors, heartbeats, and alerts: Direct your agent to create availability monitors and heartbeats, configure chart alerts, and review current alert settings and incident details.
- Incident coordination: Instruct your agent to create or acknowledge incidents, add incident comments, and review available escalation policies.
- Status page communication: Have your agent create status page reports, post updates to existing reports, and organize monitored resources into status page sections.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `BETTER_STACK_MCP_ACKNOWLEDGE_INCIDENT` | Acknowledge incident | Acknowledge an ongoing incident |
| `BETTER_STACK_MCP_ADD_CHART_TO_DASHBOARD` | Add 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`'s FROM must reference a source, either `{{source}}` or a source-type variable defined via `set_dashboard_variable` (e.g. `{{redis_source}}`). A query with no source is rejected with guidance to define it first. Dashboard chart queries run against the metrics collection: use `sum(logs_count)` (or the matching `sum(_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. **Workflow:** 1. Call `chart_building_help` for chart types, units, and settings. 2. Call `metrics_query_help` with `context: 'chart_query'` to see the source's metrics schema and chart-query examples. 3. Verify the query with `render_chart` (runs it and surfaces errors automatically) or with `query`. Use `{{source}}`, `{{start_time}}`, `{{end_time}}`, `{{time}}` variables for integration with dashboard filters. Queries can also reference custom dashboard variables — `{{var}}` (required) or `[[ AND col = {{var}} ]]` (optional clause, dropped while the variable is empty); define them with `set_dashboard_variable`. |
| `BETTER_STACK_MCP_ADD_DASHBOARD_SECTION` | Add 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 |
| `BETTER_STACK_MCP_APPLICATION` | Application | Get comprehensive details of a specific application including its configuration, retention settings, ingestion details, custom bucket settings (if configured) |
| `BETTER_STACK_MCP_APPLICATIONS` | Applications | List all available applications in a paginated table format. Returns application ID, name, platform type, team, status (active/paused), data region, and creation date |
| `BETTER_STACK_MCP_AVAILABLE_INCIDENT_ESCALATION_POLICIES` | Available incident escalation policies | Get available escalation policies for an incident |
| `BETTER_STACK_MCP_CHANGE_TEAM_MEMBER_ROLE` | Change 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`). |
| `BETTER_STACK_MCP_CHART` | Chart | Get detailed information about a specific chart including its SQL queries, configuration, and settings. Use dashboard first to find the chart ID |
| `BETTER_STACK_MCP_CHART_ALERT` | Chart 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 |
| `BETTER_STACK_MCP_CHART_ALERT_HELP` | Chart 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 |
| `BETTER_STACK_MCP_CHART_ALERTS` | Chart alerts | List chart alerts with optional filtering by team, chart, or dashboard. Returns alert ID, name, type, chart, dashboard, and status |
| `BETTER_STACK_MCP_CHART_BUILDING_HELP` | Chart 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 |
| `BETTER_STACK_MCP_CLUSTERS` | Clusters | 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 |
| `BETTER_STACK_MCP_CREATE_APPLICATION` | Create 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 |
| `BETTER_STACK_MCP_CREATE_CHART_ALERT` | Create 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 |
| `BETTER_STACK_MCP_CREATE_CLOUD_CONNECTION` | Create 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 |
| `BETTER_STACK_MCP_CREATE_DASHBOARD` | Create 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 |
| `BETTER_STACK_MCP_CREATE_ERROR_ISSUE` | Create 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. |
| `BETTER_STACK_MCP_CREATE_HEARTBEAT` | Create 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. |
| `BETTER_STACK_MCP_CREATE_INCIDENT` | Create incident | Create a new incident providing a summary of the issue, requester email, and other optional details |
| `BETTER_STACK_MCP_CREATE_INCIDENT_COMMENT` | Create incident comment | Create a comment on an incident |
| `BETTER_STACK_MCP_CREATE_METRIC_EXPRESSION` | Create 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. |
| `BETTER_STACK_MCP_CREATE_MONITOR` | Create 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. |
| `BETTER_STACK_MCP_CREATE_RELEASE` | Create 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 |
| `BETTER_STACK_MCP_CREATE_SOURCE` | Create 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 |
| `BETTER_STACK_MCP_CREATE_STATUS_PAGE_REPORT` | Create status page report | Create a new status page report |
| `BETTER_STACK_MCP_CREATE_STATUS_PAGE_REPORT_UPDATE` | Create status page report update | Create a new status update for an existing status page report |
| `BETTER_STACK_MCP_CREATE_STATUS_PAGE_RESOURCE` | Create 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. |
| `BETTER_STACK_MCP_CREATE_STATUS_PAGE_SECTION` | Create status page section | Create a section (resource group) on a status page to group resources under a heading |
| `BETTER_STACK_MCP_DASHBOARD` | Dashboard | Get detailed information about a specific dashboard including its charts, sections, layout, template variables, and configuration. Use this to understand a dashboard structure before modifying it |
| `BETTER_STACK_MCP_DASHBOARD_QUERY_HELP` | Dashboard 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`. |
| `BETTER_STACK_MCP_DASHBOARDS` | Dashboards | List all available dashboards in a paginated table format. Returns dashboard ID, name, creation date, and last updated date |
| `BETTER_STACK_MCP_DASHBOARD_TEMPLATES` | Dashboard templates | List all available dashboard templates in a paginated table format. Returns template ID, name, description, and other metadata |
| `BETTER_STACK_MCP_DATA_REGIONS` | Data 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 |
| `BETTER_STACK_MCP_DELETE_CHART_ALERT` | Delete 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 |
| `BETTER_STACK_MCP_DELETE_METRIC_EXPRESSION` | Delete 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. |
| `BETTER_STACK_MCP_DOCUMENTATION` | Documentation | Search for relevant documentation articles and return their contents |
| `BETTER_STACK_MCP_EDIT_APPLICATION` | Edit 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. |
| `BETTER_STACK_MCP_EDIT_CHART` | Edit 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's FROM must reference a source, either `{{source}}` or a source-type variable defined via `set_dashboard_variable` (queries with no source are rejected). Dashboard chart queries run against the metrics collection: use `sum(logs_count)` (or the matching `sum(_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` (runs it and surfaces errors automatically) or with `query` before saving. Queries can also reference custom dashboard variables — `{{var}}` (required) or `[[ AND col = {{var}} ]]` (optional clause, dropped while the variable is empty); define them with `set_dashboard_variable`. Call `chart_building_help` for chart/settings reference and `metrics_query_help` with `context: 'chart_query'` for the source's metrics schema and chart-query-style examples. Use `dashboard` first to find the chart ID. |
| `BETTER_STACK_MCP_EDIT_CHART_ALERT` | Edit 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 |
| `BETTER_STACK_MCP_EDIT_DASHBOARD` | Edit 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. |
| `BETTER_STACK_MCP_EDIT_DASHBOARD_SECTION` | Edit dashboard section | Edit an existing dashboard section. Only provide the fields you want to change. Use dashboard first to find the section ID |
| `BETTER_STACK_MCP_ERROR` | Error | 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 |
| `BETTER_STACK_MCP_ERRORS` | Errors | 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. |
| `BETTER_STACK_MCP_ERRORS_QUERY_HELP` | Errors 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 |
| `BETTER_STACK_MCP_ESCALATE_INCIDENT` | Escalate incident | Escalate an ongoing incident to a user, team, schedule, or policy |
| `BETTER_STACK_MCP_ESCALATION_POLICIES` | Escalation policies | List all escalation policies with their steps and configuration |
| `BETTER_STACK_MCP_ESCALATION_POLICY` | Escalation policy | Get detailed information about a specific escalation policy |
| `BETTER_STACK_MCP_EXPLORATION` | Exploration | 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 |
| `BETTER_STACK_MCP_EXPLORATIONS` | Explorations | 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 |
| `BETTER_STACK_MCP_EXPLORE_LOGS_QUERY_HELP` | Explore 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 (`{{source}}`, `{{time}}`, `{{start_time}}`, `{{end_time}}`) 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`. |
| `BETTER_STACK_MCP_EXPORT_DASHBOARD` | Export dashboard | Export a dashboard configuration as JSON. Returns the complete dashboard data structure including charts, sections, presets, and settings |
| `BETTER_STACK_MCP_HEARTBEAT` | Heartbeat | Get details of a specific heartbeat |
| `BETTER_STACK_MCP_HEARTBEAT_AVAILABILITY` | Heartbeat availability | Get availability summary for a specific heartbeat |
| `BETTER_STACK_MCP_HEARTBEATS` | Heartbeats | List all heartbeats with filtering and pagination options |
| `BETTER_STACK_MCP_IMPORT_DASHBOARD` | Import dashboard | Import a dashboard from JSON configuration. Creates a new dashboard with the provided data structure |
| `BETTER_STACK_MCP_INCIDENT` | Incident | Get detailed information about a specific incident |
| `BETTER_STACK_MCP_INCIDENT_COMMENTS` | Incident comments | Get comments for an incident |
| `BETTER_STACK_MCP_INCIDENTS` | Incidents | List incidents with filtering and pagination options |
| `BETTER_STACK_MCP_INCIDENT_TIMELINE` | Incident timeline | Get the timeline of events for an incident |
| `BETTER_STACK_MCP_INVITE_TEAM_MEMBER` | Invite 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; the Admin role applies to every team, so an existing Admin keeps it. If the token can reach more than one team, pass `team_id` (or `team_name`). |
| `BETTER_STACK_MCP_LINK_ERROR_ISSUE` | Link 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. |
| `BETTER_STACK_MCP_METRIC` | Metric | 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 |
| `BETTER_STACK_MCP_METRIC_EXPRESSIONS` | Metric 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 |
| `BETTER_STACK_MCP_METRICS_QUERY_HELP` | Metrics 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 — the prompt will emphasize `{{source}}` / `{{time}}` / `{{start_time}}` / `{{end_time}}` template variables and chart column aliases. (`context: 'direct_query'` is the default, for ad-hoc queries.) |
| `BETTER_STACK_MCP_METRICS_SCHEMA` | Metrics 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. Use `name_filter` to search by name: `rabbitmq*`, `*queue*`, `*_total`, or an exact name. When more than 250 metrics match and grouping them by name prefix would shrink the list at least 3x, a prefix summary is returned instead of the list; drill in with the `name_filter` it suggests. `page` applies to whichever table is shown |
| `BETTER_STACK_MCP_MONITOR` | Monitor | Get details of a specific monitor |
| `BETTER_STACK_MCP_MONITOR_AVAILABILITY` | Monitor availability | Get availability (SLA) summary for a specific monitor |
| `BETTER_STACK_MCP_MONITOR_RESPONSE_TIMES` | Monitor response times | Get response time metrics for a specific monitor |
| `BETTER_STACK_MCP_MONITORS` | Monitors | List monitors with optional filtering and pagination |
| `BETTER_STACK_MCP_MOVE_CHARTS` | Move 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 |
| `BETTER_STACK_MCP_ON_CALL` | On call | Get detailed information about a specific on-call calendar or the default calendar |
| `BETTER_STACK_MCP_ON_CALL_EVENT` | On call event | Get detailed information about a specific on-call event |
| `BETTER_STACK_MCP_ON_CALL_EVENTS` | On call events | List all on-call schedule events for a specific calendar |
| `BETTER_STACK_MCP_ON_CALL_ROTATION` | On call rotation | Get on-call rotation configuration for a specific calendar |
| `BETTER_STACK_MCP_ON_CALLS` | On calls | List all on-call calendars for the team |
| `BETTER_STACK_MCP_QUERY` | Query | 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 |
| `BETTER_STACK_MCP_QUERY_HELP` | Query 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. |
| `BETTER_STACK_MCP_RELEASES` | Releases | List all releases for a specific application in a paginated table format. Returns release ID (usable with remove_release), reference, environments, origin, first seen, and last seen timestamps |
| `BETTER_STACK_MCP_REMOVE_CHART` | Remove 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 |
| `BETTER_STACK_MCP_REMOVE_DASHBOARD` | Remove dashboard | Remove a dashboard permanently. This action cannot be undone |
| `BETTER_STACK_MCP_REMOVE_DASHBOARD_SECTION` | Remove 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 |
| `BETTER_STACK_MCP_REMOVE_DASHBOARD_VARIABLE` | Remove 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. |
| `BETTER_STACK_MCP_REMOVE_EXPLORATION_VARIABLE` | Remove 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. |
| `BETTER_STACK_MCP_REMOVE_RELEASE` | Remove 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 |
| `BETTER_STACK_MCP_REMOVE_STATUS_PAGE_RESOURCE` | Remove status page resource | Remove a resource from a status page |
| `BETTER_STACK_MCP_REMOVE_STATUS_PAGE_SECTION` | Remove status page section | Remove a section from a status page. Resources in the section are removed with it. |
| `BETTER_STACK_MCP_REMOVE_TEAM_MEMBER` | Remove 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. |
| `BETTER_STACK_MCP_RENDER_CHART` | Render 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), e.g. `SELECT service AS series, count() AS value FROM ... GROUP BY service`. Alias result columns as (line/bar): - `... AS time` — the time bucket (e.g., `toStartOfHour(dt) AS time`) - `... AS value` — the numeric metric (e.g., `count() AS value`) - `... AS series` — optional: a grouping column for multiple series (e.g., `service AS series`) **IMPORTANT (line/bar): Always choose a time granularity that produces 50–500 data points** — too few points make the chart useless, too many make it unreadable. Use these rules based on the query's time range: - Up to 1 hour → `toStartOfMinute(dt) AS time` → ~60 points - 1–24 hours → `toStartOfInterval(dt, INTERVAL 5 MINUTE) AS time` → up to 288 points - 1–7 days → `toStartOfHour(dt) AS time` → up to 168 points - 7–30 days → `toStartOfInterval(dt, INTERVAL 4 HOUR) AS time` → up to 180 points - 30–90 days → `toStartOfInterval(dt, INTERVAL 12 HOUR) AS time` → up to 180 points - 90+ days → `toStartOfDay(dt) AS time` Additional query instructions (data access patterns) are in: - `query_help` — logs and spans - `errors_query_help` — errors - `metrics_query_help` — metrics |
| `BETTER_STACK_MCP_REOPEN_INCIDENT` | Reopen incident | Reopen a resolved incident (must be within 24 hours of resolution) |
| `BETTER_STACK_MCP_REPLAYS_QUERY_HELP` | Replays 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 |
| `BETTER_STACK_MCP_RESOLVE_INCIDENT` | Resolve incident | Resolve an ongoing incident |
| `BETTER_STACK_MCP_SET_DASHBOARD_VARIABLE` | Set 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` (shown as "Static list") → the options in `default_values` (first = default selection) - `select_with_sql` (shown as "Dynamic list") → an option-yielding **expression** (NOT a full query) in `sql_definition`, e.g. `label('_host')`; see the `sql_definition` parameter for how it is interpolated - Both list types accept `allow_multiple_values: true` to let users pick several options at once (interpolates as a regex used with `match()`). `multi_select_with_sql` is the legacy always-multiple Dynamic list; prefer `select_with_sql` with `allow_multiple_values: true`. - `select_predefined_sql` (shown as "Query per value") → 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 chart SQL unescaped - `source` → the source IDs in `source_ids`. Name it `source` to set the dashboard's own source (which sources every chart queries by default), or use a custom name for an extra source variable that a chart references in its FROM (e.g. `FROM {{name}}`) to query a different set of sources than the dashboard default. - `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 dashboard'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 dashboard's source. Use `dashboard` to list a dashboard's variables and `dashboard_query_help` for how each type is referenced in chart SQL. |
| `BETTER_STACK_MCP_SET_EXPLORATION_VARIABLE` | Set 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. |
| `BETTER_STACK_MCP_SEVERITIES` | Severities | List all severities (urgency levels) with their notification settings |
| `BETTER_STACK_MCP_SEVERITY` | Severity | Get detailed information about a specific severity (urgency level) |
| `BETTER_STACK_MCP_SOURCE` | Source | Get comprehensive details of a specific source including its configuration, retention settings, ingestion details, custom bucket settings (if configured) |
| `BETTER_STACK_MCP_SOURCE_FIELDS` | Source 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 |
| `BETTER_STACK_MCP_SOURCES` | Sources | List all available sources in a paginated table format. Returns source ID, name, platform type, team, status (active/paused), data region, and creation date |
| `BETTER_STACK_MCP_STATUS_PAGE` | Status page | Get details of a specific status page |
| `BETTER_STACK_MCP_STATUS_PAGE_REPORTS` | Status page reports | List status reports (incidents/maintenance) for a specific status page |
| `BETTER_STACK_MCP_STATUS_PAGE_REPORT_UPDATE` | Status page report update | Get details of a specific status page report update |
| `BETTER_STACK_MCP_STATUS_PAGE_REPORT_UPDATES` | Status page report updates | List status updates for a specific status report |
| `BETTER_STACK_MCP_STATUS_PAGE_RESOURCES` | Status page resources | Get resources (monitors/heartbeats) for a specific status page |
| `BETTER_STACK_MCP_STATUS_PAGES` | Status pages | List all status pages with filtering and pagination options |
| `BETTER_STACK_MCP_STATUS_PAGE_SECTIONS` | Status page sections | List the sections (resource groups) of a status page |
| `BETTER_STACK_MCP_TEAM_MEMBERS` | 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. |
| `BETTER_STACK_MCP_TEAM_ROLES` | Team 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. |
| `BETTER_STACK_MCP_TEAMS` | Teams | List all available teams in Better Stack Logs. Returns a table with team IDs and names, grouped by organization |
| `BETTER_STACK_MCP_TOGGLE_CHART_ALERT_PAUSE` | Toggle chart alert pause | Pause or unpause a chart alert. When paused, the alert will not trigger any incidents |
| `BETTER_STACK_MCP_UNLINK_ERROR_ISSUE` | Unlink 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. |
| `BETTER_STACK_MCP_UPDATE_ERROR_STATE` | Update error state | Update the state of a specific error (mark as resolved, ignored, or unresolved) |
| `BETTER_STACK_MCP_UPDATE_METRIC_EXPRESSION` | Update 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. See `create_metric_expression` for `sql_expression` / `type` / `aggregations` guidance. Prefer `build_type: new_data` (default). `historical_logs` re-runs the rule over every stored log — expensive; only when the user explicitly asks. |
| `BETTER_STACK_MCP_UPDATE_STATUS_PAGE` | Update status page | Update the settings of a status page (company name, contact URL, theme, layout, and more) |
| `BETTER_STACK_MCP_UPDATE_STATUS_PAGE_RESOURCE` | Update 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. |
| `BETTER_STACK_MCP_UPDATE_STATUS_PAGE_SECTION` | Update status page section | Rename a status page section or move it by setting its position |

## Supported Triggers

None listed.

## Creating MCP Server - Stand-alone vs Composio SDK

Once connected, your Grok bot can access the Better Stack MCP server through Composio to run the actions you authorize, using plain language in the chat.

## Complete Code

None listed.

## Conclusion

### Way Forward
Now that Better Stack is connected, extend your setup by connecting the other apps you already use every day, so your Grok bot can run true cross-app workflows end to end.
- Connect Calendar to turn threads into scheduled meetings automatically.
- Connect Slack or Teams to post summaries, approvals, and alerts where your team works.
- Connect Notion, Linear, Jira, or Asana to convert requests into tickets, tasks, and docs.
- Connect Drive, Dropbox, or OneDrive to fetch, file, and share attachments without manual steps.
Start with one workflow you do repeatedly, then keep adding apps as you find new handoffs. With everything behind a single connection, your bot can coordinate multiple tools safely and reliably in one conversation.

## How to build Better Stack MCP Agent with another framework

- [ChatGPT](https://composio.dev/toolkits/better_stack_mcp/framework/chatgpt)
- [Claude Cowork](https://composio.dev/toolkits/better_stack_mcp/framework/claude-cowork)
- [Hermes](https://composio.dev/toolkits/better_stack_mcp/framework/hermes-agent)
- [Atomic Agent](https://composio.dev/toolkits/better_stack_mcp/framework/atomic-agent)

## Related Toolkits

- [Supabase](https://composio.dev/toolkits/supabase) - Supabase is an open-source backend platform offering scalable Postgres databases, authentication, storage, and real-time APIs. It lets developers build modern apps without managing infrastructure.
- [Codeinterpreter](https://composio.dev/toolkits/codeinterpreter) - Codeinterpreter is a Python-based coding environment with built-in data analysis and visualization. It lets you instantly run scripts, plot results, and prototype solutions inside supported platforms.
- [GitHub](https://composio.dev/toolkits/github) - GitHub is a code hosting platform for version control and collaborative software development. It streamlines project management, code review, and team workflows in one place.
- [1password](https://composio.dev/toolkits/_1password) - 1Password is a password manager and digital vault for storing logins, secrets, notes, and secure documents. It helps individuals and teams protect credentials, share access safely, and reduce password risk.
- [Ably](https://composio.dev/toolkits/ably) - Ably is a real-time messaging platform for live chat and data sync in modern apps. It offers global scale and rock-solid reliability for seamless, instant experiences.
- [Abuselpdb](https://composio.dev/toolkits/abuselpdb) - Abuselpdb is a central database for reporting and checking IPs linked to malicious online activity. Use it to quickly identify and report suspicious or abusive IP addresses.
- [Alchemy](https://composio.dev/toolkits/alchemy) - Alchemy is a blockchain development platform offering APIs and tools for Ethereum apps. It simplifies building and scaling Web3 projects with robust infrastructure.
- [Algolia](https://composio.dev/toolkits/algolia) - Algolia is a hosted search API that powers lightning-fast, relevant search experiences for web and mobile apps. It helps developers deliver instant, typo-tolerant, and scalable search without complex infrastructure.
- [Anakin](https://composio.dev/toolkits/anakin_io) - Anakin is a web automation platform offering scraping, crawling, search, and browser automation. Use it to extract structured data, automate site tasks, and monitor web changes reliably.
- [Anchor browser](https://composio.dev/toolkits/anchor_browser) - Anchor browser is a developer platform for AI-powered web automation. It transforms complex browser actions into easy API endpoints for streamlined web interaction.
- [AnyAPI](https://composio.dev/toolkits/anyapi) - AnyAPI is a marketplace of utility APIs for validation, currency conversion, holidays, documents, and web data. It brings common application workflows together through one practical API platform.
- [Apiflash](https://composio.dev/toolkits/apiflash) - Apiflash is a website screenshot API for programmatically capturing web pages. It delivers high-quality screenshots on demand for automation, monitoring, or reporting.
- [Apiverve](https://composio.dev/toolkits/apiverve) - Apiverve delivers a suite of powerful APIs that simplify integration for developers. It's designed for reliability and scalability so you can build faster, smarter applications without the integration headache.
- [Appcircle](https://composio.dev/toolkits/appcircle) - Appcircle is an enterprise-grade mobile CI/CD platform for building, testing, and publishing mobile apps. It streamlines mobile DevOps so teams ship faster and with more confidence.
- [Appdrag](https://composio.dev/toolkits/appdrag) - Appdrag is a cloud platform for building websites, APIs, and databases with drag-and-drop tools and code editing. It accelerates development and iteration by combining hosting, database management, and low-code features in one place.
- [Appveyor](https://composio.dev/toolkits/appveyor) - AppVeyor is a cloud-based continuous integration service for building, testing, and deploying applications. It helps developers automate and streamline their software delivery pipelines.
- [Authyo](https://composio.dev/toolkits/authyo) - Authyo is a REST API service for passwordless authentication, OTP verification, session management, and transactional notifications. Use it to add secure login flows and user verification without building auth infrastructure from scratch.
- [AWS Marketplace MCP](https://composio.dev/toolkits/aws_marketplace_mcp) - AWS Marketplace MCP provides MCP access to AWS Marketplace's cloud software, data, and services catalog. Use it to discover, compare, and evaluate 30K+ AWS Marketplace listings faster.
- [Azure Monitor Activity Log](https://composio.dev/toolkits/azure_monitor_activity_log) - Azure Monitor Activity Log is Azure's service that records management and control-plane events for a subscription. Use it to audit changes, troubleshoot issues, and track resource operations across your Azure resources.
- [Backendless](https://composio.dev/toolkits/backendless) - Backendless is a backend-as-a-service platform for mobile and web apps, offering database, file storage, user authentication, and APIs. It helps developers ship scalable applications faster without managing server infrastructure.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Better Stack MCP?

With a standalone Better Stack MCP server, the agents and LLMs can only access a fixed set of Better Stack tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Better Stack and many other apps based on the task at hand, all through a single MCP endpoint.

### Can I use Tool Router MCP with Grok Bot?

Yes, you can. Grok Bot fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Better Stack tools.

### Can I manage the permissions and scopes for Better Stack while using Tool Router?

Yes, absolutely. You can configure which Better Stack scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

### How safe is my data with Composio Tool Router?

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Better Stack data and credentials are handled as safely as possible.

---
[See all toolkits](https://composio.dev/toolkits) · [Composio docs](https://docs.composio.dev/llms.txt)
