Skip to main content
Glama
rrvrs

jira-alerts-mcp

Jira Alerts MCP

Find what is paging you, and who is on call — from your agent.

CI npm Listed on mcpservers.org License: Apache 2.0 Node

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

An agent answering who is on call, listing the open alerts, then acknowledging one and reading the applied acknowledgement back

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_info

It 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}" \
  --env JSM_TOOLSETS='all' \
  -- npx -y jira-alerts-mcp

JSM_TOOLSETS=all registers every verified toolset — 82 tools rather than the 28 the responder default gives you, adding schedules, teams, maintenance windows and routing. Drop the line to start narrow; all is not the widest possible surface, because the three quarantined families still have to be asked for by name. See Choosing your toolsets for what each one covers and why a bigger tool list is not automatically better.

--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

~/Library/Application Support/Claude/claude_desktop_config.json

Windows

%APPDATA%\Claude\claude_desktop_config.json

{
  "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",
        "JSM_TOOLSETS": "all"
      }
    }
  }
}

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:

  • npx wasn'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 from which node and point "args" at the installed dist/index.js, or install Node system-wide. A Node older than 24 that is found fails as EBADENGINE rather 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 under mcpServers. Look for Startup 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 build

Then 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.js

Configuration

Variable

Required

Notes

JSM_CLOUD_ID

yes

Your Atlassian site's cloud id (a UUID)

JSM_EMAIL + JSM_API_TOKEN

one of

Create a token

JSM_OAUTH_TOKEN

one of

OAuth 3LO bearer; takes precedence if set

JSM_TOOLSETS

no

Which tool families to register — see Choosing your toolsets. Unset registers responder

JSM_READ_ONLY

no

true withholds every write tool

TRANSPORT

no

stdio (default) or http

PORT / HOST

no

HTTP transport; defaults to 127.0.0.1:3000

ALLOWED_HOSTS

no

Comma-separated Host allowlist. Required if you set HOST beyond loopback — see SECURITY.md

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

heartbeats

402 Please upgrade your pricing plan for Heartbeat Monitoring on every endpoint but the ping

Heartbeat Monitoring is not in every JSM plan. jsm_ping_heartbeat does work — and answers PONG even for a heartbeat that does not exist, so a successful ping proves nothing on its own.

attachments

403 Feature not available in your plan, for a fully scoped token holding Jira admin

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.

forwarding

422 Users cannot be forwarded back to themselves

A forwarding rule needs two distinct users and the test site had one, so only jsm_list_forwarding_rules could be exercised.

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

alerts

Alert reads: search, detail, notes, activity logs, request status

5

read:ops-alert:…

alert-actions

Create, acknowledge, close, snooze, assign, escalate, annotate, tag, delete

18

read: + write:ops-alert:…, plus delete:ops-alert:… for the destructive ones

oncall

Who is on call now and next, shift timelines, schedule discovery

4

read:ops-config:…

schedules

Schedules, rotations and overrides — create, edit, delete

14

read: + write:ops-config:…

teams

Team discovery, team roles, contact methods

13

read: + write:ops-config:…

maintenance

Maintenance windows, site-wide or per team

6

read: + write:ops-config:…

routing

Escalations, routing rules, notification rules and steps

21

read: + write:ops-config:…

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

heartbeats

Dead-man's switches that alert when a ping stops arriving

5

402 — not in every JSM plan

attachments

List, download and delete alert attachments

3

403 — not in every JSM plan

forwarding

Forward one person's notifications to another

5

Needs two users; untested

Plus four profiles, which are bundles of the above:

Profile

Contents

Tools

responder

The default. alerts + alert-actions + oncall

27

core

The thirteen tools that shipped before toolsets existed, plus jsm_create_alert

14

admin

oncall + schedules + teams + maintenance + routing — configuration, not incidents

58

all

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

read:ops-alert:jira-service-management

The alert writes

read:ops-alert:… and write:ops-alert:… — both

The destructive alert tools

also delete:ops-alert:jira-service-management

jsm_list_schedules, jsm_get_on_call, jsm_get_next_on_call, jsm_get_schedule_timeline

read:ops-config:jira-service-management

Resolving responder ids to names (optional)

read:jira-user

Three consequences worth knowing before you mint a token:

  • Writes need the read scope too. A token carrying only write:ops-alert:jira-service-management fails. Atlassian requires the read scope alongside it on every write endpoint.

  • ops-config is 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 only ops-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-…); with read:jira-user the 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, not read:user:jira. The granular scheme does cover these endpoints, but only as the complete set read:application-role:jira + read:group:jira + read:user:jira + read:avatar:jiraread:user:jira on 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 Okafor

Acknowledging 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:

  1. 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_status is the correct verification path, and each write tool points at it.

  2. tinyId is not an id. The short number in the JSM UI (#4821) is rejected by /v1/alerts/{id}, which accepts only the full uuid-timestamp id. 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.

  3. The search window caps at 20,000. offset + limit must stay under it. jsm_list_alerts rejects deeper paging locally with a message telling the model to narrow the query instead of burning a round trip on a guaranteed 400.

  4. Alert actions take no actor or note. Opsgenie accepted user, source and note alongside 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, call jsm_add_alert_note. jsm_create_alert does take note and source, because CreateAlertRequest declares 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 rules

The 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

Apache-2.0

Available Tools

28 tools
jsm_acknowledge_alertAcknowledge a JSM alertA
Idempotent

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry the safety profile, and the description goes well beyond them: it discloses the asynchronous contract ('the response confirms the request was accepted, not that the alert changed'), the no-op idempotency behavior, and the exact return shape. The response-shape detail is partly redundant with the output schema, which keeps this from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its effect, then prerequisites, args, return and async caveat, in a scannable order with no filler prose. The closing example is the weak point: it is over-formatted and invents a parameter, slightly muddying an otherwise tight definition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter mutation with an output schema, everything needed to call and verify it is present: the id format requirement, the async acceptance semantics, the follow-up verification tool, and the non-resolving scope. Nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already warns that alert_id is the full id, not the tinyId, so the description adds little on that front. Worse, the trailing example implies a 'note' argument ('note="Investigating, RVS"') that does not exist in the schema and would be rejected by additionalProperties:false — a misleading detail, but the schema itself remains authoritative.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('acknowledge an open JSM alert') plus the immediate effect ('stopping further escalation notifications'). It explicitly distinguishes itself from the nearest sibling by name — jsm_close_alert resolves, this does not — so an agent can separate the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use (a human has picked the alert up), an explicit when-not/alternative ('It does not resolve the alert — use jsm_close_alert for that'), and an edge-case rule ('Acknowledging an already-acknowledged alert is a no-op'). It also routes the agent to jsm_get_request_status for verification.

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 alertA
DestructiveIdempotent

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:

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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_propertiesYesKey/value context to attach, e.g. {'runbook': 'https://…', 'region': 'us-east-1'}. A key that already exists is overwritten.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the call is asynchronous, that it merges by key, and that an existing key is overwritten without warning. These are non-obvious operational traits an agent must know, and they are stated directly rather than left to inference.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the purpose, then structured into args, returns, an async warning, merge semantics, and an example. Every block is informative, though the args/returns restatements overlap with the schema and the trailing example is truncated, adding minor redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async mutation tool with a nested object param and an output schema, the description covers the async requirement, the verification path, the overwrite/merge semantics, and pre-read guidance. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both params are already documented, but the description reinforces the critical alert_id vs tinyId distinction and adds a worked example mapping a natural-language request to the extra_properties object. The added example value slightly exceeds the schema-only baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Attach arbitrary key/value context to a JSM alert') and distinguishes the action from sibling tools by contrasting it with notes ('the structured half of an alert, next to the prose in its description'). An agent can select it over jsm_add_alert_note or jsm_update_alert_field without further reading.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names concrete use cases (runbook link, region, deploy, trace id), gives the alternative behavior (prose notes vs programmatic properties), and routes to two follow-up tools: read first with jsm_get_alert and verify with jsm_get_request_status. This is explicit when-to-use and what-to-do-next guidance.

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"

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYesNote text to record on the alert's activity timeline.
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the generic safety profile (readOnly=false, destructive=false, idempotent=false, openWorld=true). The description adds two behaviors annotations cannot express: the operation is asynchronous and must be verified via jsm_get_request_status with the returned requestId, and it appends to the timeline without mutating alert state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then scope constraint, use cases, args, return, and a worked example — a sensible order with little filler. The Args and Returns blocks partially duplicate the schema and output schema, which is the only real padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async mutation with an output schema and annotations, this covers the essentials: the exact identifier to supply, the state-preservation guarantee, the async follow-up tool, and a concrete example. The only gap, the phantom user/source arguments, is a correctness slip rather than a missing concept.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100% for the two real parameters, and the description's alert_id/note notes largely restate the schema. Worse, the Args block advertises 'user' and 'source' as optional parameters that do not exist in the schema, which declares additionalProperties: false — an agent following the description could pass arguments that get rejected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (append a note to a JSM alert's activity timeline) plus the crucial scope constraint that it does not change alert state. It explicitly separates itself from siblings jsm_acknowledge_alert, jsm_close_alert and jsm_assign_alert, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Names concrete use cases (record triage findings, link a runbook/dashboard, leave context for the next responder) and states what the tool is NOT for. It also points to the follow-up tool (jsm_get_request_status) required after the async call, which is exactly the when-to-use guidance an agent needs.

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 alertA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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_idYesId of the user, team, escalation or schedule to add as a responder.
responder_typeYesWhat kind of entity responder_id refers to.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-destructive, idempotent, open-world behavior, and the description goes further by disclosing that the operation is asynchronous, that the returned requestId must be verified via jsm_get_request_status, and what HTTP 422 implies. The 'responders are additive' note reinforces the non-destructive annotation rather than contradicting it.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its effect, then structured into args, returns, async warning, example, and error handling sections. Slightly repetitive of the schema in the Args block, but every section carries information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not explain return values, yet it still summarizes them and adds the critical async-verification step. Error handling and id-discovery guidance (jsm_list_schedules) round out a definition complete enough to call the tool correctly on the first try.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters and the enum are already documented in the schema, including the alert_id-vs-tinyId warning. The description largely restates these and adds only a worked example mapping a natural-language request to responder_type='team', which is marginal added meaning over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (add) and resource (responder) plus the accepted responder kinds, and scopes it to an existing JSM alert. It is distinguishable from adjacent siblings such as jsm_assign_alert and jsm_escalate_alert because it names the responder categories explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete usage trigger ('pull in another team once triage shows the alert belongs elsewhere') and states the key constraint that responders are additive rather than replacing existing ones. It does not explicitly contrast itself with jsm_assign_alert or jsm_escalate_alert, which would be needed for a 5.

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 alertA
Idempotent

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"]

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYesTag names. Case-sensitive, and matched exactly on removal.
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare the safety profile (not read-only, idempotent, non-destructive), but the description adds genuinely new behavioral context: the operation is asynchronous and must be verified via jsm_get_request_status with the returned requestId, plus the case-sensitivity caveat that 'DB' and 'db' are distinct tags. These are exactly the traits an agent cannot infer from annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core action in the first sentence, then structured with headers for tags, args, returns, async warning, and examples. It is somewhat long and the Returns block largely duplicates the output schema, but no sentence is wasted for an agent that needs the async and casing warnings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter mutation with a full output schema and annotations, the description covers everything needed: argument meaning, the async verification follow-up tool, the case-sensitivity pitfall, and an intent-to-arguments example. The output schema carries return details, so the brief Returns listing is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds practical meaning beyond the schema: it reinforces that alert_id is the full id (not tinyId) and turns the case-sensitivity rule into actionable guidance ('match whatever the team already uses rather than inventing a casing') with a concrete example. This is modest added value over a fully documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add one or more tags to a JSM alert') and immediately clarifies the additive semantics ('existing ones stay'), which cleanly distinguishes it from the sibling jsm_remove_alert_tags. The agent knows exactly what the tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains the purpose of tags in the workflow — grouping and later retrieval via jsm_list_alerts with tag:"db" — and provides an example mapping a user intent to arguments. It stops short of naming the removal sibling or stating when not to use it, so it is strong context but not full when/when-not routing.

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 personA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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_idYesAtlassian 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the mutation profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), and the description goes well beyond them: it discloses that the call is asynchronous, mandates verification via jsm_get_request_status with the returned requestId, and maps the common failure mode (HTTP 422 / failed status) to its cause. That is exactly the added behavioral context the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose and the sibling distinction, then layers args, return shape, async caveat, example, and error mapping in a scannable order. Some content (the account id format and the 'not an email' warning) is repeated from the schema, which is the only thing keeping it from a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still surfaces the return shape and — more importantly — the asynchronous requirement to poll jsm_get_request_status, which an agent would otherwise miss. Combined with the error mapping and id-source guidance, nothing needed to invoke this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 compensates for the ambiguity traps: it stresses full alert id vs tinyId, and account_id as an Atlassian id rather than email/display name, plus how to obtain one from jsm_get_on_call or jsm_get_alert. This largely duplicates the schema text, however, so it is useful reinforcement rather than net-new semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Make one person the owner of a JSM alert') and immediately contrasts it with the nearest sibling, jsm_add_alert_responder, by explaining that assignment confers ownership while adding a responder does not. An agent can select between the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use ('when triage has decided whose problem it is'), an explicit scope exclusion ('for that one alert rather than a class of them — routing rules, not assignment, are how a class of alerts finds its team'), and a prerequisite workflow example for the common on-call case. This is close to the ideal for routing guidance.

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 alertA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already declaring destructive and idempotent behavior, the description adds critical context: the action is asynchronous, must be verified via jsm_get_request_status, and is effectively one-way (a closed alert cannot be reopened through this API). It also explains that recurring conditions create fresh alerts rather than reviving the closed record.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and one-way behavior, then structured into Args, Returns, IMPORTANT, Examples, and Don't use when. Slightly long because the Returns section duplicates the output schema and the example includes a phantom note parameter, but overall it is efficient and well organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, asynchronous mutation, the description covers the essential operational details: the need to verify with jsm_get_request_status, the one-way nature of closing, and the preferred alternative while work is ongoing. Since an output schema exists, the return-value summary is extra but harmless, and nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already fully documents alert_id. The description's Args section merely repeats the full-id vs tinyId distinction, and its example introduces a note parameter that is absent from the schema (additionalProperties: false), which could mislead an agent. Baseline 3 is appropriate because the description adds no valid parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Close a JSM alert') and immediately clarifies the effect ('marking it resolved and ending all notifications'). It distinguishes itself from siblings by naming jsm_acknowledge_alert as the preferred tool while work is in progress.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (alert leaves the open queue) and when not to use it ('Don't use when: the alert is still being worked — acknowledge instead'). It also names the alternative tool (jsm_acknowledge_alert) with a clear condition.

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNoNote recorded on the new alert's timeline.
tagsNoTags for searching and grouping, e.g. ['db', 'prod'].
aliasNoClient-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.
entityNoWhat the alert is about — a host, service or application, e.g. 'payments-api'.
sourceNoFree-text source label shown in the alert activity log, e.g. 'claude-mcp'.
actionsNoNames of custom actions your organisation has configured for alerts. Not free text — an unrecognised name is ignored rather than rejected.
messageYesOne-line summary of what is wrong, read first by whoever gets paged. The only required field.
priorityNoP1 is highest, P5 lowest. Omitted lets the routing rules decide.
respondersNoWho to notify. Omit to let the team's routing rules decide, which is usually what you want — naming responders explicitly bypasses routing.
visible_toNoRestricts who can see the alert, beyond the responders. Max 50 entries. Omit for team-default visibility.
descriptionNoLonger detail: impact, how to reproduce, what to try. Shown on the alert page.
extra_propertiesNoArbitrary key/value context carried on the alert, e.g. {'region': 'us-east-1'}.

Output Schema

ParametersJSON Schema
NameRequiredDescription
aliasNo
resultNo
requestIdNo

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond the annotations: alerts page people and enter routing/escalation rules, the endpoint has no actor override (unlike other write tools), the call is asynchronous and 200 does not mean synchronous, the response confirms acceptance not existence, alias de-duplication semantics drive safe-retry vs silent no-op, responders bypass routing, and the required write scope. Annotations only cover the safety profile; the description carries the real behavioral burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well-organized into purpose, args, returns, alias, examples, and constraints/errors. It is long, but almost every line earns its place given a 12-parameter mutation tool. The single 'IMPORTANT' paragraph is dense but front-loads the async gotcha well.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 12-parameter, nested-object, async mutation tool, this covers the async gotcha (no alert id), the alias retry semantics, the required scope, the responder override behavior, and the 422 failure mode. Despite an output schema being present, the description correctly explains why knowing the requestId matters — retrieval paths are named. Nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is already 100%, so baseline would be 3, but the description adds meaning beyond the schema: it explains that alias is the de-duplication key with a concrete retry example, that responders bypass routing, that omitting priority lets routing rules decide, that source can be 'claude-mcp', and what 422 means. This is real value-add over the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a new alert in Jira Service Management Operations') and explicitly differentiates from the sibling jsm_add_alert_note by naming it and describing the contrasting use case. An agent can pick this tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use ('when a human wants an incident tracked and escalated') and when-not ('not to leave a note, which is jsm_add_alert_note, and not to record something nobody needs to act on'). Names the alternative tool by name. Nothing is left to inference.

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 alertA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and openWorldHint=true, but the description goes well beyond them: it enumerates exactly what is lost (notes, activity log, attachments, timing), states there is no undo and the loss is global, discloses the asynchronous nature and the verification path via jsm_get_request_status, and calls out the separate delete:ops-alert:jira-service-management grant. That last point is a high-value behavioral disclosure an agent could not infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Long, but front-loaded with the decisive warning ('This is almost never the right tool') and organized into purpose, justification cases, args, async note, and constraints. Every section earns its place for an irreversible operation, though the safety argument is restated enough that it could be trimmed slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Return values are covered by the output schema and safety by the annotations, so the description need not repeat them; it instead supplies the missing pieces: the destruction scope, the async verification step, the required scope, and the pre-call confirmation workflow. Nothing an agent needs to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the schema already documents alert_id with a full example and the tinyId warning, so the schema carries the weight. The description's 'not the tinyId' remark is redundant with the schema field description. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently delete a JSM alert and everything recorded on it') with an explicit scope statement about what is destroyed. It also draws a sharp line against the closest sibling, jsm_close_alert, so an agent can distinguish the two without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use (credentials/PII that must not persist, or a flood of alerts from a misconfigured integration) and when-not (never to tidy up, clear a queue, or loop over search results). It names the alternative jsm_close_alert and the condition that selects it, plus a required pre-flight workflow of reading the alert back and getting an explicit yes.

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 alertA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
note_idYesId of the note to delete, from jsm_list_alert_notes. Not the note's text.
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
deletedYes
note_idNo

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint/idempotentHint, but the description adds genuinely new behavior: there is no undo or confirmation step at the API, the call is synchronous and returns 204 with no body (so no requestId to poll), and it requires a separate delete:ops-alert:... grant that a write:ops-alert token may lack (403 risk). It also prescribes quoting the note text back 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.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the destructive action, then the usage rule, then the irreversible/no-undo warning, then args, returns, and constraints. Every sentence carries operative information — the 204/no-requestId and separate-permission notes are not padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, permission-gated mutation this is complete: irreversibility, required grant, failure mode (403), argument sourcing (from jsm_list_alert_notes), and a return shape are all covered. An output schema exists, so the brief Returns line is sufficient rather than redundant.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents both parameters, including the full-id-vs-tinyId distinction and that note_id is not the note text. The description only restates these, adding no syntax or sourcing detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Permanently remove a note from a JSM alert's timeline') and explicitly distinguishes the operation from jsm_update_alert_note, so an agent can separate the two destructive-ish note tools without reading either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use ('only for a note that should never have been written — a pasted credential, personal information, wrong alert') and an explicit when-not with the named alternative ('a note that turned out to be wrong: that is what jsm_update_alert_note is for'). The rationale for the distinction is even supplied.

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 policyA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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_idYesId 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover safety flags, but the description adds substantial behavior they do not: the call is asynchronous, must be verified via jsm_get_request_status with the returned requestId, and pages people out of band ahead of their agreed schedule. It also maps the failure mode (HTTP 422) to a specific cause. No contradiction with idempotentHint/destructiveHint.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose with clean sections (Args, Returns, IMPORTANT, Examples, Constraints) and no wasted framing. It loses a point for repeating the escalation_id-is-not-a-team-id warning three separate times, which pads the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists, the description states the return shape and, more importantly, the async verification step an agent must take. Combined with the parameter guidance and error handling, nothing needed to invoke this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 reinforces the two easily-confused id types (full alert id vs tinyId; escalation id vs team/schedule id) and attaches the concrete consequence of passing the wrong one (422 rather than escalating to something adjacent). This meaning is largely duplicated from the schema, so it earns a bump rather than a top score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Push a JSM alert into an escalation policy') plus the immediate-vs-scheduled distinction that separates it from passive escalation. An agent can tell this apart from jsm_assign_alert or jsm_execute_alert_action without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit triggering condition ('an alert is not getting picked up and waiting out the escalation timer is not acceptable') and an explicit caution to confirm with the user before acting on their behalf. The when-not case is implied by 'rather than waiting for it to escalate on its own.'

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 alertA
Destructive

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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_nameYesName 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial context beyond annotations: explains the action is asynchronous, that an unrecognised name is accepted and silently does nothing (so a receipt is not evidence of execution), and that names are per-integration. Annotations declare destructiveHint=true, and the description reinforces the danger with production-impact warnings, not contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core purpose, then args, returns, and a critical warning. The structure is clear, though the warning section is somewhat verbose and repeats the schema's own guidance about guessing action names.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained further. The description covers the asynchronous follow-up, error semantics (silent success on unknown names), and integration scoping — everything an agent needs to invoke this dangerous tool responsibly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, including the alert_id vs tinyId distinction and the action_name warning. The description reiterates the key gotchas (full alert id not tinyId; exact configured name) but adds little beyond what the schema provides, warranting a 4 rather than higher.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (run) and resource (custom alert action), with concrete examples like "Restart service" and "Roll back deploy". It distinguishes itself from siblings by naming jsm_get_request_status as the verification tool and noting the action is user-configured, which no sibling does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use (running a team's configured automation against an alert) and strong when-not guidance (do not guess an action name; ask the user and confirm). It names the follow-up tool jsm_get_request_status for verification.

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 detailsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
identifierYesThe 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_typeNoWhich identifier was supplied. 'id' hits /v1/alerts/{id}; 'alias' hits the separate /v1/alerts/alias endpoint.id
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
alertYes

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive, open-world. The description still adds real behavior beyond them: responder ids are resolved to names when credentials allow, aliases only resolve against OPEN alerts, and HTTP 404 usually means a tinyId was passed. These operational constraints are not derivable from annotations or schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then grouped Args/Returns/Examples/Error handling sections. Every section carries distinct information; nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-resource getter with rich annotations and an output schema, this is complete: it covers purpose, routing from the list sibling, identifier pitfalls, error recovery, and alias scoping. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description goes further with worked examples showing identifier/identifier_type usage in context (e.g. alias lookup for a closed vs open alert) and repeats the tinyId caveat. It adds marginal interpretive value over the fully documented schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (retrieve full detail of a single JSM alert) and enumerates the payload fields returned. It explicitly differentiates from the sibling jsm_list_alerts by noting the list endpoint returns a thinner record.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says to use this 'after jsm_list_alerts when you need the payload an integration attached' — naming the alternative and the condition that selects this tool. The examples reinforce the intended sequencing.

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 nextA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoISO 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.
flatNotrue (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_idYesSchedule id, or the schedule name when schedule_identifier_type='name'.
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown
schedule_identifier_typeNoWhether 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

ParametersJSON Schema
NameRequiredDescription
shiftNo
next_on_callYes
participantsYes

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds rich context beyond annotations: explains identifier resolution to names, discloses the Jira user scope caveat, and gives a precise 401 diagnosis distinguishing a scope gap from a bad credential. This is the kind of operational insight structured fields cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by usage, args, returns, examples, and error handling in a scannable format. Slightly list-heavy but each section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage, parameter details, return shape (even though output schema exists), identifier resolution behavior, and a specific error condition. Complete for an agent to call this correctly in a JSM ops context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 parameter meanings but adds little beyond the schema (e.g., it doesn't elaborate on the flat=true/false structure beyond what schema says).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource+scope: 'Return the responders who take over the next shift on a JSM schedule, and when that shift begins.' Clearly distinguished from sibling jsm_get_on_call (current shift) and jsm_get_schedule_timeline by the word 'next'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit use cases ('handover messages', 'deciding whether an alert can wait for the next rotation') and cross-tool examples with jsm_list_alerts. It does not, however, explicitly contrast with jsm_get_on_call (current on-call), which an agent may confuse with this one.

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 nowA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoISO 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?'
flatNotrue (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_idYesSchedule id, or the schedule name when schedule_identifier_type='name'.
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown
schedule_identifier_typeNoWhether 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

ParametersJSON Schema
NameRequiredDescription
shiftNo
on_callYes
participantsYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well past the readOnly/idempotent/non-destructive annotations that already cover the safety profile: it discloses that account ids are resolved to names, that ids still return without the Jira user scope, that an empty result is a meaningful answer rather than a failure, and that a 401 here is a scope gap distinct from alerts.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose, then args, returns, examples, and error handling in clearly labeled blocks. The 'Returns' block restates what the output schema already provides, which is some redundancy, but no section is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations, a full output schema, and 100% parameter coverage already present, the description still supplies the non-obvious pieces: the resolved 'participants' field is called out as the field to read, plus scope-gap diagnosis and empty-result semantics.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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, but the description adds meaning beyond it: the cost tradeoff of schedule_identifier_type='name' (one extra lookup) and the concrete intent of 'flat' (rotation/escalation nesting vs. flat list). The parameter list largely mirrors the schema, keeping it short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the responders currently on-call for a JSM schedule') and immediately scopes it with the optional timestamp evaluation window. An agent can distinguish it from jsm_get_next_on_call and jsm_get_schedule_timeline without inspecting either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage framing ('who do I wake up?', 'who was on-call when this incident started?') and routes to jsm_list_schedules on a 404. It stops short of explicitly contrasting with the two closest siblings, jsm_get_next_on_call and jsm_get_schedule_timeline, so the alternative selection is only partly spelled out.

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 statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
request_idYesThe requestId returned by any alert write tool (acknowledge, close, note, assign, snooze).
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
requestYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent and non-destructive, but the description adds substantial behavior beyond them: the async/eventually-consistent nature of writes, and the error-handling hint that a 404 shortly after a write means the request is still queued and should be retried. This is exactly the kind of context an agent needs to invoke it correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded with the core purpose, then args, returns, examples, and error handling in scannable sections. Slightly verbose in repeating the full return shape despite an existing output schema, but every section earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an async-status tool with an output schema and full annotation coverage, the description is complete: it explains the async workflow, how to obtain the parameter, and how to interpret a transient failure. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds meaning: it ties request_id to its origin ('the requestId returned by a write tool') and gives a concrete example using jsm_acknowledge_alert. It also restates response_format's purpose, though the schema already covers that.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Check whether an asynchronous alert action actually succeeded') and explains the async requestId model. It clearly distinguishes itself from the write tools and from re-reading the alert, so an agent can tell it apart from siblings like jsm_get_alert.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it (after any JSM alert write returns a requestId) and when not to (do not just re-read the alert and find it unchanged). It names the write actions that produce a requestId, giving clear routing guidance.

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 boundariesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoISO 8601 instant the returned window should cover, e.g. '2026-08-27T12:00:00Z'. Defaults to now.
schedule_idYesSchedule id, or the schedule name when schedule_identifier_type='name'.
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown
schedule_identifier_typeNoWhether 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

ParametersJSON Schema
NameRequiredDescription
shiftsYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish it as a safe, idempotent read, and the description adds genuinely new behavior: responders are resolved to display names rather than account ids, the returned window spans roughly three weeks around the requested date, and specific 401 remediation ('missing read:ops-config:jira-service-management'). It also explains the semantic meaning of shift types ('historical', 'override'), which the annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the key usage discriminator, then organized into Args, Returns, Examples, and Error handling. It is on the long side, and the full Returns JSON block substantially duplicates an output schema that already exists, which is the only real waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read tool with an output schema and full annotation coverage, this is complete: it explains the window semantics, responder resolution, argument meanings, concrete invocation examples, and auth-scope failure mode. An agent has everything needed to call it correctly and interpret the result.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all four parameters including defaults and enums. The description's Args block largely restates that content, adding only marginal value (the code-format schedule_id example in the error section is minor). Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Return the on-call rotation periods for a JSM schedule') and immediately clarifies scope: 'who covers each shift, and exactly when each shift starts and ends.' It explicitly differentiates itself from the sibling jsm_get_on_call by framing the tool around boundaries rather than a single moment.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit selection rule ('the tool for any question about shift boundaries rather than a single moment') plus four natural-language question examples that map to arguments. It also names the alternative and why it fails ('calling jsm_get_on_call at guessed timestamps takes many calls and still cannot find a boundary exactly').

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 logsA
Read-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

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1-100, default 20).
orderNoChronological order of returned entries (default 'desc', newest first).desc
offsetNoCursor from a previous response's 'next_cursor'. These endpoints use opaque cursors, not numeric offsets.
alert_idYesFull 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_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
logsYes
paginationYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so safety is covered. The description adds context the annotations don't: that logs are system-generated, that ordering defaults to newest-first, and how cursor paging continues via next_cursor. It does not discuss rate limits or retention, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, followed by args, returns and examples in a predictable order. It is slightly verbose because the Args section duplicates content already present at 100% schema coverage, but nothing is ambiguous or padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a paginated read tool with a declared output schema, the description supplies everything an agent needs: what the log contains, ordering, cursor paging, ID format caveat, and task examples. Return values are also spelled out, which is redundant but harmless.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, including the alert_id vs. tinyId distinction and the opaque-cursor semantics for offset, so the schema already carries parameter meaning. The description's Args block largely restates that; the examples are the only marginal addition, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (list) and resource (the system activity log for a JSM alert) and enumerates the event types it contains (state transitions, notifications, escalations, automated actions). It explicitly separates itself from jsm_list_alert_notes ('human comments live in ... instead'), so an agent can disambiguate without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete task framings — 'why did nobody get paged?' and 'when was this escalated and to whom?' — plus two worked examples mapping user intent to exact argument values. It names the sibling that covers the adjacent use case (notes vs. logs).

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 notesA
Read-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'.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1-100, default 20).
orderNoChronological order of returned entries (default 'desc', newest first).desc
offsetNoCursor from a previous response's 'next_cursor'. These endpoints use opaque cursors, not numeric offsets.
alert_idYesFull 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_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
notesYes
paginationYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe read-only, idempotent profile, so the bar is lower. The description still adds real context: newest-first default, that integrations append re-fire/resolution updates for deduplicated alerts, and that pagination uses opaque cursors rather than numeric offsets.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the purpose and the triage rationale, then organizes Args, Returns, Examples and a cursor note into scannable blocks. It is slightly long because the Args and Returns sections re-state what the schema and output schema already provide.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and an explicit Returns block and pagination contract are supplied, so return handling is fully covered. Required vs optional params, defaults, enums and the cursor round-trip are all described, leaving nothing an agent needs to call this correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 beyond it by pairing parameters with intent-driven examples (triage check vs full history) and warning that alert_id must be the full id, not the UI tinyId. Most of the Args list does duplicate the schema descriptions, which caps it at 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the notes ... recorded on a JSM alert's activity timeline') and immediately clarifies what notes are ('human comments'), which distinguishes this from the sibling log-listing tool. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-to-use rule ('Read them before acting on an alert so you don't repeat work') and two natural-language examples that map intent to arguments. It does not explicitly name the nearest alternative (jsm_list_alert_logs) or state when not to use it, so it falls short of full routing guidance.

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 alertsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoField to sort by (default 'createdAt'). These four are the only values the API accepts.createdAt
limitNoMaximum number of records to return (1-100, default 20).
orderNoSort direction (default 'desc', i.e. newest first).desc
queryNoJSM 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.
offsetNoNumber of records to skip, for paging. Use the 'next_offset' from a previous response.
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
alertsYes
paginationYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly, idempotent, openWorld, and non-destructive. The description adds valuable operational behavior: offset+limit cannot exceed 20000 and malformed queries return HTTP 400 with case-sensitive field names. That is 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and role, then breaks into args, returns, examples, and constraints. It is somewhat long and the returns block duplicates the existing output schema, but the structure is clean and every section has some practical value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Complete for a search/list tool with six optional parameters and a high schema coverage. It covers when to use it, input syntax, output shape, pagination limits, error behavior, and examples, so an agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds a cross-parameter constraint ('offset + limit must stay below 20000') and clarifies query error semantics, which the schema does not cover. It mostly repeats schema defaults and enums otherwise.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Search and list alerts') and scope ('in Jira Service Management Operations'). It distinguishes itself from sibling tools by declaring itself the entry point for alert workflows and the resolver of tinyId to full alert id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear context: entry point for alert workflows, use to find open/unacknowledged alerts, filter by priority/team/tag, resolve tinyId. It excludes mutation ('reads only — never creates or modifies') but does not name specific alternative siblings (e.g., jsm_get_alert, jsm_create_alert) for particular cases.

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 toolsetsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
response_formatNoOutput format. 'markdown' is compact (default); 'json' returns every field.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
toolsetsYes
read_onlyYes
requestedYes
tool_countYes

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly/idempotent/destructive, but the description adds substantial non-annotation context: it makes no API call, needs no credentials, works even when the token is missing or wrong, and discloses the unverified toolset caveat with the exact enabling syntax and the reason it was blocked (plan exclusion or unheld permission). This is rich, clearly-earned 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.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and the 'call before declaring impossible' guidance, followed by a well-structured Returns block and concrete examples. It is on the long side, and some sentences (the parenthetical about 'selected') could be tightened, but nearly every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, yet the description still explains the semantics an agent needs to interpret it correctly: what 'selected' vs 'enabled' means, what 'unverified' signals, and why. Combined with the usage examples and the restart caveat, nothing an agent needs to select or interpret this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single response_format parameter is fully documented in both schema and description (with the markdown/json tradeoff spelled out: 'markdown' is compact, 'json' returns every field). The baseline for full coverage is 3; the added nuance about what 'json' returns nudges it up.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('report every toolset this server knows about, whether it is currently loaded, and how to load one that is not') and clearly distinguishes itself from its siblings, which are all alert/schedule operations. An agent can immediately tell this is a meta/discovery tool, not an API operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly prescribes when to call it: 'Call this before telling the user something is impossible' and 'call this rather than guessing from your tool list.' It also names the failure mode it resolves (absent tool = not enabled vs. not supported) and the exact remedy (JSM_TOOLSETS env var), plus the caveat that restart is required.

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 schedulesA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of records to return (1-100, default 20).
offsetNoNumber of records to skip, for paging. Use the 'next_offset' from a previous response.
response_formatNoOutput format. 'markdown' is compact and human-readable (default); 'json' returns every field for programmatic use.markdown

Output Schema

ParametersJSON Schema
NameRequiredDescription
schedulesYes
paginationYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive behavior, and the description goes beyond them with a non-obvious operational detail: a 401 here while alert tools work indicates a missing 'read:ops-config:jira-service-management' scope rather than bad credentials. Pagination via has_more/next_offset is also disclosed, which is real behavioral context an agent needs for multi-page traversal.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose, then when-to-use, then args, return shape, examples, error handling. Slightly redundant in repeating the parameter defaults and the full return payload that the schema and output schema already provide, but the structure is clean and skimmable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, routing to downstream tools, parameter limits, pagination, example invocations, and a specific auth-scope failure mode. With annotations and an output schema present, this is more than complete for a read-only list tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (limit, offset, response_format) are already documented in the schema, including ranges and defaults. The description's Args block largely restates that, and the mention of matching on name in the example adds only marginal semantics. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb ('List') plus resource ('on-call schedules configured in JSM Operations') with the fields returned (ids, owning teams, timezones) named. It clearly separates itself from the alert-oriented siblings by scope, so an agent can route between the two families without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Start here when you need a schedule id for jsm_get_on_call or jsm_get_next_on_call', naming the downstream alternatives and the condition that selects them. It also covers the exploratory case ('which rotations exist at all'), leaving no usage ambiguity.

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 alertA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
keysYesProperty keys to remove. Keys, not values.
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructive/idempotent/openWorld), it discloses the async execution model, the exact verification path, that removing a nonexistent key is silently non-erroring (so a receipt proves nothing), and the separate delete:ops-alert:jira-service-management grant. These are precisely the behavioral traits structured fields cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then Args, Returns, an IMPORTANT async warning, and Constraints. Every block earns its place and nothing is padding despite covering several distinct concerns.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, yet the description still adds the async/verification workflow, silent-success caveat, and the required OAuth scope — everything an agent needs to invoke and confirm this destructive, asynchronous tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already explains both keys ("Keys, not values") and alert_id ("NOT the short tinyId"). The description restates this same guidance, so it is useful reinforcement but adds no meaning beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb + resource + scope: "Remove properties from a JSM alert by key." It is unambiguously distinct from the sibling jsm_add_alert_extra_properties and the field-mutating tools, and it clarifies that it operates on property keys, not fields or tags.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete operational guidance: it is asynchronous, must be verified via jsm_get_request_status with the returned requestId, and the caller should read the alert back if removal confirmation matters. It never explicitly names a sibling alternative or a when-not-to-use case (e.g., use jsm_update_alert_field for standard fields), so it stops short of 5.

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 alertA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsYesTag names. Case-sensitive, and matched exactly on removal.
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (destructiveHint/idempotentHint) by disclosing that the operation is asynchronous, that matching is case-sensitive and exact, that no-op removals still succeed, and that a separate delete:ops-alert:jira-service-management grant is required and may 403 where adding tags succeeds. This is rich, actionable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then Args/Returns/IMPORTANT/Constraints – each section earns its place. Slightly long with some repetition of schema content, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers async verification, permission requirements, error behavior, and no-op caveats, and an output schema already exists so return values need not be re-explained. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 reinforces the critical alert_id-vs-tinyId distinction and the exact/case-sensitive tag matching semantics that drive correct invocation. The overlap with the schema docs keeps it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Remove one or more tags from a JSM alert') and is immediately distinguishable from its sibling jsm_add_alert_tags. An agent knows exactly what operation this performs.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to jsm_get_alert to read current tags before acting, and to jsm_get_request_status to verify the asynchronous result. It also warns that silent no-match removals still return success, which is genuine when-to-use/when-to-be-careful guidance.

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 timeA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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_timeYesWhen 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond annotations: asynchronous execution with a required follow-up verification call (jsm_get_request_status), reversal semantics (resumes as if untouched), and the past-instant trap that masquerades as a failure. Annotations cover safety/idempotency, but the async contract and time-handling sharp edge are genuinely new value. Output/return shape is documented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and rationale, then args, returns, and the time-handling warning. It is somewhat long but every section earns its place (the time-handling and async notes are high-value). Minor redundancy between description and schema on the past-instant caveat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-param async mutation tool with an output schema and full annotation coverage, this covers purpose, rationale, return contract, verification path, error case, and the tricky time semantics. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds real meaning: it warns that alert_id is NOT the tinyId, explains end_time is an absolute instant rather than a duration, and that a bare local time should be avoided in favor of an explicit offset. That goes beyond the schema's field-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (snooze/silence) and resource (JSM alert notifications), with scope defined as 'until a specific instant, after which it resumes as if untouched.' It explicitly distinguishes itself from the closest sibling (close_alert) by explaining why closing is wrong here.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit when-to-use scenario ('we know, and there is nothing to do until the maintenance window ends') and an explicit when-not-to ('Closing it would remove it from the open queue and lose the fact that it is still an open problem'). It also notes the closed-alert no-op case. This is unambiguous routing guidance.

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 alertA
Idempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotentHint=true, destructiveHint=false, and openWorldHint=true. The description goes beyond them by disclosing async execution, the verification path (jsm_get_request_status with the requestId), the escalation/paging side effect, and the no-op-on-unacked behavior — a genuinely useful behavioral layer. Minor deduction because the async guidance duplicates what the returned requestId field already implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then when-to-use, args, returns, async warning, examples, constraints. The Returns block is redundant given an output schema exists, and the example invents a 'note' field, slightly diluting an otherwise tight structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter mutation with an output schema, the definition covers the safety profile (async, no-op case, paging restart), the verification workflow, and a concrete example — everything an agent needs to call it correctly and warn the user.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents alert_id fully, including the tinyId caveat. The description only restates 'the full alert id (not the tinyId)', adding no new syntax. The example's 'note=' argument does not exist in the schema, which is mildly misleading rather than clarifying.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource: 'Return an acknowledged JSM alert to unacknowledged, so escalation notifications resume.' It also explicitly delimits scope against siblings — 'does not close, snooze or reassign' — mapping directly to jsm_close_alert, jsm_snooze_alert, and jsm_assign_alert.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a concrete when-to-use ('someone acked an alert they cannot actually work — picked it up by mistake') plus explicit when-not via the close/snooze/reassign exclusion. It even adds a behavioral caution to communicate before acting, which no sibling definition would provide.

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 descriptionA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
fieldYesWhich field to overwrite. Each is a separate endpoint under the hood.
valueYesThe 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_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
resultNo
alert_idYes
requestIdNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (destructiveHint=true, idempotentHint=true, openWorldHint=true), and the description adds substantial behavior beyond that: the action is asynchronous and must be verified via jsm_get_request_status, it overwrites rather than appends, reading first avoids destroying existing content, and raising priority can change paging. None of this is recoverable from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is well front-loaded — the core action leads, followed by args, async caveat, the overwrite warning, and examples. It is longer than average, and the Args block partially restates the schema, but nearly every sentence carries actionable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, async, open-world mutation with three required params, the description covers everything an agent needs: what is overwritten, async verification path, the priority enum constraint, the append-vs-replace pitfall, and the paging side effect. An output schema exists, so return-value explanation is not required.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 adds genuine value: it stresses alert_id is the full id not the tinyId, pins priority to exact values P1–P5 (rejecting 'high' or '1'), and clarifies that 'value' means the new value with no user/source arguments unlike other write tools. Some content overlaps the schema, keeping it just short of a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('overwrite') and resource ('one field on an existing JSM alert') and enumerates the exact fields (priority, message, description). It explicitly distinguishes itself from siblings jsm_add_alert_note and jsm_update_alert_note, so an agent can route correctly without opening a schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use context (correcting an alert once triage knows more than the raising integration) and a clear when-not-to-use rule with a named alternative: use jsm_add_alert_note if you mean to append rather than replace. This is exactly the alternative-routing guidance the dimension rewards.

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 alertA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteYesNote text to record on the alert's activity timeline.
note_idYesId of the note to edit, from jsm_list_alert_notes. Not the note's text.
alert_idYesFull 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

ParametersJSON Schema
NameRequiredDescription
idNo
noteNo
ownerNo
note_idNo
alert_idYes
createdAtNo
updatedAtNo

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds real value beyond that: it is synchronous unlike every other alert write, returns the note itself so there is no requestId to verify with jsm_get_request_status, it replaces the whole text with no append, and 404 signals a note/alert mismatch. That is strong disclosure, though the destructive/idempotent semantics themselves are left implicit in 'replaces the note's whole text'.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the correction-vs-development guidance, then args, returns, sync note, and constraints. Well organized, but the Args block duplicates schema descriptions near-verbatim and the Returns block repeats the output schema, so a little space is not earning its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers everything an agent needs: what it does, when to use it versus the alternative, that it is synchronous with no requestId follow-up, whole-text replacement with no append, and the 404 failure meaning. An output schema exists, yet the description still closes the verification loop with jsm_get_request_status, which is exactly the kind of cross-tool context that matters here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all three params (including the full-alert-id-not-tinyId warning and note_id provenance). The Args section largely restates the schema, adding only that note is the 'replacement' text — a marginal increment over the schema's 'Note text to record'. Baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Replace the text of an existing note on a JSM alert' — and immediately distinguishes itself from its nearest siblings (jsm_add_alert_note, jsm_delete_alert_note). An agent can tell what this does and what it is not without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says when to use it ('correct a note you just wrote') versus the alternative ('prefer adding a new note with jsm_add_alert_note for anything that reads as a development'), with the reasoning that the timeline is the record of what responders knew. It even gives a worked example routing through jsm_list_alert_notes first.

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.

  1. 28 tool updatesv2.1.0
    • Changedjsm_acknowledge_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_add_alert_extra_properties2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_add_alert_note2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_add_alert_responder2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_add_alert_tags2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_assign_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_close_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_create_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_delete_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_delete_alert_note2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_escalate_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_execute_alert_action2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_get_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_get_next_on_call2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_get_on_call2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_get_request_status2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_get_schedule_timeline2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_list_alert_logs2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_list_alert_notes2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_list_alerts2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_list_capabilities2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_list_schedules2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_remove_alert_extra_properties2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_remove_alert_tags2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_snooze_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_unacknowledge_alert2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_update_alert_field2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedjsm_update_alert_note2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 19 tool updatesv2.0.0
    • Changedjsm_acknowledge_alert3 fields changed
      • removedInput schema / properties / note
        Removed value: -{
        -  "description": "Optional note recorded alongside the acknowledgement.",
        -  "maxLength": 25000,
        -  "type": "string"
        -}
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.",
        -  "type": "string"
        -}
      • removedInput schema / properties / user
        Removed value: -{
        -  "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.",
        -  "type": "string"
        -}
    • Addedjsm_add_alert_extra_properties
    • Changedjsm_add_alert_note2 fields changed
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.",
        -  "type": "string"
        -}
      • removedInput schema / properties / user
        Removed value: -{
        -  "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.",
        -  "type": "string"
        -}
    • Changedjsm_add_alert_responder3 fields changed
      • removedInput schema / properties / note
        Removed value: -{
        -  "description": "Optional note recorded with the change.",
        -  "maxLength": 25000,
        -  "type": "string"
        -}
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.",
        -  "type": "string"
        -}
      • removedInput schema / properties / user
        Removed value: -{
        -  "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.",
        -  "type": "string"
        -}
    • Addedjsm_add_alert_tags
    • Addedjsm_assign_alert
    • Changedjsm_close_alert3 fields changed
      • removedInput schema / properties / note
        Removed value: -{
        -  "description": "Optional note explaining the resolution. Strongly recommended — it's the record future responders will read.",
        -  "maxLength": 25000,
        -  "type": "string"
        -}
      • removedInput schema / properties / source
        Removed value: -{
        -  "description": "Free-text source label shown in the alert activity log, e.g. 'claude-mcp'.",
        -  "type": "string"
        -}
      • removedInput schema / properties / user
        Removed value: -{
        -  "description": "Display name or email recorded as the actor for this action. Defaults to the owner of the API credentials.",
        -  "type": "string"
        -}
    • Addedjsm_create_alert
    • Addedjsm_delete_alert
    • Addedjsm_delete_alert_note
    • Addedjsm_escalate_alert
    • Addedjsm_execute_alert_action
    • Addedjsm_list_capabilities
    • Addedjsm_remove_alert_extra_properties
    • Addedjsm_remove_alert_tags
    • Addedjsm_snooze_alert
    • Addedjsm_unacknowledge_alert
    • Addedjsm_update_alert_field
    • Addedjsm_update_alert_note
  3. 13 tool updatesv1.1.1
    • First observedjsm_acknowledge_alert
    • First observedjsm_add_alert_note
    • First observedjsm_add_alert_responder
    • First observedjsm_close_alert
    • First observedjsm_get_alert
    • First observedjsm_get_next_on_call
    • First observedjsm_get_on_call
    • First observedjsm_get_request_status
    • First observedjsm_get_schedule_timeline
    • First observedjsm_list_alert_logs
    • First observedjsm_list_alert_notes
    • First observedjsm_list_alerts
    • First observedjsm_list_schedules

TDQS

A4.4/5.0

Scored across 28 tools

Disambiguation4/5

The surface is large but the descriptions carefully draw boundaries: notes vs logs vs extra properties vs tags, acknowledge vs close vs snooze vs escalate, and get_on_call vs get_next_on_call vs get_schedule_timeline are all explicitly contrasted. A few pairs (jsm_add_alert_note vs jsm_add_alert_extra_properties, jsm_add_alert_tags vs jsm_add_alert_extra_properties) could still be momentarily confused, but the docs resolve it.

Naming Consistency5/5

Every tool uses the consistent jsm_ prefix followed by verb_noun in snake_case (jsm_list_alerts, jsm_update_alert_note, jsm_get_on_call). The pattern is uniform across alerts, notes, tags, properties, and scheduling families with no deviations in casing or style.

Tool Count3/5

28 tools is heavy for a single server, sitting above the comfortable 3-15 band. The breadth reflects a genuinely large API (alerts plus on-call scheduling plus a capability-introspection tool), so each tool has a real purpose, but the count is borderline and increases selection burden.

Completeness4/5

Coverage is strong: full alert lifecycle (create/get/list/update/ack/close/snooze/escalate/delete), note CRUD, tags and extra-properties add/remove, responder addition, async verification, and schedule/on-call reads. The main gap is the inability to remove a responder, and there is no listing of teams/escalation policies/users that some write tools (escalation_id, responder_id) would benefit from.

Maintenance

ActivityMaintained
ResponsivenessUnresponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables comprehensive Opsgenie alert management including listing, creating, acknowledging, and closing alerts, as well as managing alert notes, logs, and custom properties through natural language.
    168 npm
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables PagerDuty incident response operations including listing incidents, acknowledging and resolving incidents, looking up on-call schedules, and listing services.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables issue search, creation, updates, comments, status transitions, and project listing in Jira, purpose-built for security incident management and SOC workflows.
    9
    11 npm
    Apache 2.0