> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Shortcut

The Shortcut connector lets your AI agent act in each user's Shortcut account. Each user connects their own Shortcut API key once, and Scalekit sends it with every call, so your agent never handles credentials. It comes with 124 tools.

**Authentication:** API Key
**Categories:** Project Management, Developer Tools
**Tools:** 124: 65 read, 41 write, 18 destructive
**Users sign in with:** API key
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=SHORTCUT)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Shortcut connection

   In **AgentKit > Connections**, create a Shortcut connection. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'shortcut'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Shortcut:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'shortcut_get_current_member',
     toolInput: {},
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "shortcut"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Shortcut:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={},
       tool_name="shortcut_get_current_member",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user opens the link once and enters their Shortcut credentials there. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'shortcut_get_category',
  toolInput: {
    category_id: 12,
  },
  connector: 'shortcut',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="shortcut_get_category",
    tool_input={
        "category_id": 12,
    },
    connection_name="shortcut",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `shortcut_get_category`

Get Category · Read-only

Get one Shortcut objective category by ID.
Returns the category's name, color, type, and archived flag.
Use this when you have a category ID. Use list_categories to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category_id` (`integer`, required): Numeric ID of the category (from list_categories). Example: 12.

Example input: `{"category_id":12}`

### `shortcut_get_current_member`

Get Current Member · Read-only

Get the Shortcut member that owns the connected API token.
Returns the member's ID, name, mention name, role, workspace, and organization.
Use this to find your own member ID before filtering or assigning work. Use get_member for any other member.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_get_custom_field`

Get Custom Field · Read-only

Get one Shortcut custom field by ID.
Returns the field's name, type, enabled flag, story types, and allowed values with their IDs.
Use this when you have a custom field ID. Use list_custom_fields to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `custom_field_id` (`string`, required): UUID of the custom field (from list_custom_fields). Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"custom_field_id":"<custom_field_id>"}`

### `shortcut_get_doc`

Get Doc · Read-only

Get one Shortcut Doc with its content.
Returns the doc's title, Markdown content (and HTML when requested), archived flag, timestamps, and app URL.
Use this to read a doc. Use search_docs or list_docs to find doc IDs.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `doc_id` (`string`, required): UUID of the doc (from list_docs or search_docs). Example: 12345678-9abc-4def-8123-456789abcdef.
- `content_format` (`string`, optional): Response content format. markdown (default) returns content_markdown; html also includes content_html. Example: markdown. One of: `markdown`, `html`.

Example input: `{"doc_id":"<doc_id>"}`

### `shortcut_get_entity_template`

Get Story Template · Read-only

Get one Shortcut story template by ID.
Returns the template's name, author ID, last used time, and story contents.
Use this to inspect a template before create_story_from_template.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `template_id` (`string`, required): UUID of the story template (from list_entity_templates). Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"template_id":"<template_id>"}`

### `shortcut_get_epic`

Get Epic · Read-only

Get one Shortcut epic by ID with its full details.
Returns the epic's name, description, state, owners, teams, objectives, labels, comments, health, stats, and app URL.
Use get_epic when you have an epic ID. Use list_epic_stories for the stories in it.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"epic_id":56}`

### `shortcut_get_epic_comment`

Get Epic Comment · Read-only

Get one comment on a Shortcut epic, with its replies.
Returns the comment's ID, author ID, text, nested replies, and timestamps.
Use this when you have a comment ID. Use list_epic_comments for all comments on an epic.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"comment_id":5678,"epic_id":56}`

### `shortcut_get_epic_health`

Get Epic Health · Read-only

Get the current health status of a Shortcut epic.
Returns the health record (ID, status such as On Track or At Risk, text, author ID, timestamps).
Use this for the latest status. Use list_epic_health_history for past updates.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"epic_id":56}`

### `shortcut_get_epic_workflow`

Get Epic Workflow · Read-only

Get the epic workflow for the Shortcut workspace.
Returns the default epic state ID and the list of epic states (ID, name, type, position).
Use this to find an epic_state_id for create_epic or update_epic. Story workflow states come from list_workflows.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_get_external_link_stories`

Get Stories by External Link · Read-only

Find Shortcut stories that have a given external link attached.
Returns an array of matching stories (ID, name, workflow state, external links, app URL).
Use this to find stories tied to a URL such as a support ticket or doc. Use search_stories for text queries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `external_link` (`string`, required): The external URL to look up. Example: https://support.example.com/tickets/42.

Example input: `{"external_link":"<external_link>"}`

### `shortcut_get_file`

Get File · Read-only

Get one uploaded file in Shortcut by ID.
Returns the file's name, filename, description, content type, size, URL, story IDs, and uploader ID.
Use this when you have a file ID. Use list_files to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `file_id` (`integer`, required): Numeric ID of the uploaded file (from list_files). Example: 88.

Example input: `{"file_id":88}`

### `shortcut_get_group`

Get Team · Read-only

Get one Shortcut team (group) by ID.
Returns the team's name, mention name, description, member IDs, workflow IDs, default workflow, and story counts.
Use this when you have a group ID. Use list_group_stories for its stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `group_id` (`string`, required): UUID of the team (group), from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"group_id":"<group_id>"}`

### `shortcut_get_iteration`

Get Iteration · Read-only

Get one Shortcut iteration by ID.
Returns the iteration's name, description, status, start and end dates, teams, labels, stats, and app URL.
Use this when you have an iteration ID. Use list_iteration_stories for its stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `iteration_id` (`integer`, required): Numeric ID of the iteration (from list_iterations). Example: 78.

Example input: `{"iteration_id":78}`

### `shortcut_get_key_result`

Get Key Result · Read-only

Get one key result of a Shortcut objective.
Returns the key result's name, type, objective ID, initial, current, and target values, and progress.
Use this to check progress. Key result IDs come from get_objective (key_result_ids).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `key_result_id` (`string`, required): UUID of the key result (from get_objective's key_result_ids). Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"key_result_id":"<key_result_id>"}`

### `shortcut_get_label`

Get Label · Read-only

Get one Shortcut label by ID.
Returns the label's name, color, description, archived flag, and stats.
Use this when you have a label ID. Use list_labels to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`integer`, required): Numeric ID of the label (from list_labels). Example: 345.

Example input: `{"label_id":345}`

### `shortcut_get_linked_file`

Get Linked File · Read-only

Get one Shortcut linked file by ID.
Returns the linked file's name, type, URL, description, size, story IDs, and uploader ID.
Use this when you have a linked file ID. Use list_linked_files to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `linked_file_id` (`integer`, required): Numeric ID of the linked file (from list_linked_files). Example: 99.

Example input: `{"linked_file_id":99}`

### `shortcut_get_member`

Get Member · Read-only

Get one Shortcut workspace member by ID.
Returns the member's role, state, disabled flag, team IDs, and profile (name, mention name, email).
Use this when you have a member ID. Use list_members to find one, or get_current_member for the token owner.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `member_id` (`string`, required): UUID of the member, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `org_id` (`string`, optional): The unique ID of the Organization to limit the lookup to. Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"member_id":"<member_id>"}`

### `shortcut_get_objective`

Get Objective · Read-only

Get one Shortcut objective by ID.
Returns the objective's name, description, state, categories, key result IDs, stats, and app URL.
Use this when you have an objective ID. Use list_objective_epics for its epics.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.

Example input: `{"objective_id":90}`

### `shortcut_get_objective_health`

Get Objective Health · Read-only

Get the current health status of a Shortcut objective.
Returns the health record (ID, status such as On Track or At Risk, text, author ID, timestamps).
Use this for the latest status. Use list_objective_health_history for past updates.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.

Example input: `{"objective_id":90}`

### `shortcut_get_project`

Get Project · Read-only

Get one Shortcut project by ID.
Returns the project's name, description, abbreviation, team ID, workflow ID, archived flag, stats, and app URL.
Use this when you have a project ID. Use list_project_stories for its stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`integer`, required): Numeric ID of the project (from list_projects). Example: 23.

Example input: `{"project_id":23}`

### `shortcut_get_repository`

Get Repository · Read-only

Get one VCS repository connected to Shortcut by ID.
Returns the repository's name, full name, type, URL, and external ID.
Use this when you have a repository ID. Use list_repositories to browse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `repository_id` (`integer`, required): Numeric ID of the repository (from list_repositories). Example: 7.

Example input: `{"repository_id":7}`

### `shortcut_get_story`

Get Story · Read-only

Get one Shortcut story by ID with its full details.
Returns the story's name, description, type, workflow state, owners, epic, iteration, labels, tasks, comments, story links, branches, pull requests, and app URL.
Use get_story when you have a story ID. Use search_stories or query_stories to find stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"story_id":1234}`

### `shortcut_get_story_comment`

Get Story Comment · Read-only

Get one comment on a Shortcut story.
Returns the comment's ID, author ID, text, parent ID, reactions, and timestamps.
Use this when you have a comment ID. Use list_story_comments for all comments on a story.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"comment_id":5678,"story_id":1234}`

### `shortcut_get_story_history`

Get Story History · Read-only

Get the change history of a Shortcut story.
Returns history entries with the actor, change time, and the actions and references that changed (for example state moves, owner changes, edits).
Use this to audit who changed a story and when. Use get_story for the story's current state.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"story_id":1234}`

### `shortcut_get_story_link`

Get Story Link · Read-only

Get one Shortcut story link (story relationship) by ID.
Returns the link's subject ID, verb, object ID, and the subject's workflow state ID.
Use this when you have a story link ID. get_story lists all links on a story.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_link_id` (`integer`, required): Numeric ID of the story link (from get_story's story_links). Example: 910.

Example input: `{"story_link_id":910}`

### `shortcut_get_task`

Get Task · Read-only

Get one checklist task on a Shortcut story.
Returns the task's description, complete flag, owner IDs, position, and timestamps.
Use this when you have a task ID. get_story returns all tasks on a story.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `task_id` (`integer`, required): Numeric ID of the task (from get_story). Example: 4321.

Example input: `{"story_id":1234,"task_id":4321}`

### `shortcut_get_workflow`

Get Workflow · Read-only

Get one Shortcut story workflow by ID.
Returns the workflow's name, team, default state ID, and its workflow states (ID, name, type, position).
Use this when you know the workflow ID. Use list_workflows to browse all workflows.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `workflow_id` (`integer`, required): Numeric ID of the workflow (from list_workflows). Example: 500000005.

Example input: `{"workflow_id":500000005}`

### `shortcut_list_categories`

List Categories · Read-only

List the objective categories in the Shortcut workspace.
Returns an array of categories (ID, name, color, type, archived flag).
Use this to find a category ID. Use list_category_objectives for its objectives.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_category_objectives`

List Category Objectives · Read-only

List the objectives in a Shortcut category.
Returns an array of objectives (ID, name, state, app URL).
Use this to see the objectives grouped under one category.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category_id` (`integer`, required): Numeric ID of the category (from list_categories). Example: 12.

Example input: `{"category_id":12}`

### `shortcut_list_custom_fields`

List Custom Fields · Read-only

List the story custom fields defined in the Shortcut workspace.
Returns an array of custom fields (ID, name, field type, enabled flag, story types, and allowed values with their IDs).
Use this to get field_id and value_id pairs for the custom_fields input on story tools.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_doc_epics`

List Doc Epics · Read-only

List the epics linked to a Shortcut Doc.
Returns an array of epics (ID, name, state, app URL).
Use this to see which epics a doc supports. Use list_epic_docs for the reverse.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `doc_id` (`string`, required): UUID of the doc (from list_docs or search_docs). Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"doc_id":"<doc_id>"}`

### `shortcut_list_docs`

List Docs · Read-only

List the Shortcut Docs the connected user can read.
Returns an array of docs (ID, title, app URL).
Use list_docs to browse. Use search_docs to find docs by title, or get_doc for content.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_entity_templates`

List Story Templates · Read-only

List the story templates in the Shortcut workspace.
Returns an array of templates (ID, name, author ID, last used time, and the story contents each template fills in).
Use this to find a story_template_id for create_story_from_template.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_epic_comments`

List Epic Comments · Read-only

List the threaded comments on a Shortcut epic.
Returns an array of comments (ID, author ID, text, nested replies, created time).
Use this to read an epic's discussion. Use list_story_comments for stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"epic_id":56}`

### `shortcut_list_epic_docs`

List Epic Docs · Read-only

List the Shortcut Docs linked to an epic.
Returns an array of docs (ID, title, app URL).
Use this to find an epic's specs. Use get_doc to read one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"epic_id":56}`

### `shortcut_list_epic_health_history`

List Epic Health History · Read-only

List the health status history of a Shortcut epic, most recent first.
Returns an array of health records (ID, status, text, author ID, timestamps).
Use this to see how an epic's health changed. Use get_epic_health for only the current status.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"epic_id":56}`

### `shortcut_list_epic_stories`

List Epic Stories · Read-only

List the stories in a Shortcut epic.
Returns an array of stories (ID, name, type, workflow state, owners, estimate, app URL), with descriptions when requested.
Use this to see an epic's scope. Use query_stories for more filters across epics.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.
- `includes_description` (`boolean`, optional): Set to true to include descriptions in the results (larger response). Omit or set false to leave them out. Example: true.

Example input: `{"epic_id":56}`

### `shortcut_list_epics`

List Epics · Read-only

List every epic in the Shortcut workspace.
Returns an array of epics (ID, name, state, owners, team IDs, objective IDs, stats, app URL), with descriptions when requested.
Use list_epics to get all epics at once. Use list_epics_paginated for large workspaces, or search_epics for a text query.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `includes_description` (`boolean`, optional): Set to true to include descriptions in the results (larger response). Omit or set false to leave them out. Example: true.

Example input: `{}`

### `shortcut_list_epics_paginated`

List Epics (Paginated) · Read-only

List Shortcut epics one page at a time.
Returns a page of epics, the total count, and the next page number (null on the last page).
Use this for large workspaces. Use list_epics for every epic in one response.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `includes_description` (`boolean`, optional): Set to true to include descriptions in the results (larger response). Omit or set false to leave them out. Example: true.
- `page` (`integer`, optional): The page number to return, starting with 1. Defaults to 1. Example: 1.
- `page_size` (`integer`, optional): The number of Epics to return per page. Minimum 1, maximum 250, default 10. Example: 25.

Example input: `{}`

### `shortcut_list_files`

List Files · Read-only

List the files uploaded to the Shortcut workspace.
Returns an array of files (ID, name, filename, content type, size, URL, story IDs, uploader ID).
Use this for uploaded files. Use list_linked_files for files linked from Google Drive, Dropbox, Box, OneDrive, or a URL.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_group_stories`

List Team Stories · Read-only

List the stories assigned to a Shortcut team (group), up to 1,000 per request.
Returns an array of stories (ID, name, workflow state, owners, app URL).
Use this to see a team's work, paging with limit and offset. Use query_stories for more filters.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `group_id` (`string`, required): UUID of the team (group), from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.
- `limit` (`integer`, optional): The maximum number of results to return. (Defaults to 1000, max 1000). Example: 100.
- `offset` (`integer`, optional): The offset at which to begin returning results. (Defaults to 0). Example: 0.

Example input: `{"group_id":"<group_id>"}`

### `shortcut_list_groups`

List Teams · Read-only

List the teams (called groups in the API) in the Shortcut workspace.
Returns an array of teams (ID, name, mention name, member IDs, workflow IDs, story and epic counts, archived flag).
Use this to find a team's group_id. Use get_group for one team.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `archived` (`boolean`, optional): Filter groups by their archived state. If true, returns only archived groups. If false, returns only unarchived groups. If not provided, returns all groups. Example: false.

Example input: `{}`

### `shortcut_list_iteration_stories`

List Iteration Stories · Read-only

List the stories in a Shortcut iteration.
Returns an array of stories (ID, name, type, workflow state, owners, estimate, app URL), with descriptions when requested.
Use this to review a sprint's scope. Use query_stories for more filters.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `iteration_id` (`integer`, required): Numeric ID of the iteration (from list_iterations). Example: 78.
- `includes_description` (`boolean`, optional): Set to true to include descriptions in the results (larger response). Omit or set false to leave them out. Example: true.

Example input: `{"iteration_id":78}`

### `shortcut_list_iterations`

List Iterations · Read-only

List every iteration (sprint) in the Shortcut workspace.
Returns an array of iterations (ID, name, status, start and end dates, team IDs, stats, app URL).
Use this to find an iteration_id. Use search_iterations for a text query, or get_iteration for one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_label_epics`

List Label Epics · Read-only

List the epics that have a given Shortcut label.
Returns an array of epics (ID, name, state, owners, app URL).
Use this for epics with a label. Use list_label_stories for stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`integer`, required): Numeric ID of the label (from list_labels). Example: 345.

Example input: `{"label_id":345}`

### `shortcut_list_label_stories`

List Label Stories · Read-only

List the stories that have a given Shortcut label.
Returns an array of stories (ID, name, workflow state, owners, app URL), with descriptions when requested.
Use this to see everything tagged with a label. Use list_label_epics for epics.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`integer`, required): Numeric ID of the label (from list_labels). Example: 345.
- `includes_description` (`boolean`, optional): Set to true to include descriptions in the results (larger response). Omit or set false to leave them out. Example: true.

Example input: `{"label_id":345}`

### `shortcut_list_labels`

List Labels · Read-only

List every label in the Shortcut workspace.
Returns an array of labels (ID, name, color, description, archived flag, and stats unless slim is true).
Use this to find a label ID or name. Use get_label for one label.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `slim` (`boolean`, optional): Set to true to return slim label objects without stats. Example: true.

Example input: `{}`

### `shortcut_list_linked_files`

List Linked Files · Read-only

List the linked files (Google Drive, Dropbox, Box, OneDrive, or URL) in the Shortcut workspace.
Returns an array of linked files (ID, name, type, URL, story IDs, uploader ID).
Use this for linked files. Use list_files for files uploaded directly to Shortcut.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_members`

List Members · Read-only

List the members of the Shortcut workspace, optionally only enabled or disabled ones.
Returns each member's ID, role, state, disabled flag, team IDs, and profile (name, mention name, email).
Use this to look up member IDs for owner_ids, follower_ids, or requested_by_id. Use get_member when you already have an ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `disabled` (`boolean`, optional): Filter members by their disabled state. If true, return only disabled members. If false, return only enabled members. Example: false.
- `org_id` (`string`, optional): The unique ID of the Organization to limit the list to. Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{}`

### `shortcut_list_objective_epics`

List Objective Epics · Read-only

List the epics linked to a Shortcut objective.
Returns an array of epics (ID, name, state, owners, stats, app URL).
Use this to see the work behind an objective. Use list_epic_stories to go down to stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.

Example input: `{"objective_id":90}`

### `shortcut_list_objective_health_history`

List Objective Health History · Read-only

List the health status history of a Shortcut objective, most recent first.
Returns an array of health records (ID, status, text, author ID, timestamps).
Use this to see how an objective's health changed. Use get_objective_health for only the current status.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.

Example input: `{"objective_id":90}`

### `shortcut_list_objectives`

List Objectives · Read-only

List every objective in the Shortcut workspace.
Returns an array of objectives (ID, name, state, categories, key result IDs, stats, app URL).
Use this to find an objective ID. Use search_objectives for a text query, or get_objective for one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_project_stories`

List Project Stories · Read-only

List the stories in a Shortcut project.
Returns an array of stories (ID, name, workflow state, owners, app URL), with descriptions when requested.
Use this in workspaces that use projects. Use query_stories for more filters.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`integer`, required): Numeric ID of the project (from list_projects). Example: 23.
- `includes_description` (`boolean`, optional): Set to true to include descriptions in the results (larger response). Omit or set false to leave them out. Example: true.

Example input: `{"project_id":23}`

### `shortcut_list_projects`

List Projects · Read-only

List the projects in the Shortcut workspace. Projects are being phased out in favor of teams and workflows.
Returns an array of projects (ID, name, abbreviation, team ID, workflow ID, archived flag, stats, app URL).
Use this in workspaces that still use projects. Use list_groups for teams.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_repositories`

List Repositories · Read-only

List the VCS repositories connected to the Shortcut workspace.
Returns an array of repositories (ID, name, full name, type such as github, URL).
Use this to see which repositories feed branches and pull requests into stories.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_list_story_comments`

List Story Comments · Read-only

List the comments on a Shortcut story.
Returns an array of comments (ID, author ID, text, parent comment ID, reactions, created time).
Use this to read a story's discussion. Use get_story_comment for one comment.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"story_id":1234}`

### `shortcut_list_story_sub_tasks`

List Story Sub-tasks · Read-only

List the sub-task stories of a parent Shortcut story.
Returns an array of sub-task stories (ID, name, workflow state, owners, app URL).
Use this for sub-task stories (Sub-task feature). Checklist tasks inside a story come from get_story.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"story_id":1234}`

### `shortcut_list_workflows`

List Workflows · Read-only

List the story workflows in the Shortcut workspace.
Returns each workflow's ID, name, team, default state ID, and its workflow states (ID, name, type, position).
Use this to find a workflow_state_id for creating, moving, or filtering stories. Use get_workflow for one workflow.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs: none.

Example input: `{}`

### `shortcut_query_stories`

Query Stories · Read-only

Find Shortcut stories that match structured filters such as owner, epic, iteration, team, label, workflow state, story type, and date ranges.
Returns an array of matching stories (ID, name, type, workflow state, owners, epic, iteration, estimate, app URL).
Use query_stories for exact field filters. Use search_stories for free-text or search-operator queries.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `archived` (`boolean`, optional): Set to true for archived stories only, or false for unarchived stories only. Example: false.
- `completed_at_end` (`string`, optional): Stories should have been completed on or before this date. Example: 2026-11-15T17:00:00Z.
- `completed_at_start` (`string`, optional): Stories should have been completed on or after this date. Example: 2026-11-15T17:00:00Z.
- `created_at_end` (`string`, optional): Stories should have been created on or before this date. Example: 2026-11-15T17:00:00Z.
- `created_at_start` (`string`, optional): Stories should have been created on or after this date. Example: 2026-11-15T17:00:00Z.
- `deadline_end` (`string`, optional): Stories should have a deadline on or before this date. Example: 2026-11-15T17:00:00Z.
- `deadline_start` (`string`, optional): Stories should have a deadline on or after this date. Example: 2026-11-15T17:00:00Z.
- `epic_id` (`integer`, optional): ID of the epic the stories belong to. Example: 56.
- `epic_ids` (`array`, optional): The Epic IDs that may be associated with the Stories. Example: [1234, 1235]
- `estimate` (`integer`, optional): Exact estimate in points that the stories have. Example: 3.
- `external_id` (`string`, optional): An ID or URL that references an external resource. Useful during imports. Example: JIRA-1234.
- `group_id` (`string`, optional): ID of the team (group) the stories belong to. Example: 12345678-9abc-4def-8123-456789abcdef.
- `group_ids` (`array`, optional): IDs of teams (groups); stories in any of them match (from list_groups). Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `includes_description` (`boolean`, optional): Set to true to include each story's description in the results. Example: true.
- `iteration_id` (`integer`, optional): ID of the iteration the stories belong to. Example: 78.
- `iteration_ids` (`array`, optional): The Iteration IDs that may be associated with the Stories. Example: [1234, 1235]
- `label_ids` (`array`, optional): The Label IDs that may be associated with the Stories. Example: [1234, 1235]
- `label_name` (`string`, optional): Name of a label the stories have. Example: backend.
- `owner_id` (`string`, optional): ID of a member who owns the stories. Example: 12345678-9abc-4def-8123-456789abcdef.
- `owner_ids` (`array`, optional): IDs of members; stories owned by any of them match (from list_members). Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `project_id` (`integer`, optional): ID of the project the stories belong to (legacy). Example: 23.
- `project_ids` (`array`, optional): The IDs for the Projects the Stories may be assigned to. Example: [1234, 1235]
- `requested_by_id` (`string`, optional): ID of the member who requested the stories (from list_members). Example: 12345678-9abc-4def-8123-456789abcdef.
- `story_type` (`string`, optional): The type of Stories that you want returned. Example: feature. One of: `feature`, `chore`, `bug`.
- `updated_at_end` (`string`, optional): Stories should have been updated on or before this date. Example: 2026-11-15T17:00:00Z.
- `updated_at_start` (`string`, optional): Stories should have been updated on or after this date. Example: 2026-11-15T17:00:00Z.
- `workflow_state_id` (`integer`, optional): ID of the workflow state the stories are in (from list_workflows). Example: 500000008.
- `workflow_state_types` (`array`, optional): The type of Workflow State the Stories may be in. Example: ["started"]

Example input: `{}`

### `shortcut_search`

Search Stories and Epics · Read-only

Search stories and epics (and optionally iterations and objectives) in Shortcut with one query using Shortcut search operators.
Returns one result set per entity type, each with total, a page of matching items, and a next-page token.
Use search for a mixed-entity text query. Use search_stories or search_epics for one entity type, or query_stories for structured filters.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Search text. Supports Shortcut search operators such as owner:jane, state:"In Progress", type:bug, label:backend, epic:56, team:mobile, is:started, and !is:done. Example: owner:jane type:bug !is:done.
- `detail` (`string`, optional): How much detail each result includes: slim (smaller, without descriptions and comments) or full (descriptions, comments, and more fields on related items). Example: full. One of: `full`, `slim`.
- `entity_types` (`array`, optional): Entity types to search. Defaults to story and epic when omitted. Allowed values: story, epic, iteration, objective. Example: ["story"]
- `next` (`string`, optional): Token for the next page of results. Each response's next field is a URL path ending in next=<token>; pass only the token value and repeat the same query and filters. Example: a8acc6577548df7a213272f7f9f617bcb1f8a831~24.
- `page_size` (`integer`, optional): The number of search results to include in a page. Minimum of 1 and maximum of 250. Example: 25.

Example input: `{"query":"<query>"}`

### `shortcut_search_docs`

Search Docs · Read-only

Search Shortcut Docs by title, with optional archived, created-by-me, and followed-by-me filters.
Returns total matches, a page of docs (ID, title, app URL), and a next-page token.
Use search_docs to find a doc by title. Use list_docs to browse every doc you can read, or get_doc for content.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `title` (`string`, required): Text to match against doc titles (fuzzy match). Example: launch plan.
- `archived` (`boolean`, optional): When true, find archived documents. When false, find non-archived documents. Example: false.
- `created_by_me` (`boolean`, optional): When true, find documents created by the current user. When false, find documents NOT created by current user. Example: false.
- `followed_by_me` (`boolean`, optional): When true, find documents that the current user is following. When false, find documents NOT followed. Example: false.
- `next` (`string`, optional): Token for the next page of results. Each response's next field is a URL path ending in next=<token>; pass only the token value and repeat the same query and filters. Example: a8acc6577548df7a213272f7f9f617bcb1f8a831~24.
- `page_size` (`integer`, optional): The number of search results to include in a page. Minimum of 1 and maximum of 250. Example: 25.

Example input: `{"title":"<title>"}`

### `shortcut_search_epics`

Search Epics · Read-only

Search Shortcut epics with a text query that supports Shortcut search operators.
Returns total matches, a page of epics (ID, name, state, owners, objectives, app URL), and a next-page token.
Use search_epics for text queries. Use list_epics or list_epics_paginated to browse all epics, or get_epic for one.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Search text. Supports Shortcut search operators such as owner:jane, state:"In Progress", type:bug, label:backend, epic:56, team:mobile, is:started, and !is:done. Example: owner:jane type:bug !is:done.
- `detail` (`string`, optional): How much detail each result includes: slim (smaller, without descriptions and comments) or full (descriptions, comments, and more fields on related items). Example: full. One of: `full`, `slim`.
- `next` (`string`, optional): Token for the next page of results. Each response's next field is a URL path ending in next=<token>; pass only the token value and repeat the same query and filters. Example: a8acc6577548df7a213272f7f9f617bcb1f8a831~24.
- `page_size` (`integer`, optional): The number of search results to include in a page. Minimum of 1 and maximum of 250. Example: 25.

Example input: `{"query":"<query>"}`

### `shortcut_search_iterations`

Search Iterations · Read-only

Search Shortcut iterations with a text query that supports Shortcut search operators.
Returns total matches, a page of iterations (ID, name, status, start and end dates, app URL), and a next-page token.
Use search_iterations for text queries. Use list_iterations to browse all iterations.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Search text. Supports Shortcut search operators such as owner:jane, state:"In Progress", type:bug, label:backend, epic:56, team:mobile, is:started, and !is:done. Example: owner:jane type:bug !is:done.
- `detail` (`string`, optional): How much detail each result includes: slim (smaller, without descriptions and comments) or full (descriptions, comments, and more fields on related items). Example: full. One of: `full`, `slim`.
- `next` (`string`, optional): Token for the next page of results. Each response's next field is a URL path ending in next=<token>; pass only the token value and repeat the same query and filters. Example: a8acc6577548df7a213272f7f9f617bcb1f8a831~24.
- `page_size` (`integer`, optional): The number of search results to include in a page. Minimum of 1 and maximum of 250. Example: 25.

Example input: `{"query":"<query>"}`

### `shortcut_search_objectives`

Search Objectives · Read-only

Search Shortcut objectives with a text query that supports Shortcut search operators.
Returns total matches, a page of objectives (ID, name, state, categories, app URL), and a next-page token.
Use search_objectives for text queries. Use list_objectives to browse all objectives.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Search text. Supports Shortcut search operators such as owner:jane, state:"In Progress", type:bug, label:backend, epic:56, team:mobile, is:started, and !is:done. Example: owner:jane type:bug !is:done.
- `detail` (`string`, optional): How much detail each result includes: slim (smaller, without descriptions and comments) or full (descriptions, comments, and more fields on related items). Example: full. One of: `full`, `slim`.
- `next` (`string`, optional): Token for the next page of results. Each response's next field is a URL path ending in next=<token>; pass only the token value and repeat the same query and filters. Example: a8acc6577548df7a213272f7f9f617bcb1f8a831~24.
- `page_size` (`integer`, optional): The number of search results to include in a page. Minimum of 1 and maximum of 250. Example: 25.

Example input: `{"query":"<query>"}`

### `shortcut_search_stories`

Search Stories · Read-only

Search Shortcut stories with a text query that supports Shortcut search operators (for example owner:, state:, type:, label:, epic:).
Returns total matches, a page of stories (ID, name, type, workflow state, owners, epic, iteration, app URL), and a next-page token.
Use search_stories for free-text or operator queries. Use query_stories for exact structured filters, or get_story for one story.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `query` (`string`, required): Search text. Supports Shortcut search operators such as owner:jane, state:"In Progress", type:bug, label:backend, epic:56, team:mobile, is:started, and !is:done. Example: owner:jane type:bug !is:done.
- `detail` (`string`, optional): How much detail each result includes: slim (smaller, without descriptions and comments) or full (descriptions, comments, and more fields on related items). Example: full. One of: `full`, `slim`.
- `next` (`string`, optional): Token for the next page of results. Each response's next field is a URL path ending in next=<token>; pass only the token value and repeat the same query and filters. Example: a8acc6577548df7a213272f7f9f617bcb1f8a831~24.
- `page_size` (`integer`, optional): The number of search results to include in a page. Minimum of 1 and maximum of 250. Example: 25.

Example input: `{"query":"<query>"}`

### `shortcut_create_category`

Create Category · Write

Create an objective category in Shortcut.
Returns the created category (ID, name, color, type).
Use this to add a category for grouping objectives.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the new Category. Example: Growth.
- `color` (`string`, optional): The hex color to be displayed with the Category (for example, "#ff0000"). Example: #3366ff.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Category has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `type` (`string`, optional): The type of entity this Category is associated with; currently Milestone or Objective is the only type of Category. Example: example.

Example input: `{"name":"<name>"}`

### `shortcut_create_doc`

Create Doc · Write

Create a Shortcut Doc from Markdown or HTML content.
Returns the created doc (ID, title, app URL).
Use this to write a new doc. Set content_format to markdown when sending Markdown; it defaults to HTML.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `content` (`string`, required): Doc body. Sent as HTML unless content_format is markdown. Example: # Launch plan

Goals...
- `title` (`string`, required): The title for the new document. Example: Q4 launch plan.
- `content_format` (`string`, optional): Format of content: markdown or html. Defaults to html when omitted, so set markdown when sending Markdown. Example: markdown. One of: `markdown`, `html`.

Example input: `{"content":"<content>","title":"<title>"}`

### `shortcut_create_entity_template`

Create Story Template · Write

Create a story template in Shortcut that pre-fills story fields.
Returns the created template (ID, name, story contents).
Use this to save a reusable story shape. Use create_story_from_template to use it.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the new entity template. Example: Bug report.
- `story_contents` (`object`, required): The story fields this template fills in, such as name, description, story_type, workflow_state_id, owner_ids, labels, tasks, estimate, epic_id, iteration_id, and group_id. Example: {"name": "Bug: ", "story_type": "bug", "labels": [{"name": "triage"}], "tasks": [{"description": "Add repro steps"}]}
- `author_id` (`string`, optional): ID of the member to record as the author. Defaults to the owner of the API token. Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"name":"<name>","story_contents":{}}`

### `shortcut_create_epic`

Create Epic · Write

Create an epic in Shortcut.
Returns the created epic (ID, name, epic state, owners, teams, objectives, labels, app URL).
Use this to group related stories. Add stories to it with update_story or update_stories (epic_id).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The Epic's name. Example: Checkout redesign.
- `completed_at_override` (`string`, optional): A manual override for the time/date the Epic was completed. Example: 2026-11-15T17:00:00Z.
- `deadline` (`string`, optional): Due date as an ISO 8601 date-time. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): The Epic's description. Example: Redesign the checkout flow to cut drop-off.
- `epic_state_id` (`integer`, optional): ID of the epic state (from get_epic_workflow). Example: 500000002.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Epic has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_ids` (`array`, optional): IDs of the teams (groups) to associate, from list_groups. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `objective_ids` (`array`, optional): IDs of the objectives this epic supports, from list_objectives. Example: [1234, 1235]
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `planned_start_date` (`string`, optional): The Epic's planned start date. Example: 2026-11-15T17:00:00Z.
- `requested_by_id` (`string`, optional): ID of the member who requested it, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `started_at_override` (`string`, optional): A manual override for the time/date the Epic was started. Example: 2026-11-15T17:00:00Z.

Example input: `{"name":"<name>"}`

### `shortcut_create_epic_comment`

Create Epic Comment · Write

Add a top-level comment to a Shortcut epic.
Returns the created comment (ID, author ID, text, created time, app URL).
Use this for a new thread on an epic. Use reply_epic_comment to reply to an existing comment.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.
- `text` (`string`, required): The comment text. Example: Looks good, shipping today.
- `author_id` (`string`, optional): ID of the member to record as the author. Defaults to the owner of the API token. Example: 12345678-9abc-4def-8123-456789abcdef.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the comment has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.

Example input: `{"epic_id":56,"text":"<text>"}`

### `shortcut_create_epic_health`

Create Epic Health · Write

Post a new health status (On Track, At Risk, Off Track, or No Health) on a Shortcut epic.
Returns the created health record.
Use this to post a status update. Use update_health to correct an existing record.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.
- `status` (`string`, required): The health status of the Epic. Example: At Risk. One of: `At Risk`, `On Track`, `Off Track`, `No Health`.
- `text` (`string`, optional): The description of the Health status. Example: Looks good, shipping today.

Example input: `{"epic_id":56,"status":"At Risk"}`

### `shortcut_create_group`

Create Team · Write

Create a team (group) in Shortcut.
Returns the created team (ID, name, mention name, member IDs, workflow IDs, app URL).
Use this to add a team. Use update_group to change members or settings later.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `mention_name` (`string`, required): The mention name of this Group. Example: mobile-team.
- `name` (`string`, required): The name of this Group. Example: Mobile.
- `card_aging_mode` (`string`, optional): The card aging mode for stories in this Group: "gradual" (fixed fade steps at 1, 2, and 4 weeks), "immediate", or "off" (explicitly disabled for this Group). Set to null to inherit the Workspace default. Example: off. One of: `off`, `gradual`, `immediate`.
- `card_aging_threshold_days` (`integer`, optional): The number of days an in-progress Story can go without activity before it is considered stale. Required when card_aging_mode is "immediate"; not allowed otherwise. Example: 14.
- `color` (`string`, optional): The color you wish to use for the Group in the system. Example: #3366ff.
- `color_key` (`string`, optional): The color key you wish to use for the Group in the system. Example: blue. One of: `blue`, `purple`, `midnight-blue`, `orange`, `yellow-green`, `brass`, `gray`, `fuchsia`, `yellow`, `pink`, `sky-blue`, `green`, `red`, `black`, `slate`, `turquoise`.
- `description` (`string`, optional): The description of the Group. Example: Owns the iOS and Android apps.
- `display_icon_id` (`string`, optional): The Icon id for the avatar of this Group. Example: 12345678-9abc-4def-8123-456789abcdef.
- `member_ids` (`array`, optional): IDs of the members to add to the team, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `workflow_ids` (`array`, optional): The Workflow ids to add to the Group. Example: [1234, 1235]

Example input: `{"mention_name":"<mention_name>","name":"<name>"}`

### `shortcut_create_iteration`

Create Iteration · Write

Create an iteration (sprint) in Shortcut with a name and start and end dates.
Returns the created iteration (ID, name, status, dates, teams, app URL).
Use this to plan a sprint. Assign stories to it with update_story or update_stories (iteration_id).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `end_date` (`string`, required): Date the iteration ends, as YYYY-MM-DD. Example: 2026-11-13.
- `name` (`string`, required): The name of this Iteration. Example: Sprint 42.
- `start_date` (`string`, required): Date the iteration begins, as YYYY-MM-DD. Example: 2026-11-02.
- `description` (`string`, optional): The description of the Iteration. Example: Focus: checkout bugs.
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_ids` (`array`, optional): IDs of the teams (groups) to associate, from list_groups. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]

Example input: `{"end_date":"<end_date>","name":"<name>","start_date":"<start_date>"}`

### `shortcut_create_label`

Create Label · Write

Create a label in Shortcut.
Returns the created label (ID, name, color, description, app URL).
Use this to add a new label. Stories and epics can also create labels inline by name.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the new Label. Example: backend.
- `color` (`string`, optional): The hex color to be displayed with the Label (for example, "#ff0000"). Example: #3366ff.
- `description` (`string`, optional): The description of the new Label. Example: Server-side work.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Label has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.

Example input: `{"name":"<name>"}`

### `shortcut_create_linked_file`

Create Linked File · Write

Attach a link to an external file (Google Drive, Dropbox, Box, OneDrive, or any URL) in Shortcut, optionally on a story.
Returns the created linked file (ID, name, type, URL, story IDs).
Use this to attach a file by link. Direct uploads are not supported by this connector.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the file. Example: Design spec.
- `type` (`string`, required): The integration type of the file (e.g. google, dropbox, box). Example: google. One of: `google`, `url`, `dropbox`, `box`, `onedrive`.
- `url` (`string`, required): The URL of linked file. Example: https://drive.google.com/file/d/abc123/view.
- `content_type` (`string`, optional): The content type of the image (e.g. txt/plain). Example: application/pdf.
- `description` (`string`, optional): The description of the file. Example: Final design spec.
- `size` (`integer`, optional): The filesize, if the integration provided it. Example: 20480.
- `story_id` (`integer`, optional): The ID of the linked story. Example: 1234.
- `thumbnail_url` (`string`, optional): The URL of the thumbnail, if the integration provided it. Example: https://example.com/thumb.png.
- `uploader_id` (`string`, optional): The UUID of the member that uploaded the file. Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"name":"<name>","type":"google","url":"<url>"}`

### `shortcut_create_objective`

Create Objective · Write

Create an objective in Shortcut.
Returns the created objective (ID, name, state, categories, app URL).
Use this to set a goal. Link epics to it with update_epic (objective_ids).

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the Objective. Example: Grow self-serve revenue.
- `categories` (`array`, optional): Categories to attach, each an object with a name (created if it doesn't exist yet) and an optional hex color. Example: [{"name": "Growth"}]
- `completed_at_override` (`string`, optional): A manual override for the time/date the Objective was completed. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): The Objective's description. Example: Increase paid conversions in Q4.
- `started_at_override` (`string`, optional): A manual override for the time/date the Objective was started. Example: 2026-11-15T17:00:00Z.
- `state` (`string`, optional): The workflow state that the Objective is in. Example: in progress. One of: `in progress`, `to do`, `done`.

Example input: `{"name":"<name>"}`

### `shortcut_create_objective_health`

Create Objective Health · Write

Post a new health status (On Track, At Risk, Off Track, or No Health) on a Shortcut objective.
Returns the created health record.
Use this to post a status update. Use update_health to correct an existing record.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.
- `status` (`string`, required): The health status of the Objective. Example: At Risk. One of: `At Risk`, `On Track`, `Off Track`, `No Health`.
- `text` (`string`, optional): The description of the Health status. Example: Looks good, shipping today.

Example input: `{"objective_id":90,"status":"At Risk"}`

### `shortcut_create_project`

Create Project · Write

Create a project in Shortcut (legacy; Shortcut is phasing out projects).
Returns the created project (ID, name, team ID, workflow ID, app URL).
Use this only in workspaces that still use projects. Prefer teams and workflow states for new setups.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the Project. Example: Web App.
- `team_id` (`integer`, required): The ID of the team the project belongs to. Example: 1.
- `abbreviation` (`string`, optional): The Project abbreviation used in Story summaries. Should be kept to 3 characters at most. Example: WEB.
- `color` (`string`, optional): The color you wish to use for the Project in the system. Example: #3366ff.
- `description` (`string`, optional): The Project description. Example: Customer-facing web app.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Project has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `iteration_length` (`integer`, optional): The number of weeks per iteration in this Project. Example: 2.
- `start_time` (`string`, optional): The date at which the Project was started. Example: 2026-11-15T17:00:00Z.

Example input: `{"name":"<name>","team_id":1}`

### `shortcut_create_stories`

Create Multiple Stories · Write

Create several Shortcut stories in one request.
Returns an array of the created stories (ID, name, workflow state, app URL).
Use create_stories for batch creation. Use create_story for a single story.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `stories` (`array`, required): The stories to create. Each item takes the same fields as create_story: a name, and exactly one of workflow_state_id or project_id, plus any optional fields. Example: [{"name": "Add CSV export", "workflow_state_id": 500000008, "story_type": "feature"}]

Example input: `{"stories":[{"name":"Add CSV export","workflow_state_id":500000008,"story_type":"feature"}]}`

### `shortcut_create_story`

Create Story · Write

Create a story in Shortcut. Set exactly one of workflow_state_id (recommended) or project_id.
Returns the created story, including its ID, name, workflow state, owners, labels, tasks, and app URL.
Use create_story for one story. Use create_stories for several at once, or create_story_from_template to start from a template.
Get a workflow_state_id from list_workflows first.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `name` (`string`, required): The name of the story. Example: Fix login redirect loop.
- `archived` (`boolean`, optional): Controls the story's archived state. Example: false.
- `comments` (`array`, optional): Comments to add when the story is created, each with the comment text. Example: [{"text": "Reported by the support team."}]
- `completed_at_override` (`string`, optional): A manual override for the time/date the Story was completed. Example: 2026-11-15T17:00:00Z.
- `custom_fields` (`array`, optional): Custom field values, each pairing a custom field ID with the ID of one of that field's allowed values (get both from list_custom_fields). Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef", "value_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `deadline` (`string`, optional): Due date as an ISO 8601 date-time. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): Story description in Markdown. Example: Steps to reproduce: ...
- `epic_id` (`integer`, optional): The ID of the epic the story belongs to. Example: 56.
- `estimate` (`integer`, optional): Point estimate. Leave empty for unestimated. Example: 3.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Story has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `external_links` (`array`, optional): External URLs to associate (for example support tickets or design files). Example: ["https://support.example.com/tickets/42"]
- `file_ids` (`array`, optional): An array of IDs of files attached to the story. Example: [1234, 1235]
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_id` (`string`, optional): ID of the team (group) to associate, from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.
- `iteration_id` (`integer`, optional): The ID of the iteration the story belongs to. Example: 78.
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `linked_file_ids` (`array`, optional): An array of IDs of linked files attached to the story. Example: [1234, 1235]
- `move_to` (`string`, optional): Move the story to the first or last position in its workflow state. Example: last. One of: `last`, `first`.
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `parent_story_id` (`integer`, optional): The ID of the parent story to associate with this story (making the created story a sub-task). Field only applicable when Sub-task feature is enabled. Example: 1200.
- `project_id` (`integer`, optional): Legacy: ID of the project to create the story in. Set this or workflow_state_id, not both; Shortcut recommends workflow_state_id. Example: 23.
- `requested_by_id` (`string`, optional): ID of the member who requested it, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `started_at_override` (`string`, optional): A manual override for the time/date the Story was started. Example: 2026-11-15T17:00:00Z.
- `story_links` (`array`, optional): Relationships to create with existing stories. Each link has a verb (blocks, duplicates, or relates to) and the other story's ID: use object_id when the new story acts on that story, or subject_id when that story acts on the new one. Example: [{"verb": "blocks", "object_id": 1235}]
- `story_type` (`string`, optional): The type of story (feature, bug, chore). Example: feature. One of: `feature`, `chore`, `bug`.
- `sub_tasks` (`array`, optional): Sub-tasks for the new story (only when the Sub-task feature is enabled). Each item either links an existing story by story_id or creates a new sub-task story with a name (and optional owner_ids and workflow_state_id). Example: [{"story_id": 1200}, {"name": "Write migration"}]
- `tasks` (`array`, optional): Checklist tasks to create on the story. Each task needs a description and can set complete and owner_ids. Example: [{"description": "Write tests"}, {"description": "Update docs", "complete": false}]
- `workflow_state_id` (`integer`, optional): ID of the workflow state to create the story in (from list_workflows). Set this or project_id, not both. Example: 500000008.

Example input: `{"name":"<name>"}`

### `shortcut_create_story_comment`

Create Story Comment · Write

Add a comment to a Shortcut story, optionally as a threaded reply.
Returns the created comment (ID, author ID, text, parent ID, created time, app URL).
Use this to comment on a story. Set parent_id to reply in a thread. Use create_epic_comment for epics.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `text` (`string`, required): The comment text. Example: Looks good, shipping today.
- `author_id` (`string`, optional): ID of the member to record as the author. Defaults to the owner of the API token. Example: 12345678-9abc-4def-8123-456789abcdef.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the comment has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `parent_id` (`integer`, optional): The ID of the Comment that this comment is threaded under. Example: 5600.

Example input: `{"story_id":1234,"text":"<text>"}`

### `shortcut_create_story_from_template`

Create Story from Template · Write

Create a Shortcut story from a story template, optionally overriding or adding to the template's values.
Returns the created story with its full details.
Use this to start from a template. Use create_story for a blank story.
Get a story_template_id from list_entity_templates first.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `story_template_id` (`string`, required): The id of the story template used to create this story. Example: 12345678-9abc-4def-8123-456789abcdef.
- `archived` (`boolean`, optional): Controls the story's archived state. Example: false.
- `comments` (`array`, optional): Comments to add when the story is created, each with the comment text. Example: [{"text": "Reported by the support team."}]
- `completed_at_override` (`string`, optional): A manual override for the time/date the Story was completed. Example: 2026-11-15T17:00:00Z.
- `created_at` (`string`, optional): The time/date the Story was created. Example: 2026-11-15T17:00:00Z.
- `custom_fields` (`array`, optional): Custom field values, each pairing a custom field ID with the ID of one of that field's allowed values (get both from list_custom_fields). Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef", "value_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `custom_fields_add` (`array`, optional): Custom field values to set, each pairing a custom field ID with one of its allowed value IDs (from list_custom_fields). Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef", "value_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `custom_fields_remove` (`array`, optional): Custom fields from the template to leave unset, each identified by its custom field ID. Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `deadline` (`string`, optional): Due date as an ISO 8601 date-time. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): The description of the story. Example: Steps to reproduce: ...
- `epic_id` (`integer`, optional): The ID of the epic the story belongs to. Example: 56.
- `estimate` (`integer`, optional): Point estimate. Leave empty for unestimated. Example: 3.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Story has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `external_links` (`array`, optional): External URLs to associate (for example support tickets or design files). Example: ["https://support.example.com/tickets/42"]
- `external_links_add` (`array`, optional): An array of External Links associated with this story. These will be added to any links provided by the template. Cannot be used in conjunction with `external_links`. Example: ["value"]
- `external_links_remove` (`array`, optional): An array of External Links associated with this story. These will be removed from any links provided by the template. Cannot be used in conjunction with `external_links`. Example: ["value"]
- `file_ids` (`array`, optional): An array of IDs of files attached to the story. Example: [1234, 1235]
- `file_ids_add` (`array`, optional): An array of IDs of files attached to the story in addition to files from the template. Cannot be used in conjunction with `file_ids`. Example: [1234, 1235]
- `file_ids_remove` (`array`, optional): An array of IDs of files removed from files from the template. Cannot be used in conjunction with `file_ids`. Example: [1234, 1235]
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `follower_ids_add` (`array`, optional): The UUIDs of the new followers to be added in addition to followers from the template. Cannot be used in conjunction with `follower_ids.`. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `follower_ids_remove` (`array`, optional): The UUIDs of the new followers to be removed from followers from the template. Cannot be used in conjunction with `follower_ids`. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_id` (`string`, optional): ID of the team (group) to associate, from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.
- `iteration_id` (`integer`, optional): The ID of the iteration the story belongs to. Example: 78.
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `labels_add` (`array`, optional): Labels to add, each an object with a name (created if it doesn't exist yet) and an optional color. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `labels_remove` (`array`, optional): Template labels to leave off the new story, each identified by name. Example: [{"name": "needs-triage"}]
- `linked_file_ids` (`array`, optional): An array of IDs of linked files attached to the story. Example: [1234, 1235]
- `linked_file_ids_add` (`array`, optional): An array of IDs of linked files attached to the story in addition to files from the template. Cannot be used in conjunction with `linked_files`. Example: [1234, 1235]
- `linked_file_ids_remove` (`array`, optional): An array of IDs of linked files removed from files from the template. Cannot be used in conjunction with `linked_files.`. Example: [1234, 1235]
- `move_to` (`string`, optional): Move the story to the first or last position in its workflow state. Example: last. One of: `last`, `first`.
- `name` (`string`, optional): The name of the story. Must be provided if the template does not provide a name. Example: Fix login redirect loop.
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `owner_ids_add` (`array`, optional): The UUIDs of the new owners to be added in addition to owners from the template. Cannot be used in conjunction with `owners`. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `owner_ids_remove` (`array`, optional): The UUIDs of the new owners to be removed from owners from the template. Cannot be used in conjunction with `owners`. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `parent_story_id` (`integer`, optional): The ID of the parent story to associate with this story (making the created story a sub-task). Field only applicable when Sub-task feature is enabled. Example: 1200.
- `project_id` (`integer`, optional): The ID of the project the story belongs to. Example: 23.
- `requested_by_id` (`string`, optional): ID of the member who requested it, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `source_task_id` (`integer`, optional): Given this story was converted from a task in another story, this is the original task ID that was converted to this story. Example: 4321.
- `started_at_override` (`string`, optional): A manual override for the time/date the Story was started. Example: 2026-11-15T17:00:00Z.
- `story_links` (`array`, optional): Relationships to create with existing stories. Each link has a verb (blocks, duplicates, or relates to) and the other story's ID: use object_id when the new story acts on that story, or subject_id when that story acts on the new one. Example: [{"verb": "blocks", "object_id": 1235}]
- `story_type` (`string`, optional): The type of story (feature, bug, chore). Example: feature. One of: `feature`, `chore`, `bug`.
- `sub_tasks` (`array`, optional): Sub-tasks for the new story (only when the Sub-task feature is enabled). Each item either links an existing story by story_id or creates a new sub-task story with a name. Example: [{"story_id": 1200}, {"name": "Write migration"}]
- `tasks` (`array`, optional): Checklist tasks to create on the story. Each task needs a description and can set complete and owner_ids. Example: [{"description": "Write tests"}, {"description": "Update docs", "complete": false}]
- `updated_at` (`string`, optional): The time/date the Story was updated. Example: 2026-11-15T17:00:00Z.
- `workflow_state_id` (`integer`, optional): ID of the workflow state (from list_workflows). Example: 500000008.

Example input: `{"story_template_id":"<story_template_id>"}`

### `shortcut_create_story_link`

Create Story Link · Write

Create a relationship between two Shortcut stories: the subject story blocks, duplicates, or relates to the object story.
Returns the story link (ID, subject ID, verb, object ID).
Use this to mark dependencies or duplicates. Use update_story_link to change an existing link.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `object_id` (`integer`, required): The ID of the object Story. Example: 1235.
- `subject_id` (`integer`, required): The ID of the subject Story. Example: 1234.
- `verb` (`string`, required): The type of link. Example: blocks. One of: `blocks`, `duplicates`, `relates to`.

Example input: `{"object_id":1235,"subject_id":1234,"verb":"blocks"}`

### `shortcut_create_story_reaction`

Add Comment Reaction · Write

Add an emoji reaction to a comment on a Shortcut story.
Returns the comment's reactions (emoji and the member IDs who reacted).
Use this to react to a story comment. Use delete_story_reaction to remove a reaction.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `emoji` (`string`, required): Emoji short-code to react with. Example: :thumbsup:.
- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"comment_id":5678,"emoji":"<emoji>","story_id":1234}`

### `shortcut_create_task`

Create Task · Write

Add a checklist task to a Shortcut story.
Returns the created task (ID, story ID, description, complete flag, owner IDs, position).
Use create_task for checklist items inside a story. Use create_story with parent_story_id for a sub-task story.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `description` (`string`, required): The Task description. Example: Write tests.
- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `complete` (`boolean`, optional): True/false boolean indicating whether the Task is completed. Defaults to false. Example: true.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Task has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]

Example input: `{"description":"<description>","story_id":1234}`

### `shortcut_link_doc_to_epic`

Link Doc to Epic · Write

Link a Shortcut Doc to an epic.
Returns an empty response on success.
Use this to attach a spec or doc to an epic. Use unlink_doc_from_epic to remove the link.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `doc_id` (`string`, required): UUID of the doc (from list_docs or search_docs). Example: 12345678-9abc-4def-8123-456789abcdef.
- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"doc_id":"<doc_id>","epic_id":56}`

### `shortcut_reply_epic_comment`

Reply to Epic Comment · Write

Reply to an existing comment on a Shortcut epic.
Returns the created reply comment.
Use this to answer inside a thread. Use create_epic_comment to start a new thread.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.
- `text` (`string`, required): The comment text. Example: Looks good, shipping today.
- `author_id` (`string`, optional): ID of the member to record as the author. Defaults to the owner of the API token. Example: 12345678-9abc-4def-8123-456789abcdef.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the comment has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.

Example input: `{"comment_id":5678,"epic_id":56,"text":"<text>"}`

### `shortcut_update_category`

Update Category · Write

Rename, recolor, or archive a Shortcut objective category.
Returns the updated category.
Use this to edit a category. Use delete_category to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `category_id` (`integer`, required): Numeric ID of the category (from list_categories). Example: 12.
- `archived` (`boolean`, optional): A true/false boolean indicating if the Category has been archived. Example: false.
- `color` (`string`, optional): The hex color to be displayed with the Category (for example, "#ff0000"). Example: #3366ff.
- `name` (`string`, optional): The new name of the Category. Example: Growth.

Example input: `{"category_id":12}`

### `shortcut_update_doc`

Update Doc · Write

Update the title or content of a Shortcut Doc, from Markdown or HTML.
Returns the updated doc.
Use this to edit a doc. Set content_format to markdown when sending Markdown; it defaults to HTML.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `doc_id` (`string`, required): UUID of the doc (from list_docs or search_docs). Example: 12345678-9abc-4def-8123-456789abcdef.
- `content` (`string`, optional): Doc body. Sent as HTML unless content_format is markdown. Example: # Launch plan

Goals...
- `content_format` (`string`, optional): Format of content: markdown or html. Defaults to html when omitted, so set markdown when sending Markdown. Example: markdown. One of: `markdown`, `html`.
- `title` (`string`, optional): The new title for the document. Example: Q4 launch plan.

Example input: `{"doc_id":"<doc_id>"}`

### `shortcut_update_entity_template`

Update Story Template · Write

Update a Shortcut story template's name or story contents.
Returns the updated template.
Use this to change what a template fills in. Use delete_entity_template to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `template_id` (`string`, required): UUID of the story template (from list_entity_templates). Example: 12345678-9abc-4def-8123-456789abcdef.
- `name` (`string`, optional): The updated template name. Example: Bug report.
- `story_contents` (`object`, optional): The story fields this template fills in, such as name, description, story_type, workflow_state_id, owner_ids, labels, tasks, estimate, epic_id, iteration_id, and group_id. Example: {"name": "Bug: ", "story_type": "bug", "labels": [{"name": "triage"}], "tasks": [{"description": "Add repro steps"}]}

Example input: `{"template_id":"<template_id>"}`

### `shortcut_update_epic`

Update Epic · Write

Update fields on a Shortcut epic, such as name, description, epic state, owners, deadline, objectives, or archived state.
Returns the updated epic.
Use this to edit an epic. Use create_epic_health to post a health update.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.
- `after_id` (`integer`, optional): The ID of the Epic we want to move this Epic after. Example: 1231.
- `archived` (`boolean`, optional): A true/false boolean indicating whether the Epic is in archived state. Example: false.
- `before_id` (`integer`, optional): The ID of the Epic we want to move this Epic before. Example: 1230.
- `completed_at_override` (`string`, optional): A manual override for the time/date the Epic was completed. Example: 2026-11-15T17:00:00Z.
- `deadline` (`string`, optional): Due date as an ISO 8601 date-time. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): The Epic's description. Example: Redesign the checkout flow to cut drop-off.
- `epic_state_id` (`integer`, optional): ID of the epic state (from get_epic_workflow). Example: 500000002.
- `external_id` (`string`, optional): This field can be set to another unique ID. In the case that the Epic has been imported from another tool, the ID in the other tool can be indicated here. Example: JIRA-1234.
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_ids` (`array`, optional): IDs of the teams (groups) to associate, from list_groups. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `name` (`string`, optional): The Epic's name. Example: Checkout redesign.
- `objective_ids` (`array`, optional): IDs of the objectives this epic supports, from list_objectives. Example: [1234, 1235]
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `planned_start_date` (`string`, optional): The Epic's planned start date. Example: 2026-11-15T17:00:00Z.
- `requested_by_id` (`string`, optional): ID of the member who requested it, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `started_at_override` (`string`, optional): A manual override for the time/date the Epic was started. Example: 2026-11-15T17:00:00Z.

Example input: `{"epic_id":56}`

### `shortcut_update_epic_comment`

Update Epic Comment · Write

Replace the text of a comment on a Shortcut epic.
Returns the updated comment.
Use this to edit an epic comment. Use update_story_comment for story comments.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.
- `text` (`string`, required): The updated comment text. Example: Looks good, shipping today.

Example input: `{"comment_id":5678,"epic_id":56,"text":"<text>"}`

### `shortcut_update_file`

Update File · Write

Update the name, description, or external ID of an uploaded Shortcut file (not its contents).
Returns the updated file.
Use this to rename or describe a file. Use delete_file to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `file_id` (`integer`, required): Numeric ID of the uploaded file (from list_files). Example: 88.
- `description` (`string`, optional): The description of the file. Example: Final design spec.
- `external_id` (`string`, optional): An additional ID that you may wish to assign to the file. Example: JIRA-1234.
- `name` (`string`, optional): The name of the file. Example: design-spec.pdf.
- `uploader_id` (`string`, optional): The unique ID assigned to the Member who uploaded the file to Shortcut. Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"file_id":88}`

### `shortcut_update_group`

Update Team · Write

Update a Shortcut team (group), such as its name, members, workflows, default workflow, or archived state.
Returns the updated team.
Use this to edit a team. member_ids and workflow_ids are set as given.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `group_id` (`string`, required): UUID of the team (group), from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.
- `archived` (`boolean`, optional): Whether or not this Group is archived. Example: false.
- `card_aging_mode` (`string`, optional): The card aging mode for stories in this Group: "gradual" (fixed fade steps at 1, 2, and 4 weeks), "immediate", or "off" (explicitly disabled for this Group). Set to null to inherit the Workspace default. Example: off. One of: `off`, `gradual`, `immediate`.
- `card_aging_threshold_days` (`integer`, optional): The number of days an in-progress Story can go without activity before it is considered stale. Required when card_aging_mode is "immediate"; not allowed otherwise. Example: 14.
- `color` (`string`, optional): The color you wish to use for the Group in the system. Example: #3366ff.
- `color_key` (`string`, optional): The color key you wish to use for the Group in the system. Example: blue. One of: `blue`, `purple`, `midnight-blue`, `orange`, `yellow-green`, `brass`, `gray`, `fuchsia`, `yellow`, `pink`, `sky-blue`, `green`, `red`, `black`, `slate`, `turquoise`.
- `default_workflow_id` (`integer`, optional): The ID of the default workflow for stories created in this group. Example: 500000005.
- `description` (`string`, optional): The description of this Group. Example: Owns the iOS and Android apps.
- `display_icon_id` (`string`, optional): The Icon id for the avatar of this Group. Example: 12345678-9abc-4def-8123-456789abcdef.
- `member_ids` (`array`, optional): The team's member IDs. The list you send replaces the current members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `mention_name` (`string`, optional): The mention name of this Group. Example: mobile-team.
- `name` (`string`, optional): The name of this Group. Example: Mobile.
- `workflow_ids` (`array`, optional): The team's workflow IDs. The list you send replaces the current workflows. Example: [1234, 1235]

Example input: `{"group_id":"<group_id>"}`

### `shortcut_update_health`

Update Health · Write

Update the status or text of an existing epic or objective health record in Shortcut.
Returns the updated health record.
Use this to correct a posted update. Use create_epic_health or create_objective_health to post a new one.
Get the health record ID from get_epic_health, get_objective_health, or a health history tool.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `health_id` (`string`, required): UUID of the health record. Example: 12345678-9abc-4def-8123-456789abcdef.
- `status` (`string`, optional): The health status of the Epic. Example: At Risk. One of: `At Risk`, `On Track`, `Off Track`, `No Health`.
- `text` (`string`, optional): The description of the Health status. Example: Looks good, shipping today.

Example input: `{"health_id":"<health_id>"}`

### `shortcut_update_iteration`

Update Iteration · Write

Update a Shortcut iteration's name, description, dates, teams, followers, or labels.
Returns the updated iteration.
Use this to edit a sprint. Use delete_iteration to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `iteration_id` (`integer`, required): Numeric ID of the iteration (from list_iterations). Example: 78.
- `description` (`string`, optional): The description of the Iteration. Example: Focus: checkout bugs.
- `end_date` (`string`, optional): New end date, as YYYY-MM-DD. Example: 2026-11-13.
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_ids` (`array`, optional): IDs of the teams (groups) to associate, from list_groups. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `name` (`string`, optional): The name of this Iteration. Example: Sprint 42.
- `start_date` (`string`, optional): New start date, as YYYY-MM-DD. Example: 2026-11-02.

Example input: `{"iteration_id":78}`

### `shortcut_update_key_result`

Update Key Result · Write

Update a Shortcut key result's name or its initial, observed, or target value.
Returns the updated key result with its progress.
Use this to record progress on an objective's key result.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `key_result_id` (`string`, required): UUID of the key result (from get_objective's key_result_ids). Example: 12345678-9abc-4def-8123-456789abcdef.
- `initial_observed_value` (`object`, optional): The key result's starting value: an object with numeric_value (a decimal string with at most two decimals) or boolean_value. Example: {"numeric_value": "10"}
- `name` (`string`, optional): The name of the Key Result. Example: Reach 1,000 paid workspaces.
- `observed_value` (`object`, optional): The key result's current observed value: an object with numeric_value (a decimal string with at most two decimals) or boolean_value. Example: {"numeric_value": "42.5"}
- `target_value` (`object`, optional): The key result's target value: an object with numeric_value (a decimal string with at most two decimals) or boolean_value. Example: {"numeric_value": "100"}

Example input: `{"key_result_id":"<key_result_id>"}`

### `shortcut_update_label`

Update Label · Write

Rename, recolor, describe, or archive a Shortcut label.
Returns the updated label.
Use this to edit a label. Use delete_label to remove it entirely.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`integer`, required): Numeric ID of the label (from list_labels). Example: 345.
- `archived` (`boolean`, optional): A true/false boolean indicating if the Label has been archived. Example: false.
- `color` (`string`, optional): The hex color to be displayed with the Label (for example, "#ff0000"). Example: #3366ff.
- `description` (`string`, optional): The new description of the label. Example: Server-side work.
- `name` (`string`, optional): The new name of the label. Example: backend.

Example input: `{"label_id":345}`

### `shortcut_update_linked_file`

Update Linked File · Write

Update a Shortcut linked file's name, URL, type, description, or story.
Returns the updated linked file.
Use this to fix a link. Use delete_linked_file to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `linked_file_id` (`integer`, required): Numeric ID of the linked file (from list_linked_files). Example: 99.
- `description` (`string`, optional): The description of the file. Example: Final design spec.
- `name` (`string`, optional): The name of the file. Example: Design spec.
- `size` (`integer`, optional): The filesize, if the integration provided it. Example: 20480.
- `story_id` (`integer`, optional): The ID of the linked story. Example: 1234.
- `thumbnail_url` (`string`, optional): The URL of the thumbnail, if the integration provided it. Example: https://example.com/thumb.png.
- `type` (`string`, optional): The integration type of the file (e.g. google, dropbox, box). Example: google. One of: `google`, `url`, `dropbox`, `box`, `onedrive`.
- `uploader_id` (`string`, optional): The UUID of the member that uploaded the file. Example: 12345678-9abc-4def-8123-456789abcdef.
- `url` (`string`, optional): The URL of linked file. Example: https://drive.google.com/file/d/abc123/view.

Example input: `{"linked_file_id":99}`

### `shortcut_update_objective`

Update Objective · Write

Update a Shortcut objective's name, description, state, categories, dates, position, or archived state.
Returns the updated objective.
Use this to edit an objective. Use create_objective_health to post a health update.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.
- `after_id` (`integer`, optional): The ID of the Objective we want to move this Objective after. Example: 1231.
- `archived` (`boolean`, optional): A boolean indicating whether the Objective is archived or not. Example: false.
- `before_id` (`integer`, optional): The ID of the Objective we want to move this Objective before. Example: 1230.
- `categories` (`array`, optional): Categories to attach, each an object with a name (created if it doesn't exist yet) and an optional hex color. Example: [{"name": "Growth"}]
- `completed_at_override` (`string`, optional): A manual override for the time/date the Objective was completed. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): The Objective's description. Example: Increase paid conversions in Q4.
- `name` (`string`, optional): The name of the Objective. Example: Grow self-serve revenue.
- `started_at_override` (`string`, optional): A manual override for the time/date the Objective was started. Example: 2026-11-15T17:00:00Z.
- `state` (`string`, optional): The workflow state that the Objective is in. Example: in progress. One of: `in progress`, `to do`, `done`.

Example input: `{"objective_id":90}`

### `shortcut_update_project`

Update Project · Write

Update a Shortcut project's name, description, color, team, followers, or archived state.
Returns the updated project.
Use this to edit a project. Use delete_project to remove an empty one.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`integer`, required): Numeric ID of the project (from list_projects). Example: 23.
- `abbreviation` (`string`, optional): The Project abbreviation used in Story summaries. Should be kept to 3 characters at most. Example: WEB.
- `archived` (`boolean`, optional): A true/false boolean indicating whether the Story is in archived state. Example: false.
- `color` (`string`, optional): The color that represents the Project in the UI. Example: #3366ff.
- `days_to_thermometer` (`integer`, optional): The number of days before the thermometer appears in the Story summary. Example: 14.
- `description` (`string`, optional): The Project's description. Example: Customer-facing web app.
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `name` (`string`, optional): The Project's name. Example: Web App.
- `show_thermometer` (`boolean`, optional): Configuration to enable or disable thermometers in the Story summary. Example: false.
- `team_id` (`integer`, optional): The ID of the team the project belongs to. Example: 1.

Example input: `{"project_id":23}`

### `shortcut_update_stories`

Update Multiple Stories · Write

Apply the same change to many Shortcut stories at once, such as moving state, setting epic or iteration, or adding and removing owners, followers, or labels.
Returns an array of the updated stories.
Use update_stories for bulk edits. Use update_story for one story.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_ids` (`array`, required): The Ids of the Stories you wish to update. Example: [1234, 1235]
- `after_id` (`integer`, optional): The ID of the story that the stories are to be moved below. Example: 1231.
- `archived` (`boolean`, optional): If the Stories should be archived or not. Example: false.
- `before_id` (`integer`, optional): The ID of the story that the stories are to be moved before. Example: 1230.
- `custom_fields_add` (`array`, optional): Custom field values to set, each pairing a custom field ID with one of its allowed value IDs (from list_custom_fields). Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef", "value_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `custom_fields_remove` (`array`, optional): Custom field values to clear, each identified by the custom field ID and the value ID currently set. Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef", "value_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `deadline` (`string`, optional): Due date as an ISO 8601 date-time. Example: 2026-11-15T17:00:00Z.
- `epic_id` (`integer`, optional): The ID of the epic the story belongs to. Example: 56.
- `estimate` (`integer`, optional): Point estimate. Leave empty for unestimated. Example: 3.
- `external_links` (`array`, optional): External URLs to associate (for example support tickets or design files). Example: ["https://support.example.com/tickets/42"]
- `follower_ids_add` (`array`, optional): The UUIDs of the new followers to be added. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `follower_ids_remove` (`array`, optional): The UUIDs of the followers to be removed. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_id` (`string`, optional): ID of the team (group) to associate, from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.
- `iteration_id` (`integer`, optional): The ID of the iteration the story belongs to. Example: 78.
- `labels_add` (`array`, optional): Labels to add, each an object with a name (created if it doesn't exist yet) and an optional color. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `labels_remove` (`array`, optional): Labels to remove, each an object with the label's name. Example: [{"name": "urgent"}]
- `move_to` (`string`, optional): Move the story to the first or last position in its workflow state. Example: last. One of: `last`, `first`.
- `owner_ids_add` (`array`, optional): The UUIDs of the new owners to be added. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `owner_ids_remove` (`array`, optional): The UUIDs of the owners to be removed. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `project_id` (`integer`, optional): The ID of the Project the Stories should belong to. Example: 23.
- `requested_by_id` (`string`, optional): ID of the member who requested it, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `story_type` (`string`, optional): The type of story (feature, bug, chore). Example: feature. One of: `feature`, `chore`, `bug`.
- `workflow_state_id` (`integer`, optional): ID of the workflow state (from list_workflows). Example: 500000008.

Example input: `{"story_ids":[1234,1235]}`

### `shortcut_update_story`

Update Story · Write

Update fields on an existing Shortcut story, such as name, description, workflow state, owners, epic, iteration, estimate, or labels.
Returns the updated story with its full details.
Use update_story for one story. Use update_stories to apply the same change to many stories.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `after_id` (`integer`, optional): The ID of the story we want to move this story after. Example: 1231.
- `archived` (`boolean`, optional): True if the story is archived, otherwise false. Example: false.
- `before_id` (`integer`, optional): The ID of the story we want to move this story before. Example: 1230.
- `branch_ids` (`array`, optional): An array of IDs of Branches attached to the story. Example: [1234, 1235]
- `commit_ids` (`array`, optional): An array of IDs of Commits attached to the story. Example: [1234, 1235]
- `completed_at_override` (`string`, optional): A manual override for the time/date the Story was completed. Example: 2026-11-15T17:00:00Z.
- `custom_fields` (`array`, optional): Custom field values, each pairing a custom field ID with the ID of one of that field's allowed values (get both from list_custom_fields). Example: [{"field_id": "12345678-9abc-4def-8123-456789abcdef", "value_id": "12345678-9abc-4def-8123-456789abcdef"}]
- `deadline` (`string`, optional): Due date as an ISO 8601 date-time. Example: 2026-11-15T17:00:00Z.
- `description` (`string`, optional): New story description in Markdown. Example: Steps to reproduce: ...
- `epic_id` (`integer`, optional): The ID of the epic the story belongs to. Example: 56.
- `estimate` (`integer`, optional): Point estimate. Leave empty for unestimated. Example: 3.
- `external_links` (`array`, optional): External URLs to associate (for example support tickets or design files). Example: ["https://support.example.com/tickets/42"]
- `file_ids` (`array`, optional): An array of IDs of files attached to the story. Example: [1234, 1235]
- `follower_ids` (`array`, optional): IDs of the members who follow it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `group_id` (`string`, optional): ID of the team (group) to associate, from list_groups. Example: 12345678-9abc-4def-8123-456789abcdef.
- `iteration_id` (`integer`, optional): The ID of the iteration the story belongs to. Example: 78.
- `labels` (`array`, optional): Labels to attach. Each label is an object with a name (created if it doesn't exist yet) and an optional hex color and description. Example: [{"name": "backend"}, {"name": "urgent", "color": "#ff0000"}]
- `linked_file_ids` (`array`, optional): An array of IDs of linked files attached to the story. Example: [1234, 1235]
- `move_to` (`string`, optional): Move the story to the first or last position in its workflow state. Example: last. One of: `last`, `first`.
- `name` (`string`, optional): The title of the story. Example: Fix login redirect loop.
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]
- `parent_story_id` (`integer`, optional): The parent story id. If you want to unset this value set parent_story_id to null. Example: 1200.
- `project_id` (`integer`, optional): The ID of the project the story belongs to. Example: 23.
- `pull_request_ids` (`array`, optional): An array of IDs of Pull/Merge Requests attached to the story. Example: [1234, 1235]
- `requested_by_id` (`string`, optional): ID of the member who requested it, from list_members. Example: 12345678-9abc-4def-8123-456789abcdef.
- `started_at_override` (`string`, optional): A manual override for the time/date the Story was started. Example: 2026-11-15T17:00:00Z.
- `story_type` (`string`, optional): The type of story (feature, bug, chore). Example: feature. One of: `feature`, `chore`, `bug`.
- `sub_tasks` (`array`, optional): The complete, ordered list of sub-task stories for this parent story. Stories missing from the list are unlinked, new ones are linked, and the order sets their positions. Example: [{"story_id": 1200}, {"story_id": 1201}]
- `workflow_state_id` (`integer`, optional): ID of the workflow state (from list_workflows). Example: 500000008.

Example input: `{"story_id":1234}`

### `shortcut_update_story_comment`

Update Story Comment · Write

Replace the text of a comment on a Shortcut story.
Returns the updated comment.
Use this to edit a story comment. Use update_epic_comment for epic comments.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `text` (`string`, required): The updated comment text. Example: Looks good, shipping today.

Example input: `{"comment_id":5678,"story_id":1234,"text":"<text>"}`

### `shortcut_update_story_link`

Update Story Link · Write

Change the verb or the stories of an existing Shortcut story link.
Returns the updated story link.
Use this to change a relationship. Use delete_story_link to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_link_id` (`integer`, required): Numeric ID of the story link (from get_story's story_links). Example: 910.
- `object_id` (`integer`, optional): The ID of the object Story. Example: 1235.
- `subject_id` (`integer`, optional): The ID of the subject Story. Example: 1234.
- `verb` (`string`, optional): The type of link. Example: blocks. One of: `blocks`, `duplicates`, `relates to`.

Example input: `{"story_link_id":910}`

### `shortcut_update_task`

Update Task · Write

Update a checklist task on a Shortcut story, for example to mark it complete, change its text, owners, or position.
Returns the updated task.
Use this to tick off or edit a task. Use delete_task to remove it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `task_id` (`integer`, required): Numeric ID of the task (from get_story). Example: 4321.
- `after_id` (`integer`, optional): Move task after this task ID. Example: 1231.
- `before_id` (`integer`, optional): Move task before this task ID. Example: 1230.
- `complete` (`boolean`, optional): A true/false boolean indicating whether the task is complete. Example: true.
- `description` (`string`, optional): The Task's description. Example: Write tests.
- `owner_ids` (`array`, optional): IDs of the members who own it, from list_members. Example: ["12345678-9abc-4def-8123-456789abcdef"]

Example input: `{"story_id":1234,"task_id":4321}`

### `shortcut_delete_category`

Delete Category · Destructive

Permanently delete a Shortcut objective category.
Returns an empty response on success.
Use this to remove a category. Use update_category with archived: true to hide it instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `category_id` (`integer`, required): Numeric ID of the category (from list_categories). Example: 12.

Example input: `{"category_id":12}`

### `shortcut_delete_doc`

Delete Doc · Destructive

Permanently delete a Shortcut Doc. Requires admin access to the doc.
Returns an empty response on success.
Use this to remove a doc.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `doc_id` (`string`, required): UUID of the doc (from list_docs or search_docs). Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"doc_id":"<doc_id>"}`

### `shortcut_delete_entity_template`

Delete Story Template · Destructive

Delete a Shortcut story template.
Returns an empty response on success.
Use this to remove a template. Stories already created from it are not changed.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `template_id` (`string`, required): UUID of the story template (from list_entity_templates). Example: 12345678-9abc-4def-8123-456789abcdef.

Example input: `{"template_id":"<template_id>"}`

### `shortcut_delete_epic`

Delete Epic · Destructive

Permanently delete a Shortcut epic.
Returns an empty response on success.
Use this to remove an epic. To keep history, archive it with update_epic (archived: true) instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"epic_id":56}`

### `shortcut_delete_epic_comment`

Delete Epic Comment · Destructive

Delete a comment from a Shortcut epic.
Returns an empty response on success.
Use this to remove an epic comment. Use delete_story_comment for story comments.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"comment_id":5678,"epic_id":56}`

### `shortcut_delete_file`

Delete File · Destructive

Permanently delete an uploaded file from Shortcut.
Returns an empty response on success.
Use this to remove an uploaded file. Use delete_linked_file for linked files.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `file_id` (`integer`, required): Numeric ID of the uploaded file (from list_files). Example: 88.

Example input: `{"file_id":88}`

### `shortcut_delete_iteration`

Delete Iteration · Destructive

Permanently delete a Shortcut iteration.
Returns an empty response on success.
Use this to remove a sprint. Its stories stay in the workspace without an iteration.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `iteration_id` (`integer`, required): Numeric ID of the iteration (from list_iterations). Example: 78.

Example input: `{"iteration_id":78}`

### `shortcut_delete_label`

Delete Label · Destructive

Permanently delete a Shortcut label.
Returns an empty response on success.
Use this to remove a label. Use update_label with archived: true to hide it instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `label_id` (`integer`, required): Numeric ID of the label (from list_labels). Example: 345.

Example input: `{"label_id":345}`

### `shortcut_delete_linked_file`

Delete Linked File · Destructive

Delete a linked file from Shortcut.
Returns an empty response on success.
Use this to remove a link added with create_linked_file. The external file is not touched.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `linked_file_id` (`integer`, required): Numeric ID of the linked file (from list_linked_files). Example: 99.

Example input: `{"linked_file_id":99}`

### `shortcut_delete_objective`

Delete Objective · Destructive

Permanently delete a Shortcut objective.
Returns an empty response on success.
Use this to remove an objective. Use update_objective with archived: true to hide it instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `objective_id` (`integer`, required): Numeric ID of the objective (from list_objectives). Example: 90.

Example input: `{"objective_id":90}`

### `shortcut_delete_project`

Delete Project · Destructive

Delete a Shortcut project. It must have no stories left.
Returns an empty response on success; a 422 error if stories remain.
Move or delete the project's stories first (list_project_stories, update_stories).

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `project_id` (`integer`, required): Numeric ID of the project (from list_projects). Example: 23.

Example input: `{"project_id":23}`

### `shortcut_delete_stories`

Delete Multiple Stories · Destructive

Permanently delete several archived Shortcut stories at once.
Returns an empty response on success.
Use this for bulk deletion. Stories must be archived first (update_stories with archived: true).

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `story_ids` (`array`, required): An array of IDs of Stories to delete. Example: [1234, 1235]

Example input: `{"story_ids":[1234,1235]}`

### `shortcut_delete_story`

Delete Story · Destructive

Permanently delete a Shortcut story.
Returns an empty response on success.
Use delete_story to remove one story. To keep history, archive it with update_story (archived: true) instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"story_id":1234}`

### `shortcut_delete_story_comment`

Delete Story Comment · Destructive

Delete a comment from a Shortcut story.
Returns an empty response on success.
Use this to remove a story comment. Use delete_epic_comment for epic comments.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"comment_id":5678,"story_id":1234}`

### `shortcut_delete_story_link`

Delete Story Link · Destructive

Remove a relationship between two Shortcut stories.
Returns an empty response on success.
Use this to unlink stories created with create_story_link.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `story_link_id` (`integer`, required): Numeric ID of the story link (from get_story's story_links). Example: 910.

Example input: `{"story_link_id":910}`

### `shortcut_delete_story_reaction`

Remove Comment Reaction · Destructive

Remove an emoji reaction from a comment on a Shortcut story.
Returns an empty response on success.
Use this to undo a reaction added with create_story_reaction.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`integer`, required): Numeric ID of the comment. Example: 5678.
- `emoji` (`string`, required): Emoji short-code to react with. Example: :thumbsup:.
- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.

Example input: `{"comment_id":5678,"emoji":"<emoji>","story_id":1234}`

### `shortcut_delete_task`

Delete Task · Destructive

Delete a checklist task from a Shortcut story.
Returns an empty response on success.
Use this to remove a task. Use update_task with complete: true to mark it done instead.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `story_id` (`integer`, required): Numeric ID of the story (shown in its URL, for example 1234 in app.shortcut.com/org/story/1234). Example: 1234.
- `task_id` (`integer`, required): Numeric ID of the task (from get_story). Example: 4321.

Example input: `{"story_id":1234,"task_id":4321}`

### `shortcut_unlink_doc_from_epic`

Unlink Doc from Epic · Destructive

Remove the link between a Shortcut Doc and an epic.
Returns an empty response on success.
Use this to undo link_doc_to_epic. The doc and epic are not deleted.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `doc_id` (`string`, required): UUID of the doc (from list_docs or search_docs). Example: 12345678-9abc-4def-8123-456789abcdef.
- `epic_id` (`integer`, required): Numeric ID of the epic (from list_epics or search_epics). Example: 56.

Example input: `{"doc_id":"<doc_id>","epic_id":56}`

## Related

Other Project Management connectors ([all 40](/agentkit/connectors/?category=project-management)):

- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools
- [Linear](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools
- [Airtable](/agentkit/connectors/airtable/): Scalekit connector, OAuth, 26 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
