Skip to main content
Glama

Toggle comment reaction

toggle_comment_reaction

Toggle an emoji reaction on an OpenProject work-package comment to acknowledge it or take the reaction back, then return the comment's full reaction state and whether you now reacted.

Instructions

React to a work-package comment with an emoji, or take your reaction back.

Use this for the lightweight acknowledgement a comment does not deserve: šŸ‘ on a decision, šŸ‘€ to say you are looking at it, šŸŽ‰ when something shipped. Returns the comment's full reaction state afterwards — every emoji on it with the people who picked it — plus reacted, which says whether you are now among them.

Pitfalls. This is a toggle, not an add: calling it twice with the same reaction leaves the comment exactly as it started, so it is not safe to retry blindly after a timeout — read reacted from the result instead. Reactions belong to the authenticated account; you cannot react on someone else's behalf and cannot remove their reaction. Only comment entries can be reacted to — a field-change journal entry ("Status changed from New to In progress") is refused by OpenProject with a 400. The feature needs OpenProject 16.0 or newer; an instance known to be older is refused up front with a version hint rather than pretending to have reacted, and one whose version is not readable answers 404 instead.

Cross-references: list_work_package_comments reads the thread and produces activity ids; add_work_package_comment says something in words when an emoji is not enough; get_instance_info reports the detected OpenProject version.

Input Schema

NameRequiredDescriptionDefault
reactionYesWhich emoji to toggle. OpenProject accepts exactly eight: thumbs_up (šŸ‘), thumbs_down (šŸ‘Ž), grinning_face_with_smiling_eyes (šŸ˜„), confused_face (šŸ˜•), heart (ā¤ļø), party_popper (šŸŽ‰), rocket (šŸš€), eyes (šŸ‘€). Passing the emoji character itself is rejected — use these names.
activity_idYesId of the comment to react to. It comes from list_work_package_comments (the 'id' of an entry with kind='comment') or from add_work_package_comment's result — it is an activity id, not a work package id.

Output Schema

NameRequiredDescriptionDefault
notesNo
messageYes
reactedNo
reactionYes
reactionsNo
activity_idYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed35 schema fields changedv0.4.0
    • removedOutput schema / description
      Removed value: -"The reactions on a comment after one of them was toggled."
    • removedOutput schema / properties / activity_id / description
      Removed value: -"Activity (journal entry) whose reactions these are."
    • removedOutput schema / properties / message / description
      Removed value: -"Human-readable confirmation."
    • removedOutput schema / properties / notes / description
      Removed value: -"Degradation notes; always a list, usually empty."
    • removedOutput schema / properties / reacted / anyOf
      Removed value: -[
      -  {
      -    "type": "boolean"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / reacted / default
      Removed value: -null
    • removedOutput schema / properties / reacted / description
      Removed value: -"True when YOU now react with it, false when this call removed your reaction. Null when the authenticated user could not be determined."
    • addedOutput schema / properties / reacted / type
      Added value: +[
      +  "boolean",
      +  "null"
      +]
    • removedOutput schema / properties / reaction / description
      Removed value: -"The reaction this call toggled."
    • removedOutput schema / properties / reactions / description
      Removed value: -"Every reaction on the comment after the toggle; always a list, empty once the last one is removed."
    • removedOutput schema / properties / reactions / items / description
      Removed value: -"One reaction group on a comment: an emoji and everyone who picked it."
    • removedOutput schema / properties / reactions / items / properties / count / default
      Removed value: -0
    • removedOutput schema / properties / reactions / items / properties / count / description
      Removed value: -"How many people reacted with this emoji."
    • removedOutput schema / properties / reactions / items / properties / emoji / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / reactions / items / properties / emoji / default
      Removed value: -null
    • removedOutput schema / properties / reactions / items / properties / emoji / description
      Removed value: -"The emoji character itself, e.g. 'šŸš€'."
    • addedOutput schema / properties / reactions / items / properties / emoji / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / reactions / items / properties / first_reaction_at / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / reactions / items / properties / first_reaction_at / default
      Removed value: -null
    • removedOutput schema / properties / reactions / items / properties / first_reaction_at / description
      Removed value: -"ISO 8601 UTC timestamp of the first reaction of this kind."
    • addedOutput schema / properties / reactions / items / properties / first_reaction_at / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / reactions / items / properties / reaction / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / reactions / items / properties / reaction / default
      Removed value: -null
    • removedOutput schema / properties / reactions / items / properties / reaction / description
      Removed value: -"Reaction name, e.g. 'thumbs_up' or 'rocket'."
    • addedOutput schema / properties / reactions / items / properties / reaction / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / reactions / items / properties / users / description
      Removed value: -"Users who reacted with it; always a list, never empty for a group OpenProject still reports."
    • removedOutput schema / properties / reactions / items / properties / users / items / description
      Removed value: -"A reference to another resource. Canonical output shape."
    • removedOutput schema / properties / reactions / items / properties / users / items / properties / id / anyOf
      Removed value: -[
      -  {
      -    "type": "integer"
      -  },
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / reactions / items / properties / users / items / properties / id / default
      Removed value: -null
    • removedOutput schema / properties / reactions / items / properties / users / items / properties / id / description
      Removed value: -"Resource id."
    • addedOutput schema / properties / reactions / items / properties / users / items / properties / id / type
      Added value: +[
      +  "integer",
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / reactions / items / properties / users / items / properties / name / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • removedOutput schema / properties / reactions / items / properties / users / items / properties / name / default
      Removed value: -null
    • removedOutput schema / properties / reactions / items / properties / users / items / properties / name / description
      Removed value: -"Human-readable name."
    • addedOutput schema / properties / reactions / items / properties / users / items / properties / name / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  2. First observedv0.1.0

TDQS

A4.8/5.0
Behavior5/5

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

Goes far beyond the annotations: it discloses that this is a non-idempotent toggle (matching idempotentHint=false) and warns against blind retries after a timeout — a subtle trap the annotations alone cannot convey. It also covers auth scope (only the authenticated account's reaction), the 400 refusal on non-comment entries, and version gating with 404 fallback.

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 usage, then a clearly labeled 'Pitfalls' block and 'Cross-references' block — easy to scan. Slightly long, and the version-detection paragraph is more verbose than strictly necessary, but no sentence is pure 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?

Although an output schema exists, the description still explains the meaningful return field (`reacted`) and the full reaction roster, and it covers version prerequisites, retry hazards, and permission scope. Nothing an agent needs 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 both parameters are already well documented in the schema. The description adds semantic value by framing `reaction` as a per-emoji toggle (calling twice restores the original state) and by tying the return `reacted` flag to that parameter's effect.

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?

Names a specific verb+resource (toggle a reaction on a work-package comment) and immediately disambiguates the two directions (add vs. remove) while contrasting with siblings like add_work_package_comment and list_work_package_comments. An agent can tell exactly what this 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 Guidelines5/5

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

Gives concrete when-to-use examples (šŸ‘ on a decision, šŸ‘€ to say you're looking, šŸŽ‰ on a ship) and explicitly routes elsewhere when an emoji is insufficient (add_work_package_comment) or when the version must be checked (get_instance_info). Exclusions are stated: only comment entries, not journal field-change entries.

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