Skip to main content
Glama

Create or update an issue

save_issue
Destructive

Create an issue (omit identifier) or update one (pass identifier, e.g. XEN-12). Only title is required to create. Setting status to canceled requires cancelReason, and MOVING AN ISSUE INTO review requires handoff unless it already carries a checkpoint — a finished-work claim has to say where the work is. labels replaces the issue's labels. CREATE requires FOUR declarations: (1) a dependency declaration — blockedBy (ids this depends on) OR noDependency (a one-line reason there are none); and (2) work — true if this is a unit an agent executes, false if it's a tracking container; and (3) changeType — which of the Conventional Commits types this change is, which is what the Cost page splits spend by; and (4) reviewedSimilar — the open look-alikes you have read, demanded only when there ARE any. A create missing any of them is rejected. The fourth CANNOT be filled in blind: it is a list of issue ids only the server produces. So if nothing looks like this work you never send it, and if something does the create is refused with DUPLICATE_CHECK_REQUIRED naming the candidates and you re-call with them — or you searched first with list_issues, name them yourself, and pass in ONE call. Read them before you name them: the gate proves you were shown them, not that you judged them right, and the cheapest issue to file is the one you don't file twice. If this call is refused for billing (BILLING_INACTIVE or MONTHLY_CAP_REACHED), the response carries tellHuman, a ready-to-relay sentence: PASS IT TO YOUR HUMAN. You cannot fix it yourself — only an owner can — so do NOT absorb the refusal and continue with read-only work as if the session were healthy; every value-bearing write will keep failing until they act.

Input Schema

NameRequiredDescriptionDefault
bodyNoMarkdown spec: context, acceptance criteria, repro.
workNoREQUIRED on create — you decide once. true = a unit an agent FINISHES by changing something: editing code/config/files, infrastructure (deploys, provisioning, env, DB/schema, CI/CD, DNS, services), writing/updating docs, running commands/migrations/scripts, fixing a bug, building a feature, refactoring, or a spike that ends in a concrete deliverable. false = it only ORGANIZES or TRACKS other issues and is never executed: epic, milestone, plan, roadmap, grouping — 'done' only when its child work issues are. Test: to finish this, does an agent change files or systems? → true; just a container done when its children are? → false. work:false issues are readable but NEVER claimed by next_issue/next_batch/claim_issue.
dueAtNoPrecise deadline as epoch milliseconds. SET IT WHENEVER THE PERSON ASKING NAMED A TIME — "by Friday", "before the demo", "end of the month" — converted to the instant they meant in their own timezone; a date said out loud and not recorded is a date the queue cannot act on. If the work is plainly time-bound and nobody said when, ASK, once, while you are filing it: a deadline added days later is a deadline that never dispatched. Omit only when there is genuinely no commitment — most work has none, and a guessed date is worse than none. It is not a label: dispatch derives an effective-priority FLOOR from it (RTSC-187) — past 75% of the window an issue sorts at least High, past 90% at least Urgent, past due above Urgent — and that floor inherits up the `blocks` chain, so a dated issue pulls its blockers up with it. Every read echoes the derived `slaState`, and the Dash cannot set a date anywhere: yours is the only hand that puts one on. Distinct from the day-granular import-only `dueDate` and from the claim lease TTL.
titleNoRequired when creating.
labelsNoReplaces all labels on the issue.
statusNo`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. `assignee` is REQUIRED on every write that LEAVES the issue in `review` (RTSC-347 + RTSC-400) — name the reviewer's human lane, an ACTIVE member who is a DIFFERENT principal than whoever submitted it (author ≠ reviewer). It is a property of the STATE, not of the transition: it applies when you move an issue to review, when you CREATE one with `status:"review"`, and to any later write that changes a live review's assignee — including a write that names no `status` at all. So `assignee:""` can't clear a live review's reviewer, and it can't be re-pointed at the submitter, at a suspended/retired member, or at a member nobody has ever signed in as (an unclaimed placeholder left behind by an import or a restore — RTSC-408): a review parked on a lane nobody can claim strands, non-terminal, blocking its dependents. To unassign, send it back first (`status:"todo"`). The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review is your team's convention; that it must be assigned is not. Entering `review` also requires `handoff` (RTSC-741) unless the issue already carries a checkpoint — see that field.
handoffNoThe author's handoff, REQUIRED on the write that MOVES an issue into `review` (RTSC-741) and on a CREATE with status:"review" — unless the issue already carries a checkpoint, which IS the handoff and satisfies it. Say what you built and where it lives: branch, PR, commit. It is stored as the issue's checkpoint, so the next agent to claim it resumes from it instead of being handed your spec with no sign the work exists and building it a second time (which is what happened on 2026-08-25, twice in 25 minutes). Not validated for content — nothing here reads your branch or your CI; the requirement is only that the claim carries its evidence, exactly as `canceled` carries a cancelReason. Valid ONLY on that entry: passing it on any other write (including a re-save of an issue ALREADY in review) is rejected, not ignored, because a live review's checkpoint is protected by the claim. To revise the note on a review already submitted, use the `checkpoint` tool (it needs the claim_token), or send the issue back with status:"todo" and re-submit with a corrected handoff.
assigneeNoResponsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional for most statuses — unassigned issues stay in the global pull pool — but REQUIRED whenever the write leaves the issue in `review` (RTSC-347 + RTSC-400), including a CREATE with `status:"review"` (which records YOU as the submitter, so the assignee must be a different active principal). While an issue sits in `review`, '' does NOT unassign: clearing it, or naming the submitter's own principal, a suspended/retired member, or a placeholder nobody has signed in as (left by an import or a restore), is rejected even on a write that never mentions `status`. Send it back with `status:"todo"` first if you want it unassigned.
priorityNo0=None,1=Urgent,2=High,3=Medium,4=Low.
blockedByNoOn create: issue ids this new one DEPENDS ON (e.g. ['RTSC-12']). Creates blocked_by links so the dependency graph drives dispatch.
changeTypeNoREQUIRED on create — what KIND of change this is, in Conventional Commits' vocabulary: feat (new capability a user can reach) · fix (a defect repaired) · docs (documentation only) · style (formatting, no behaviour change) · refactor (restructuring, no behaviour change) · perf (measurably faster or cheaper) · test (tests only) · build (build system, deps, packaging) · ci (pipelines and automation) · chore (maintenance that ships no behaviour) · revert (undoes an earlier change). ONE per issue, never a list — the Cost page splits spend by it and a multi-valued dimension cannot sum to a total. Pick what the change IS, not what area it touches: that is what `labels` are for, and they are unaffected. Correctable later with the same call if the work turns out to be something else.
identifierNoExisting issue ID to update; omit to create.
cancelReasonNoRequired when status=canceled.
noDependencyNoOn create: a one-line reason this issue depends on nothing open. Use INSTEAD of blockedBy when independent — a positive 'I considered it' assertion.
reviewedSimilarNoOn create: the ids of the open look-alike issues you have READ (e.g. ['RTSC-959']). Send it only when there are any — a create with no look-alikes needs no acknowledgement and an empty list is never wrong. Retasc refuses a create while any open issue looks like the same or adjacent work — `DUPLICATE_CHECK_REQUIRED`, which names them — because duplicate work is the most expensive failure a fleet has, and it is the one thing the other three declarations never caught. Unlike `noDependency` this cannot be pre-filled blind: only the server produces these ids. Two ways through, both fine: file, read the refusal, re-call with the ids it named; or search with `list_issues` FIRST and name them yourself, which passes in one call. Unknown ids are ignored, the second call recomputes rather than trusting your list (so a look-alike filed in between is surfaced again), and this is valid ONLY on a create — passing it on an update is rejected. What to do with what you read: if one of them IS this work, do not create — comment on it or claim it; if one is adjacent, create and link it with `add_relation` after. A declared `blockedBy` also counts as having read that issue, but declare one only where the dependency is real — a blocks edge invented to clear this gate leaves the new issue undispatchable until the other one closes.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added
  2. Removed
  3. Changed2 schema fields changed
    • changedInput schema / properties / assignee / description
      Previous value: -"Responsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional for most statuses — unassigned issues stay in the global pull pool — but REQUIRED whenever the write leaves the issue in `review` (RTSC-347 + RTSC-400), including a CREATE with `status:\"review\"` (which records YOU as the submitter, so the assignee must be a different active principal). While an issue sits in `review`, '' does NOT unassign: clearing it, or naming the submitter's own principal or a suspended/retired member, is rejected even on a write that never mentions `status`. Send it back with `status:\"todo\"` first if you want it unassigned."New value: +"Responsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional for most statuses — unassigned issues stay in the global pull pool — but REQUIRED whenever the write leaves the issue in `review` (RTSC-347 + RTSC-400), including a CREATE with `status:\"review\"` (which records YOU as the submitter, so the assignee must be a different active principal). While an issue sits in `review`, '' does NOT unassign: clearing it, or naming the submitter's own principal, a suspended/retired member, or a placeholder nobody has signed in as (left by an import or a restore), is rejected even on a write that never mentions `status`. Send it back with `status:\"todo\"` first if you want it unassigned."
    • changedInput schema / properties / status / description
      Previous value: -"`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. `assignee` is REQUIRED on every write that LEAVES the issue in `review` (RTSC-347 + RTSC-400) — name the reviewer's human lane, an ACTIVE member who is a DIFFERENT principal than whoever submitted it (author ≠ reviewer). It is a property of the STATE, not of the transition: it applies when you move an issue to review, when you CREATE one with `status:\"review\"`, and to any later write that changes a live review's assignee — including a write that names no `status` at all. So `assignee:\"\"` can't clear a live review's reviewer, and it can't be re-pointed at the submitter or at a suspended/retired member: a review parked on a lane nobody can claim strands, non-terminal, blocking its dependents. To unassign, send it back first (`status:\"todo\"`). The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review is your team's convention; that it must be assigned is not."New value: +"`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. `assignee` is REQUIRED on every write that LEAVES the issue in `review` (RTSC-347 + RTSC-400) — name the reviewer's human lane, an ACTIVE member who is a DIFFERENT principal than whoever submitted it (author ≠ reviewer). It is a property of the STATE, not of the transition: it applies when you move an issue to review, when you CREATE one with `status:\"review\"`, and to any later write that changes a live review's assignee — including a write that names no `status` at all. So `assignee:\"\"` can't clear a live review's reviewer, and it can't be re-pointed at the submitter, at a suspended/retired member, or at a member nobody has ever signed in as (an unclaimed placeholder left behind by an import or a restore — RTSC-408): a review parked on a lane nobody can claim strands, non-terminal, blocking its dependents. To unassign, send it back first (`status:\"todo\"`). The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review is your team's convention; that it must be assigned is not."
  4. Changed2 schema fields changed
    • changedInput schema / properties / assignee / description
      Previous value: -"Responsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional for most statuses — unassigned issues stay in the global pull pool — but REQUIRED when `status:\"review\"` (RTSC-347): a review must name a different-principal reviewer or it's rejected."New value: +"Responsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional for most statuses — unassigned issues stay in the global pull pool — but REQUIRED whenever the write leaves the issue in `review` (RTSC-347 + RTSC-400), including a CREATE with `status:\"review\"` (which records YOU as the submitter, so the assignee must be a different active principal). While an issue sits in `review`, '' does NOT unassign: clearing it, or naming the submitter's own principal or a suspended/retired member, is rejected even on a write that never mentions `status`. Send it back with `status:\"todo\"` first if you want it unassigned."
    • changedInput schema / properties / status / description
      Previous value: -"`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. `assignee` is REQUIRED when moving to `review` (RTSC-347) — name the reviewer's human lane, an ACTIVE member who is a DIFFERENT principal than whoever submitted it (author ≠ reviewer). A review with no assignee, or one assigned to a suspended/retired member, is rejected: such a review is invisible to every lane AND locks the submitter out (they can't claim their own review back), so the work would strand. The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review is your team's convention; that it must be assigned is not."New value: +"`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. `assignee` is REQUIRED on every write that LEAVES the issue in `review` (RTSC-347 + RTSC-400) — name the reviewer's human lane, an ACTIVE member who is a DIFFERENT principal than whoever submitted it (author ≠ reviewer). It is a property of the STATE, not of the transition: it applies when you move an issue to review, when you CREATE one with `status:\"review\"`, and to any later write that changes a live review's assignee — including a write that names no `status` at all. So `assignee:\"\"` can't clear a live review's reviewer, and it can't be re-pointed at the submitter or at a suspended/retired member: a review parked on a lane nobody can claim strands, non-terminal, blocking its dependents. To unassign, send it back first (`status:\"todo\"`). The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review is your team's convention; that it must be assigned is not."
  5. Changed2 schema fields changed
    • changedInput schema / properties / assignee / description
      Previous value: -"Responsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional — unassigned issues stay in the global pull pool."New value: +"Responsible human (routing lane, distinct from claiming): a human member name, 'me', or '' to unassign. Optional for most statuses — unassigned issues stay in the global pull pool — but REQUIRED when `status:\"review\"` (RTSC-347): a review must name a different-principal reviewer or it's rejected."
    • changedInput schema / properties / status / description
      Previous value: -"`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. Set `assignee` to the reviewer's human lane when moving to `review` — it must be a DIFFERENT principal than whoever did the work (author ≠ reviewer). The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review, and who reviews, is your team's convention."New value: +"`review` (RTSC-257) = work finished, pending human acceptance: it still BLOCKS dependents (unlike done) and releases your lease so a reviewer can claim it. `assignee` is REQUIRED when moving to `review` (RTSC-347) — name the reviewer's human lane, an ACTIVE member who is a DIFFERENT principal than whoever submitted it (author ≠ reviewer). A review with no assignee, or one assigned to a suspended/retired member, is rejected: such a review is invisible to every lane AND locks the submitter out (they can't claim their own review back), so the work would strand. The reviewer's agent then promotes it (`status:done`, unblocks dependents) or sends it back (`status:todo` + a comment). Whether to use review is your team's convention; that it must be assigned is not."
  6. First observed

TDQS

A4.2/5.0
Behavior4/5

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

Annotations only say write/destructive/non-idempotent; the description adds the rejection gates (four required create declarations, `DUPLICATE_CHECK_REQUIRED`), the `labels` replace-not-merge side effect, and the billing-refusal handling via `tellHuman`. It loses a point because a large share of this content is restated in the schema field descriptions rather than being net-new 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.

Conciseness3/5

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

The create/update split is front-loaded and the required-declarations list is well enumerated, but the prose is bloated with editorial asides ('the cheapest issue to file is the one you don't file twice', the 2026-08-25 anecdote, the billing admonition) and repeats `reviewedSimilar` logic already in the schema.

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

Completeness4/5

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

For a 15-parameter, zero-annotation-coverage-of-gates, output-schema-less mutation tool, it covers required-on-create fields, state-transition constraints, and error recovery. It stops short of stating update merge semantics (which omitted fields are left untouched) or what a successful write returns.

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 each of the 15 parameters is already documented exhaustively in the schema, so the baseline is 3. The description adds cross-parameter rules (which fields are required together on create, that `handoff` is valid only on the review entry) but repeats most field semantics verbatim.

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?

Opens with a precise verb+resource pair and immediately splits the two modes: create when `identifier` is omitted, update when it is passed. It is unmistakably distinct from siblings like save_comment, add_relation, and claim_issue.

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 names the alternative path (search with `list_issues` first) and the decision rule when a look-alike exists ('if one of them IS this work, do not create — comment on it or claim it'). It also states when not to send `reviewedSimilar` (no look-alikes) and how to recover from a refusal.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources