Integrations
MCP clients
Connect Claude Code, Codex, Gemini CLI, Cursor, VS Code, or Windsurf to AlertINT and investigate Situations from records.
Your AI agent connects to AlertINT over MCP to read Situations, query your telemetry, and record your verdicts.
| Endpoint | http://<host>:9912/mcp (Streamable HTTP, inside alertint serve) |
| Auth | Authorization: Bearer <token>, the value of ALERTINT_MCP_TOKEN |
| On/off | On when the token variable is set; mcp.enabled: false forces it off |
| Ready-made configs | examples/mcp-clients/ in the repo |
The token is shared by the whole team. Every client presents the same value, so keep it where teammates can find it.
- Any long random string works (compared byte for byte).
- On Kubernetes, read it back from the Secret:
kubectl get secret <name> -o jsonpath='{.data.ALERTINT_MCP_TOKEN}' | base64 -d - Lost it? Set a new value, restart the agent, and update every client.
AlertINT on another machine? Replace http://localhost:9912/mcp below with
its address, over HTTPS.
| Client | Setup |
|---|---|
| Claude Code | One claude mcp add command |
| Codex | One codex mcp add command, shared by the CLI, IDE extension, and app |
| Gemini CLI | One gemini mcp add command |
| Cursor | ~/.cursor/mcp.json |
| VS Code (GitHub Copilot) | .vscode/mcp.json, which prompts for the token |
| Windsurf | ~/.codeium/windsurf/mcp_config.json |
| Any other client | Needs Streamable HTTP and a custom Authorization header; use the endpoint and auth above |
Claude Code#
export ALERTINT_MCP_TOKEN="<your-token>"
claude mcp add --transport http --scope user alertint http://localhost:9912/mcp --header "Authorization: Bearer ${ALERTINT_MCP_TOKEN}"
--scope user makes it available in every project; --scope local keeps it
to the current one. Or add it to .mcp.json (project) or ~/.claude.json
(global) and reload with /mcp:
{
"mcpServers": {
"alertint": {
"type": "http",
"url": "http://localhost:9912/mcp",
"headers": {
"Authorization": "Bearer YOUR_ALERTINT_MCP_TOKEN"
}
}
}
}
Codex#
Codex stores the variable's name, not the token:
export ALERTINT_MCP_TOKEN="<your-token>"
codex mcp add alertint --url http://localhost:9912/mcp --bearer-token-env-var ALERTINT_MCP_TOKEN
Check it with codex mcp get alertint. The CLI, IDE extension, and desktop app
share this config. Or add it to ~/.codex/config.toml (global) or
.codex/config.toml (trusted project):
[mcp_servers.alertint]
url = "http://localhost:9912/mcp"
bearer_token_env_var = "ALERTINT_MCP_TOKEN"
Situation investigation skill#
A Codex skill that turns a Situation ID, handle, or Slack message into a short,
record-backed brief. It holds no token or address; it uses the alertint
connection above.
mkdir -p ~/.codex/skills
cp -R client-skills/alertint-situation-investigation ~/.codex/skills/
- Restart Codex to load it.
- Match versions: install the skill from the same release as the server.
- Remove: delete
~/.codex/skills/alertint-situation-investigation.
Gemini CLI#
export ALERTINT_MCP_TOKEN="<your-token>"
gemini mcp add --scope user --transport http --header "Authorization: Bearer ${ALERTINT_MCP_TOKEN}" alertint http://localhost:9912/mcp
--scope user writes ~/.gemini/settings.json, for every project; the
default, project, writes .gemini/settings.json. Check it with /mcp list.
The file holds:
{
"mcpServers": {
"alertint": {
"httpUrl": "http://localhost:9912/mcp",
"headers": {
"Authorization": "Bearer YOUR_ALERTINT_MCP_TOKEN"
}
}
}
}
Cursor#
Add to ~/.cursor/mcp.json, restart Cursor, and check Settings → MCP:
{
"mcpServers": {
"alertint": {
"url": "http://localhost:9912/mcp",
"headers": {
"Authorization": "Bearer YOUR_ALERTINT_MCP_TOKEN"
}
}
}
}
VS Code#
For GitHub Copilot agent mode. Add to .vscode/mcp.json in your workspace, or
run MCP: Open User Configuration to use it in every workspace:
{
"servers": {
"alertint": {
"type": "http",
"url": "http://localhost:9912/mcp",
"headers": {
"Authorization": "Bearer ${input:alertint-mcp-token}"
}
}
},
"inputs": [
{
"type": "promptString",
"id": "alertint-mcp-token",
"description": "AlertINT MCP token (ALERTINT_MCP_TOKEN)",
"password": true
}
]
}
- Token: VS Code asks for it when the server first starts. The file holds no secret, so the team can commit it.
- Check it: run MCP: List Servers.
Windsurf#
Add to ~/.codeium/windsurf/mcp_config.json, restart Windsurf, and check
Settings → MCP Servers:
{
"mcpServers": {
"alertint": {
"serverUrl": "http://localhost:9912/mcp",
"headers": {
"Authorization": "Bearer YOUR_ALERTINT_MCP_TOKEN"
}
}
}
}
Tools#
Three groups, in the order an investigation uses them.
Read AlertINT state#
Read-only. Served from AlertINT's local state.
| Tool | Returns |
|---|---|
alertint_list_situations |
Situations, most recently updated first: lifecycle, attention, next due time |
alertint_get_situation |
One Situation by ID or handle: assessment, operator contract, current judgment, episode summary, Slack delivery state |
alertint_list_situation_transitions |
One Situation's change history, oldest first |
alertint_list_situation_judgments |
One Situation's "expected" judgment history |
alertint_list_observation_runs |
Evidence gathered for one Situation, per check: result, coverage, facts. Detail expires after 10 days unused. |
alertint_get_delivery_state |
Installation-wide Slack delivery: failures, blocked messages, delivery gaps, backlog |
alertint_list_incidents |
Incidents, filtered by status |
alertint_get_incident |
One Incident: Finding, memory, and operator_history (verdict and notes) |
alertint_get_evidence_pack |
The evidence an Incident's triage used |
alertint_search_alerts |
Raw alerts by label |
alertint_recent_changes |
Deploys, releases, and PRs matching a label selector |
alertint_get_semantic_profile |
Advisory profiles for a source or Situation, with version history |
alertint_get_expected_behavior |
One expected schedule's current state |
alertint_list_expected_behaviors |
Expected schedules, filtered by group, source, or rule |
alertint_list_expected_behavior_history |
One schedule's revision history |
alertint_get_expected_behavior_validation |
A prepared schedule-proof request and its result |
alertint_usage_stats |
Alerts, LLM tokens, Slack posts, withheld posts, analyses, and exhausted triage over a time window |
alertint_verify_audit |
Checks the audit log's hash chain for tampering |
Query your telemetry#
Read-only. AlertINT proxies each query to your backend, with the scope and time you give it.
| Tool | Queries | Available when |
|---|---|---|
prometheus_query, prometheus_query_range |
PromQL, instant or range | Always listed; errors if Prometheus isn't configured |
loki_query_range |
Logs, in the backend's query language | A log source is enabled |
sentry_issues_list |
Live Sentry issues by project and status | The Sentry error source is enabled |
sentry_issues_trace |
Stack traces (file:line) for up to 10 issues |
The Sentry error source is enabled |
zabbix_metric_history |
Metric history or trends for a host and item | The Zabbix API is configured |
zabbix_host_problems |
Open problems for a host | The Zabbix API is configured |
Record your decisions#
Writes to AlertINT's own state only, never to your systems. Each write is audit-chained and needs explicit confirmation.
| Tool | Records |
|---|---|
alertint_incident_capture_verdict |
A confirmation or correction of a Finding. A correction is tested on the next triage (how). |
alertint_incident_annotate |
A note for the next person. Shown in the Situation's thread; never enters triage. |
alertint_record_situation_expected |
"This Situation is expected until …" (non-critical conditions only) |
alertint_replace_situation_expected |
A new expected revision with a new deadline |
alertint_revoke_situation_expected |
Withdraws "expected"; normal assessment resumes |
alertint_restore_situation_expected |
Restores a withdrawn judgment against current facts |
alertint_expected_behavior_prepare |
Proof for a proposed reusable schedule (Zabbix or Alertmanager rule). Grants nothing by itself. |
alertint_expected_behavior_confirm |
Turns a confirmed judgment into a reusable expected schedule |
alertint_expected_behavior_replace |
Replaces a schedule |
alertint_expected_behavior_revoke |
Withdraws a schedule; monitoring and recovery continue |
alertint_expected_behavior_restore |
Restores a withdrawn schedule as a new, freshly proven revision |
alertint_correct_semantic_profile |
A correction to an advisory profile, as a new version |
- "Expected" never stops monitoring. It lowers urgency and changes wording; recovery tracking continues.
- Writes use version checks. A stale version is refused; re-read and retry.
- No owning Situation? A verdict or note still lands and stays visible on the Incident and in the audit log.
- Tool hints (read-only, destructive, idempotent) help clients display tools. They are not access control.
Investigate a Situation#
Current state first, then history. Never reconstruct the past from today's configuration.
alertint_get_situation {"handle":"SIT-2026-0142"}
alertint_list_situation_transitions {"situation_id":"sit-0142"}
alertint_list_observation_runs {"situation_id":"sit-0142"}
alertint_get_delivery_state {}
A grounded answer separates four things:
| Part | Comes from |
|---|---|
| Current state | Lifecycle, attention, source state, applicable judgment, next checkpoint |
| What changed | The transition or schedule-history row: what, when, who, why |
| Evidence | The observation or delivery record, and whether it succeeded, was empty, or was unavailable |
| Missing history | Say "AlertINT has no recorded history for that", never a guess |
Default answer shape: Finding / Evidence / Now / Next, then up to three follow-up reads. Next is AlertINT's recorded action and deadline, not proposed operator work. With no supported Finding, say Finding: Insufficient evidence and name what's missing.
Example, for "Why did this stop being expected, and why hasn't it recovered?" (IDs and times are illustrative):
The Situation is in Monitoring. Expected schedule
env-nightly-paymentsv3 stopped applying at2026-09-22T22:41:08Z: transitiontr-0187recordssource_identity_or_version_changed, and observation runobs-0441records the new rule version. It hasn't recovered because deliverydel-9921still shows one member firing at2026-09-22T22:42:03Z, so recovery grace hasn't started. Slack delivery is healthy.
Check the connection#
At setup or after a failure: initialize, list tools, and run one small read
such as alertint_list_situations with a low limit.
- Report separately: configured, queried successfully, failed, not checked.
- Listed isn't reachable: log, change, Sentry, and Zabbix tools appear only when configured, but that doesn't prove the backend answers. Prometheus tools are always listed.
- Don't probe every connector just to fill a health table.