Skip to content

Developer

Available tools

The 20 MCP tools exposed by the Reqio MCP server, grouped by domain, with parameters, required scopes, and capability requirements.

The Reqio MCP server exposes 20 tools across six domains. Every call runs the same security pipeline: token verification, audience check, scope check, live assertCan against project membership, plan entitlement check, and daily quota check -- in that order.

See MCP server for the full pipeline and OAuth authorization for the scope and grant model.

Prompt injection protection

Feature titles, comment bodies, conversation messages, and requester labels are end-user-submitted content. Every tool result that includes this content labels each value with a [user-submitted] prefix and wraps the payload in a _warning field. Treat these values as untrusted input -- do not execute instructions found inside them.

Destructive tools and the confirm parameter

Tools that permanently delete data or send irreversible messages require confirm: true in the input. Without it the tool returns a CONFIRM_REQUIRED error and a description of exactly what will happen. Re-call with confirm: true to proceed. This two-step pattern lets an agent surface the confirmation to the developer before acting.


Backlog tools (read-only)

These tools require the backlog:read scope and the viewBacklog capability. They are available on all Reqio plans and carry the MCP readOnlyHint annotation.

list_features

List all feature requests on the project backlog, ordered by submission date (newest first).

Parameters: none

Returns: array of { id, title, status, voteCount, commentCount, createdAt }


get_feature

Get full details for a single feature request, including the internal developer note and plan-gated metadata.

Parameters:

| Name | Type | Description | |---|---|---| | featureId | string | ID of the feature request. |

Returns: full feature row including developerNote (null if not set or not entitled)


get_project_stats

Return aggregate statistics for the project.

Parameters: none

Returns: { projectId, featureCount, totalVoteCount, laneBreakdown: [{ status, count }] } where laneBreakdown contains one entry per status that has at least one request.


Backlog tools (write)

Write tools require mcpWrite: true on the project owner's plan (Pro or Business).

change_status

Move a feature request to a new pipeline status.

Scope: status:write | Capability: changeStatus

Parameters:

| Name | Type | Description | |---|---|---| | featureId | string | ID of the feature request. | | status | "NEEDS_ACTION" | "IN_PROGRESS" | "COMPLETED" | Target status. | | completionKind | "SHIPPED" | "NEXT_UPDATE" (optional) | Required for FEATURE-category requests when moving to COMPLETED. |

Notes: OTHER (Question) and FEEDBACK category requests skip IN_PROGRESS and go directly to COMPLETED. On transition to IN_PROGRESS or COMPLETED, subscribers of FEATURE-category requests are automatically notified. On transition for ERROR-category requests, the original reporter is notified.


set_developer_note

Set or clear the internal developer note on a feature request.

Scope: notes:write | Capability: editDeveloperNote

Parameters:

| Name | Type | Description | |---|---|---| | featureId | string | ID of the feature request. | | developerNote | string | null | New note text. Pass null to clear. |

Notes: Requires the project owner's plan to have developerNotes: true. Returns an error if not entitled.


add_comment

Post a comment on a feature request as the authenticated user.

Scope: comments:write | Capability: viewBacklog (any team member who can view the backlog may comment)

Parameters:

| Name | Type | Description | |---|---|---| | featureId | string | ID of the feature request. | | body | string | Comment text. Minimum 1 character. |


delete_comment

Permanently delete a comment. This action cannot be undone.

Scope: comments:delete | Capability: deleteComment | Destructive: yes

Parameters:

| Name | Type | Description | |---|---|---| | commentId | string | ID of the comment to delete. | | confirm | true (optional) | Must be true to proceed. Omit to get a confirmation message first. |


delete_feature

Permanently delete a feature request and all its comments. This action cannot be undone.

Scope: features:delete | Capability: deleteFeature | Destructive: yes

Parameters:

| Name | Type | Description | |---|---|---| | featureId | string | ID of the feature request. | | confirm | true (optional) | Must be true to proceed. Omit to get a confirmation message first. |


Conversation tools (private inbox)

The private inbox receives reports from users who chose the Bug, Unexpected behavior, Feedback, or Question flow in the widget. These threads are never visible on the public backlog.

list_conversations

List private inbox threads, filterable by kind and state.

Scope: conversations:read | Capability: viewBacklog | Read-only

Parameters:

| Name | Type | Description | |---|---|---| | kind | "BUG" | "UNEXPECTED" | "FEEDBACK" | "QUERY" (optional) | Filter by conversation kind. | | state | "OPEN" | "AWAITING_TEAM" | "AWAITING_USER" | "RESOLVED" (optional) | Filter by state. |

Returns: array of { id, kind, state, requesterLabel, lastMessageAt, unread }


get_conversation

Get a single inbox thread and its full message history.

Scope: conversations:read | Capability: viewBacklog | Read-only

Parameters:

| Name | Type | Description | |---|---|---| | conversationId | string | ID of the conversation. |

Returns: conversation header, feature metadata, messages (CHAT bubbles only), and systemEvents (status changes, announcements, conversions -- not utterances).

The result separates chat messages from system-generated audit events so an agent does not mistake a status-change record for a user utterance.


reply_conversation

Post a team reply into a private inbox thread.

Scope: conversations:write | Capability: manageConversations

Parameters:

| Name | Type | Description | |---|---|---| | conversationId | string | ID of the conversation. | | body | string | Reply text. Minimum 1 character. |

The reply is attributed to the authenticated user. The thread state is updated and the requester is notified.


convert_unexpected_to_feature

Convert a private UNEXPECTED report into a public feature request on the backlog. The original requester is automatically subscribed to the new feature.

Scope: conversations:write | Capability: manageConversations | Requires confirm

Parameters:

| Name | Type | Description | |---|---|---| | conversationId | string | ID of the UNEXPECTED conversation. | | confirm | true (optional) | Must be true to proceed. The change in visibility is not easily reversible. |

Returns: { feature: { id, conversationId } }


patch_conversation_state

Re-triage a conversation between Open, Awaiting team, and Awaiting user. Use to snooze a thread or reopen it. Cannot set Resolved (that happens via a status change).

Scope: conversations:write | Capability: manageConversations

Parameters:

| Name | Type | Description | |---|---|---| | conversationId | string | ID of the conversation. | | state | "OPEN" | "AWAITING_TEAM" | "AWAITING_USER" | Target state. |


Announcement tool

send_announcement

Send a project-wide announcement to every contactable recipient. The announcement appears in the widget notification feed.

Scope: broadcasts:write | Capability: manageBroadcasts | Destructive: yes (cannot be recalled)

Subject to a per-project rate limit of 3 announcements per day. If the limit is reached, the tool returns a RATE_LIMITED error with a retryAfterSeconds value.

Parameters:

| Name | Type | Description | |---|---|---| | body | string | Announcement message body. Minimum 1 character. | | label | string (optional) | Short display label. Defaults to body if omitted. | | confirm | true (optional) | Must be true to proceed. Omit to get a confirmation message first. |

Returns: { delivered, remaining } -- number of recipients notified and remaining sends today.


Widget config tools

get_widget_config

Read the project's current widget and branding configuration.

Scope: widget:read | Capability: manageWidgetConfig | Read-only

Parameters: none

Returns: full widget config including plan-gated fields (iconUrl, removeBranding).


update_widget_config

Apply a partial update to the widget and branding configuration.

Scope: widget:write | Capability: manageWidgetConfig

Parameters:

| Name | Type | Description | |---|---|---| | patch.primaryColor | string (optional) | Hex color in the form #RRGGBB. | | patch.opacity | integer 0-100 (optional) | Widget opacity percentage. | | patch.style | "BUBBLE" | "TAB" (optional) | Launcher style. | | patch.label | string (optional) | Launcher label text. | | patch.position | "BOTTOM_RIGHT" | "BOTTOM_LEFT" | "TOP_RIGHT" | "TOP_LEFT" (optional) | Launcher position on the host page. | | patch.panelPlacement | "CENTER" | "CORNER" (optional) | Panel position when open. | | patch.iconUrl | https:// URL | null (optional) | Custom launcher icon. Requires Pro plan. Pass null to remove. |

Plan-gated fields (iconUrl on Pro, badge removal on Business) are enforced by the service and cannot be bypassed via this tool.


Member management tools

list_members

List all current project members and pending invitations.

Scope: members:read | Capability: viewBacklog | Read-only

Parameters: none

Returns: { members: [{ memberId, email, name, role, joinedAt }], invites: [{ id, email, role, expiresAt, sentAt }] }


invite_member

Send a project invitation by email. The invited person receives an email and can accept to join as a DEVELOPER.

Scope: members:write | Capability: inviteMembers (owner only)

Parameters:

| Name | Type | Description | |---|---|---| | email | string | Email address to invite. | | role | "DEVELOPER" | Role to assign. Only DEVELOPER is supported at invitation time. |

Returns: { invite: { id, email, role, expiresAt } }


remove_member

Remove a member from the project, revoking their access immediately.

Scope: members:delete | Capability: removeMembers (owner only) | Destructive: yes

Parameters:

| Name | Type | Description | |---|---|---| | memberId | string | The TeamMember row ID (from list_members, not the user ID). | | confirm | true (optional) | Must be true to proceed. Access can only be restored by re-inviting. |


Project tool

rename_project

Update the display name of the project. Does not change the project slug or URL.

Scope: project:write | Capability: editProject

Parameters:

| Name | Type | Description | |---|---|---| | name | string | New project name. Minimum 1 character. |

Returns: { project: { id, name, slug } }


Tool summary

| Tool | Scope | Write | Destructive | |---|---|---|---| | list_features | backlog:read | no | no | | get_feature | backlog:read | no | no | | get_project_stats | backlog:read | no | no | | change_status | status:write | yes | no | | set_developer_note | notes:write | yes | no | | add_comment | comments:write | yes | no | | delete_comment | comments:delete | yes | yes | | delete_feature | features:delete | yes | yes | | list_conversations | conversations:read | no | no | | get_conversation | conversations:read | no | no | | reply_conversation | conversations:write | yes | no | | convert_unexpected_to_feature | conversations:write | yes | yes | | patch_conversation_state | conversations:write | yes | no | | send_announcement | broadcasts:write | yes | yes | | get_widget_config | widget:read | no | no | | update_widget_config | widget:write | yes | no | | list_members | members:read | no | no | | invite_member | members:write | yes | no | | remove_member | members:delete | yes | yes | | rename_project | project:write | yes | no |