jira-alerts-mcp
This server lets an agent work with Jira Service Management Operations: search and inspect alerts, act on them, and look up on-call schedules.
Search and list alerts with filters, sorting, and pagination (
jsm_list_alerts)Get full alert details including descriptions, tags, responders, and custom details (
jsm_get_alert)Read alert notes and activity logs to see triage history and system events (
jsm_list_alert_notes,jsm_list_alert_logs)Acknowledge, close, annotate, and add responders to alerts (
jsm_acknowledge_alert,jsm_close_alert,jsm_add_alert_note,jsm_add_alert_responder)Verify asynchronous alert actions via request status (
jsm_get_request_status)List on-call schedules and find who is on call now, next, or at a specific time (
jsm_list_schedules,jsm_get_on_call,jsm_get_next_on_call)Get shift boundaries and rota periods for handover and scheduling questions (
jsm_get_schedule_timeline)
Provides tools for Jira Service Management Operations: searching and reading alerts, managing alert notes, logs, and request statuses, acknowledging/closing/annotating alerts, adding responders, and querying schedules and on-call rotations.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@jira-alerts-mcpwho is on call right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Jira Alerts MCP
Find what is paging you, and who is on call — from your agent.
An MCP server for Jira Service Management Operations — the alert surface that replaced Opsgenie, which no other Jira MCP server covers.
Search alerts and read their notes and activity timeline; acknowledge, close, annotate them and add responders; and look up who is on call now and next. Twelve tools, four of them writes.
Demo

Three questions in one session, against a live JSM site: who is on call, what is
open, and acknowledge what isn't. Watch the last answer in particular — the agent
confirms the acknowledgement actually landed (ack landed 16:38:00.577Z) instead
of assuming it did, which is the asynchronous-write behaviour described under
What this server handles for you.
Related MCP server: Jira & Confluence MCP Server
Quickstart
You need Node ≥ 24 and an Atlassian Cloud site with JSM Operations enabled. There is nothing to clone or build — your MCP client runs the published package.
1. Find your cloud id. Open this while logged in to your site:
https://<your-site>.atlassian.net/_edge/tenant_infoIt answers with one line — {"cloudId":"..."} — and that UUID is what
JSM_CLOUD_ID wants. If you'd rather not rely on that endpoint, the cloud id is
also the segment after /s/ in the URL at
admin.atlassian.com → Apps → Sites → your site.
2. Create an API token at id.atlassian.com.
3. Add the server.
Claude Code:
claude mcp add jira-alerts-mcp \
--scope user \
--env JSM_CLOUD_ID='your-cloud-id' \
--env JSM_EMAIL='you@example.com' \
--env JSM_API_TOKEN="${JSM_API_TOKEN}" \
-- npx -y jira-alerts-mcp--scope user registers the server for your whole account rather than only the
directory you happened to run the command in. That is what you want for an
alerts server — you want it in every session. Without the flag claude mcp add
defaults to local scope, and the server exists in that one directory only.
Claude Desktop: open the config from the app rather than by hand — the Claude menu in your menu bar (not the settings inside the window) → Settings → Developer → Edit Config. That creates the file if it doesn't exist yet:
OS | Path |
macOS |
|
Windows |
|
{
"mcpServers": {
"jira-alerts-mcp": {
"command": "npx",
"args": ["-y", "jira-alerts-mcp"],
"env": {
"JSM_CLOUD_ID": "your-cloud-id",
"JSM_EMAIL": "you@example.com",
"JSM_API_TOKEN": "your-api-token"
}
}
}
}mcpServers is a top-level key, and the file holds every server you have
configured. If it already has an mcpServers block, add jira-alerts-mcp as
another entry inside it — pasting the whole block above over the file replaces
whatever was already there.
Then quit Claude Desktop completely and reopen it — the file is read only at startup, and closing the window is not quitting. The server then appears under the connectors panel in the message composer.
Most other MCP clients accept that same JSON shape. There is no scope choice to
make here — claude_desktop_config.json is already per-user, the same reach as
--scope user on the CLI.
4. Check it works. Ask your agent to list your open alerts. That runs
jsm_list_alerts, which needs no ids and confirms your credentials and the
read:ops-alert scope that nine of the fourteen tools share.
Then ask who is on call, which runs jsm_list_schedules. That is a separate
check, because schedules need read:ops-config — if alerts work and schedules
return 401, nothing is wrong with your token; see
Required scopes below.
Things that catch people out: with claude mcp add the server name is the first
positional argument, before any flags; -y on npx skips the install prompt,
which an MCP client has no way to answer; and in zsh ${VAR} needs quoting. A
server added without --scope user works in the directory you added it from and
is simply missing everywhere else, with no error to explain the absence — if it
seems to have disappeared, run claude mcp list from a different directory
before touching anything else. For GUI-launched sessions the token has to live
in the env block of the config itself — the shell environment isn't inherited,
which is why the JSON above carries the credentials inline.
If the server never shows up in Claude Desktop, two causes account for almost all of it, and neither announces itself:
npxwasn't on the PATH. A GUI app is launched by the window manager, not a shell, so a Node installed through nvm often isn't visible to it. Set"command"to the absolute path fromwhich nodeand point"args"at the installeddist/index.js, or install Node system-wide. A Node older than 24 that is found fails asEBADENGINErather than anything readable.The server exited during startup. Credentials are validated before the handshake, so a bad cloud id or token stops it dead — and because stdout is the protocol channel, that message goes to stderr only. Claude Desktop keeps it at
~/Library/Logs/Claude/mcp-server-jira-alerts-mcp.log(Windows:%APPDATA%\Claude\logs\), named after the key you used undermcpServers. Look forStartup failed:— it names exactly what is wrong.
You found @rrvrs/jira-alerts-mcp on GitHub Packages. That is a mirror of the
same build, published so the panel is not empty. GitHub Packages requires a
personal access token even for public packages, so installing from it needs auth
that npmjs.com does not.
Use npx jira-alerts-mcp above — that is
the package on npmjs.com,
installable anonymously, and the only supported install route. The two are
separate names on separate registries; nothing redirects between them.
Only needed to work on the server itself, or to run a revision that has not been released:
git clone https://github.com/rrvrs/jira-alerts-mcp.git
cd jira-alerts-mcp
npm install
npm run buildThen point your client at the build rather than at npx, so edits take effect without republishing:
-- node /absolute/path/to/jira-alerts-mcp/dist/index.jsConfiguration
Variable | Required | Notes |
| yes | Your Atlassian site's cloud id (a UUID) |
| one of | |
| one of | OAuth 3LO bearer; takes precedence if set |
| no | Which tool families to register — see Choosing your toolsets. Unset registers |
| no |
|
| no |
|
| no | HTTP transport; defaults to |
| no | Comma-separated |
Credentials are validated at startup, so a bad config fails immediately with an actionable message rather than on the first tool call.
.env.example lists these for reference. The server does not
read .env itself — an MCP server is launched by its client, and the client owns
the environment. Use the file as a checklist for your client's env block, or
set -a; source .env; set +a for local development.
What your credentials can and cannot do
Both auth methods are not equivalent, and the difference is not documented by Atlassian. Verified against a live tenant on 2026-09-05:
The delete scopes are granted per token, not per authentication method. Two
Atlassian account API tokens for the same account behave differently: one was
refused on every DELETE with 401 Unauthorized; scope does not match — valid
credentials, missing grant — and another completed the whole set. So a 401 on a
delete is not a reason to abandon JSM_EMAIL + JSM_API_TOKEN. Reissue the
token with the delete scopes included, or supply a 3LO or Forge OAuth token
granted delete:ops-alert:jira-service-management as JSM_OAUTH_TOKEN. The 401
handler says exactly this, so the model reports it rather than retrying.
The delete-backed alert tools are jsm_delete_alert · jsm_delete_alert_note ·
jsm_remove_alert_tags · jsm_remove_alert_extra_properties ·
jsm_delete_alert_attachment.
The alert attachment endpoints are gated twice over. The API's own OpenAPI
document maps them to no OAuth scope at all, so a token missing the delete
scopes is turned away at the gateway with the same bare
scope does not match — which reads like an auth dead end and is not one. A
fully scoped token reaches the API and is told Feature not available in your plan instead. On a site whose plan excludes attachments, no token opens them,
which is why they now live in their own quarantined attachments toolset that
no profile loads. The handler reports the plan limit as a plan limit rather than
sending you off to widen a token.
Some actions depend on your JSM plan, not on your scopes. On a Standard
tenant, snooze, assign and custom actions are accepted and then fail out of band
with Your account plan does not support …. The request is well-formed; the
plan is the limit. This is exactly why writes are asynchronous and why
jsm_get_request_status matters — the immediate response to all three is a
successful receipt.
What has and has not been verified
Every tool in this server was run against a live Jira Service Management site before release. Every tool that a profile can load returned a real success — that is an invariant, and a test enforces it: a toolset marked unverified cannot appear in a profile.
Three families could not be verified, and they ship quarantined rather than removed. Nothing about them is known to be broken; they were untestable on the site available, and the code is very likely correct for a site where they are not blocked.
Toolset | What the API answered | What that means |
|
| Heartbeat Monitoring is not in every JSM plan. |
|
| The plan excludes attachments. The API also declares no OAuth scope for these four endpoints, so their listed scopes are inferred from the alert family. |
|
| A forwarding rule needs two distinct users and the test site had one, so only |
Enable one by naming it alongside whatever else you want:
"env": { "JSM_TOOLSETS": "all,heartbeats" }jsm_list_capabilities reports the same thing at runtime, so an assistant asking
"can you create a heartbeat?" is told the family exists, is off, how to turn it
on, and that it was never seen to work — rather than guessing.
Two families were removed in 2.0.0 rather than quarantined. Alert policies
(11 tools) and custom user roles (6 tools) answered 403 You are not authorized
under two separate credentials, one of them holding Jira ADMINISTER. Custom
user roles is an Opsgenie Enterprise feature, and the policy refusal looks
like the same kind of limit. Shipping seventeen tools whose only evidence was
that they compiled was not worth the tool-list weight, so they are gone. If you
have a site where they work and want them back, open an issue — the code is in
the history and the drift guard still knows the endpoints.
Choosing your toolsets
The JSM Operations API is roughly 240 operations. Registering all of them would hand your client a tool list it cannot choose from accurately, so the surface is cut into named toolsets and you pick:
Name | What it registers | Tools | Scope |
| Alert reads: search, detail, notes, activity logs, request status | 5 |
|
| Create, acknowledge, close, snooze, assign, escalate, annotate, tag, delete | 18 |
|
| Who is on call now and next, shift timelines, schedule discovery | 4 |
|
| Schedules, rotations and overrides — create, edit, delete | 14 |
|
| Team discovery, team roles, contact methods | 13 |
|
| Maintenance windows, site-wide or per team | 6 |
|
| Escalations, routing rules, notification rules and steps | 21 |
|
Three more ship but no profile loads them — see What has and has not been verified:
Name | What it registers | Tools | Why it is quarantined |
| Dead-man's switches that alert when a ping stops arriving | 5 | 402 — not in every JSM plan |
| List, download and delete alert attachments | 3 | 403 — not in every JSM plan |
| Forward one person's notifications to another | 5 | Needs two users; untested |
Plus four profiles, which are bundles of the above:
Profile | Contents | Tools |
| The default. | 27 |
| The thirteen tools that shipped before toolsets existed, plus | 14 |
|
| 58 |
| Every verified toolset | 81 |
"env": { "JSM_TOOLSETS": "responder" } // or "alerts,oncall", or "all"Names combine freely, and the flags --toolsets=a,b and --read-only override
the environment. A name that isn't in the tables above stops the server at
startup with the valid names and a suggestion — a typo should not quietly leave
you with fewer tools than you asked for.
core is a frozen list of names — the surface this server had before toolsets
existed — kept so an install that wants exactly that can ask for it without
listing thirteen tools. It keeps those fourteen when combined: core,schedules
is core plus every schedule tool, not both families unrestricted, so adding a
toolset beside it cannot widen what core itself contributes. responder is derived from its toolsets and widens as
families land, which is why it is the default: an alerts server whose alert tools
are mostly invisible until you reconfigure it is not much use.
all means every verified toolset, not every toolset. The three quarantined
families have to be named on their own — JSM_TOOLSETS=all,heartbeats — so that
asking for everything cannot hand you tools that have never been seen to work.
jsm_list_capabilities is always registered, whatever you select. It reports
every toolset, whether it is loaded, its scopes, and the variable to change — so
when you ask for something the current selection doesn't cover, you get "that's
in the oncall toolset" rather than "this server can't do that". Changing
JSM_TOOLSETS needs a restart; nothing can enable a toolset mid-conversation.
Required scopes. Alerts and on-call sit behind different scopes, which is the single most common setup mistake:
Tools | Scope |
The 5 alert reads |
|
The alert writes |
|
The destructive alert tools | also |
|
|
Resolving responder ids to names (optional) |
|
Three consequences worth knowing before you mint a token:
Writes need the read scope too. A token carrying only
write:ops-alert:jira-service-managementfails. Atlassian requires the read scope alongside it on every write endpoint.ops-configis a separate grant, and a missing one returns 401, not 403. Omit it and the nine alert tools work perfectly while the four on-call tools fail — which reads like a broken credential and is not one. Both are supported configurations: granting only the read scopes, or onlyops-alert, is a deliberate way to narrow what the agent can reach.The Jira user scope is optional, and its absence is visible rather than silent. Every responder the Operations API returns is a bare account id (
712020:9ae5385e-…); withread:jira-userthe on-call tools resolve those to names and emails in the same call. Without it they still answer — you get the ids, plus one line saying which scope would have named them. Knowing who is on-call matters more than knowing their display name, so a missing scope here never turns into an error.Reach for
read:jira-user, notread:user:jira. The granular scheme does cover these endpoints, but only as the complete setread:application-role:jira+read:group:jira+read:user:jira+read:avatar:jira—read:user:jiraon its own is not sufficient, and Atlassian still marks the whole granular set Beta for this API.
Team visibility. The account also needs JSM Operations access on the relevant team. Alerts and schedules hang off a team's Operations page, so credentials that can't see the team will get empty lists rather than errors.
Example
Asking who is on call resolves to jsm_list_schedules, then jsm_get_on_call:
you — who's on call for payments right now?
# Currently on-call for Payments — Primary
- Dana OkaforAcknowledging an alert returns a receipt, not the updated alert — because JSM applies alert actions out of band:
you — ack alert 4f2a9c1e-…-1718395200000, I'm looking at it
Acknowledge request accepted for alert `4f2a9c1e-…-1718395200000`.
- **Request id**: `c7b41f30-…`
- **Result**: Request will be processed
JSM applies alert actions asynchronously, so the alert may not reflect this
change immediately. Confirm with jsm_get_request_status using the request id
above, or re-read the alert after a moment.That last paragraph is the point: without it an agent re-reads the alert, sees it still unacknowledged, and acknowledges it again.
Tools
Ninety-five tools across ten toolsets: alerts, alert-actions, oncall,
schedules, teams, maintenance, routing, heartbeats, attachments and
forwarding. The first three are registered by default; the rest load only when
JSM_TOOLSETS names them, and jsm_list_capabilities reports at runtime which
of them this install actually has.
TOOLS.md is the catalogue: every tool with the endpoint behind it, whether it reads or writes, which are marked destructive, and the caveats that come with each family.
Narrow the surface with JSM_TOOLSETS or JSM_READ_ONLY — see
Choosing your toolsets.
What this server handles for you
Three API behaviours silently break naive integrations. Each is stated in the tool descriptions, where the model will actually read it:
Writes are asynchronous. Every mutating endpoint returns
{ result, requestId, took }immediately and applies the change out of band. Re-reading the alert right after an ack will often show it still unacknowledged.jsm_get_request_statusis the correct verification path, and each write tool points at it.tinyIdis not an id. The short number in the JSM UI (#4821) is rejected by/v1/alerts/{id}, which accepts only the fulluuid-timestampid. Aliases need a different endpoint entirely (/v1/alerts/alias?alias=). Both the schema descriptions and the 404 handler say so explicitly, so the model self-corrects instead of retrying the same call.The search window caps at 20,000.
offset + limitmust stay under it.jsm_list_alertsrejects deeper paging locally with a message telling the model to narrow the query instead of burning a round trip on a guaranteed 400.Alert actions take no actor or note. Opsgenie accepted
user,sourceandnotealongside an acknowledge or a close, and JSM Operations is an Opsgenie rehost — but it declares no request body for those endpoints and discards the fields silently. Acknowledging with a note and reading the activity log back shows neither the note nor the actor. So these tools do not offer the parameters at all: a rejected argument is a fact the model can act on, where an ignored one looks like a recorded decision that has actually vanished. To leave a durable note, calljsm_add_alert_note.jsm_create_alertdoes takenoteandsource, becauseCreateAlertRequestdeclares both and the API honours them — also verified.
Why this exists
Alerts are not work items. They live behind a different API — /jsm/ops/api,
the rehosted Opsgenie surface — with its own scopes, its own id format and its
own asynchronous write semantics. The MCP Registry lists 30 Jira servers; every
one of them talks to work items. None can tell you what is paging you right now.
atlassian/atlassian-mcp-server
narrows the gap but does not close it. Since February 2026 it ships four JSM
Operations tools — getJsmOpsAlerts, getJsmOpsScheduleInfo, getJsmOpsTeamInfo
and updateJsmOpsAlert — and they are coarse: a single updateJsmOpsAlert covers
acknowledge, unacknowledge, close and escalate, and nothing covers notes, logs,
tags, attachments, snooze, assign, request status, timelines, rotations,
overrides, heartbeats, maintenance, routing, integrations or audit logs. They are
also absent from that repository's README, documented only on Atlassian's
supported tools page,
and were API-token-only at launch — an OAuth install sees none of them. Being a
hosted, closed server, those gaps are Atlassian's to close rather than something
a contribution can fix.
The Opsgenie MCP servers that do exist speak an API with an end date.
giantswarm/mcp-opsgenie,
burakdirin/opsgenie-mcp-server
and daviddykeuk/opsgenie-mcp all
call api.opsgenie.com with a GenieKey. Opsgenie
reached end-of-sale on 4 June 2025 and shuts down on 5 April 2027,
at which point those REST APIs stop responding. This server targets the surface
that replaces them: https://api.atlassian.com/jsm/ops/api/{cloudId}/v1.
Compatibility. For Atlassian Cloud tenants with JSM Operations — sites
already migrated off standalone Opsgenie, or provisioned after the merge. If your
team still logs in at app.opsgenie.com and authenticates with a GenieKey, this
server will not reach your data; one of the Opsgenie servers above will, until
2027.
Project layout
src/
├── index.ts # transports and startup credential validation
├── server.ts # assembles the catalogue from the eight families
├── toolsets.ts # toolsets, profiles, and selection resolution
├── constants.ts # API root, limits
├── types.ts # JSM API interfaces
├── schemas/common.ts # Zod fragments shared across families
├── services/
│ ├── client.ts # auth, request, envelope normalisation, error mapping
│ ├── directory.ts # resolves bare Atlassian ids to names
│ ├── name-cache.ts # one registry for every process-wide cache
│ ├── format.ts # markdown rendering, truncation, result envelopes
│ └── render/ # per-family renderers
└── tools/
├── define.ts # defineTool() + registerTools()
├── family.ts # the resource-family factory
├── execute-write.ts # the shared write executor
├── list-executor.ts # the shared list pipeline
├── paging.ts # the paging dialects each endpoint wants
├── capabilities.ts # jsm_list_capabilities
├── test-support.ts # stub client and in-memory MCP harness
├── alerts/ # alert reads
├── actions/ # alert writes
├── oncall/ # who is on call now and next
├── schedules/ # schedules, rotations, overrides
├── teams/ # teams, roles, contact methods
├── maintenance/ # maintenance windows
├── heartbeats/ # heartbeat monitors
└── routing/ # escalations, routing, notification, forwarding rulesThe alert families are written one tool per file: a module owns its input shape,
its description and its handler, and nothing else. The configuration families
are generated instead — family.ts builds the mechanical
list/get/create/update/delete shapes from a ResourceConfig, because writing
ten of them by hand would be a hundred files whose differences are three lines
each. Where an endpoint does not fit those five shapes, a hand-written tool sits
beside the generated ones; teams/contacts.ts has both.
server.ts concatenates the eight families into allTools, the full catalogue.
toolsets.ts cuts that down to what a process actually registers, and
index.ts only knows about transports. The tool catalogue itself — every tool,
grouped by family — is in TOOLS.md.
Three conventions in here are load-bearing, and changing them by accident is the most likely way to break the server subtly. They are written up, with the bugs that motivated each, under Conventions worth preserving.
Contributing
See CONTRIBUTING.md for the development loop, the conventions worth preserving, and how to add a tool. Issues and PRs must not contain cloud ids, tokens, or real alert data.
Security
This server holds Atlassian credentials, and the HTTP transport performs no authentication of its own — see SECURITY.md for the threat model, hardening notes, and how to report a vulnerability privately.
License
Available Tools
28 toolsjsm_acknowledge_alertAcknowledge a JSM alertAIdempotent
Acknowledge an open JSM alert, stopping further escalation notifications for it.
Acknowledging signals that a human has picked the alert up. It does not resolve the alert — use jsm_close_alert for that. Acknowledging an already-acknowledged alert is a no-op.
Args:
alert_id (string): the full alert id (not the tinyId)
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. The response confirms the request was accepted, not that the alert changed. Verify with jsm_get_request_status using the returned requestId.
Examples:
"Ack the Redis latency alert, I'm on it" -> alert_id=, note="Investigating, RVS"
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare idempotency and non-read-only behavior, but the description adds valuable context by explaining escalation suppression, the no-op on already-acknowledged alerts, and especially the asynchronous nature: 'The response confirms the request was accepted, not that the alert changed.' This goes beyond the annotations and helps set agent expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is largely well-structured and front-loaded, with the core behavior in the first sentence and clear sections for Args, Returns, and async behavior. It loses a point because the example's mention of 'note' is extraneous and inconsistent with the schema, and the Args section partially duplicates the schema's existing parameter description.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool, the description covers the key operator needs: what the action does, how it differs from closing, its idempotency, and how to verify success via jsm_get_request_status. The misleading 'note' in the example is the main completeness gap, and it could have also explicitly pointed to jsm_list_alerts for obtaining the full alert_id as the schema does.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents alert_id with an example and the warning not to use the tinyId, so the description adds little beyond repeating that. The example then introduces a 'note="Investigating, RVS"' argument that is not part of the input schema and would violate additionalProperties=false, potentially misleading an agent into passing an invalid parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Acknowledge' and resource 'open JSM alert', and clearly states the effect: 'stopping further escalation notifications'. It also distinguishes itself from jsm_close_alert by stating 'It does not resolve the alert', which separates it from a key sibling tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use it: 'Acknowledging signals that a human has picked the alert up.' It also names an alternative with the condition: 'use jsm_close_alert for that' when resolving. The no-op note for already-acknowledged alerts clarifies expected behavior in an edge case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_add_alert_extra_propertiesAttach key/value properties to a JSM alertADestructiveIdempotent
Attach arbitrary key/value context to a JSM alert, or overwrite properties already on it.
Extra properties are the structured half of an alert, next to the prose in its description: a runbook link, the region, the deploy that preceded it, a trace id. Unlike a note they can be read back programmatically by whatever picks the alert up next.
Args:
alert_id (string): the full alert id (not the tinyId)
extra_properties (object): key/value pairs; values may be strings, numbers or booleans
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
This merges by key: keys not mentioned are left alone, and a key that already exists is overwritten without warning. Read the alert first with jsm_get_alert if you need to know what a key currently holds.
Examples:
"Note the runbook on this alert" -> extra_properties={"runbook": "https://wiki/runbooks/db-failover"}
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| extra_properties | Yes | Key/value context to attach, e.g. {'runbook': 'https://…', 'region': 'us-east-1'}. A key that already exists is overwritten. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description thoroughly discloses behavior beyond the annotations: the operation is asynchronous, it merges by key, untouched keys are preserved, and existing keys are overwritten without warning. This directly supports the destructiveHint=true annotation and adds material context the agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is detailed but every sentence earns its place: purpose, distinction from notes, args, return shape, async warning, overwrite warning, and a concrete example. It is well-structured and front-loads the core behavior before edge-case warnings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation tool with an output schema, the description is complete: it covers async verification, return fields, destructive merge semantics, how to retrieve the full alert id, and provides a worked example. Nothing essential is left for the agent to guess.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters and their types. The description adds useful context on top: full alert id vs tinyId, allowed value types, a concrete example, and the effect of merging/overwriting. This goes beyond the schema baseline without being redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool attaches key/value context to a JSM alert and can overwrite existing properties. It also distinguishes extra properties from notes, making it easy to tell apart from sibling tools like jsm_add_alert_note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when this tool is appropriate: for structured, programmatically readable context, unlike prose notes. It also gives explicit guidance on prerequisites and follow-up: read the alert first with jsm_get_alert to avoid clobbering keys, and verify completion with jsm_get_request_status because the action is asynchronous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_add_alert_noteAdd a note to a JSM alertA
Append a note to a JSM alert's activity timeline without changing its state.
Use this to record triage findings, link a runbook or dashboard, or leave context for the next responder. It does not acknowledge, close, or reassign the alert.
Args:
alert_id (string): the full alert id (not the tinyId)
note (string): the note text
user (string, optional): actor name/email; defaults to the credential owner
source (string, optional): source label for the activity log
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Examples:
"Note that this correlates with the 14:02 deploy" -> alert_id=, note="Correlates with deploy 4412 at 14:02 UTC"
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | Note text to record on the alert's activity timeline. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the asynchronous behavior with a warning to verify via jsm_get_request_status, and notes the actor defaults to the credential owner. These traits are not captured in the annotations, which only cover readOnly/destructive hints. The 'without changing its state' clarification is valuable and consistent with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured with logical sections: usage, args, returns, async warning, and an example. The core purpose is front-loaded, and each section serves a purpose. The inclusion of the unsupported user/source params adds a minor structural blemish but overall it remains concise enough.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description includes return shape, async warning, and a concrete example, plus strong guidance on alert_id. However, the contradiction between the documented optional args and the actual schema means an agent following the description could fail at runtime, which prevents it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents alert_id and note at 100% coverage, so the description adds little for those parameters. However, the Args section mentions optional 'user' and 'source' parameters that are not defined in the schema, and additionalProperties is false, meaning they would be rejected. This misleading extra information actively harms parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Append a note') and resource ('a JSM alert's activity timeline') and immediately clarifies the action does not change alert state. This clearly differentiates it from sibling tools like jsm_update_alert_note, jsm_add_alert_tags, and jsm_acknowledge_alert.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit use cases: 'record triage findings, link a runbook or dashboard, or leave context for the next responder' and states what it does not do: 'does not acknowledge, close, or reassign the alert.' It does not explicitly name sibling alternatives for those excluded actions, but the guidance is still clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_add_alert_responderAdd a responder to a JSM alertAIdempotent
Add a responder (user, team, escalation or schedule) to an existing JSM alert so they are notified and become accountable for it.
Use this to pull in another team once triage shows the alert belongs elsewhere. Responders are additive — this does not remove the existing ones.
Args:
alert_id (string): the full alert id (not the tinyId)
responder_id (string): id of the user/team/escalation/schedule to add
responder_type ('user' | 'team' | 'escalation' | 'schedule'): what responder_id refers to
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Examples:
"Page the database team on this" -> responder_id=, responder_type="team"
Error handling:
HTTP 422 or a failed request status usually means responder_id doesn't exist or its type is wrong. Team and schedule ids can be found with jsm_list_schedules or the JSM UI.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| responder_id | Yes | Id of the user, team, escalation or schedule to add as a responder. | |
| responder_type | Yes | What kind of entity responder_id refers to. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations by disclosing that the action is asynchronous and must be verified via jsm_get_request_status with the returned requestId, that responders are additive, and the specific failure mode (HTTP 422 / failed status means responder_id doesn't exist or has the wrong type). No contradiction with idempotentHint=true or readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured and front-loaded with the core purpose, followed by labeled sections for Args, Returns, async warning, example, and error handling. The Args section partially duplicates the fully-documented schema, which is mild redundancy, but every other sentence earns its place and the headers make scanning efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating, asynchronous tool this is as complete as it gets: it documents the return shape (requestId enabling follow-up), names the follow-up tool, explains the failure mode, provides a usage example, and tells where to source valid IDs. Nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds genuine value beyond the schema: the example maps natural-language intent ('Page the database team on this') to responder_type, and the error-handling section clarifies what a wrong responder_id/type produces behaviorally. The Args block itself is largely redundant with the schema, limiting the additional credit.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb-resource pair ('Add a responder... to an existing JSM alert') and names the four entity types the responder can be. The additive scoping note ('does not remove the existing ones') helps distinguish it from assignment-style siblings, and the stated outcome (notified and accountable) makes the effect concrete.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use signal: 'pull in another team once triage shows the alert belongs elsewhere.' It also routes the agent to jsm_get_request_status for async verification and jsm_list_schedules for finding IDs. It does not explicitly name alternatives to avoid (e.g., jsm_assign_alert), but the additive-vs-replace distinction serves that role implicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_add_alert_tagsAdd tags to a JSM alertAIdempotent
Add one or more tags to a JSM alert. Tags are additive — existing ones stay.
Tags are how alerts get grouped and found later: jsm_list_alerts can filter on them (tag:"db"), and they are what turns a scattering of individual alerts into "the seventeen from last night's storage incident".
Args:
alert_id (string): the full alert id (not the tinyId)
tags (string[]): one or more tag names
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Tags are case-sensitive. 'DB' and 'db' are two tags, and searches will not find one by the other — so match whatever the team already uses rather than inventing a casing.
Examples:
"Tag this as part of the storage incident" -> tags=["incident-2026-09-05", "storage"]
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tag names. Case-sensitive, and matched exactly on removal. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only signal mutation and idempotency; the description goes further by disclosing the asynchronous request/response pattern, requiring follow-up via jsm_get_request_status with the returned requestId, and warning that tags are case-sensitive. This is meaningful behavioral context far beyond the annotations and no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, uses clear section labels (Args, Returns, IMPORTANT), and every paragraph earns its place — including the illustrative tagging example. The motivational sentence about grouping is slightly expansive but supports usage decisions without bloating the definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich output schema and annotations already covering mutation/idempotency, the description supplies the missing operational details: asynchronous behavior, verification step, error-prone id confusion, and case-sensitivity. An agent has everything needed to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters at 100% coverage, and the description still adds value: it emphasizes using the full alert_id rather than tinyId, gives a concrete example, and explains why casing must match existing tags. The Args list largely repeats the schema, but the prose around additive and case-sensitive behavior deepens the semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific action ('Add one or more tags to a JSM alert') and the additive semantics ('existing ones stay') clarify exactly what the tool does. This cleanly distinguishes it from sibling operations such as removing tags because add is explicitly non-destructive.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains when tagging is useful — grouping/filtering with jsm_list_alerts (tag:"db") and organizing incident-related alerts — and advises aligning casing with existing team conventions. It does not explicitly state when to prefer a sibling like jsm_remove_alert_tags, so there is no direct alternative exclusion, but the intended context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_assign_alertAssign a JSM alert to a personAIdempotent
Make one person the owner of a JSM alert, so it is clear who is working it.
Assigning names an owner; jsm_add_alert_responder adds people to notify without taking ownership away. Reach for this when triage has decided whose problem it is, and for that one alert rather than a class of them — routing rules, not assignment, are how a class of alerts finds its team.
Args:
alert_id (string): the full alert id (not the tinyId)
account_id (string): Atlassian account id of the assignee
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
account_id is an Atlassian account id, not an email address and not a display name. It looks like '712020:9ae5385e-6a4c-4f0e-9c02-6f8a1e21d7b1'. Both other forms are rejected. To find one: jsm_get_on_call and jsm_get_alert both return account ids for the people they name, so read the id from there rather than guessing from a name.
Examples:
"Assign this to whoever is on call for payments" -> jsm_get_on_call first, take the account id from the result, then assign
Constraints and errors:
HTTP 422 or a failed request status usually means the account id is wrong, or the account has no JSM Operations access on that team.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| account_id | Yes | Atlassian account id of the assignee, e.g. '712020:9ae5385e-…'. NOT an email address and NOT a display name — both are rejected. Account ids appear in jsm_get_alert's responder and owner fields and in jsm_get_on_call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds important behavioral context beyond the annotations: the action is asynchronous, a requestId is returned, and callers must verify completion with jsm_get_request_status. It also discloses likely error causes (HTTP 422 / failed status = bad account id or no JSM Operations access), which the annotations do not cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well organized with clear sections for args, returns, async behavior, account_id caveats, examples, and errors. Key information is front-loaded, and even the longer portions earn their place by preventing common failure modes.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's mutation, asynchronous behavior, and the need for valid account ids, the description covers everything an agent needs: what it does, when to use it, parameter nuances, return shape, verification step, and error interpretation. The output schema and sibling context further fill any remaining gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though the input schema already documents both parameters well, the description adds practical meaning: alert_id must be the full id rather than tinyId, and account_id is not an email or display name. It also tells the agent where to find valid account ids (jsm_get_on_call, jsm_get_alert) and gives a concrete id format.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action and outcome: 'Make one person the owner of a JSM alert, so it is clear who is working it.' It also distinguishes this tool from jsm_add_alert_responder and routing rules, so an agent can tell it apart from siblings without guessing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit guidance is given: use this when triage has decided whose problem it is, and for a single alert rather than a class of alerts. It names the alternative (jsm_add_alert_responder) and explains when that alternative is appropriate, plus notes that routing rules handle classes of alerts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_close_alertClose a JSM alertADestructiveIdempotent
Close a JSM alert, marking it resolved and ending all notifications for it.
Closing is how an alert leaves the open queue. Treat it as effectively one-way: a closed alert cannot be reopened through this API, and a recurring condition will create a fresh alert (or increment a deduplicated one) rather than reviving this record. Prefer jsm_acknowledge_alert while work is still in progress.
Args:
alert_id (string): the full alert id (not the tinyId)
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Examples:
"Close it, the deploy fixed it" -> alert_id=, note="Resolved by rollback of build 4412"
Don't use when: the alert is still being worked — acknowledge instead.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses important non-obvious behaviors beyond annotations: the action is asynchronous, requires verification via jsm_get_request_status, cannot be reopened, and recurring conditions create a new/fresh alert rather than reviving the record. These traits align with destructiveHint=true and idempotentHint=true without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with short labeled sections and front-loaded purpose. It is longer than necessary, however, because the Args and Returns sections largely duplicate the schema and output schema, and the example introduces an unsupported parameter. Overall it remains scannable and purposeful.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is rich: it covers async behavior, verification, one-way semantics, when to avoid, and the exact return shape. It is incomplete only because of the phantom 'note' parameter in the example, which could cause an agent to construct an invalid request, and because it does not clarify what happens when attempting to close an already-closed alert.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description introduces a misleading 'note' argument in the example ('note="Resolved by rollback of build 4412"') that is not present in the input schema and would be rejected by additionalProperties:false. The Args section merely restates what the schema already says about alert_id, adding no genuine semantic value beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Close a JSM alert, marking it resolved and ending all notifications for it.' It also clarifies the lifecycle role ('Closing is how an alert leaves the open queue') and implicitly differentiates from acknowledge/delete siblings by noting it is one-way and not for active work.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use guidance is provided: 'Prefer jsm_acknowledge_alert while work is still in progress' and 'Don't use when: the alert is still being worked — acknowledge instead.' It also warns the operation is effectively one-way, so the agent understands the consequence before invoking.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_create_alertCreate a JSM alertA
Create a new alert in Jira Service Management Operations.
This pages people. A created alert enters the team's routing and escalation rules exactly as one raised by a monitoring integration would, so someone's phone may ring. Create one when a human wants an incident tracked and escalated — not to leave a note, which is jsm_add_alert_note, and not to record something nobody needs to act on.
Args:
message (string): one-line summary. The ONLY required field.
alias (string, optional): de-duplication key — see below
description (string, optional): longer detail, impact, what to try
priority ('P1'..'P5', optional): P1 highest; omit to let routing rules decide
responders (array, optional): [{ id, type }] with type 'user' | 'team' | 'escalation' | 'schedule'
visible_to (array, optional): [{ id, type }] with type 'user' | 'team'; max 50
entity (string, optional): what the alert is about, e.g. 'payments-api'
tags (string[], optional)
actions (string[], optional): names of custom actions configured in your org
extra_properties (object, optional): arbitrary key/value context
note (string, optional): note recorded on the new alert's timeline
source (string, optional): where the alert came from, e.g. 'claude-mcp'
There is no 'user' argument, unlike the other write tools: this endpoint has no actor override, and the alert is created as the owner of the credentials.
Returns: { "requestId": string, "result": string, "alias": string }
IMPORTANT: this is asynchronous, and it does not return the new alert's id. The response confirms the request was accepted, not that an alert exists. Unusually for this API the status code is 200 rather than 202, which does not make it synchronous. To get the id: call jsm_get_request_status with the returned requestId, or — if you set an alias — jsm_get_alert with identifier_type='alias'.
Alias is the de-duplication key, and it is the difference between a safe retry and a silent no-op. Creating with an alias that already has an OPEN alert does not create a second alert; it increments the existing one's count and leaves everything else alone. That makes a retried create safe. It also means reusing an alias from an earlier, still-open incident quietly does nothing visible — so make aliases specific to the occurrence, not to the check.
Examples:
"Raise a P1 for the payments API being down" -> message="Payments API returning 503", priority="P1", entity="payments-api"
Retryable create -> alias="payments-api-503-2026-09-05T11:00"
Constraints and errors:
Needs write:ops-alert:jira-service-management alongside the read scope. A token with only read scopes gets 403.
Responders bypass the team's routing rules. Omit them unless you specifically want to route around routing.
HTTP 422 usually means a responder id doesn't exist or its type is wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| note | No | Note recorded on the new alert's timeline. | |
| tags | No | Tags for searching and grouping, e.g. ['db', 'prod']. | |
| alias | No | Client-defined de-duplication key. Creating against an alias that already has an OPEN alert does not create a second one — it increments that alert's count. This is the field that makes creation safe to retry, and the field that makes it silently do nothing if reused carelessly. | |
| entity | No | What the alert is about — a host, service or application, e.g. 'payments-api'. | |
| source | No | Free-text source label shown in the alert activity log, e.g. 'claude-mcp'. | |
| actions | No | Names of custom actions your organisation has configured for alerts. Not free text — an unrecognised name is ignored rather than rejected. | |
| message | Yes | One-line summary of what is wrong, read first by whoever gets paged. The only required field. | |
| priority | No | P1 is highest, P5 lowest. Omitted lets the routing rules decide. | |
| responders | No | Who to notify. Omit to let the team's routing rules decide, which is usually what you want — naming responders explicitly bypasses routing. | |
| visible_to | No | Restricts who can see the alert, beyond the responders. Max 50 entries. Omit for team-default visibility. | |
| description | No | Longer detail: impact, how to reproduce, what to try. Shown on the alert page. | |
| extra_properties | No | Arbitrary key/value context carried on the alert, e.g. {'region': 'us-east-1'}. |
Output Schema
| Name | Required | Description |
|---|---|---|
| alias | No | |
| result | No | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the annotations: it discloses that the alert 'pages people,' that the API is asynchronous with a 200 rather than 202 status, that the response contains no alert id, and that alias reuse on an open alert silently increments instead of creating. It also documents required auth scopes and responder routing bypass, all beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but exceptionally well-organized with Args, Returns, IMPORTANT, Alias, Examples, and Constraints sections. It front-loads the most important warning ('This pages people') and each sentence carries distinct value, making the length appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, usage criteria, return shape, async behavior, how to obtain the real alert id, alias semantics, concrete examples, required permissions, and likely error causes. The output schema doesn't provide this contextual information, so the description fully compensates.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even with 100% schema coverage, the description adds substantial meaning: message is the only required field, alias is the de-duplication key with safe-retry versus no-op consequences, responders bypass routing rules, priority omission defers to routing, and there is deliberately no 'user' parameter. These semantics are critical for correct invocation and are not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource ('Create a new alert in Jira Service Management Operations') and immediately distinguishes the tool from siblings: 'not to leave a note, which is jsm_add_alert_note, and not to record something nobody needs to act on.' It also notes the absence of a 'user' argument compared to other write tools, removing ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to use it: 'Create one when a human wants an incident tracked and escalated,' and names the alternative jsm_add_alert_note for notes. It also explains when to use alias-based retries and how to follow up via jsm_get_request_status or jsm_get_alert.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_delete_alertPermanently delete a JSM alertADestructiveIdempotent
Permanently delete a JSM alert and everything recorded on it.
This is almost never the right tool. Closing an alert with jsm_close_alert takes it out of the open queue and keeps the record: who was paged, what they tried, when it resolved. Deleting throws that away, for everyone, with no undo — the notes, the activity log, the attachments and the timing all go with it. A closed alert costs nothing to keep.
The cases that justify it are narrow: an alert containing credentials or personal data that must not persist, or a flood of alerts from a misconfigured integration that never represented anything real.
Args:
alert_id (string): the full alert id (not the tinyId)
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Before calling this, read the alert back with jsm_get_alert and show the user what they are about to lose — its message, its state and how many notes it carries — and get an explicit yes. Never call it to tidy up, to clear a queue, or in a loop over search results.
Constraints and errors:
Needs delete:ops-alert:jira-service-management, a separate grant from write:ops-alert. A token that can close alerts usually cannot delete them, and that is a deliberate configuration rather than a problem to work around.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate destructive and non-read-only behavior, but the description adds substantial context: deletion has no undo, destroys notes/activity/attachments/timing, is asynchronous and requires verification via jsm_get_request_status, and needs a separate delete:ops-alert grant. This fully discloses the behavioral weight of the operation beyond what the annotations alone convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every sentence is load-bearing: the most important warning is front-loaded, the destructive implications are explained, the narrow justifications are named, async behavior is highlighted, and permission constraints are included. The use of bold, section headers, and bullet-like structure makes the length navigable rather than bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive asynchronous mutation tool with one parameter and an output schema, the description covers every essential decision factor: what is destroyed, when deletion is justified, when it is not, how to confirm user consent, how to verify completion, and what permission is required. The return shape is described and the output schema exists, so no critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains that alert_id must be the full alert id rather than the tinyId, provides an example, and directs the agent to jsm_list_alerts. The description's Args line repeats 'full alert id (not the tinyId)' but adds no new parameter-level semantics beyond the schema. The pre-call instruction to read the alert is usage guidance, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action: permanently delete a JSM alert and everything recorded on it. It explicitly distinguishes itself from jsm_close_alert by explaining what is lost in deletion versus what is preserved when closing. This makes the tool's purpose unmistakable and clearly differentiated from its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives unusually explicit when-to-use and when-not-to-use guidance: it names the narrow cases that justify deletion, warns it is 'almost never the right tool,' and enumerates forbidden uses such as tidying up, clearing queues, or looping over search results. It also requires reading the alert back and obtaining explicit user consent before calling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_delete_alert_noteDelete a note from a JSM alertADestructiveIdempotent
Permanently remove a note from a JSM alert's timeline.
Reach for this only for a note that should never have been written — a pasted credential, someone's personal information, a note on the wrong alert. Not for a note that turned out to be wrong: that is what jsm_update_alert_note is for, and being able to see what a responder believed at the time is most of what the timeline is worth.
Args:
alert_id (string): the full alert id (not the tinyId)
note_id (string): id of the note to delete, from jsm_list_alert_notes
Returns: { "deleted": true, "note_id": string }
There is no undo, and no confirmation step at the API. The note is gone the moment this returns. Confirm with the user before calling it, and quote the note's text back to them first so they are deleting the thing they think they are.
Unlike most alert writes this is synchronous: the API answers 204 with no body, so there is no requestId to verify.
Constraints and errors:
Needs delete:ops-alert:jira-service-management, which is a separate grant from write:ops-alert. A token that can edit notes may still get 403 here.
| Name | Required | Description | Default |
|---|---|---|---|
| note_id | Yes | Id of the note to delete, from jsm_list_alert_notes. Not the note's text. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| deleted | Yes | |
| note_id | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive and non-readonly, but the description adds substantial behavior beyond that: there is no undo, no confirmation step at the API, the operation is synchronous, the API returns 204 with no body, no requestId is available, and a separate delete:ops-alert grant is required. This is exactly the kind of context an agent needs before calling a destructive tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is well-structured into purpose, args, returns, safety warning, synchronous behavior, and permissions. Every section carries important information for a destructive operation, though some statements like 'There is no undo' and 'The note is gone the moment this returns' are mildly redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with sensitive side effects, the description covers return shape, error/permission context, synchronous behavior, and user-confirmation expectations. Nothing needed to safely call this tool is missing, especially given the annotations also flag destructiveness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already has 100% coverage with clear descriptions for both parameters, so the baseline is 3. The description adds useful emphasis that alert_id must be the full id and not the tinyId, and that note_id should come from jsm_list_alert_notes, which reinforces the correct source without inventing new semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: permanently remove a note from a JSM alert's timeline. It also distinguishes itself from the sibling jsm_update_alert_note by explicitly saying that correction is not this tool's purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: only for notes that should never have been written, such as pasted credentials or personal information. It also gives a clear when-not-to-use directive by naming jsm_update_alert_note as the alternative for notes that merely turned out to be wrong, plus a strong instruction to confirm with the user and quote the note before deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_escalate_alertEscalate a JSM alert through an escalation policyAIdempotent
Push a JSM alert into an escalation policy immediately, rather than waiting for it to escalate on its own.
Use this when an alert is not getting picked up and waiting out the escalation timer is not acceptable. It pages the next people in that policy now.
Args:
alert_id (string): the full alert id (not the tinyId)
escalation_id (string): id of the escalation policy to run
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
This pages people out of band, ahead of the schedule they agreed to. Confirm with the user before escalating on their behalf.
escalation_id is an escalation policy id — not a team id and not a schedule id. The three are separate objects with separate ids, and passing the wrong one fails with 422 rather than escalating to something adjacent.
Examples:
"Nobody has picked this up, escalate it" -> get the escalation id for the team, then escalate
Constraints and errors:
HTTP 422 or a failed request status usually means escalation_id is not an escalation, or belongs to a different team than the alert.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| escalation_id | Yes | Id of the escalation policy to escalate through. This is an escalation id, not a team or schedule id — the three are separate objects with separate ids. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the side effect of paging people out of band, the async request/response pattern, and the need for user confirmation. It also explains error behavior for invalid escalation IDs. These details go beyond the annotations and accurately represent the action's behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is somewhat repetitive, particularly around paging people and distinguishing escalation IDs from team/schedule IDs, but the extra details serve important disambiguation and safety purposes. Overall it is well-organized with clear sections for arguments, returns, constraints, and examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description includes the return shape, async verification instructions, common error causes with HTTP 422, and examples. It provides enough context for an agent to decide when to use the tool and what to expect, complementing the input schema and annotations effectively.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Both parameters are fully described in the schema, with additional context in the description. The alert_id description clarifies that the full ID is required, not the tinyId, and the escalation_id description distinguishes escalation policies from team and schedule IDs. The description includes a concrete example for alert_id.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Push a JSM alert into an escalation policy immediately' and distinguishes it from sibling alert actions by specifying that it pages the next people in the policy now. The title and description align on the verb and resource.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete condition for use: 'when an alert is not getting picked up and waiting out the escalation timer is not acceptable.' It also explicitly instructs to confirm with the user before escalating and notes the async nature of the action, providing clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_execute_alert_actionRun a custom action on a JSM alertADestructive
Run one of your organisation's own custom alert actions — the buttons a team wires up on an integration, like "Restart service" or "Roll back deploy".
What these do is entirely up to whoever configured them, and this server cannot see it. An action name is a request to run somebody's automation against production.
Args:
alert_id (string): the full alert id (not the tinyId)
action_name (string): the configured action's name, exactly as configured
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Do not guess an action name. There is no endpoint that lists them, so a plausible-sounding guess is exactly as likely to be a real destructive automation as it is to be nothing. An unrecognised name is accepted and silently does nothing, which means a successful receipt is not evidence that anything ran. Ask the user which action they mean, and confirm before running it.
Constraints and errors:
Names are configured per integration, so an action that exists for one alert's source may not exist for another's.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| action_name | Yes | Name of a custom action configured for your organisation's integrations. Not free text: an unrecognised name is accepted and then does nothing. Ask the user what actions exist rather than guessing a plausible one. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, openWorldHint=true, idempotentHint=false): it discloses async execution with an explicit verification step, the silent no-op on unrecognised names with the consequence that 'a successful receipt is not evidence that anything ran', and the fact that the server cannot see what the action does. The production-impact framing ('a request to run somebody's automation against production') gives the agent a concrete risk model beyond the boolean hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Long but dense with unique safety-critical content: the guessing warning, async verification, and per-integration constraint all earn their place and the core purpose is front-loaded in the first sentence. Minor deduction because the 'Args:' and 'Returns:' lines duplicate information already present in the input schema and output schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The output schema covers return values and annotations cover the safety profile, so the description's remaining job is the open-world danger, which it handles fully. Every identified failure mode — guessing names, silent no-ops, cross-integration mismatches, async receipt without execution — is addressed with an actionable instruction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both schema descriptions are already rich: alert_id explains the tinyId distinction and how to obtain the full id, and action_name explains the not-free-text caveat. The description's Args section largely restates this same information, adding no new parameter-level semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource: 'Run one of your organisation's own custom alert actions', concretely illustrated with examples like 'Restart service' or 'Roll back deploy'. This clearly separates it from the sibling built-in operations (acknowledge, snooze, assign, escalate, close) by scoping it to org-configured automation rather than platform features.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong contextual guidance: the agent is told the action name must match a real configured action, is explicitly instructed to 'Ask the user which action they mean, and confirm before running it', and is routed to the follow-up tool jsm_get_request_status for async verification. It also notes per-integration name scoping, though it does not explicitly enumerate which sibling alternatives to prefer instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_get_alertGet JSM alert detailsARead-onlyIdempotent
Retrieve the full detail of a single JSM alert, including its description, custom details/extraProperties, responders, tags and dedupe count.
Use this after jsm_list_alerts when you need the payload an integration attached to the alert (host, service, metric values, runbook links) — the list endpoint returns a thinner record without the description or details map.
Args:
identifier (string): the full alert id, or an alias when identifier_type='alias'
identifier_type ('id' | 'alias'): default 'id'
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): a single alert object with id, tinyId, message, description, status, acknowledged, snoozed, priority, source, owner, tags, responders, details (custom key/value map), extraProperties, count, createdAt, updatedAt, lastOccurredAt, and a report block with acknowledgedBy/closedBy. Responder ids are resolved to names where the credentials allow it.
Examples:
"What does alert #4821 actually say?" -> resolve the id via jsm_list_alerts, then call with identifier=
"Look up the alert our pipeline created with alias 'redis-latency-prod'" -> identifier="redis-latency-prod", identifier_type="alias"
Error handling:
HTTP 404 usually means a tinyId was passed instead of the full id. Resolve it with jsm_list_alerts first.
Aliases only resolve against OPEN alerts; a closed alert must be fetched by id.
| Name | Required | Description | Default |
|---|---|---|---|
| identifier | Yes | The alert's full id, or its alias if identifier_type='alias'. The short tinyId from the UI is NOT accepted by the API — search with jsm_list_alerts to resolve a tinyId to a full id. | |
| identifier_type | No | Which identifier was supplied. 'id' hits /v1/alerts/{id}; 'alias' hits the separate /v1/alerts/alias endpoint. | id |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| alert | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds substantial behavioral context: it documents that responder ids are resolved to names when credentials allow, that a 404 usually means a tinyId was passed, and that alias lookup only works for open alerts. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: a scoped purpose statement, usage guidance, parameter summary, return expectations, examples, and error handling. It is front-loaded with the most important information and structured with clear labels, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three parameters, a rich return shape, and potential error traps, the description covers everything an agent needs: when to use it, what parameters mean, what the response contains, how to handle the likely 404, and two concrete example queries. The output schema further covers return fields, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters thoroughly. The description adds extra value with worked examples for id-based and alias-based lookups, clarifies the tinyId limitation, and explains the difference between identifier and alias endpoints, which helps the agent choose values correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Retrieve') with a clear resource ('a single JSM alert') and enumerates the included fields (description, custom details/extraProperties, responders, tags, dedupe count). It explicitly contrasts the output with the thinner jsm_list_alerts record, so an agent can distinguish it from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool ('after jsm_list_alerts when you need the payload an integration attached') and when the list endpoint is sufficient. Error handling notes clarify that tinyIds are rejected and aliases only resolve against open alerts, guiding correct invocation and recovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_get_next_on_callGet who is on-call nextARead-onlyIdempotent
Return the responders who take over the next shift on a JSM schedule, and when that shift begins.
Use this for handover messages and for deciding whether an alert can wait for the next rotation.
Args:
schedule_id (string): schedule id, or name if schedule_identifier_type='name'
schedule_identifier_type ('id' | 'name'): default 'id'
date (string, optional): ISO 8601 reference point; "next" is computed relative to it. Defaults to now
flat (boolean): default true — flat list of user identifiers; false shows rotation/escalation nesting
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "next_on_call": { ... }, // the API response, unmodified "participants": [ // resolved, and the field to read { "id": string, "type": string, "displayName": string, "emailAddress": string } ] }
Responders are Atlassian account ids; this tool resolves them to names for you. If the credentials lack the Jira user scope the ids are still returned, with a note saying so.
Examples:
"Who picks up after this shift?" -> schedule_id=
"Who is on after the shift that covers Thursday?" -> date="2026-08-27T12:00:00Z"
"Draft a handover note" -> combine with jsm_list_alerts query="status:open"
Error handling:
HTTP 401 here while alert tools work means the token is missing read:ops-config:jira-service-management — schedules and on-call sit behind a different scope from alerts, so this is a scope gap, not a bad credential.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO 8601 reference timestamp. The next shift is computed relative to this instant rather than to now, e.g. '2026-08-21T18:30:00Z'. Defaults to now. | |
| flat | No | true (default) returns a flat list of on-call user identifiers. false returns the nested structure showing which rotation or escalation each person came from. | |
| schedule_id | Yes | Schedule id, or the schedule name when schedule_identifier_type='name'. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
| schedule_identifier_type | No | Whether schedule_id holds an id or a schedule name. A name costs one extra lookup, because every schedule endpoint takes an id. | id |
Output Schema
| Name | Required | Description |
|---|---|---|
| shift | No | |
| next_on_call | Yes | |
| participants | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral detail beyond the readOnly/idempotent annotations: it explains that responders are Atlassian account IDs that the tool resolves to names, that missing Jira user scope still returns IDs with a note, and that HTTP 401 indicates a specific scope gap rather than bad credentials. This gives the agent a clear failure-mode interpretation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections for purpose, usage, arguments, return value, examples, and error handling. Every section adds information an agent needs, and the most critical purpose statement is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the full calling context: parameters, return shape, scope requirements, error semantics, and example phrasing. Combined with the annotations and output schema, nothing essential is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description enriches parameter meaning with illustrative examples such as 'Who is on after the shift that covers Thursday?' mapping to date="2026-08-27T12:00:00Z" and clarifying that 'next' is computed relative to the date. These examples help the agent map natural-language intent to parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Return the responders who take over the next shift on a JSM schedule, and when that shift begins.' This clearly distinguishes it from sibling tools like jsm_get_on_call and jsm_get_schedule_timeline by emphasizing the 'next shift' and its start time.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'Use this for handover messages and for deciding whether an alert can wait for the next rotation.' It also gives concrete examples and suggests combining with jsm_list_alerts, though it does not explicitly state when not to use it or name alternatives like jsm_get_on_call.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_get_on_callGet who is on-call nowARead-onlyIdempotent
Return the responders currently on-call for a JSM schedule, optionally evaluated at a past or future timestamp.
This is the tool for "who do I wake up?" and, with the 'date' argument, for "who was on-call when this incident started?" — which is often the more useful question during a post-incident review.
Args:
schedule_id (string): schedule id, or name if schedule_identifier_type='name'
schedule_identifier_type ('id' | 'name'): default 'id'
date (string, optional): ISO 8601 timestamp to evaluate at; defaults to now
flat (boolean): default true — flat list of user identifiers; false shows rotation/escalation nesting
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "on_call": { ... }, // the API response, unmodified "participants": [ // resolved, and the field to read { "id": string, "type": string, "displayName": string, "emailAddress": string } ] }
Responders are Atlassian account ids; this tool resolves them to names for you, so there is no need to look an id up elsewhere. If the credentials lack the Jira user scope the ids are still returned, with a note saying so.
Examples:
"Who's on-call for platform right now?" -> schedule_id="platform", schedule_identifier_type="name"
"Who was on-call at 03:14 UTC yesterday?" -> date="2026-08-20T03:14:00Z"
Error handling:
An empty result means nobody is rostered at that moment — a real and important answer, not a failure.
HTTP 404 means the schedule id/name is wrong; list them with jsm_list_schedules.
HTTP 401 here while alert tools work means the token is missing read:ops-config:jira-service-management — schedules and on-call sit behind a different scope from alerts, so this is a scope gap, not a bad credential.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO 8601 timestamp to evaluate the rotation at, e.g. '2026-08-21T18:30:00Z'. Defaults to now. Use this to answer 'who was on-call when this fired?' | |
| flat | No | true (default) returns a flat list of on-call user identifiers. false returns the nested structure showing which rotation or escalation each person came from. | |
| schedule_id | Yes | Schedule id, or the schedule name when schedule_identifier_type='name'. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
| schedule_identifier_type | No | Whether schedule_id holds an id or a schedule name. A name costs one extra lookup, because every schedule endpoint takes an id. | id |
Output Schema
| Name | Required | Description |
|---|---|---|
| shift | No | |
| on_call | Yes | |
| participants | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds substantial behavioral context beyond this: it resolves Atlassian account ids to display names, identifies 'participants' as the field to read, explains that an empty result is a valid answer rather than a failure, and details 401/404 semantics including the specific missing OAuth scope.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but tightly organized into Args, Returns, Examples, and Error handling sections, with every sentence earning its place. The most important usage distinction is front-loaded, and the error handling section preempts common failure modes an agent would otherwise have to discover by trial.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers everything an agent needs: parameter semantics, return shape, the key field to read, example invocations, and failure interpretation. The presence of an output schema plus this rich narrative makes the tool fully self-contained for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning beyond the schema: it explains when schedule_id is a name versus an id, gives concrete ISO 8601 examples for the date argument, clarifies the practical difference between flat=true and flat=false, and maps natural-language example queries to actual parameter settings. This is genuinely additive rather than redundant.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Return the responders currently on-call for a JSM schedule', and immediately clarifies that it can also evaluate a past or future timestamp. It distinguishes itself from siblings by framing the tool as 'who do I wake up?' and 'who was on-call when this incident started?', which separates it from jsm_get_next_on_call and jsm_list_schedules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states what this tool is for, including the post-incident review use case with the 'date' argument. It gives concrete example prompts mapped to parameter values, and in error handling it directs the agent to jsm_list_schedules for 404s, providing clear routing to an alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_get_request_statusCheck JSM async request statusARead-onlyIdempotent
Check whether an asynchronous alert action actually succeeded.
Every JSM alert write (acknowledge, close, add note, assign, snooze) returns immediately with a requestId and does NOT apply the change synchronously. Pass that requestId here to confirm the action landed — this is the correct way to verify a write, rather than immediately re-reading the alert and finding it unchanged.
Args:
request_id (string): the requestId returned by a write tool
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "action": string, // e.g. "Acknowledge" "isSuccess": boolean, "status": string, // human-readable outcome, e.g. "Alert acknowledged" "processedAt": string, // ISO 8601 "alertId": string, "alias": string }
Examples:
After jsm_acknowledge_alert returns requestId "d383c6e9-..." -> request_id="d383c6e9-..."
Error handling:
HTTP 404 shortly after a write usually means the request is still queued; wait a second and retry.
| Name | Required | Description | Default |
|---|---|---|---|
| request_id | Yes | The requestId returned by any alert write tool (acknowledge, close, note, assign, snooze). | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| request | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly/idempotent/non-destructive, and the description adds important async behavior: writes return immediately and do not apply synchronously, so this endpoint is necessary to confirm the action landed. The 404-usually-queued error note is additional behavioral context beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and then efficiently covers rationale, arguments, return shape, example, and error handling in clearly labeled sections. No sentence is filler; the length is justified by the non-obvious async behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a status-check tool with simple parameters, annotations covering safety, an output shape, a runnable example, and retry guidance, the description fully equips an agent to select and invoke the tool correctly. The async verification context closes the main completeness gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the schema already documents both parameters. The description still adds value by showing a concrete request_id example and giving the exact flow (write tool returns requestId -> pass as request_id), though its Args section largely restates the schema's parameter descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and object: 'Check whether an asynchronous alert action actually succeeded.' It also explains the requestId verification mechanism and distinguishes this tool from immediately re-reading the alert, so an agent can tell it apart from jsm_get_alert and jsm_list_alerts without inspecting the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool: after any JSM alert write returns a requestId, and it tells the agent not to use immediate re-reads as verification. It also provides an example ('After jsm_acknowledge_alert returns requestId...') and error-handling guidance for the queued case, so usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_get_schedule_timelineGet a schedule's shift boundariesARead-onlyIdempotent
Return the on-call rotation periods for a JSM schedule — who covers each shift, and exactly when each shift starts and ends.
This is the tool for any question about shift boundaries rather than a single moment: "when does the current shift end?", "when is the handover?", "who covers the weekend?", "show me next week's rota". Answering those by calling jsm_get_on_call at guessed timestamps takes many calls and still cannot find a boundary exactly; this takes one.
Responders are resolved to names, so periods come back with people rather than bare account ids.
Args:
schedule_id (string): schedule id, or name if schedule_identifier_type='name'
schedule_identifier_type ('id' | 'name'): default 'id'
date (string, optional): ISO 8601 instant the window should cover; defaults to now
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "shifts": [ { "start": string, // ISO 8601 "end": string, // ISO 8601 "rotation_name": string, "type": "base" | "override" | "forwarding" | "historical", "responders": [ { "id": string, "displayName": string, "emailAddress": string } ] } ] }
The window spans roughly three weeks around the requested date, so both the shift in progress and the ones on either side of it are included.
Examples:
"When does the current on-call shift end?" -> schedule_id=
"Who has the rota next week?" -> date=
"When did the handover happen on Tuesday?" -> date="2026-08-25T00:00:00Z"
Error handling:
Periods of type 'historical' are in the past; 'override' means someone swapped in.
HTTP 401 here while alert tools work means the token is missing read:ops-config:jira-service-management — the same scope the other on-call tools need.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO 8601 instant the returned window should cover, e.g. '2026-08-27T12:00:00Z'. Defaults to now. | |
| schedule_id | Yes | Schedule id, or the schedule name when schedule_identifier_type='name'. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
| schedule_identifier_type | No | Whether schedule_id holds an id or a schedule name. A name costs one extra lookup, because every schedule endpoint takes an id. | id |
Output Schema
| Name | Required | Description |
|---|---|---|
| shifts | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and idempotent, and the description adds substantial behavior beyond that: the approximate three-week window, responder resolution to names, interpretation of shift types like 'override' and 'historical', and specific HTTP 401 troubleshooting context. This gives the agent useful operational expectations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured and every section earns its place: purpose, usage guidance, parameters, return shape, examples, and error handling. The most important scoping statement is front-loaded, making it easy for an agent to quickly decide whether to use this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only scheduling tool with a rich output schema, the description covers the key gaps an agent would face: what the window covers, what shift types mean, how responders appear, and how to diagnose auth failures. Nothing essential is missing for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's Args section largely mirrors the schema rather than adding new parameter-level semantics, though the examples provide some usage nuance. Overall, the schema already carries the parameter documentation burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource: returning on-call rotation periods and shift boundaries for a JSM schedule. It further differentiates itself from jsm_get_on_call by explicitly framing this as the tool for boundary questions rather than single-moment queries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use this tool ('questions about shift boundaries rather than a single moment'), gives concrete example queries, and contrasts it with jsm_get_on_call. It even explains the cost tradeoff of using schedule_identifier_type='name', giving clear selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_list_alert_logsList JSM alert activity logsARead-onlyIdempotent
List the system activity log for a JSM alert — every state transition, notification, escalation and automated action, newest first by default.
Use this to answer "why did nobody get paged?" or "when was this escalated and to whom?". Logs are system-generated; human comments live in jsm_list_alert_notes instead.
Args:
alert_id (string): the full alert id (not the tinyId)
limit (number): 1-100, default 20
order ('asc' | 'desc'): default 'desc'
offset (string, optional): opaque cursor from a previous response's next_cursor
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "logs": [{ "log": string, "owner": string, "createdAt": string, "type": string, "offset": string }], "pagination": { "count": number, "has_more": boolean, "next_cursor": string } }
Examples:
"Trace the escalation path for this alert" -> alert_id=, order="asc", limit=100
"Who acked this and when?" -> alert_id=, limit=20
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-100, default 20). | |
| order | No | Chronological order of returned entries (default 'desc', newest first). | desc |
| offset | No | Cursor from a previous response's 'next_cursor'. These endpoints use opaque cursors, not numeric offsets. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| logs | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context: logs are system-generated, sorted newest-first by default, and opaque cursors are used for pagination. This is useful beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear opening sentence, an explicit use-case section, an Args list, a Returns sample, and examples. Every section earns its place and the most important scoping information ('system-generated' vs human comments) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five parameters, a clear output schema, annotations, and sibling context, the description covers everything an agent needs: what the tool does, when to use it, which sibling to use instead, parameter semantics, response shape, and worked examples. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all parameters. The description adds extra value by explaining that alert_id is the full id and not the tinyId, suggesting how to obtain it via jsm_list_alerts, and providing concrete examples that map use cases to parameter choices. This goes beyond simple schema repetition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'List the system activity log for a JSM alert', and enumerates the content covered: 'every state transition, notification, escalation and automated action'. It also distinguishes itself from jsm_list_alert_notes, so an agent can tell it apart from sibling tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance with example queries like "why did nobody get paged?" and "when was this escalated and to whom?", and explicitly says human comments live in jsm_list_alert_notes instead. This clear exclusion and alternative make the usage boundary unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_list_alert_notesList JSM alert notesARead-onlyIdempotent
List the notes (human comments) recorded on a JSM alert's activity timeline, newest first by default.
Notes are where responders write triage context, and where integrations append re-fire and resolution updates for a deduplicated alert. Read them before acting on an alert so you don't repeat work someone already did.
Args:
alert_id (string): the full alert id (not the tinyId)
limit (number): 1-100, default 20
order ('asc' | 'desc'): default 'desc'
offset (string, optional): opaque cursor from a previous response's next_cursor
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "notes": [{ "note": string, "owner": string, "createdAt": string, "offset": string }], "pagination": { "count": number, "has_more": boolean, "next_cursor": string } }
Examples:
"Has anyone looked at this alert yet?" -> alert_id=, limit=10
"Read the full triage history oldest first" -> order="asc", limit=100
Note: these endpoints page with opaque cursors, not numeric offsets — pass next_cursor back as 'offset'.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-100, default 20). | |
| order | No | Chronological order of returned entries (default 'desc', newest first). | desc |
| offset | No | Cursor from a previous response's 'next_cursor'. These endpoints use opaque cursors, not numeric offsets. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| notes | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate read-only, idempotent, non-destructive behavior, and the description adds meaningful context beyond that: default ordering, opaque cursor pagination rather than numeric offsets, the distinction between human notes and integration updates, and response format behavior. This is rich, accurate behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well structured with clear sections: overview, usage rationale, arguments, return shape, examples, and a pagination caveat. Every sentence contributes practical information, and the most decision-relevant detail (what this tool returns and when to use it) is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema and rich annotations, the description is fully adequate for an agent to select and invoke the tool correctly. It covers ordering, pagination, the full alert id requirement, response formats, and example usage. Nothing an agent needs for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so the baseline is 3. The description adds value by emphasizing that alert_id is the full id and not tinyId, explaining the opaque cursor semantics again, and giving example parameter combinations for natural-language use cases. This goes beyond merely restating schema field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List'), a specific resource ('notes on a JSM alert's activity timeline'), and the default ordering ('newest first'). It clearly identifies these as human comments, distinguishing them from related alert actions and from the sibling log tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable guidance: 'Read them before acting on an alert so you don't repeat work someone already did.' It also provides example queries showing when to use different limits and orderings. It does not explicitly compare to siblings like jsm_list_alert_logs, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_list_alertsSearch JSM alertsARead-onlyIdempotent
Search and list alerts in Jira Service Management Operations.
This is the entry point for almost every alert workflow: use it to find open or unacknowledged alerts, filter by priority/team/tag, and to resolve a short tinyId (as shown in the JSM UI) into the full alert id that every other alert tool requires. It reads only — it never creates or modifies alerts.
Args:
query (string, optional): field:value search, e.g. "status:open AND priority:P1"
limit (number): 1-100, default 20
offset (number): records to skip, default 0
sort (string): field to sort by, default "createdAt"
order ('asc' | 'desc'): default "desc"
response_format ('markdown' | 'json'): default "markdown"
Returns (json format): { "alerts": [ { "id": string, // full alert id — pass this to other tools "tinyId": string, // short id shown in the JSM UI "message": string, "status": "open" | "closed", "acknowledged": boolean, "priority": "P1".."P5", "count": number, // dedupe count "tags": string[], "owner": string, "createdAt": string, // ISO 8601 "lastOccurredAt": string } ], "pagination": { "count": number, "offset": number, "has_more": boolean, "next_offset": number } }
Examples:
"What's on fire right now?" -> query="status:open AND acknowledged:false", sort="createdAt"
"Show P1s from the Payments team" -> query="priority:P1 AND teams:Payments"
"Find the alert about Redis latency" -> query="message:Redis"
Constraints and errors:
offset + limit must stay below 20000; the API refuses to page deeper.
A malformed query returns HTTP 400 — field names are case-sensitive.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Field to sort by (default 'createdAt'). These four are the only values the API accepts. | createdAt |
| limit | No | Maximum number of records to return (1-100, default 20). | |
| order | No | Sort direction (default 'desc', i.e. newest first). | desc |
| query | No | JSM alert search query. Field:value syntax, combinable with AND/OR/NOT. Examples: "status:open", "status:open AND priority:P1", "acknowledged:false AND createdAt > 1704067200000", "tag:database AND status:open", "teams:Payments". Omit to return the most recent alerts unfiltered. | |
| offset | No | Number of records to skip, for paging. Use the 'next_offset' from a previous response. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| alerts | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, and non-destructive behavior, and the description reinforces this. It adds genuinely useful constraints beyond annotations: offset + limit must stay below 20000, malformed queries return HTTP 400, field names are case-sensitive, and the response includes pagination details.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but well-structured with sections for arguments, return values, examples, and constraints. Some content duplicates the schema and output schema, but the examples and error constraints earn their place for an entry-point tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is self-sufficient: it explains what the tool does, how to use every parameter, what the response looks like, and which failure modes to expect. With the output schema and detailed examples, an agent has everything needed to call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters at 100%, so the baseline is already strong. The description adds value with query examples, field:value syntax guidance, default values restated in context, and practical constraints like the 20000-record paging limit that are not fully expressed in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the tool as the search/list entry point for Jira Service Management alerts, with a specific verb and resource. It differentiates itself by noting it resolves tinyId to the full alert id required by other alert tools and explicitly states it is read-only, which separates it from sibling mutation tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong context: it is the entry point for almost every alert workflow, useful for finding open/unacknowledged alerts, filtering by priority/team/tag, and resolving tinyIds. It does not explicitly name sibling alternatives like jsm_get_alert for single-alert lookups, but the read-only statement and entry-point framing make the intended usage clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_list_capabilitiesList this server's toolsetsARead-onlyIdempotent
Report every toolset this server knows about, whether it is currently loaded, and how to load one that is not.
Call this before telling the user something is impossible. This server carries far more of the Jira Service Management Operations API than any one install registers — the operator chooses which families load, so an absent tool usually means "not enabled here", not "not supported". This tool tells you which of the two it is, and names the exact environment variable to change.
It takes no arguments, makes no API call, and needs no credentials, so it also answers when the token is missing or wrong.
Args: none beyond response_format.
response_format ('markdown' | 'json'): default "markdown"
Returns (json format): { "requested": string[], // the names this process was configured with "read_only": boolean, "tool_count": number, // tools actually registered "toolsets": [ { "name": string, "enabled": boolean, // whether any of its tools are registered "selected": boolean, // whether the selection asked for it; false enabled with true // selected means read-only mode withheld the tools "summary": string, "scopes": string[], // OAuth scopes this family needs "tool_count": number, "tools": string[], "unverified": string // present only when the family was never seen to work } ] }
A toolset carrying unverified ships but no profile loads it, 'all' included — it has to be named on its own, as JSM_TOOLSETS=all,. The string says what blocked it: a JSM plan that excludes the feature, or a permission no credential on the test site held. Enabling it is allowed and may well work on a different site, but say what the limit was before suggesting it.
Examples:
User asks for something no loaded tool covers -> call this, then tell them which toolset covers it and that JSM_TOOLSETS needs to include it.
Tool exists but its toolset is unverified -> say so plainly, quote the reason, and let the user decide whether their plan differs.
"What can you do here?" -> call this rather than guessing from your tool list.
Note: changing JSM_TOOLSETS requires restarting the server. You cannot enable a toolset from inside a conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| response_format | No | Output format. 'markdown' is compact (default); 'json' returns every field. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| toolsets | Yes | |
| read_only | Yes | |
| requested | Yes | |
| tool_count | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/idempotentHint annotations by disclosing that it makes no API call, needs no credentials, works even when the token is missing or wrong, and explaining read-only mode's effect on toolset registration. The unverified field semantics and the JSM_TOOLSETS restart requirement add important operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but front-loaded with purpose, then flows into usage, return shape, and examples. The inline JSON return block partially duplicates the output schema, so it is not maximally concise, but all sections carry meaningful guidance for a meta-tool that needs careful interpretation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers selection criteria, failure modes (unverified), credential-less operation, the restart limitation, and how to interpret fields like selected vs enabled. With an output schema already present, nothing an agent needs to correctly invoke and interpret this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already covers response_format with an enum and default description, and coverage is 100%. The description only restates the default and format choices without adding meaning beyond the schema, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific action and resource: 'Report every toolset this server knows about, whether it is currently loaded, and how to load one that is not.' This clearly differentiates it from the alert- and schedule-focused sibling tools and establishes it as a meta-capability tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance: 'Call this before telling the user something is impossible' and 'What can you do here?' — call rather than guessing. It also covers the unverified-toolset scenario and tells the agent to quote the reason, making the decision process concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_list_schedulesList JSM on-call schedulesARead-onlyIdempotent
List the on-call schedules configured in JSM Operations, with their ids, owning teams and timezones.
Start here when you need a schedule id for jsm_get_on_call or jsm_get_next_on_call, or when you want to know which rotations exist at all.
Args:
limit (number): 1-100, default 20
offset (number): records to skip, default 0
response_format ('markdown' | 'json'): default 'markdown'
Returns (json format): { "schedules": [ { "id": string, "name": string, "description": string, "timezone": string, "enabled": boolean, "ownerTeam": { "id": string, "name": string } } ], "pagination": { "count": number, "offset": number, "has_more": boolean, "next_offset": number } }
Examples:
"What on-call rotations do we have?" -> no args
"Find the schedule id for the platform rotation" -> then match on name
Error handling:
HTTP 401 here while alert tools work means the token is missing read:ops-config:jira-service-management — schedules and on-call sit behind a different scope from alerts, so this is a scope gap, not a bad credential.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of records to return (1-100, default 20). | |
| offset | No | Number of records to skip, for paging. Use the 'next_offset' from a previous response. | |
| response_format | No | Output format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use. | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| schedules | Yes | |
| pagination | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark the tool read-only, idempotent, and non-destructive. The description adds substantial behavioral context beyond that: it documents the response envelope, pagination fields, default output format, and even explains a likely HTTP 401 cause (missing read:ops-config:jira-service-management scope) that distinguishes this family from alert tools. This is far beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every section earns its place: purpose, usage routing, parameter summary, return shape, examples, and error handling. The most important usage guidance is front-loaded, and the rest is compact and scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no required parameters, this is complete. It includes the output structure, pagination semantics, example invocations, and a likely auth failure cause. An agent has everything needed to call it successfully and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% coverage, with each parameter already documented by name, type, default, and constraints. The description largely restates the parameters, but it does add light semantic value by tying limit/offset to pagination and providing an example that says matching on the returned name is how you find a specific schedule id. That is useful but not a major addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('List') and a specific resource ('on-call schedules configured in JSM Operations'), then names the key fields returned: ids, owning teams, and timezones. It also differentiates itself from sibling tools like jsm_get_on_call and jsm_get_next_on_call by explicitly positioning itself as the entry point for discovering schedule ids and rotations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use guidance: use when you need a schedule id for jsm_get_on_call or jsm_get_next_on_call, or when you want to enumerate existing rotations. This explicitly names sibling tools and the selection condition, so an agent can route correctly without opening any other definitions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_remove_alert_extra_propertiesRemove key/value properties from a JSM alertADestructiveIdempotent
Remove properties from a JSM alert by key.
Args:
alert_id (string): the full alert id (not the tinyId)
keys (string[]): the property keys to remove — keys, not values
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
A key that is not present is not an error, so a receipt here does not prove anything was removed. Read the alert back if that matters.
Constraints and errors:
Needs delete:ops-alert:jira-service-management, a separate grant from write:ops-alert.
| Name | Required | Description | Default |
|---|---|---|---|
| keys | Yes | Property keys to remove. Keys, not values. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the action is asynchronous, that a successful receipt does not prove removal, and that missing keys are silently ignored. It also explains the permission distinction between delete:ops-alert and write:ops-alert. These are meaningful behavioral details not available from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with a clear first-sentence purpose, Args, Returns, an IMPORTANT async warning, a caveat about receipt semantics, and a constraints/errors section. Every sentence earns its place and the formatting makes the critical warnings easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, asynchronous tool, the description covers everything an agent needs: what to pass, what is returned, how to verify completion, what the semantics of a non-existent key are, and what permission is required. It is self-sufficient for correct invocation and follow-up.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the key semantics ('full alert id not tinyId', 'keys, not values') but does not add meaning beyond what the schema already provides. It is accurate but not additive.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Remove properties from a JSM alert by key', a specific verb-plus-resource statement that clearly identifies the operation. It distinguishes this from sibling tools that deal with tags, notes, or adding properties, and the title reinforces the same scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational guidance: the action is asynchronous, must be verified with jsm_get_request_status, and removal of absent keys is not an error. It also states the required delete grant. It does not explicitly contrast with alternatives like jsm_remove_alert_tags or jsm_add_alert_extra_properties, but the behavior and prerequisites are clear enough for an agent to know when to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_remove_alert_tagsRemove tags from a JSM alertADestructiveIdempotent
Remove one or more tags from a JSM alert.
Args:
alert_id (string): the full alert id (not the tinyId)
tags (string[]): the tag names to remove
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Removal matches exactly and is case-sensitive, so removing 'DB' leaves 'db' in place. Read the alert's current tags with jsm_get_alert first rather than guessing the casing — a removal that silently matches nothing still returns a successful receipt.
Constraints and errors:
Needs delete:ops-alert:jira-service-management, a separate grant from write:ops-alert. Adding tags can work where removing them returns 403.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | Yes | Tag names. Case-sensitive, and matched exactly on removal. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this destructive/non-read-only/idempotent; the description adds meaningful behavioral detail beyond that: the action is asynchronous and returns a requestId to poll, a no-op removal still returns a successful receipt, and a separate delete:ops-alert grant is required. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then organized into Args/Returns/IMPORTANT/Constraints. Every sentence earns its place: async polling, exact matching, permission requirements, and edge-case behavior are all included without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with an output schema, the description covers everything an agent needs: required permission, async verification path, exact-match behavior, and the silent-success edge case. The siblings list and schema round out the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema already covers both parameters at 100%, including the full-id-vs-tinyId warning and case-sensitivity. The description reinforces these and adds practical guidance on how to choose tag values (read current tags first rather than guessing casing), slightly exceeding the schema. It doesn't change the baseline much because the schema already does most of the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Remove one or more tags from a JSM alert.' This clearly distinguishes it from siblings like jsm_add_alert_tags and jsm_remove_alert_extra_properties, and the title and description agree.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use context: removed tags are exactly/case-sensitively matched, and it instructs reading current tags with jsm_get_alert first and polling jsm_get_request_status after. It does not explicitly name an alternative tool for adding tags or state a when-not-to-use condition, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_snooze_alertSnooze a JSM alert until a given timeAIdempotent
Silence a JSM alert's notifications until a specific instant, after which it resumes as if untouched.
Snoozing is the right tool for "we know, and there is nothing to do until the maintenance window ends" — it stops the paging without pretending the alert is resolved. Closing it would remove it from the open queue and lose the fact that it is still an open problem.
Args:
alert_id (string): the full alert id (not the tinyId)
end_time (string): ISO 8601 instant with an offset, e.g. "2026-09-05T18:30:00Z"
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
Time handling is the sharp edge here. end_time is an absolute instant, not a duration — "snooze for two hours" means computing the instant yourself from the current time. A past instant is accepted, and the alert un-snoozes immediately, which looks exactly like the call having failed. Send an explicit offset ('Z' or '+05:30') rather than a bare local time.
Examples:
"Snooze this until the deploy finishes at 6pm UTC" -> end_time="2026-09-05T18:00:00Z"
"Give it an hour" -> compute now + 1h as an ISO instant, then pass it
Constraints and errors:
Snoozing a closed alert has no useful effect; close is terminal for notification purposes.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. | |
| end_time | Yes | When the snooze ends, as an ISO 8601 instant with an offset, e.g. '2026-09-05T18:30:00Z'. Must be in the future — a past instant is accepted and the alert un-snoozes immediately. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is a mutating, non-destructive, idempotent action, but the description adds important behavioral detail beyond that: the action is asynchronous and returns a requestId that must be checked via jsm_get_request_status. It also reveals edge behavior like past end_time instants causing immediate un-snoozing and snoozing a closed alert having no effect.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but it is tightly organized into purpose, usage, arguments, async warning, time handling, examples, and constraints. Every paragraph earns its place by addressing a distinct operational risk, with the most critical caveats (async execution and absolute-time semantics) appearing early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's non-obvious async behavior, time-format sharp edges, and terminal behavior for closed alerts, the description is complete. It covers how to invoke the tool, how to verify the result, what errors or misleading outcomes to expect, and what the return payload looks like, while the output schema covers the exact returned shape.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description goes well beyond the schema. It warns that alert_id is the full id and not the tinyId, clarifies that end_time is an absolute instant rather than a duration, gives concrete ISO 8601 examples, and tells the agent how to handle a relative request like 'give it an hour'. The only blemish is the schema's contradictory 'Must be in the future — a past instant is accepted' phrasing, which the description resolves correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Silence ... notifications') and resource ('a JSM alert') and clarifies that it is a temporary pause which resumes later. It distinguishes the action from closing an alert, so an agent can immediately tell it apart from the sibling jsm_close_alert.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames snoozing as the right choice when there is 'nothing to do until the maintenance window ends' and explains why closing would be wrong because it removes the alert from the open queue and loses the open-problem state. This gives clear when-to-use and when-not-to-use guidance against a relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_unacknowledge_alertTake back an acknowledgement on a JSM alertAIdempotent
Return an acknowledged JSM alert to unacknowledged, so escalation notifications resume.
Use this when someone acked an alert they cannot actually work — picked it up by mistake, or got pulled onto something else — and it needs to go back into the escalation path so the next responder is paged. It does not close, snooze or reassign the alert.
Args:
alert_id (string): the full alert id (not the tinyId)
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
This restarts paging. Say so before doing it on someone's behalf — the practical effect is that a phone rings.
Examples:
"I can't take this one after all, put it back" -> alert_id=, note="Handing back, on another incident"
Constraints and errors:
Unacknowledging an alert that was never acknowledged is a no-op, not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true), the description discloses that the action is asynchronous and should be verified via jsm_get_request_status, that it restarts paging and can cause a phone to ring, and that unacknowledging an already-unacknowledged alert is a no-op. These details align with and enrich the annotations rather than contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with its core purpose and uses clear sections including Args, Returns, IMPORTANT, Examples, and Constraints. It is somewhat long, and the example imports a non-existent `note` parameter, but nearly every other sentence carries meaningful operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutating alert tool with an output schema, the description covers return shape, asynchronous verification, idempotency, and human-impact warning, so an agent has enough to invoke it correctly. The only real gap is the misleading example that references a `note` parameter not present in the input schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully documents alert_id at 100% coverage, so the baseline is 3; the description adds little beyond repeating the full-id warning. However, the example line `note="Handing back, on another incident"` introduces a `note` argument that is absent from the schema and disallowed by additionalProperties=false, which could mislead an agent into passing an invalid parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states the exact action ('Return an acknowledged JSM alert to unacknowledged') and the consequence ('escalation notifications resume'). This is a specific verb+resource phrasing that clearly distinguishes the tool from sibling alert-mutation actions, and the 'does not close, snooze or reassign' line reinforces the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit when-to-use scenario ('picked it up by mistake, or got pulled onto something else') and explicitly excludes alternative behaviors by stating it does not close, snooze, or reassign. It also adds practical advice about warning the person before restarting paging, which helps an agent decide when to invoke the tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_update_alert_fieldUpdate a JSM alert's priority, message or descriptionADestructiveIdempotent
Overwrite one field on an existing JSM alert: its priority, its message, or its description.
This is how an alert gets corrected once triage knows more than the integration that raised it did — a P3 that turns out to be customer-facing, a message that says "check failed" when it should say which check, a description that should carry what has been tried.
Args:
alert_id (string): the full alert id (not the tinyId)
field ('priority' | 'message' | 'description'): which field to overwrite
value (string): the new value
There are no 'user' or 'source' arguments here, unlike the other write tools: these three endpoints take only the value.
Returns: { "requestId": string, "result": string, "alert_id": string }
IMPORTANT: this action is asynchronous. Verify with jsm_get_request_status using the returned requestId.
This overwrites, it does not append. Reading the current value first with jsm_get_alert is the difference between adding context to a description and destroying what someone else wrote in it. If you mean to add to the record without replacing anything, use jsm_add_alert_note instead — notes are additive and are what the activity timeline is for.
For field='priority', value must be exactly one of P1, P2, P3, P4, P5 — not "high", not "1", not "p1".
Examples:
"This is worse than we thought, make it a P1" -> field="priority", value="P1"
"Fix the alert title to name the failing endpoint" -> read it first, then field="message"
Constraints and errors:
Raising priority may change who is paged, since routing and escalation rules read it.
| Name | Required | Description | Default |
|---|---|---|---|
| field | Yes | Which field to overwrite. Each is a separate endpoint under the hood. | |
| value | Yes | The new value. For field='priority' this must be exactly one of P1, P2, P3, P4, P5. For 'message' keep it to one line — it is the headline responders read first. For 'description' anything goes, and an empty string clears it. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | No | |
| alert_id | Yes | |
| requestId | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the action is asynchronous, overwrites rather than appends, and may change paging behavior when priority is raised. It also warns that not reading the current value first can destroy content written by someone else. These behavioral traits are concrete and directly relevant to safe invocation, and there is no contradiction with the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every section earns its place: purpose, arguments, return value, async behavior, destructive warning, alternative tool, field-specific constraints, and examples. The key warning about overwriting is front-loaded after the summary, and the structure makes the important caveats easy to find.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is complete for a destructive, asynchronous mutation tool. It covers what the operation does, how to invoke it correctly, what to do after invocation, what pitfalls exist, and which siblings to use instead. The output schema plus provided return example fill in the response contract, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema description coverage is 100%, the description adds substantial meaning: alert_id must be the full id and not the tinyId, priority must be exactly P1–P5, message should be one line, and an empty description clears it. It also clarifies that there are no user/source arguments, which helps the agent avoid confusion with other tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Overwrite one field on an existing JSM alert' and immediately enumerates the three possible fields. It clearly distinguishes itself from sibling write tools by contrasting with jsm_add_alert_note, and the purpose is unambiguous even without reading the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: correcting an alert once more is known, and warns against using it to append context. It names the exact alternative (jsm_add_alert_note) and tells the agent to read the current value first with jsm_get_alert. It also explains the async follow-up step with jsm_get_request_status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
jsm_update_alert_noteEdit a note on a JSM alertADestructiveIdempotent
Replace the text of an existing note on a JSM alert.
Use it to correct a note you just wrote — a wrong hostname, a stale conclusion. Prefer adding a new note with jsm_add_alert_note for anything that reads as a development rather than a correction: the timeline is the record of what responders knew and when, and editing history out of it costs more than an extra line.
Args:
alert_id (string): the full alert id (not the tinyId)
note_id (string): id of the note to edit, from jsm_list_alert_notes
note (string): the replacement text
Returns the updated note: { "alert_id", "note_id", "note", "owner", "createdAt", "updatedAt" }
Unlike every other alert write, this one is synchronous. It answers with the note itself, so there is no requestId and nothing to verify with jsm_get_request_status.
This replaces the note's whole text. There is no append. Read the note first if you mean to add to it.
Examples:
"Fix my last note, the host is db-3 not db-2" -> jsm_list_alert_notes, take the id, then update with the corrected text
Constraints and errors:
HTTP 404 means the note id does not belong to that alert. Note ids come from jsm_list_alert_notes, not from the note's text.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | Note text to record on the alert's activity timeline. | |
| note_id | Yes | Id of the note to edit, from jsm_list_alert_notes. Not the note's text. | |
| alert_id | Yes | Full alert id, e.g. '9b251e07-73c9-4907-9996-8cb53a6a20d0-1704440650350'. This is NOT the short tinyId shown in the JSM UI — get the full id from jsm_list_alerts first. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| note | No | |
| owner | No | |
| note_id | No | |
| alert_id | Yes | |
| createdAt | No | |
| updatedAt | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark destructiveHint and idempotentHint, and the description adds important behavior beyond that: this operation is synchronous unlike other alert writes, returns the updated note with no requestId, replaces the entire note text with no append, and has a specific 404 meaning. This is exactly the kind of behavioral context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every section earns its place: primary behavior, usage guidance, parameter semantics, return behavior, destructive warning, example, and error meaning. It is well-structured with headers and front-loaded warnings, making it easy to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 3-parameter mutation with an output schema and rich annotations, this description is complete. It covers why to use it, what it does, how it behaves differently from siblings, what gets replaced, what returns, and how to interpret a common error. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description's Args section adds meaningful clarification: alert_id must be the full id not the tinyId, note_id is sourced from jsm_list_alert_notes, and note is the complete replacement text. It reinforces and slightly extends the schema without merely repeating it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Replace the text of an existing note') on a specific resource (a JSM alert note), and explicitly contrasts it with jsm_add_alert_note. This makes it immediately distinguishable from sibling note tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly says when to use this tool: to correct a note just written. It also explicitly says when NOT to use it and which sibling to prefer instead: use jsm_add_alert_note for anything read as a development, because the timeline is the record. The example reinforces this decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
19 tool updates
v2.0.0- Changed
jsm_acknowledge_alert3 fields changed- removed
Input schema / properties / noteRemoved value: -{ - "description": "Optional note recorded alongside the acknowledgement.", - "maxLength": 25000, - "type": "string" -} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.", - "type": "string" -} - removed
Input schema / properties / userRemoved value: -{ - "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.", - "type": "string" -}
- Added
jsm_add_alert_extra_properties - Changed
jsm_add_alert_note2 fields changed- removed
Input schema / properties / sourceRemoved value: -{ - "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.", - "type": "string" -} - removed
Input schema / properties / userRemoved value: -{ - "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.", - "type": "string" -}
- Changed
jsm_add_alert_responder3 fields changed- removed
Input schema / properties / noteRemoved value: -{ - "description": "Optional note recorded with the change.", - "maxLength": 25000, - "type": "string" -} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.", - "type": "string" -} - removed
Input schema / properties / userRemoved value: -{ - "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.", - "type": "string" -}
- Added
jsm_add_alert_tags - Added
jsm_assign_alert - Changed
jsm_close_alert3 fields changed- removed
Input schema / properties / noteRemoved value: -{ - "description": "Optional note explaining the resolution. Strongly recommended — it's the record future responders will read.", - "maxLength": 25000, - "type": "string" -} - removed
Input schema / properties / sourceRemoved value: -{ - "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.", - "type": "string" -} - removed
Input schema / properties / userRemoved value: -{ - "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.", - "type": "string" -}
- Added
jsm_create_alert - Added
jsm_delete_alert - Added
jsm_delete_alert_note - Added
jsm_escalate_alert - Added
jsm_execute_alert_action - Added
jsm_list_capabilities - Added
jsm_remove_alert_extra_properties - Added
jsm_remove_alert_tags - Added
jsm_snooze_alert - Added
jsm_unacknowledge_alert - Added
jsm_update_alert_field - Added
jsm_update_alert_note
13 tool updates
v1.1.1- First observed
jsm_acknowledge_alert - First observed
jsm_add_alert_note - First observed
jsm_add_alert_responder - First observed
jsm_close_alert - First observed
jsm_get_alert - First observed
jsm_get_next_on_call - First observed
jsm_get_on_call - First observed
jsm_get_request_status - First observed
jsm_get_schedule_timeline - First observed
jsm_list_alert_logs - First observed
jsm_list_alert_notes - First observed
jsm_list_alerts - First observed
jsm_list_schedules
TDQS
Scored across 28 tools
Every tool maps to a distinct resource and action, and the descriptions actively call out neighboring tools to prevent confusion (e.g. logs vs notes, create vs add note, close vs delete, current vs next on-call). There is no pair of tools that appears to do the same thing.
All tools share the jsm_ prefix and follow a snake_case verb_noun pattern, with consistent list/get/update/delete pairs throughout. Minor deviations exist between create_alert vs add_alert_* for creating versus attaching, and delete vs remove for notes versus tags/properties, but the conventions are still predictable.
28 tools is on the high side, though the server covers two related domains—alert lifecycle and on-call schedules—plus async verification and capability discovery. The granularity is justified by distinct operations, but the surface is heavy for an agent to scan at a glance.
The alert lifecycle is thoroughly covered: create, read, list, update, acknowledge, snooze, close, delete, assign, escalate, responders, notes, tags, extra properties, and logs. Notable gaps are the lack of a remove-responder tool and no way to list escalation policies, teams, or custom action names, which sometimes forces the user to supply ids manually.
Maintenance
Related MCP Connectors
Manage incidents and on-call: list/create/update incidents, who is on call, on-call overrides.
Read incidents, services, teams, on-call schedules; acknowledge, resolve and note incidents.
Read monitors, incidents, heartbeats, on-call and status pages; acknowledge or resolve incidents.
Read status-page status, services, incidents and metrics; create, update and publish incidents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables comprehensive Opsgenie alert management including listing, creating, acknowledging, and closing alerts, as well as managing alert notes, logs, and custom properties through natural language.168MIT
- FlicenseAqualityFmaintenanceEnables interaction with Jira and Confluence APIs to search, create, and manage issues, pages, comments, and attachments across both Atlassian platforms.7-
- AlicenseNot gradedqualityDmaintenanceEnables PagerDuty incident response operations including listing incidents, acknowledging and resolving incidents, looking up on-call schedules, and listing services.MIT
- AlicenseAqualityCmaintenanceEnables issue search, creation, updates, comments, status transitions, and project listing in Jira, purpose-built for security incident management and SOC workflows.9118Apache 2.0