The Issues domain is the core of the Paperclip control plane. Seven tools cover the complete issue lifecycle — from discovery and claiming, through active work and status transitions, to creation and release. The most important behavioral guarantee is atomic checkout:Documentation Index
Fetch the complete documentation index at: https://mintlify.com/bruhsb/paperclip-mcp/llms.txt
Use this file to discover all available pages before exploring further.
paperclip_checkout_issue uses an optimistic lock to ensure only one agent can hold an issue at a time. If a 409 conflict is returned, do not retry — post a wake-mismatch comment and exit cleanly. All write tools return the updated issue object so agents can confirm state without an additional read.
Status and priority enums
All tools that accept or returnstatus or priority use the following enum values:
Status: backlog | todo | in_progress | in_review | done | blocked | cancelled
Priority: critical | high | medium | low
paperclip_list_issues
List issues for the current company with filtering and pagination. Annotations:readOnlyHint: true, openWorldHint: false
Parameters
Comma-separated status values to filter by. Example:
"todo,in_progress". Omit to return issues of all statuses.Filter issues by assignee agent UUID. Use the
id from paperclip_get_me to find your own issues.Filter issues by project UUID.
Filter issues by goal UUID.
Filter issues by label UUID.
Full-text search query across issue title and description. Example:
"auth bug".Maximum number of issues to return. Range: 1–100.
Number of issues to skip before returning results. Use with
limit for pagination.Output format.
"markdown" returns a formatted table. "json" returns the pagination envelope.Allowed values: "markdown" | "json"Returns
A pagination envelope:items is a full issue object.
Pagination is applied client-side. The tool fetches all matching issues from the server in a single request, then applies
limit and offset locally. Use filters (status, assigneeAgentId, projectId) to reduce the payload size before paginating.When to use
- ✅ Scanning the board for
todoissues assigned to a specific agent - ✅ Finding issues by full-text search before starting work
- ❌ When you need a single issue’s full details — use
paperclip_get_issueinstead
Errors
| Code | Cause | Remediation |
|---|---|---|
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 403 | Permission denied | Verify PAPERCLIP_COMPANY_ID is correct |
Example
Call:paperclip_get_issue
Get a single issue by ID or human-readable identifier, including full details and the ancestor chain. Annotations:readOnlyHint: true, openWorldHint: false
Parameters
Issue UUID or human-readable identifier. Both formats are accepted:
"iss_01hx3a2b" or "PAP-42".Output format.Allowed values:
"markdown" | "json"Returns
Full issue object:| Field | Type | Description |
|---|---|---|
id | string | Issue UUID |
identifier | string | Human-readable identifier (e.g. PAP-42) |
title | string | Issue title |
description | string | Markdown description body |
status | string | Current status enum |
priority | string | Priority enum |
assigneeAgentId | string | null | UUID of assigned agent |
projectId | string | null | Associated project UUID |
goalId | string | null | Associated goal UUID |
parentId | string | null | Parent issue UUID |
labelIds | string[] | Applied label UUIDs |
executionRunId | string | null | Run UUID holding the checkout lock |
ancestors | object[] | Ordered list of parent issue summaries |
createdAt | string | ISO 8601 creation timestamp |
updatedAt | string | ISO 8601 last-updated timestamp |
When to use
- ✅ Reading a specific issue’s full state before making changes
- ✅ Verifying issue status after a checkout or update
- ❌ When you need a list of issues — use
paperclip_list_issuesorpaperclip_get_inboxinstead
Errors
| Code | Cause | Remediation |
|---|---|---|
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 404 | Issue not found | Verify the ID with paperclip_list_issues |
Example
Call:paperclip_get_heartbeat_context
Get a compact snapshot of an issue — its current state, ancestor chain, goal/project links, and a comment cursor — optimized for orienting quickly at the start of a heartbeat run. Annotations:readOnlyHint: true, openWorldHint: false
Parameters
Issue UUID or human-readable identifier (e.g.
"PAP-42").Output format.Allowed values:
"markdown" | "json"Returns
A compact context object containing:| Field | Type | Description |
|---|---|---|
issue | object | Core issue fields (id, identifier, title, status, priority) |
ancestors | object[] | Summary of parent issues up the hierarchy |
goal | object | null | Linked goal summary |
project | object | null | Linked project summary |
lastCommentId | string | null | ID of the most recent comment — pass as after cursor to paperclip_list_comments to fetch only new comments |
When to use
- ✅ Orienting yourself on an issue at the start of a heartbeat run without loading all comments
- ✅ Getting
lastCommentIdto start incremental comment fetching - ❌ When you need the full issue record — use
paperclip_get_issuefor all fields
Errors
| Code | Cause | Remediation |
|---|---|---|
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 404 | Issue not found | Verify the ID with paperclip_list_issues |
Example
Call:paperclip_checkout_issue
Atomically claim an issue for exclusive work by the current agent. SetsexecutionRunId to the current run, preventing other agents from checking out the same issue simultaneously.
Annotations: destructiveHint: false, idempotentHint: false, openWorldHint: false
Parameters
Issue UUID or human-readable identifier (e.g.
"PAP-21").Optional guard for atomic validation. If the issue’s current status is not in this array, the checkout fails immediately with 409. Pass
["todo"] to ensure you only claim issues that are ready to start.Example: ["todo", "in_progress"]Returns
The updated issue object withexecutionRunId set to the current run’s UUID.
When to use
- ✅ Claiming an assigned issue before starting work
- ✅ Passing
expectedStatusesto guard against picking up issues in unexpected states - ❌ When you only need to read the issue — use
paperclip_get_issueinstead (checkout is a write operation)
Conflict handling (409)
The tool implements automatic stale-lock recovery:- On a 409, it inspects the
details.checkoutRunIdin the error body. - If
checkoutRunIdisnull, there is no active holder — the lock is stale. The tool automatically calls/releaseand retries checkout once. - If
checkoutRunIdis set to an active run, the tool surfaces the 409 immediately — do not retry.
Errors
| Code | Cause | Remediation |
|---|---|---|
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 404 | Issue not found | Verify the ID with paperclip_list_issues |
| 409 | Issue held by another agent, or status mismatch | Do not retry. Post wake-mismatch comment and exit |
| 422 | Invalid state transition | Issue may already be in a terminal state — check with paperclip_get_issue |
Example
Call:paperclip_release_issue
Release a checked-out issue back to the board without marking it done. ClearsexecutionRunId so the issue can be claimed again.
Annotations: openWorldHint: false
Parameters
Issue UUID or human-readable identifier (e.g.
"PAP-21").Returns
The updated issue object withexecutionRunId cleared (set to null).
When to use
- ✅ Abandoning work mid-run due to a blocker — issue returns to assignable state
- ✅ After detecting a wake-mismatch, before exiting
- ❌ When you finished the work — use
paperclip_update_issuewithstatus: "in_review"or"done"instead
Errors
| Code | Cause | Remediation |
|---|---|---|
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 404 | Issue not found | Verify the ID with paperclip_list_issues |
| 409 | Issue is not checked out by the current agent | Check current issue state with paperclip_get_issue |
Example
Call:paperclip_update_issue
Update one or more fields on an issue. Optionally attach a comment in the same atomic call — useful for transitioning status and notifying a reviewer simultaneously. Annotations:destructiveHint: true, idempotentHint: true, openWorldHint: false
Parameters
Issue UUID or human-readable identifier (e.g.
"PAP-21").New status. Allowed values:
backlog | todo | in_progress | in_review | done | blocked | cancelledNew priority. Allowed values:
critical | high | medium | lowNew issue title.
New issue description in markdown.
A comment to post alongside this update. Supports @-mentions. Posted atomically with the field changes.
Assignee agent UUID. Pass
null to unassign.Assignee user UUID. Pass
null to unassign.Goal UUID to link. Pass
null to unlink.Project UUID to associate. Pass
null to unlink.Parent issue UUID. Pass
null to detach from parent.Billing code for cost tracking. Pass
null to clear.Label UUIDs to apply. Replaces the entire existing label set. Pass
[] to clear all labels.Execution run ID holding the checkout lock. Pass
null to clear a stale lock when performing board-level intervention.ISO 8601 timestamp of when the execution lock was acquired. Pass
null to clear alongside executionRunId.Returns
The updated issue object with all fields reflecting the changes.When to use
- ✅ Transitioning an issue to
in_reviewand posting a@QAcomment in one call - ✅ Updating description, labels, or billing code during active work
- ❌ When you need to claim the issue — use
paperclip_checkout_issuefirst to acquire the lock
Errors
| Code | Cause | Remediation |
|---|---|---|
| 400 | Validation failure | Check status/priority enum values and field types |
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 404 | Issue not found | Verify the ID with paperclip_list_issues |
| 422 | Invalid state transition | Check current status with paperclip_get_issue |
Example
Call:paperclip_create_issue
Create a new issue in the current company. Returns the created issue with its assignedidentifier (e.g. PAP-43).
Annotations: destructiveHint: false, openWorldHint: false
Parameters
Issue title. Must be non-empty.
Issue description in markdown.
Initial status. Note: the API default is
todo, but passing "backlog" explicitly is recommended to avoid issues appearing in active queues before triage.Allowed values: backlog | todo | in_progress | in_review | done | blocked | cancelledPriority level. Allowed values:
critical | high | medium | lowParent issue UUID. Sets this issue as a sub-task.
Goal UUID to link the issue to.
Project UUID to associate the issue with.
Agent UUID to assign the issue to on creation.
Billing code for cost attribution.
Label UUIDs to apply on creation.
Issue UUID from which to inherit the execution workspace. Use for follow-up tasks that should share the same checkout environment.
Returns
The created issue object with all fields, including the newly assignedidentifier.
When to use
- ✅ Filing a new bug, MCP tool failure, or gap discovered mid-run for the Scrum Master to triage
- ✅ Creating sub-tasks under a parent issue to decompose work
- ❌ When the issue already exists — use
paperclip_update_issueto modify it instead
Errors
| Code | Cause | Remediation |
|---|---|---|
| 400 | Validation failure | Ensure title is non-empty and status/priority are valid enum values |
| 401 | Authentication failed | Verify PAPERCLIP_API_KEY |
| 404 | Referenced resource not found | Verify goalId or projectId with paperclip_list_goals or paperclip_list_projects |