Triagic docs
Integrations

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.

FieldRequiredWhat to put
Access tokenyesThe token above.
Organization slugyesmy-org
Self-hosted hostnosentry.example.com for self-hosted or GlitchTip. Blank means sentry.io.
Use plain HTTPnoOnly 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.

FieldRequiredWhat to put
Server URLyeshttp://prometheus.internal:9090
Authentication methodno, defaults NoneBasic auth or a bearer token, matching whatever fronts the server.
Username / Passwordyes, with Username and password
Bearer tokenyes, with Bearer tokenSent as Authorization: Bearer.
Tenant IDnoThe X-Scope-OrgID value for Cortex, Mimir or Thanos. Blank for a plain Prometheus.
CA certificate pathnoAbsolute path on the machine running Triagic, for a private CA.
Client certificate pathnoFor a server that authenticates clients by certificate. A single PEM holding both certificate and key works alone.
Client key pathnoOnly when the certificate file does not already contain the key.
Verify TLS certificateno, defaults onTurn 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 reportsIt usually means
CERTIFICATE_VERIFY_FAILED, SSLCertVerificationErrorThe certificate isn't trusted by that machine. Set CA certificate path, or turn off Verify TLS certificate if it is self-signed.
401 / 403The 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 nothingOn 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.

FieldRequiredWhat to put
Cluster URLyeshttps://opensearch.internal:9200
Authentication methodno, defaults NoneSee above.
Username / Passwordyes, with Username and passwordThe read-only user.
AWS access key ID / AWS secret access keyno, with either AWS methodBlank uses the machine's own AWS credentials.
Session tokennoOnly for temporary (STS) credentials.
Regionyes, with either AWS methodThe 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 ARNyes, with assume an IAM rolearn:aws:iam::123456789012:role/opensearch-reader
Serverless collectionnoTurn 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 pathnoAbsolute path on the machine running Triagic, for a private CA.
Client certificate path / Client key pathnoFor 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 certificateno, defaults onTurn 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 reportsIt usually means
CERTIFICATE_VERIFY_FAILED, SSLCertVerificationErrorThe 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 pathsOnly 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 mismatchWith 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:AssumeRoleThe 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.

FieldRequiredWhat to put
Cluster URLyeshttps://es.internal:9200
API keynoThe encoded key. Preferred over username/password.
Username / PasswordnoThe alternative. Send one style or the other, not both.
Elasticsearch versionno, defaults 9.xPick 8.x for an 8.x cluster, or the handshake may be refused.
Path prefixno/elasticsearch, when a reverse proxy serves the cluster under a subpath rather than at the root of its host.
CA certificate pathnoAbsolute path on the machine running Triagic.
Verify TLS certificateno, defaults onTurn off for a self-signed certificate.

Verify. Health check lists indices matching *.

If it reportsIt usually means
security_exception, missing authentication credentials, 401The key must be the base64 id:key form from Kibana, not the raw key id.
self-signed certificate, unable to verify the first certificateSet the CA path, or turn verification off.
404 on every requestA 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.

FieldRequiredWhat to put
API keyyes
Application keyyesMust belong to the same organization as the API key.
Siteno, defaults datadoghq.comPick 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 reportsIt usually means
401 / authentication failedOne of the keys is wrong, they come from different organizations, or Site doesn't match where that organization lives.
403 / Authorization deniedUsually 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 orgOnly 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.

FieldRequiredWhat to put
Grafana URLyeshttps://grafana.example.com, or http://host.docker.internal:3000 for a local one.
Authentication methodno, defaults service account tokenUsername + password for an instance with no service accounts.
Service account tokenwith token authViewer-role token.
Usernamewith basic authA Viewer-role Grafana login.
Passwordwith basic auth
Organization IDnoThe number from the Organizations URL, on a multi-organization instance. Blank uses the credential's own default organization.
CA certificate pathnoFor 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 certificateno, defaults onTurn 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 reportsIt usually means
connection refused, no such hostThe container couldn't reach that URL. See host.docker.internal above.
401Token expired or revoked, the service account is disabled, or, with basic auth, the account is disabled or SSO-only.
403Give 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 authorityGrafana'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.

FieldRequiredWhat to put
User API tokenyes
API hostno, defaults https://api.pagerduty.comUse https://api.eu.pagerduty.com for accounts on the EU service region.

Verify. Health check reads the token's own user record.

If it reportsIt usually means
401Either 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.
403The token's user cannot see that data.
Connects, but the health check finds no userAn 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.

FieldRequiredWhat to put
Splunk URLyesThe management port: https://splunk.example.com:8089. Not the web UI on 8000.
Authentication tokenyesThe mcp-audience token.

Verify. Health check reads instance info.

If it reportsIt usually means
404The management port answered but has no MCP endpoint: app 7931 isn't installed or isn't enabled.
401 / 403Token expired, audience not tagged mcp, or the owning role lacks mcp_tool_execute.
self-signed certificateSplunk 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.

FieldRequiredWhat to put
User API keyyesNRAK-…
Account IDyes1234567
Regionno, defaults USPick 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 reportsIt usually means
401 / 403Wrong key type, or the wrong Region. An EU key fails against the US endpoint with exactly this error.
account not foundThe key works but its user isn't on that account.
An EU account returns some results and not othersRegion 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.

FieldRequiredWhat to put
Personal API keyyesphx_…, 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 reportsIt usually means
401, unauthorizedNot 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 scopeThe 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.

FieldRequiredWhat to put
Environment URLyeshttps://<environment-id>.apps.dynatrace.com. Not the classic …live.dynatrace.com URL.
Authentication methodno, defaults to platform token
Platform tokenyes, for a platform tokendt0s16.…
OAuth client ID / secretyes, for an OAuth clientBoth. With only the ID the server tries to open a browser.
Grail query budget (GB)no, defaults 100Raise 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 reportsIt usually means
valid Dynatrace Platform Environment URLThe URL is a classic …live.dynatrace.com one, or has a path on it.
ENOTFOUND / getaddrinfoThe environment ID in the URL is wrong.
401A classic API token, or an expired platform token.
403 / lacking the necessary permissionsThe token is missing a scope for that tool.
Failed to retrieve OAuth tokenThe OAuth client ID and secret don't belong together, or the client is in another account.
Grail Budget ExceededThis 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.

FieldRequiredWhat to put
Management API keyyesThe key ID and secret joined by a colon: KEY_ID:SECRET.
Regionno, defaults USEU 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 reportsIt usually means
401Only 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.
403The key is missing the Model Context Protocol or Environments scope.

On this page