SIGNL4 MCP by usefulapi
Read SIGNL4 alerts, teams, users and duty schedules; raise, acknowledge, close and annotate alerts.
Should I use this
Quality & Safety
Findings (2)
- HIGH
- LOWin signl4_get_user
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"signl4": {
"url": "https://signl4.usefulapi.io/mcp"
}
}
}Remote endpoints
https://signl4.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (18)
🟢signl4_list_teams(team_ids)
List the SIGNL4 teams the API key can access: id, name, description, time zone and member ids. Team ids are needed to raise alerts and to look up categories and duties. GET /v3/teams.
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_team(team_id)
One SIGNL4 team: name, description, time zone, member ids. GET /v3/teams/{teamId}.
Input Schema
{
"type": "object",
"properties": {
"team_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"required": [
"team_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_list_users
List the SIGNL4 users the key can access with name, e-mail, contact addresses, activation state and duty status per team (dutyMode, onDutyTime). User ids are needed to acknowledge/close/annotate alerts. GET /v3/users.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_user(user_id)
One SIGNL4 user: name, e-mail, contact addresses, time zone and duty status per team. GET /v3/users/{userId}.
Input Schema
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 user id (a GUID); get it from signl4_list_users."
}
},
"required": [
"user_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_list_team_users(team_ids)
List the users of the given teams (all accessible teams by default) with duty status. Teams that cannot be read are reported under `errors`. GET /v3/teams/users.
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_list_categories(team_id)
List the alert categories of a team (name, color, keywords used to auto-classify alerts). The category name can be passed to signl4_raise_alert. GET /v3/categories/{teamId}.
Input Schema
{
"type": "object",
"properties": {
"team_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"required": [
"team_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_list_alerts(team_ids, status, created_after, created_before, text, ...)
Search SIGNL4 alerts (signls), newest first, with status, severity, category and history (created, acknowledged, closed). Filter by team, status, creation time, text or external id. Up to 100 per page; pass the returned continuation_token to get the next page. POST /v3/signls/paged (a read).
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"status": {
"description": "Only alerts in this state (default: all).",
"type": "string",
"enum": [
"open",
"acknowledged",
"closed"
]
},
"created_after": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z."
},
"created_before": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z."
},
"text": {
"description": "Free-text search in title and text.",
"type": "string",
"maxLength": 200
},
"external_id": {
"description": "Only alerts raised with this external id.",
"type": "string",
"maxLength": 200
},
"category_ids": {
"description": "Only alerts of these category ids (see signl4_list_categories).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "A SIGNL4 id (a GUID)."
}
},
"max_results": {
"description": "Alerts per page, 1-100 (default 25).",
"type": "integer",
"minimum": 1,
"maximum": 100
},
"continuation_token": {
"description": "The continuation_token of the previous page.",
"type": "string",
"maxLength": 4000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_alert(alert_id)
Full detail of one alert: title, text, severity, category, status and delivery status, history (who acknowledged/closed it and when), parameters, attachments and escalations with per-user delivery. GET /v3/signls/{signlId}/details.
Input Schema
{
"type": "object",
"properties": {
"alert_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Alert (signl) id; get it from signl4_list_alerts or the id returned by signl4_raise_alert."
}
},
"required": [
"alert_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_alert_timeline(alert_id)
The ordered timeline of an alert: creation, notifications, acknowledgements, annotations, escalations and remote actions. GET /v3/signls/{signlId}/timeline.
Input Schema
{
"type": "object",
"properties": {
"alert_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Alert (signl) id; get it from signl4_list_alerts or the id returned by signl4_raise_alert."
}
},
"required": [
"alert_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_alert_report(team_ids, user_id)
Alert volume and response statistics per team over several time periods: acknowledged, closed and unhandled counts, overall and per category (optionally for one user). Teams that cannot be read are reported under `errors`. GET /v3/signls/report.
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"user_id": {
"description": "Report for this user only.",
"type": "string",
"minLength": 1,
"maxLength": 100
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴signl4_raise_alert(team_id, title, text, severity, category, ...)
WRITE: raise a new alert in a SIGNL4 team. THIS NOTIFIES REAL PEOPLE: every team member currently on duty is paged (push, SMS and/or voice call according to their settings) and the alert escalates if nobody acknowledges it. Only use it when the user clearly asked to alert the team; never for tests unless they said so. Not idempotent: a second call pages the team again. Returns the new alert incl. its id. POST /v3/signls.
Input Schema
{
"type": "object",
"properties": {
"team_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
},
"title": {
"type": "string",
"minLength": 1,
"maxLength": 500,
"description": "Alert title, shown on the pager screen."
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 8000,
"description": "Alert message body."
},
"severity": {
"description": "Severity (default: SIGNL4's default for the team).",
"type": "string",
"enum": [
"low",
"major",
"critical"
]
},
"category": {
"description": "Category name, see signl4_list_categories (default: automatic).",
"type": "string",
"maxLength": 200
},
"external_id": {
"description": "Your own reference for this alert, for later look-up (and for SIGNL4 to group follow-ups).",
"type": "string",
"maxLength": 200
}
},
"required": [
"team_id",
"title",
"text"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴signl4_acknowledge_alert(alert_id, user_id, comment)
WRITE: acknowledge an alert on behalf of a SIGNL4 user (recorded in its history under that user). Stops escalation to further tiers for that alert. POST /v3/signls/{signlId}/acknowledge.
Input Schema
{
"type": "object",
"properties": {
"alert_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Alert (signl) id; get it from signl4_list_alerts or the id returned by signl4_raise_alert."
},
"user_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The SIGNL4 user the acknowledgement is recorded for; see signl4_list_users."
},
"comment": {
"description": "Optional comment stored with the acknowledgement.",
"type": "string",
"maxLength": 2000
}
},
"required": [
"alert_id",
"user_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴signl4_close_alert(alert_id, user_id, comment)
WRITE: close (resolve) an alert on behalf of a SIGNL4 user; it leaves the open list and stops all further notifications. POST /v3/signls/{signlId}/close.
Input Schema
{
"type": "object",
"properties": {
"alert_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Alert (signl) id; get it from signl4_list_alerts or the id returned by signl4_raise_alert."
},
"user_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The SIGNL4 user the closure is recorded for; see signl4_list_users."
},
"comment": {
"description": "Optional comment stored with the closure.",
"type": "string",
"maxLength": 2000
}
},
"required": [
"alert_id",
"user_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴signl4_annotate_alert(alert_id, user_id, text)
WRITE: add a text note to an alert's timeline on behalf of a SIGNL4 user. The note is visible to the team in the app. It does not page anyone by itself. POST /v3/signls/{signlId}/annotate.
Input Schema
{
"type": "object",
"properties": {
"alert_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "Alert (signl) id; get it from signl4_list_alerts or the id returned by signl4_raise_alert."
},
"user_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The SIGNL4 user the note is recorded for; see signl4_list_users."
},
"text": {
"type": "string",
"minLength": 1,
"maxLength": 4000,
"description": "The note."
}
},
"required": [
"alert_id",
"user_id",
"text"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_list_duty_schedules(team_ids, user_id, from, to, limit)
Planned on-call duty schedules (who is on duty when): start/end, team, user, tier, stand-in and shift info. Filter by team, user and time window. POST /v3/schedules (a read).
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"user_id": {
"description": "Only this user's duties.",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"from": {
"description": "Start of the window, ISO 8601 with timezone.",
"type": "string"
},
"to": {
"description": "End of the window, ISO 8601 with timezone.",
"type": "string"
},
"limit": {
"description": "Maximum schedules to return, 1-500 (default 100).",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_duty_status(user_id, team_ids)
Whether a user is currently on or off duty in each of their teams (dutyMode, onDutyTime, tier). GET /v3/users/{userId}/dutyStatus.
Input Schema
{
"type": "object",
"properties": {
"user_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 user id (a GUID); get it from signl4_list_users."
},
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
}
},
"required": [
"user_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_get_duty_summary(team_ids, last_two_only)
Duty assistant info per team: whether it is enabled and the last two (or all) duty periods. GET /v3/duties/summary.
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"last_two_only": {
"description": "Only the last two duties (default true).",
"type": "boolean"
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢signl4_list_audit_logs(team_ids, from, to, message_contains, max_results, ...)
Audit log of changes and events in the SIGNL4 subscription (who changed what, when). Filter by team, time window and message text; pass the returned continuation_token for the next page. GET /v3/audits.
Input Schema
{
"type": "object",
"properties": {
"team_ids": {
"description": "Limit to these team ids (default: all teams the key can access).",
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "SIGNL4 team id (a GUID); get it from signl4_list_teams."
}
},
"from": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z."
},
"to": {
"type": "string",
"description": "ISO 8601 date-time with a timezone, e.g. 2026-10-01T00:00:00Z."
},
"message_contains": {
"description": "Only entries whose message contains this text.",
"type": "string",
"maxLength": 200
},
"max_results": {
"description": "Entries per page, 1-200 (default 50).",
"type": "integer",
"minimum": 1,
"maximum": 200
},
"continuation_token": {
"description": "The continuation_token of the previous page.",
"type": "string",
"maxLength": 4000
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence