Databases
Step-by-step connection and configuration for MongoDB, PostgreSQL, MySQL, Redis, ClickHouse, Snowflake, BigQuery, DynamoDB and Supabase.
Nine integrations that let the agent look up the row behind a ticket. Every one of them should be given a credential that cannot write; where the server enforces that itself, this page says so, and where it does not, it says that too.
MongoDB
mongodb · runs mongodb-mcp-server via npx · read-only enforced by the server's
--readOnly flag, which blocks writes and admin commands.
Create a read-only user. In mongosh, against the database the tickets are about:
db.getSiblingDB("admin").createUser({
user: "triagic",
pwd: "…",
roles: [{ role: "read", db: "orders" }]
})Note which database the user is defined in — that is the authSource, and it is the
commonest cause of a rejected login.
Assemble the connection string, including that auth source:
mongodb+srv://triagic:…@cluster0.abc.mongodb.net/orders?authSource=admin. For Atlas,
add the machine's egress IP to the cluster's IP access list first.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Connection string | yes | The full URI above, credentials included. Stored encrypted, returned masked. |
| Read-only | no, defaults on | Leave on. It is the server's own write block; turning it off is a deliberate act. |
Verify. The desktop proves the credential with list-databases before reporting
running.
| If it reports | It usually means |
|---|---|
connection string is not valid | Not the URI — this is also what the server says when the host simply isn't reachable. Check the host and port answer from that machine, and that an SRV or replica-set name resolves, before editing anything. |
authentication failed / bad auth | The username or password was rejected, or authSource points at the wrong database. |
PostgreSQL
postgres · runs @modelcontextprotocol/server-postgres via npx · the server
ships a query tool only.
Create a read-only role.
CREATE ROLE triagic LOGIN PASSWORD '…';
GRANT CONNECT ON DATABASE billing TO triagic;
GRANT USAGE ON SCHEMA public TO triagic;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO triagic;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO triagic;The last line is the one people forget: without it, tables created later are invisible.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Connection URL | yes | postgres://triagic:…@host:5432/billing. Any sslmode you set is replaced by the toggle below. |
| Verify TLS certificate | no, defaults on | Turn off for managed Postgres (RDS, DigitalOcean, Supabase) and internal clusters whose certificate is signed by a private CA. Traffic stays encrypted. |
Verify. Health check is SELECT 1.
| If it reports | It usually means |
|---|---|
self-signed certificate in certificate chain, unable to verify local issuer | The certificate isn't signed by a CA that machine trusts — usual for managed Postgres. Turn off Verify TLS certificate, or install the provider's CA bundle on the machine. The failure appears on the health check, not at startup, because the driver connects lazily. |
MySQL
mysql · runs mysql-mcp-server via uvx.
Create a read-only user.
CREATE USER 'triagic'@'%' IDENTIFIED BY '…';
GRANT SELECT ON shop.* TO 'triagic'@'%';Fill the form. This one takes the parts, not a URL.
| Field | Required | What to put |
|---|---|---|
| Host | yes | Hostname or IP reachable from the member's machine. |
| Port | no, defaults 3306 | |
| User | yes | triagic |
| Password | no | Blank is accepted for a passwordless user. |
| Database | yes | The default schema queries run against. |
Verify. Health check is SELECT 1 through the execute_sql tool.
Redis
redis · runs @modelcontextprotocol/server-redis via npx.
Create a restricted ACL user so a cached-value lookup cannot become a FLUSHALL:
ACL SETUSER triagic on >… ~* +@read +@keyspaceFill the form.
| Field | Required | What to put |
|---|---|---|
| Connection URL | yes | redis://triagic:…@host:6379, or rediss:// for TLS. |
Verify. Health check lists keys matching a pattern that matches nothing, so it proves the connection without reading data.
ClickHouse
clickhouse · runs mcp-clickhouse via uvx · read-only twice over: writes are
disabled in the server, and each query is sent with ClickHouse's own readonly
setting where the user's grants allow it.
Create a read-only user.
CREATE USER triagic IDENTIFIED BY '…' SETTINGS readonly = 1;
GRANT SELECT ON events.* TO triagic;Fill the form.
| Field | Required | What to put |
|---|---|---|
| Host | yes | abc123.us-east-1.aws.clickhouse.cloud, or your own hostname. |
| Port | no | Leave blank and it follows TLS: 8443 with, 8123 without. |
| User | yes | triagic, or default on a fresh Cloud service. |
| Password | no | Blank is allowed for a passwordless user. |
| Database | no | Default database for queries. Blank browses them all. |
| Use TLS | no, defaults on | Turn off only for a plain-HTTP cluster, typically self-hosted on 8123. |
| Verify TLS certificate | no, defaults on | Turn off for a self-signed certificate. |
Verify. Health check is list_databases.
| If it reports | It usually means |
|---|---|
Code: 516 / Authentication failed | The user or password was rejected. Remember ClickHouse Cloud always requires TLS on 8443. |
Snowflake
snowflake · runs simple-snowflake-mcp via uvx · the server pins its own
read-only mode on and gives clients no way to relax it, but its guard is a SQL keyword
check — defense-in-depth, not a permission boundary.
Create a service user whose default role can only read. The connector never sends
a role, so the user's DEFAULT_ROLE is what applies — there is no role field on this
form.
CREATE ROLE triagic_reader;
GRANT USAGE ON WAREHOUSE analytics_wh TO ROLE triagic_reader;
GRANT USAGE ON DATABASE prod TO ROLE triagic_reader;
GRANT USAGE ON ALL SCHEMAS IN DATABASE prod TO ROLE triagic_reader;
GRANT SELECT ON ALL TABLES IN DATABASE prod TO ROLE triagic_reader;
CREATE USER triagic PASSWORD = '…' DEFAULT_ROLE = triagic_reader;
GRANT ROLE triagic_reader TO USER triagic;It must be a password user: SSO and MFA accounts cannot sign in here.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Account identifier | yes | Just the identifier — myorg-myaccount, or a locator plus region like xy12345.us-east-1. Never the full …snowflakecomputing.com URL. |
| User | yes | triagic |
| Password | yes | |
| Warehouse | yes | Queries need one. Metadata calls work without it; SELECTs do not. |
| Database | no | Default database, or leave blank and fully qualify names in queries. |
| Schema | no |
Verify. Health check is list-databases.
| If it reports | It usually means |
|---|---|
250001 / Failed to connect to DB | Almost always the account identifier, not the network. Pasting the full URL is the classic mistake. |
Incorrect username or password | Check both — and note SSO/MFA users cannot authenticate with a password here. |
BigQuery
bigquery · runs mcp-server-bigquery via uvx.
Writes are not blocked here
The query tool runs whatever SQL it is given. IAM is the only control, so the service account's roles are the boundary.
Create a service account with exactly two roles: BigQuery Data Viewer (roles/bigquery.dataViewer) to read, and BigQuery Job User (roles/bigquery.jobUser) to run queries. Nothing else.
Download its JSON key and place it on the machine that runs Triagic — an absolute
path readable by the desktop app, e.g. /opt/triagic/bigquery-sa.json. Skip this if
that machine already has Application Default Credentials configured.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Project ID | yes | my-project-123 |
| Location | yes, defaults US | Where the datasets live: a multi-region (US, EU) or a region like europe-west9. A mismatch returns no results rather than an error. |
| Service account key path | no | Absolute path to the JSON above. Blank falls back to Application Default Credentials. |
Verify. Health check is list-tables.
| If it reports | It usually means |
|---|---|
Could not automatically determine credentials | No Google credentials on that machine. Set the key path, or run gcloud auth application-default login there. |
403 / Access Denied | A missing role — it needs both Data Viewer and Job User on this project. |
DynamoDB
dynamodb · runs awslabs.aws-api-mcp-server via uvx, locked to read-only
operations · every command is matched against AWS's read-only action list before it
runs, local file access is refused outright, and upstream telemetry is off.
Create an IAM user with AmazonDynamoDBReadOnlyAccess, or a policy granting
dynamodb:List*, dynamodb:Describe*, dynamodb:Query, dynamodb:Scan and
dynamodb:GetItem on the tables you need. Generate an access key for it.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| AWS access key ID | yes | AKIA… |
| AWS secret access key | yes | |
| Region | yes, defaults us-east-1 | DynamoDB tables are per-region — this has to be the region the table lives in. |
| Session token | no | Only for temporary (STS) credentials. |
Verify. No health check runs for this one: the underlying tool returns AWS errors as successful results with an error field, so a check could not tell a working credential from a denied one. It is start-checked only — the first real tool call is what proves the credential.
| If it reports | It usually means |
|---|---|
InvalidClientTokenId, SignatureDoesNotMatch | Key ID and secret aren't a matching pair, or the key is inactive. Temporary credentials also need Session token filled in. |
AccessDenied | Credentials are valid, the IAM policy is not. |
ResourceNotFoundException | Right credentials, wrong Region. |
…is a write operation | Expected. This integration refuses writes before they reach AWS. |
Supabase
supabase · runs @supabase/mcp-server-supabase via npx with --read-only ·
SQL executes inside a read-only transaction, and the migration, branching, storage and
edge-function deploy tools are not offered at all.
The tool surface is deliberately narrowed to three feature groups: database (list tables, extensions, migrations, run SQL), debugging (query logs, security and performance advisors) and docs. Account-level tools are excluded on purpose — they reach across projects, which would undo the per-project scoping below.
Generate a personal access token at supabase.com/dashboard/account/tokens. It inherits its owner's organization access, so create it from an account that is a member of the organization owning the project — ideally a dedicated one.
The project's anon and service_role keys are a different credential and are not
accepted here.
Find the project ref. Project Settings → General → Reference ID, a
20-character string. It is also the subdomain of the project's …supabase.co URL.
Fill the form.
| Field | Required | What to put |
|---|---|---|
| Personal access token | yes | sbp_… |
| Project ref | yes | The reference ID. One configuration is one project — add a second instance for a second project. |
Verify. Health check is list_tables, which runs real SQL through the platform
API, so it fails on both a bad token and a project the token cannot reach.
| If it reports | It usually means |
|---|---|
401 / invalid token | Not a personal access token. It must start sbp_ and come from the account tokens page. |
403 | The token's owner is not a member of the organization that owns this project. |
404 / project not found | Wrong ref — use the 20-character reference ID, not the project's display name. |
cannot execute … in a read-only transaction | Expected, and deliberate. |
Connecting data sources
How an integration is configured, what has to be installed on the machine that runs it, and the whole catalog with a link to the per-integration steps.
Observability
Step-by-step connection and configuration for Sentry, Prometheus, OpenSearch, Elasticsearch, Datadog, Grafana, PagerDuty, Splunk and New Relic.