Observability
Step-by-step connection and configuration for Sentry, Prometheus, OpenSearch, Elasticsearch, Datadog, Grafana, PagerDuty, Splunk, New Relic, PostHog, Dynatrace and Honeycomb.
Where the agent goes to find out what actually happened: the error, the metric, the log line, the incident that was open at the time.
Sentry
sentry · runs @sentry/mcp-server via npx · works with sentry.io and with
Sentry-compatible backends such as GlitchTip.
Overview, prompts and the tool list: /integrations/sentry.
Create an auth token. Sentry → Settings → Auth Tokens → Create New Token, with
issue and project read scopes (project:read, event:read, org:read). No write
scopes.
Note the organization slug: the segment in sentry.io/organizations/<slug>/.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Access token | yes | The token above. |
| Organization slug | yes | my-org |
| Self-hosted host | no | sentry.example.com for self-hosted or GlitchTip. Blank means sentry.io. |
| Use plain HTTP | no | Only for a self-hosted host served over http://. |
Verify. Health check is find_projects, not whoami: the pinned server
version serves only 8 top-level tools and whoami isn't one of them.
Prometheus
prometheus · runs prometheus-mcp-server via uvx.
Overview, prompts and the tool list: /integrations/prometheus.
Confirm the server URL is reachable from members' machines. Prometheus itself has no user model, so if it is exposed at all it is behind something else: a reverse proxy, an ingress, or a managed service. That front door's URL is what goes in the form, and its authentication is what Authentication method describes.
Get the credential that front door wants.
For a proxy doing HTTP basic auth, that is a username and password. For Grafana Cloud, Amazon Managed Prometheus behind a proxy, or an ingress checking a header, it is a bearer token, created wherever that service issues API tokens, and given read access to the metrics endpoint only.
Pick one. A token, once set, is the only credential sent; a username and password filled in beside it would be dropped without a word, which is why this is a choice on the form rather than two optional pairs.
For Cortex, Mimir or Thanos, find the tenant ID. Multi-tenant deployments key every
query on an X-Scope-OrgID header. Without it a query returns nothing, or is rejected
outright, with no hint that a tenant was expected. It is the same value your Grafana
data source sends.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Server URL | yes | http://prometheus.internal:9090 |
| Authentication method | no, defaults None | Basic auth or a bearer token, matching whatever fronts the server. |
| Username / Password | yes, with Username and password | |
| Bearer token | yes, with Bearer token | Sent as Authorization: Bearer. |
| Tenant ID | no | The X-Scope-OrgID value for Cortex, Mimir or Thanos. Blank for a plain Prometheus. |
| CA certificate path | no | Absolute path on the machine running Triagic, for a private CA. |
| Client certificate path | no | For a server that authenticates clients by certificate. A single PEM holding both certificate and key works alone. |
| Client key path | no | Only when the certificate file does not already contain the key. |
| Verify TLS certificate | no, defaults on | Turn off for a self-signed certificate or an https:// URL pointing at a bare IP. |
Verify. Health check is the server's own health_check.
| If it reports | It usually means |
|---|---|
CERTIFICATE_VERIFY_FAILED, SSLCertVerificationError | The certificate isn't trusted by that machine. Set CA certificate path, or turn off Verify TLS certificate if it is self-signed. |
401 / 403 | The proxy rejected the credential. Check Authentication method matches what it actually checks: a bearer token sent to a basic-auth proxy fails the same way a wrong password does. |
| Queries succeed but return nothing | On Cortex, Mimir or Thanos, Tenant ID is unset or names a tenant with no data. |
OpenSearch
opensearch · runs opensearch-mcp-server-py via uvx · read-only enforced by the
server's own write filter, which drops every tool that is not a GET. The search
configuration, query set and experiment writers are not registered at all.
Overview, prompts and the tool list: /integrations/opensearch.
Pick the authentication method the cluster actually offers. It is the first choice on the form and it decides which other fields appear:
- None: a self-managed cluster with the security plugin disabled.
- Username and password: a self-managed cluster with the security plugin on.
- AWS SigV4 (access keys): Amazon OpenSearch Service, signing with a key pair, or with whatever credentials the machine running Triagic already has.
- AWS SigV4 (assume an IAM role): the same, but assuming a role first. This is the only route to a role, because the server has no other role setting.
Create a read-only user if the security plugin is enabled: a user mapped to a
role with indices:data/read/* on the log indices, and nothing else.
For Amazon OpenSearch Service, create an IAM identity that can only read. Attach a
policy granting es:ESHttpGet and es:ESHttpHead on the domain, and add that identity
to the domain's fine-grained access control mapping if it has one.
To assume a role instead of using long-lived keys, leave AWS access key ID and
AWS secret access key blank and fill in IAM role ARN. The credentials that
assume it are then whatever the machine running Triagic already has (an EC2 instance
profile, an ECS task role, or ~/.aws/credentials), and that identity needs
sts:AssumeRole on the role. Filling the key fields in as well makes those keys the
ones that assume the role.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Cluster URL | yes | https://opensearch.internal:9200 |
| Authentication method | no, defaults None | See above. |
| Username / Password | yes, with Username and password | The read-only user. |
| AWS access key ID / AWS secret access key | no, with either AWS method | Blank uses the machine's own AWS credentials. |
| Session token | no | Only for temporary (STS) credentials. |
| Region | yes, with either AWS method | The domain's region. SigV4 signs the region into the request, so a wrong one comes back as a bad signature, not as a wrong address. |
| IAM role ARN | yes, with assume an IAM role | arn:aws:iam::123456789012:role/opensearch-reader |
| Serverless collection | no | Turn on for an OpenSearch Serverless collection. It changes the signing service from es to aoss; without it a Serverless endpoint rejects every request. |
| CA certificate path | no | Absolute path on the machine running Triagic, for a private CA. |
| Client certificate path / Client key path | no | For a cluster that authenticates clients by certificate. Set both or neither: the server refuses to start with one of the pair, and refuses a path that does not exist. |
| Verify TLS certificate | no, defaults on | Turn off for a self-signed certificate or an https:// URL pointing at a bare IP. |
Verify. Health check is the cluster-health call.
| If it reports | It usually means |
|---|---|
CERTIFICATE_VERIFY_FAILED, SSLCertVerificationError | The certificate isn't trusted by that machine. Set CA certificate path, or turn off Verify TLS certificate if it is self-signed. |
mTLS requires both client certificate and client key paths | Only one of the pair is filled in. The form catches this on save, so this one only appears if the file itself has gone missing since. |
The security token included in the request is invalid, a signature mismatch | With an AWS method: Region does not match the domain's, or a Serverless collection was configured without Serverless collection on. |
User: … is not authorized to perform: sts:AssumeRole | The credentials assuming IAM role ARN are not allowed to. With the key fields blank, those are the machine's own AWS credentials, not the ones on this form. |
Elasticsearch
elasticsearch · runs @elastic/mcp-server-elasticsearch via npx · read-only is
structural in this version: the toolset is search, mappings, indices and shards, with
no write tools at all.
Overview, prompts and the tool list: /integrations/elasticsearch.
Create an API key in Kibana → Stack Management → API keys, restricted to read
privileges on the indices you need. "Restricted" means a role descriptor on the key:
read and view_index_metadata on those indices is the whole requirement, plus the
cluster's monitor privilege for the shard and health tools:
{
"triagic-read": {
"cluster": ["monitor"],
"indices": [{ "names": ["logs-*"], "privileges": ["read", "view_index_metadata"] }]
}
}Copy the encoded value, the base64 id:key form. A username and password also
work (give that user the same role); the API key wins if both are filled in.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Cluster URL | yes | https://es.internal:9200 |
| API key | no | The encoded key. Preferred over username/password. |
| Username / Password | no | The alternative. Send one style or the other, not both. |
| Elasticsearch version | no, defaults 9.x | Pick 8.x for an 8.x cluster, or the handshake may be refused. |
| Path prefix | no | /elasticsearch, when a reverse proxy serves the cluster under a subpath rather than at the root of its host. |
| CA certificate path | no | Absolute path on the machine running Triagic. |
| Verify TLS certificate | no, defaults on | Turn off for a self-signed certificate. |
Verify. Health check lists indices matching *.
| If it reports | It usually means |
|---|---|
security_exception, missing authentication credentials, 401 | The key must be the base64 id:key form from Kibana, not the raw key id. |
self-signed certificate, unable to verify the first certificate | Set the CA path, or turn verification off. |
404 on every request | A reverse proxy serving the cluster under a subpath. Set Path prefix to that subpath. |
Datadog
datadog · runs datadog-mcp via npx with --read-only, which rejects every
create, update, delete, mute, cancel and trigger action. MCP_READ_ONLY is set as
well, so the guarantee does not rest on argument order alone.
Overview, prompts and the tool list: /integrations/datadog.
Create an API key. Datadog → Organization Settings → API Keys.
Create an application key. Organization Settings → Application Keys, in the same organization.
An unscoped application key inherits every permission of the user who created it,
so create it from a least-privilege user, not an admin. If your plan supports scoped
application keys, scope it instead, with read scopes covering what this integration
queries: monitors_read, dashboards_read, metrics_read, timeseries_query,
logs_read_data, events_read, incident_read, slos_read, hosts_read,
apm_read, usage_read, rum_apps_read, synthetics_read,
security_monitoring_rules_read, security_monitoring_signals_read, teams_read,
notebooks_read, logs_read_pipelines, logs_read_index_data, and
logs_read_archives. Leave every write scope off; the server's --read-only flag
refuses writes anyway, and the scopes make that hold even if the flag ever breaks.
Note your site. It is the domain in the URL when you log in to Datadog. Keys are per-region, so a mismatch is rejected outright. Pick from the list rather than typing, because a site the server does not recognise still routes API calls correctly while quietly building every link in a tool result against the US1 app.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| API key | yes | |
| Application key | yes | Must belong to the same organization as the API key. |
| Site | no, defaults datadoghq.com | Pick the region your org lives in: US1, US3, US5, EU1, AP1, AP2 or US1-FED. |
Verify. Health check lists monitors, chosen because Datadog's own key-validation tool reports bad keys as a successful result and would pass for a broken config.
| If it reports | It usually means |
|---|---|
401 / authentication failed | One of the keys is wrong, they come from different organizations, or Site doesn't match where that organization lives. |
403 / Authorization denied | Usually Site again: keys are per-region, and the default rejects keys minted in an EU or US3/US5 org. Otherwise the app key lacks scopes. |
| Links in results point at the wrong org | Only happens on AP2, whose app URL is missing from the server's own link table upstream. Queries are unaffected; the links are not. |
Grafana
grafana · runs the official grafana/mcp-grafana:1.1.0 image via Docker with
--disable-write, which turns off dashboard updates, incident creation, alerting and
annotation mutations, snapshots and Sift.
Overview, prompts and the tool list: /integrations/grafana.
Choose an authentication method.
A service account token is the modern path and needs Grafana 9.1 or later. Go to Administration → Users and access → Service accounts, create one with the Viewer role, then Add service account token and copy it. The deprecated API keys are not used.
Older on-prem instances have no service accounts. Pick Username + password there and use a dedicated read-only Grafana login. Basic auth sends those credentials on every request, so a person's own login is the wrong thing to put here. An SSO-only account cannot authenticate this way at all.
Pick one. Grafana resolves a token ahead of a username and password and does it silently, so leaving both filled in would mean the password is ignored with nothing to say so, which is why this is a choice rather than two optional boxes.
Work out the URL as the container sees it. This server runs inside Docker, so
localhost is the container itself. A Grafana on the same machine must be addressed
as http://host.docker.internal:3000.
Find the organization ID, if the instance has more than one. Open Administration → General → Organizations and read the number out of the URL. On a single-organization instance leave this blank.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Grafana URL | yes | https://grafana.example.com, or http://host.docker.internal:3000 for a local one. |
| Authentication method | no, defaults service account token | Username + password for an instance with no service accounts. |
| Service account token | with token auth | Viewer-role token. |
| Username | with basic auth | A Viewer-role Grafana login. |
| Password | with basic auth | |
| Organization ID | no | The number from the Organizations URL, on a multi-organization instance. Blank uses the credential's own default organization. |
| CA certificate path | no | For an https:// Grafana behind a private CA. Give the path on the machine running Triagic; it is mounted into the container for you. |
| Verify TLS certificate | no, defaults on | Turn off only for a self-signed certificate you cannot supply a CA for. |
Verify. Health check searches dashboards, deliberately not the datasource list, which stock RBAC hides from Viewers.
| If it reports | It usually means |
|---|---|
connection refused, no such host | The container couldn't reach that URL. See host.docker.internal above. |
401 | Token expired or revoked, the service account is disabled, or, with basic auth, the account is disabled or SSO-only. |
403 | Give the service account or user at least Viewer. Folder-scoped permissions can also hide everything, and on a multi-organization instance a wrong Organization ID looks the same. |
x509: certificate signed by unknown authority | Grafana's certificate isn't trusted inside the container. Set CA certificate path to that CA's PEM bundle. |
PagerDuty
pagerduty · runs pagerduty-mcp via uvx · read-only by absence: write tools
only exist when the server is started with a flag this catalog never passes.
Overview, prompts and the tool list: /integrations/pagerduty.
Create a user API token. PagerDuty → User Settings → API Access → Create API User Token. Mint it from an account with at least Responder-level visibility of the services you care about.
It has to be a user token, and that is a requirement rather than a preference. The
server calls /users/me when it starts, to work out whose name to act under for the
REST API's From: header. An account-level REST API key authenticates perfectly well
but has no user behind it, so that lookup comes back empty, and the failure is
swallowed rather than reported. The server then runs with no identity, and
get_user_data, which is this integration's own health check, cannot answer.
An Events API v2 integration key does not work here either.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| User API token | yes | |
| API host | no, defaults https://api.pagerduty.com | Use https://api.eu.pagerduty.com for accounts on the EU service region. |
Verify. Health check reads the token's own user record.
| If it reports | It usually means |
|---|---|
401 | Either the wrong kind of key, or an EU account being called on the US host. PagerDuty runs separate control planes and the error is identical either way. |
403 | The token's user cannot see that data. |
| Connects, but the health check finds no user | An account-level REST API key rather than a user token. It authenticates, so nothing 401s; there is simply no user behind it. |
Splunk
splunk · a hosted endpoint, not a local process: the desktop talks HTTPS to the
MCP Server app running inside your own Splunk instance. Nothing is installed locally.
Overview, prompts and the tool list: /integrations/splunk.
An admin has to install the app first
This integration talks to MCP Server for Splunk Platform (Splunkbase app 7931). No credential will make it work until that app is installed and enabled on the instance.
Install app 7931 on the Splunk instance and enable it.
Create an authentication token. Splunk → Settings → Tokens → New Token, with
its audience set to mcp. Searches run under the token's own Splunk role, so a
read-only role is what keeps this read-only, and that role needs the
mcp_tool_execute capability.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Splunk URL | yes | The management port: https://splunk.example.com:8089. Not the web UI on 8000. |
| Authentication token | yes | The mcp-audience token. |
Verify. Health check reads instance info.
| If it reports | It usually means |
|---|---|
404 | The management port answered but has no MCP endpoint: app 7931 isn't installed or isn't enabled. |
401 / 403 | Token expired, audience not tagged mcp, or the owning role lacks mcp_tool_execute. |
self-signed certificate | Splunk ships a self-signed certificate on 8089 by default. Install its CA on the machine, or point the URL at a front end with a trusted certificate. |
New Relic
new-relic · runs newrelic-mcp via npx.
Overview, prompts and the tool list: /integrations/new-relic.
Writes are not blocked here
The tool set is almost entirely query-side, but it does include incident acknowledgement, browser-monitor creation and deployment markers, and there is no switch to drop them. The key's own capabilities are the boundary.
Create a User key from a read-only user. New Relic → Administration → API keys → Create a key → User key. Licence keys and browser keys do not work.
A User key carries the permissions of the user it belongs to, so the user is the scope: create the key from an account given the standard Read only user type (or a custom group whose roles grant only read capabilities), not from an admin. That user's limits are what stand behind the missing write block called out above.
Find the account ID: the numeric id under Administration → Access management.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| User API key | yes | NRAK-… |
| Account ID | yes | 1234567 |
| Region | no, defaults US | Pick EU for an EU-datacentre account. Reaches the NerdGraph tools only; see below. |
Verify. Health check fetches account metadata, so it fails on both a bad key and an account the key cannot see.
| If it reports | It usually means |
|---|---|
401 / 403 | Wrong key type, or the wrong Region. An EU key fails against the US endpoint with exactly this error. |
account not found | The key works but its user isn't on that account. |
| An EU account returns some results and not others | Region only reaches the NerdGraph tools: NRQL, entity search, alerts and incidents. The REST tools take their own region argument that defaults to US whatever you pick, so they query the wrong data centre and come back empty. This is an upstream defect with no setting that corrects it. |
PostHog
posthog · a hosted endpoint, not a local process: the desktop talks HTTPS to
mcp.posthog.com. Nothing is installed locally.
Overview, prompts and the tool list: /integrations/posthog.
It is filed under Business systems in the picker
The catalog groups PostHog with the business systems, not with observability. Look for it there when you add it; everything below is the same either way.
Read-only here is annotation-vetted rather than allowlisted. This catalog pins no
tool list for PostHog, so each tool the hosted server offers has to annotate itself
readOnlyHint (and not destructiveHint) or it is dropped before the agent ever
sees it. switch-organization and switch-project annotate a write, and are dropped.
Create a personal API key. PostHog → Settings → Personal API keys → Create
key, with the MCP Server preset. A project API key (phc_…) is write-only
ingestion and is not accepted here.
The key also decides the region. The hosted endpoint routes to US or EU Cloud from the key itself, which is why there is no host field on the form.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Personal API key | yes | phx_…, created with the MCP Server preset. It decides which organizations and projects are reachable. |
Verify. Health check is organizations-get. It takes no arguments, is annotated
read-only, and fails on a bad key where merely listing tools would not.
The tool roster is pinned in the endpoint URL rather than left at the server's
default, which is the whole API surface. What the agent can pull: error-tracking
issues, events and persons, insights and dashboards, HogQL through execute-sql,
feature flags and experiments, session replay, logs, and PostHog's own docs search.
| If it reports | It usually means |
|---|---|
401, unauthorized | Not a personal API key. It must be the phx_… key from Settings → Personal API keys with the MCP Server preset; a project phc_… key authenticates nothing here. |
403, a missing scope | The key is valid but was minted without a scope the server needs. Recreate it with the MCP Server preset. |
Dynatrace
dynatrace · runs @dynatrace-oss/dynatrace-mcp-server via npx · read-only by an
allowlist of the query and read tools, bounded by the token's scopes.
Overview, prompts and the tool list: /integrations/dynatrace.
Covers DQL over Grail (logs, spans, metrics, events, entities), problems,
vulnerabilities, exceptions, Kubernetes events, entity lookup, Davis analyzers and
Davis CoPilot. Needs a Dynatrace platform environment, the one whose URL ends in
.apps.dynatrace.com.
DQL is billed by data scanned
Every query reads from Grail, and Grail bills by bytes scanned. Each running server keeps a Grail query budget, 100 GB unless you change it. Once it's used up the server refuses further DQL until the integration restarts. The count is shared by every investigation that server handles, and the query that crosses the line still completes.
Create a platform token under Dynatrace's identity and access management
settings. Give it app-engine:apps:run and the storage:*:read scopes for
the data you want reachable: logs, spans, metrics, events, entities,
bizevents, security.events, system, buckets, smartscape, files. Add
davis-copilot:*:execute and davis:analyzers:read / :execute for the CoPilot
and analyzer tools. Leave out every write scope (storage:events:write,
email:emails:send, document:documents:write). This is a requirement, not advice:
a platform token is used for every call as is, so its scopes are the outer boundary.
Triagic also refuses any Davis analyzer name that isn't a plain dotted id, so that
tool can't be pointed at another platform API.
A classic API token (dt0c01.…) doesn't work here. An OAuth client with the same
scopes does: pick OAuth client as the method and paste both the ID and the
secret.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Environment URL | yes | https://<environment-id>.apps.dynatrace.com. Not the classic …live.dynatrace.com URL. |
| Authentication method | no, defaults to platform token | |
| Platform token | yes, for a platform token | dt0s16.… |
| OAuth client ID / secret | yes, for an OAuth client | Both. With only the ID the server tries to open a browser. |
| Grail query budget (GB) | no, defaults 100 | Raise it if investigations routinely need more. |
Verify. The server tests the token as it starts, then the health check reads the environment's own record.
| If it reports | It usually means |
|---|---|
valid Dynatrace Platform Environment URL | The URL is a classic …live.dynatrace.com one, or has a path on it. |
ENOTFOUND / getaddrinfo | The environment ID in the URL is wrong. |
401 | A classic API token, or an expired platform token. |
403 / lacking the necessary permissions | The token is missing a scope for that tool. |
Failed to retrieve OAuth token | The OAuth client ID and secret don't belong together, or the client is in another account. |
Grail Budget Exceeded | This server used its budget. Restart the integration or raise the budget. |
Honeycomb
honeycomb · a hosted endpoint at https://mcp.honeycomb.io/mcp (EU:
https://mcp.eu1.honeycomb.io/mcp), reached with a Honeycomb Management API key as
the bearer. Nothing runs locally.
Overview, prompts and the tool list: /integrations/honeycomb.
Covers queries, BubbleUp, traces and spans, datasets and columns, the service map, boards, triggers, SLOs and semantic-convention lookups.
Create a Management API key. Only team owners can. Give it the Model Context Protocol and Environments scopes with Read, and leave Write off. Honeycomb's write tools (boards, triggers, SLOs, recipients, Canvas) need the write scope, so a Read-only key can't run them whatever the agent asks.
Ingest and configuration keys are a different credential and don't work here.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Management API key | yes | The key ID and secret joined by a colon: KEY_ID:SECRET. |
| Region | no, defaults US | EU if your team lives on Honeycomb's EU instance. |
Verify. Health check reads your team name and environments, which fails on a bad key.
| If it reports | It usually means |
|---|---|
401 | Only half the key was pasted, it's not a Management key, or an EU team is on the US region. The error is the same for all three. |
403 | The key is missing the Model Context Protocol or Environments scope. |