Triagic docs
Integrations

Business systems

Step-by-step connection and configuration for Atlassian, Stripe, Slack, Notion, Zendesk, ServiceNow, Linear, Intercom, HubSpot, Salesforce, Freshdesk, and PostHog, which the picker files here.

The systems that hold the human context around a ticket: the runbook, the past conversation, the charge that was actually refunded.

PostHog is in this picker group, documented with observability

The catalog lists PostHog under Business systems, but it reads product analytics, so its steps live with the rest of them: see PostHog.

Atlassian

atlassian · runs mcp-atlassian via uvx with read-only mode on, which disables create, update and delete across both products.

Overview, prompts and the tool list: /integrations/atlassian.

Confluence and Jira are configured independently. A product is enabled only when its URL is filled in, so a Jira-only setup is a valid configuration. It just carries fewer tools.

Pick the authentication method your deployment can actually issue. The Authentication method select changes which fields appear; the ones the other methods use are hidden, are not required, and are dropped when you save.

  • Cloud — account email + API token. A *.atlassian.net site. The default.
  • Server / Data Center — personal access token. Self-hosted. These instances cannot issue Atlassian API tokens at all, and take a bare bearer token with no email beside it.
  • Cloud — pre-issued OAuth 2.0 access token. For someone who already mints access tokens out of band.

Create the credential.

Cloud: an API token at id.atlassian.com → Security → API tokens. One token works for both products. It acts as the Atlassian account it belongs to, so use an account whose Jira and Confluence permissions are read-only.

Server / Data Center: a personal access token from the account's own profile, under Profile → Personal Access Tokens → Create token, in each product. Jira needs 8.14 or newer, Confluence 6.0 or newer; older versions have no such screen and cannot use this method. The token carries that account's permissions, so create it under a read-only account. There is no email field to fill in; a bare token is the whole credential.

Pre-issued OAuth token: paste a token you already hold, plus the site's cloud ID. Read it from api.atlassian.com/oauth/token/accessible-resources called with that token. It is a UUID, not the site URL.

An OAuth access token expires, and nothing here renews it

Triagic can't run the browser authorization flow that mints or refreshes one: there is no browser to open and nowhere to receive the redirect. Atlassian access tokens last about an hour, so this method suits an operator who is already issuing them, not a connection meant to stay up.

Fill in one or both product blocks.

FieldRequiredWhat to put
Authentication methodyes, defaults CloudWhich of the three shapes above.
Confluence URLper producthttps://your-company.atlassian.net/wiki (note the /wiki suffix). Self-hosted looks like https://wiki.acme.internal.
Confluence emailCloud, with the URLThe Atlassian account email the token belongs to.
Confluence API tokenCloud, with the URL
Confluence personal access tokenData Center, with the URLFrom the account's profile. No email goes with it.
Jira URLper producthttps://your-company.atlassian.net, or https://jira.acme.internal.
Jira emailCloud, with the URLThe same account email.
Jira API tokenCloud, with the URLThe same token is fine.
Jira personal access tokenData Center, with the URLFrom the account's profile.
OAuth access tokenOAuth onlyA token you already hold.
OAuth cloud IDOAuth onlyThe site's UUID, not its URL. One token and one cloud ID cover both products.
CA certificate pathnoSelf-hosted behind a private CA. An absolute path on the member's machine to that CA's PEM bundle; it applies to both products.
Verify TLS certificateno, defaults onTurn off only for a self-signed instance you cannot supply a CA bundle for. It goes off for both products together.

Filling an email or token without its URL does nothing. The product stays off.

Verify. Start-checked only: every search tool requires a query, so there is no fixed call to health-check with.

If it reportsIt usually means
401 / unauthorizedThe method doesn't match the deployment. Cloud wants the Atlassian account email and an API token; a login password never works. Data Center wants a personal access token and no email at all. A pre-issued OAuth token has probably expired.
CERTIFICATE_VERIFY_FAILED, SSLCertVerificationErrorThe instance's certificate isn't trusted by that machine. Set CA certificate path, or turn off Verify TLS certificate.

Stripe

stripe · runs the official @stripe/mcp via npx, pinned to a version whose --tools flag still validates: the spawned process is restricted to read tools (balance, coupons, customers, disputes, documentation, invoices, payment intents, prices, products, subscriptions), so the write half is refused by the process itself as well as by your key.

Overview, prompts and the tool list: /integrations/stripe.

Create a restricted key. dashboard.stripe.com/apikeys → Create restricted key, granting Read on: Balance, Customers, Products, Prices, Invoices, Coupons, Payment intents, Subscriptions, Disputes. Nothing write.

Mind the mode: a test-mode key can't see live data.

Fill the form.

FieldRequiredWhat to put
API keyyesrk_live_… (restricted). A full secret key works but grants far more than this needs.

Verify. Health check retrieves the account balance.

If it reportsIt usually means
Invalid API keyTruncated paste, or the wrong mode (test vs live).
Restricted API key … insufficient permissionsAdd Read on the resource named in the error.

Slack

slack · runs slack-mcp-server via npx · posting is off by default: the posting tool is not registered at all unless you enable it below.

Overview, prompts and the tool list: /integrations/slack.

Create a Slack app at api.slack.com/apps → From scratch, in the workspace you want searchable.

Add user token scopes under OAuth & Permissions → Scopes → User Token Scopes: search:read (the reason this integration exists), plus channels:history, channels:read, groups:history / groups:read for private channels, users:read (looking up who posted), and usergroups:read (resolving @team mentions).

If you intend to turn on Allow posting messages below, also add chat:write. Without it the posting tool is registered but every post fails with missing_scope. Leave it off the token for a read-only setup, so the scope list matches what the integration can actually do.

Use a user token, not a bot token

Slack's search.messages API refuses bot tokens outright. A bot token (xoxb-) works for reading history but cannot search at all.

One tool never works here, on any token

The saved-items list ("Save for Later") needs Slack's undocumented browser-session tokens, which this integration deliberately doesn't accept — no scope on an xoxp or xoxb token fixes it. Treat a not_allowed_token_type on that one tool as expected, not a misconfiguration.

Install the app to the workspace and copy the User OAuth Token (xoxp-…). Invite the token's user to any private channels you want readable.

Fill the form.

FieldRequiredWhat to put
Slack tokenyesxoxp-…. The prefix is what selects the token type; you don't restate it.
Allow posting messagesno, defaults offTurn on to let Triagic post findings back to Slack, workspace-wide.
Limit posting to channelsnoComma-separated channel IDs, e.g. C0123456789,C9876543210. Setting this enables posting only to those channels and overrides the toggle above.
CA certificate pathnoOnly when something re-signs the connection to slack.com. An absolute path on the member's machine to the inspecting proxy's CA bundle.
Proxy URLnoAn outbound proxy to route through, e.g. http://proxy.acme.internal:3128. A user:password@ prefix works.
Verify TLS certificateno, defaults onTurn off only if you cannot get the proxy's CA bundle.

If the connection is inspected on the way out, the token isn't the problem, the certificate is. A corporate TLS-inspecting proxy re-signs slack.com with its own CA, which the server does not trust, so put an absolute path to that CA's PEM bundle in CA certificate path and the proxy's address in Proxy URL. Your network team has both.

A password in the proxy URL is stored encrypted like any other field on this form, and is stripped from the connection target shown in the UI.

The CA path is the fix; the toggle is the last resort

Turning off Verify TLS certificate makes the server accept any certificate presented for slack.com, which is exactly what an interceptor needs. Trusting the one CA leaves everything else verified.

Verify. Health check lists one public channel. On a very large workspace the first attempt can land before the server's channel cache is warm; it fails closed and recovers on the next sync.

If it reportsIt usually means
invalid_auth, token_revokedRe-copy from OAuth & Permissions. Reinstalling the app invalidates the old token.
missing_scope, not_allowed_token_typeSearching needs a user token with search:read; history needs channels:history and channels:read; looking up users or @team mentions needs users:read / usergroups:read. On the saved-items tool specifically, this is expected — see the callout above.
not_in_channelInvite the token's user to that private channel.
A certificate or TLS error rather than a Slack error slugSomething is inspecting the connection to slack.com. Set CA certificate path and Proxy URL.

Notion

notion · runs the official @notionhq/notion-mcp-server via npx.

Overview, prompts and the tool list: /integrations/notion.

Read-only is the integration's capability, not a flag

The server exposes write tools and has no switch to drop them. Granting the Notion integration only "Read content" when you create it makes every write fail at Notion's side. That's the real boundary, and it's set once, at creation.

Create an internal integration at notion.so/profile/integrations. Under Capabilities, select Read content and nothing else.

Copy the Internal Integration Secret (ntn_…). The integration's own ID is not a token.

Connect it to the pages you want readable. In Notion, open the page (or the parent of a whole space), then ••• → Connections → add the integration. Nothing is visible to it until you do this; sharing is per-page and it is the step people miss.

Fill the form.

FieldRequiredWhat to put
Integration tokenyesntn_…

Verify. Health check reads the integration's own bot user, so it fails exactly when the token is wrong. Note that it passes even when nothing has been shared yet.

If it reportsIt usually means
unauthorized, API token is invalidWrong string: copy the Internal Integration Secret, not the integration id.
object_not_foundAlmost always step 3: the page isn't connected to the integration.
restricted_resourceCapabilities were set to "No content".

Zendesk

zendesk · runs zendesk-mcp via npx.

Overview, prompts and the tool list: /integrations/zendesk.

Writes are not blocked here

The server exposes ticket and user writes and offers no read-only flag. A Zendesk API token acts as the agent whose email is paired with it, so the role of that agent is the boundary. Mint the token against a read-only custom role or a Light Agent.

Enable API token access. Admin Center → Apps and integrations → Zendesk API, turn on token access, then Add API token. Copy it; it's shown once.

Note the agent email the token was created under. The two are paired; a mismatch is a 401.

Fill the form.

FieldRequiredWhat to put
SubdomainyesJust the subdomain: for https://acme.zendesk.com that's acme, not the URL.
Agent emailyesThe account the token was created under.
API tokenyes

Verify. Health check lists organizations, which exercises all three fields.

If it reportsIt usually means
ENOTFOUND / getaddrinfoThe subdomain field has a full URL in it.
401 / Couldn't authenticate youEmail and token don't match, or API token access is still switched off.
403End users can't use the API at all. The token must belong to an agent.

ServiceNow

servicenow · runs servicenow-mcp-ai via npx · read-only twice over: the server's own read-only switch refuses every create, update and delete, and its write mode is pinned to plan, which returns a non-mutating preview instead of acting.

Overview, prompts and the tool list: /integrations/servicenow.

Pick the authentication method the instance can issue. The Authentication method select changes which fields appear; the ones the other methods use are hidden, are not required, and are dropped when you save. Read-only is enforced on Triagic's side under all four.

  • Basic — username + password. The default, and the one every instance supports.
  • OAuth 2.0 — client credentials. The token belongs to a registered application rather than to a person.
  • Inbound API key. A key scoped by an inbound authentication profile.
  • Pre-issued bearer token. A token you already hold. Nothing here refreshes it.

Create the credential.

Basic: a service account with REST API access and a read-only role. itil is enough to read incidents and changes; snc_read_only or a custom read role is the least-privilege option. The account must not be locked out, and must not be an interactive-only user; instances often block those from the REST API.

OAuth: System OAuth → Application Registry → Create an OAuth API endpoint for external clients. Copy the Client ID and Client Secret from the record. Triagic uses the client credentials grant, the only one of ServiceNow's four that runs without a browser. So grant the application itself read-only access, because there is no user behind the token whose roles would limit it.

Inbound API key: System Web Services → API Key. It goes out as the x-sn-apikey header and reaches only the endpoints its inbound authentication profile allows, so the profile is where you narrow it.

Bearer token: paste one you already hold.

What is deliberately not offered

The password (ROPC) grant is deprecated by ServiceNow. The refresh-token grant needs the browser flow that issued the refresh token, which Triagic cannot run. The JWT-bearer grant and mutual-TLS client certificates both need a PEM private key pasted into a form, a different class of secret than a token, and not something this app handles today.

Fill the form.

FieldRequiredWhat to put
Instance URLyesThe full https://acme.service-now.com form.
Authentication methodno, defaults BasicWhich of the four shapes above.
UsernameBasicThe service account.
PasswordBasic
OAuth client IDOAuthFrom the Application Registry record.
OAuth client secretOAuthFrom the same record.
API keyAPI keyFrom System Web Services → API Key.
Bearer tokenBearer tokenA token you already hold.
CA certificate pathnoOn-prem instance behind a private CA. An absolute path on the member's machine to that CA's PEM bundle.
Verify TLS certificateno, defaults onTurn off only for a self-signed instance you cannot supply a CA bundle for.

Verify. Health check lists tables, which fails on a bad URL, a rejected credential, or a user without table visibility.

If it reportsIt usually means
401 / User Not AuthenticatedWrong credentials, a locked-out account, or one without web-service access.
403 / ACLSigned in, but an ACL blocked the read. Grant a role that can read the tables you need.
ENOTFOUND, hibernatingWrong URL, or a personal developer instance that needs waking from the developer portal.
unable to get local issuer, SELF_SIGNED_CERT…, DEPTH_ZERO_SELF_SIGNED_CERTAn on-prem instance whose certificate this machine doesn't trust. Set CA certificate path, or turn off Verify TLS certificate.

Linear

linear · connects to Linear's hosted server at https://mcp.linear.app/mcp/readonly.

Overview, prompts and the tool list: /integrations/linear.

Read-only twice over

Triagic always uses Linear's /mcp/readonly endpoint, which only lists read tools. Make the API key Read only as well, so it can't write even if it's reused somewhere else.

Create a personal API key. In Linear, open Settings → Account → Security & access → New API key. Set the permission to Read and, if you want, limit it to the teams the agent should see. Copy it; it's shown once.

Fill the form.

FieldRequiredWhat to put
API keyyesThe key, starting lin_api_.

Verify. Health check lists teams, which fails on a bad or revoked key.

If it reportsIt usually means
401 / invalid_tokenThe key is wrong or revoked, or it's an OAuth client secret rather than a personal API key.
403 / ForbiddenThe key is limited to other teams, or an admin has turned off member API keys.
ENOTFOUND / fetch failedThis machine can't reach mcp.linear.app. Check the network or proxy.

Intercom

intercom · connects to Intercom's hosted server at https://mcp.intercom.com/mcp (US) or https://mcp.eu.intercom.com/mcp (EU).

Overview, prompts and the tool list: /integrations/intercom.

AU workspaces aren't supported yet

Intercom's MCP server only runs for US and EU hosted workspaces. An AU workspace can't connect until Intercom adds it.

Get an access token. In Intercom's Developer Hub, open or create an app for your workspace, then Configure → Authentication. Edit its permissions down to Read conversations, Read and list users and companies, and article read if you want Help Center search. Copy the access token.

Fill the form.

FieldRequiredWhat to put
Workspace regionnoUS (default) or EU, matching where your workspace is hosted.
Access tokenyesThe token from the app's Authentication page.

Verify. Health check lists companies, which fails on a bad token or the wrong region.

Creating and updating articles and adding internal notes are left out, and so is the tool that sends feedback to Intercom.

If it reportsIt usually means
Access Token Invalid / 401The token is wrong, or the region doesn't match the workspace.
403 / forbiddenThe app is missing a read permission. Add it under Configure → Authentication.
ENOTFOUND / fetch failedThis machine can't reach Intercom's MCP endpoint. Check the network or proxy.

HubSpot

hubspot · runs @hubspot/mcp-server via npx.

Overview, prompts and the tool list: /integrations/hubspot.

Writes are left out, not blocked

The server has create and update tools for records, properties and engagements, and no read-only flag. Triagic only exposes the list, search and get tools, and refuses any object type that isn't a plain name, since the server builds request paths from it. Give the key read scopes only so it can't write if it's ever used elsewhere.

Create a Service Key. In HubSpot, open Settings → Integrations → Service Keys and create one with read scopes: crm.objects.contacts.read, crm.objects.companies.read, crm.objects.deals.read. Add tickets only if you want ticket lookups; HubSpot's tickets scope also allows writes. An existing private app's access token (pat-…) works too, but HubSpot is retiring new private apps.

Fill the form.

FieldRequiredWhat to put
Access tokenyesThe Service Key or private app access token.

Verify. Health check lists one contact, so the key needs crm.objects.contacts.read.

If it reportsIt usually means
401 / INVALID_AUTHENTICATIONThe token is wrong or rotated out. A developer API key or OAuth client secret won't work.
403 / MISSING_SCOPESThe key lacks the read scope for that object. Add it and try again.

Salesforce

salesforce · runs @tsmztech/mcp-server-salesforce via npx.

Overview, prompts and the tool list: /integrations/salesforce.

Triagic gets SOQL queries, SOSL search and object describes, so it can read cases, accounts, contacts and custom objects. The record, metadata and Apex tools the server also ships aren't exposed. SOQL can't write, so this holds even for a user with full access. The user's profile still decides which records and fields come back.

Create the app. Setup → External Client App Manager → New External Client App (a Connected App works the same). Turn on OAuth, add the api scope, and enable the Client Credentials Flow.

Pick the run-as user. In the app's policies, set Run As to an integration user with API Enabled and read-only access to the objects you want triaged. Every query runs as this user.

Copy the consumer key and secret from the app's OAuth settings. New apps can take a few minutes before the first token request succeeds.

Fill the form.

FieldRequiredWhat to put
Instance URLyesYour My Domain URL, like https://acme.my.salesforce.com. Not login.salesforce.com.
Authentication methodnoClient credentials (default), or username + password + security token.
Consumer key / Consumer secretyes, for client credentialsFrom the app above.
Username / Passwordyes, for passwordAn integration user, not an admin.
Security tokennoNeeded unless this machine's IP is in the org's trusted ranges.

Verify. Health check searches the object list for Case, which needs a working login and nothing else.

If it reportsIt usually means
request not supported on this domainClient credentials against login.salesforce.com. Use the My Domain URL.
no client credentials user enabledThe app has no Run As user set.
invalid_clientWrong consumer key or secret, or the app is still propagating.
INVALID_LOGINWrong password or security token, or the user is locked out.
API_DISABLED_FOR_ORGThe user lacks API Enabled, or the edition has no API access.

Freshdesk

freshdesk · runs freshdesk-mcp via npx.

Overview, prompts and the tool list: /integrations/freshdesk.

The agent's role is the second boundary

The server ships ticket, contact and knowledge base writes with no read-only flag. Triagic exposes only the tools that send GET requests, and a Freshdesk API key acts as the agent it belongs to, so use a key from an agent whose role can view but not reply or edit.

Pick the agent. Ideally a dedicated agent with a custom role limited to viewing tickets, contacts and solutions (custom roles need the Pro plan or above).

Copy its API key. Signed in as that agent: profile picture → Profile settings → View API key.

Fill the form.

FieldRequiredWhat to put
Helpdesk domainyesacme.freshdesk.com, or just acme. Not a custom portal domain.
API keyyes

Verify. Health check reads the current agent (/agents/me), which fails on a wrong domain or key.

If it reportsIt usually means
ENOTFOUND / getaddrinfoThe domain is a custom portal address or has a typo.
HTTP 401The key is wrong or belongs to another helpdesk.
HTTP 403The agent's role can't view that resource.
HTTP 429The account's per-minute API limit, shared with other integrations.

On this page