Skip to main content
Glama

Vote for an issue (spec D143 (4)): one vote per person, idempotent

vote_issue

Vote for an issue (spec D143 (4)): one vote per person, idempotent.

Adds the caller to votes.by and returns the full issue. Voting twice is a no-op: 200 with the issue as it is, no new version, no history row. A real vote is a normal issue write — version + 1, history entry "vote" by the actor, event core.issue.updated with changed: ["votes"]. Project member and above (viewer 403 forbidden); an AI agent votes with its owner's rights (lane warning only, never a block). The project needs votes_enabled (Feedback template, or turned on in settings), else 409 votes_disabled.

Adds the token user's vote (D143): one vote per person, idempotent (voting again changes nothing). Pass the version from get_issue; returns the issue with votes {count, by} and my_vote. Members and up (viewer 403); a project with votes_enabled false → 409 votes_disabled. Vote only when the user asks.

WRITE: version = from your latest read (get_issue, list_comments, list_sprints, get_doc, read_file). 409 version_conflict (details.current, details.current_version): re-read, re-apply your change, retry — never overwrite blindly; when the changes disagree, ask the user.

Input Schema

NameRequiredDescriptionDefault
reasonNoSpec D144: why you make this change (≤ 200 characters). Optional, but give it when you act as an agent account — it is shown in the agent's run log ("moved KJ-12 To Do → In Progress because <reason>"). board-mcp records it in `agent.run`; board-core / board-files accept it and ignore it (it never changes the file, the version or the history).
versionYesOptimistic-lock version of the file; +1 on every write. Every write must send the version it read.
issue_keyYesIssue key `{PROJECT}-{n}`, e.g. `KJ-101`.
project_keyYesProject key, e.g. `KJ`. 2–10 chars, uppercase letters and digits, starts with a letter.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Added

TDQS

A3.9/5.0
Behavior1/5

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

Substantively the description discloses a lot (no-op on repeat, version + 1, history entry 'vote', `core.issue.updated` event, permission and error behavior) — but it flatly contradicts the structured annotation: it twice asserts the operation is 'idempotent' while annotations declare idempotentHint: false. The agent gets opposite signals on the single most important behavioral question for this tool.

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?

Front-loaded with the key constraint (one vote per person, idempotent), but the text is noticeably redundant — the D143 paragraph restates the opening sentence's content almost verbatim, and permission/409 details are repeated, so several sentences do not earn their 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 a 3-required-param write tool with no output schema, the definition covers the return shape (`votes` {count, by} and `my_vote`), the optimistic-lock contract, the failure modes (403/409/version_conflict with details), and the agent-account nuance (votes with owner's rights, lane warning only). 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 baseline is 3; the description earns above that by telling the agent where `version` must come from ('Pass the `version` from get_issue') and how to recover from 409 version_conflict (re-read, re-apply, retry, ask the user on disagreement). The optional `reason` parameter is left to its schema documentation.

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 ('Vote for an issue') and pins the exact effect — 'Adds the caller to `votes.by` and returns the full issue' — which cleanly separates it from sibling unvote_issue and from generic write tools like update_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?

Gives an explicit trigger ('Vote only when the user asks'), the eligibility gate ('Project member and above (viewer 403 `forbidden`)'), and the feature precondition (`votes_enabled`, else 409 votes_disabled), so the agent knows when the call will succeed and when it should not be attempted.

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