> **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 the Linear MCP server

The Linear MCP connector routes your AI agent's tool calls to Linear's own MCP server through Scalekit. Each user signs in to Linear once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 63 tools.

**Authentication:** OAuth 2.1/DCR
**Categories:** Project Management, Developer Tools
**Tools:** 63: 37 read, 14 write, 12 destructive
**Users sign in with:** OAuth
**OAuth app:** Scalekit's or your own
**Built by:** Vendor MCP
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=LINEARMCP)

## What you can do

- **Manage issues**: create, update, list, and look up issues with their labels, statuses, and attachments
- **Plan projects and initiatives**: create and update projects, milestones, and initiatives, and post status updates
- **Comment and discuss**: add, edit, and delete comments on issues, projects, documents, and status updates
- **Write documents**: create, update, and read documents in the workspace
- **Review code changes**: read diffs and review threads, leave comments, approve or request changes, and merge
- **Track customers and releases**: manage customers and their requests, and create releases and release notes

## 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 Linear MCP connection

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

   Scalekit credentials are available for Linear, so you don't need to register an OAuth app.

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 = 'linearmcp'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Linear MCP:', 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: 'linearmcp_get_workspace',
     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 = "linearmcp"
   identifier = "user_123"

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

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

   ```bash
   python quickstart.py
   ```

   Each user signs in once. 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: 'linearmcp_extract_images',
  toolInput: {
    markdown: '<markdown>',
  },
  connector: 'linearmcp',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="linearmcp_extract_images",
    tool_input={
        "markdown": "<markdown>",
    },
    connection_name="linearmcp",
    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.

### `linearmcp_extract_images`

ExtractImages · Read-only

Extract and fetch images from markdown content. Use this to view screenshots, diagrams, or other images embedded in Linear issues, comments, or documents. Pass the markdown content (e.g., issue description) and receive the images as viewable data.

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

Inputs:

- `markdown` (`string`, required): Markdown content containing image references (e.g., issue description, comment body)

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

### `linearmcp_get_agent_skill`

GetAgentSkill · Read-only

Retrieve a Linear Agent skill by ID, including its full markdown instructions.

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

Inputs:

- `id` (`string`, required): Agent skill ID

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

### `linearmcp_get_attachment`

GetAttachment · Read-only

Retrieve an attachment's content by ID.

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

Inputs:

- `id` (`string`, required): Attachment ID

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

### `linearmcp_get_diff`

GetDiff · Read-only

Exact lookup for a Linear diff. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.

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

Inputs:

- `urlOrId` (`string`, required): Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL

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

### `linearmcp_get_diff_threads`

GetDiffThreads · Read-only

Exact lookup for diff threads. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.

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

Inputs:

- `urlOrId` (`string`, required): Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `resolved` (`boolean`, optional): Filter returned threads by resolved state
- `threadId` (`string`, optional): Optional Linear comment UUID of any comment in the thread (not its `externalThreadId`); a reply's UUID resolves to its thread root

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

### `linearmcp_get_document`

GetDocument · Read-only

Retrieve a Linear document by ID or slug

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

Inputs:

- `id` (`string`, required): Document ID or slug

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

### `linearmcp_get_initiative`

GetInitiative · Read-only

Retrieve detailed information about a specific initiative in Linear

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

Inputs:

- `query` (`string`, required): Initiative name, ID, identifier (e.g., INIT-123), or slug
- `includeProjects` (`boolean`, optional): Include projects. Default: `false`.
- `includeSubInitiatives` (`boolean`, optional): Include sub-initiatives. Default: `false`.

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

### `linearmcp_get_issue`

GetIssue · Read-only

Retrieve detailed information about an issue by ID, including attachments, git branch name, and active Triage Intelligence suggestions when the issue is in triage

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

Inputs:

- `id` (`string`, required): Issue ID or identifier (e.g., LIN-123)
- `includeCustomerNeeds` (`boolean`, optional): Include associated customer needs. Default: `false`.
- `includeRelations` (`boolean`, optional): Include blocking/related/duplicate relations. Default: `false`.
- `includeReleases` (`boolean`, optional): Include associated releases. Default: `false`.

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

### `linearmcp_get_issue_status`

GetIssueStatus · Read-only

Retrieve detailed information about an issue status in Linear by name or ID

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

Inputs:

- `id` (`string`, required): Status ID
- `name` (`string`, required): Status name
- `team` (`string`, required): Team name or ID

Example input: `{"id":"<id>","name":"<name>","team":"<team>"}`

### `linearmcp_get_milestone`

GetMilestone · Read-only

Retrieve details of a specific milestone by ID or name

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

Inputs:

- `project` (`string`, required): Project name, ID, identifier (e.g., PROJ-123), or slug
- `query` (`string`, required): Milestone name or ID

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

### `linearmcp_get_project`

GetProject · Read-only

Retrieve details of a specific project in Linear

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

Inputs:

- `query` (`string`, required): Project name, ID, identifier (e.g., PROJ-123), or slug
- `includeMembers` (`boolean`, optional): Include project members. Default: `false`.
- `includeMilestones` (`boolean`, optional): Include milestones. Default: `false`.
- `includeResources` (`boolean`, optional): Include resources (documents, links, attachments). Default: `false`.

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

### `linearmcp_get_release`

GetRelease · Read-only

Retrieve details of a release by ID or slug.

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

Inputs:

- `id` (`string`, required): Release ID or slug
- `includeReleaseNotes` (`boolean`, optional): Include associated release notes. Default: `false`.

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

### `linearmcp_get_release_note`

GetReleaseNote · Read-only

Retrieve release notes by ID or slug, including markdown content.

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

Inputs:

- `id` (`string`, required): Release notes ID or slug
- `includeReleases` (`boolean`, optional): Include associated releases. Default: `false`.

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

### `linearmcp_get_status_updates`

GetStatusUpdates · Read-only

List or get project/initiative status updates. Pass `id` to get a specific update, or filter to list.

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

Inputs:

- `type` (`string`, required): Type of status update — project or initiative. One of: `project`, `initiative`.
- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `id` (`string`, optional): Status update ID - if provided, returns this specific update
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `initiative` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `project` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)
- `user` (`string`, optional): User ID, name, email, or "me"

Example input: `{"type":"project"}`

### `linearmcp_get_team`

GetTeam · Read-only

Retrieve details of a specific Linear team

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

Inputs:

- `query` (`string`, required): Team UUID, key, or name

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

### `linearmcp_get_user`

GetUser · Read-only

Retrieve details of a specific Linear user

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

Inputs:

- `query` (`string`, required): User ID, name, email, or "me"

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

### `linearmcp_get_workspace`

GetWorkspace · Read-only

Retrieve the connected Linear workspace

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

Inputs: none.

Example input: `{}`

### `linearmcp_list_agent_skills`

ListAgentSkills · Read-only

List Linear Agent skills available to the authenticated user.

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.

Example input: `{}`

### `linearmcp_list_comments`

ListComments · Read-only

List comments on a Linear issue, project, initiative, document, project milestone, or project/initiative status update. Provide exactly one of issueId, projectId, initiativeId, documentId, milestoneId, or statusUpdateId. For issues, projects, and initiatives this returns both top-level discussion threads and inline description comments. Inline (anchored) comments carry a non-null quotedText set to the snippet of description text they reference. Returned comments include author and nullable onBehalfOf; when set, onBehalfOf identifies the user the agent author acted for.

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `documentId` (`string`, optional): Document ID or slug (provide exactly one parent)
- `initiativeId` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug (provide exactly one parent)
- `issueId` (`string`, optional): Issue ID or identifier (e.g., LIN-123) (provide exactly one parent)
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `milestoneId` (`string`, optional): Milestone UUID (provide exactly one parent). Resolve milestone names via list_milestones first.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `projectId` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug (provide exactly one parent)
- `statusUpdateId` (`string`, optional): Status update UUID (provide exactly one parent). Resolve status updates via get_status_updates first.
- `statusUpdateType` (`string`, optional): Type of status update named by statusUpdateId, as returned by get_status_updates. Only valid together with statusUpdateId; omit to check both project and initiative status updates. One of: `project`, `initiative`.

Example input: `{}`

### `linearmcp_list_customers`

ListCustomers · Read-only

List customers in the user's Linear workspace

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `includeNeeds` (`boolean`, optional): Include associated customer needs. Default: `false`.
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `owner` (`string`, optional): User ID, name, email, or "me"
- `query` (`string`, optional): Search customer name
- `status` (`string`, optional): Customer status name or ID
- `tier` (`string`, optional): Customer tier name or ID
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_cycles`

ListCycles · Read-only

Retrieve cycles for a specific Linear team

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

Inputs:

- `teamId` (`string`, required): Team ID
- `type` (`string`, optional): Filter: current, previous, next, or all. One of: `current`, `previous`, `next`.

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

### `linearmcp_list_diffs`

ListDiffs · Read-only

List Linear diff pull requests visible to the authenticated user

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `owner` (`string`, optional): Filter returned diffs by repository owner
- `query` (`string`, optional): Broad search by title, branch, PR number, or bare slug
- `repo` (`string`, optional): Filter returned diffs by repository name
- `status` (`string`, optional): Filter returned diffs by pull request status

Example input: `{}`

### `linearmcp_list_documents`

ListDocuments · Read-only

List documents in the user's Linear workspace

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `creatorId` (`string`, optional): Filter by creator ID
- `cursor` (`string`, optional): Next page cursor
- `fields` (`array`, optional): Fields to include in each result. id is always included. Omit or pass an empty array for the default response.
- `includeArchived` (`boolean`, optional): Include archived documents. Default: `false`.
- `initiativeId` (`string`, optional): Filter by initiative ID
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `projectId` (`string`, optional): Filter by project ID
- `query` (`string`, optional): Search query
- `teamId` (`string`, optional): Filter by team ID
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_initiative_labels`

ListInitiativeLabels · Read-only

List available initiative labels in the Linear workspace

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `name` (`string`, optional): Filter by name
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.

Example input: `{}`

### `linearmcp_list_initiatives`

ListInitiatives · Read-only

List initiatives in the user's Linear workspace

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `fields` (`array`, optional): Fields to include in each result. id is always included. Omit or pass an empty array for the default response.
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `includeProjects` (`boolean`, optional): Include projects. Default: `false`.
- `includeSubInitiatives` (`boolean`, optional): Include sub-initiatives. Default: `false`.
- `label` (`string`, optional): Label name or ID
- `leadTeam` (`string`, optional): Lead team name, key, or ID
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `owner` (`string`, optional): User ID, name, email, or "me"
- `parentInitiative` (`string`, optional): Parent initiative. Initiative name, ID, identifier (e.g., INIT-123), or slug
- `query` (`string`, optional): Search initiative name
- `status` (`string`, optional): Status of the initiative
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_issue_labels`

ListIssueLabels · Read-only

List available issue labels in a Linear workspace or team

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `name` (`string`, optional): Filter by name
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `team` (`string`, optional): Team name or ID

Example input: `{}`

### `linearmcp_list_issue_statuses`

ListIssueStatuses · Read-only

List available issue statuses in a Linear team

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

Inputs:

- `team` (`string`, required): Team name or ID

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

### `linearmcp_list_issues`

ListIssues · Read-only

List issues in the user's Linear workspace, including active Triage Intelligence suggestions for issues in triage. For my issues, use "me" as the assignee. Use "null" for no assignee.

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

Inputs:

- `assignee` (`string`, optional): User ID, name, email, or "me"
- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `cycle` (`string`, optional): Cycle name, number, or ID
- `delegate` (`string`, optional): Agent name or ID. When the user asks to delegate to "Linear" or "the Linear agent", this refers to the "Linear" app user specifically
- `fields` (`array`, optional): Fields to include in each result. id is always included. Omit or pass an empty array for the default response.
- `includeArchived` (`boolean`, optional): Include archived items. Default: `true`.
- `label` (`string`, optional): Label name or ID
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `parentId` (`string`, optional): Parent issue ID or identifier (e.g., LIN-123)
- `priority` (`number`, optional): 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low
- `project` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug
- `query` (`string`, optional): Search issue title or description
- `release` (`string`, optional): Release ID or slug
- `state` (`string`, optional): State type, name, or ID
- `team` (`string`, optional): Team name or ID
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_milestones`

ListMilestones · Read-only

List all milestones in a Linear project

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

Inputs:

- `project` (`string`, required): Project name, ID, identifier (e.g., PROJ-123), or slug

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

### `linearmcp_list_project_labels`

ListProjectLabels · Read-only

List available project labels in the Linear workspace

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `name` (`string`, optional): Filter by name
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.

Example input: `{}`

### `linearmcp_list_projects`

ListProjects · Read-only

List projects in the user's Linear workspace

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `fields` (`array`, optional): Fields to include in each result. id is always included. Omit or pass an empty array for the default response.
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `includeMembers` (`boolean`, optional): Include project members. Default: `false`.
- `includeMilestones` (`boolean`, optional): Include milestones. Default: `false`.
- `initiative` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug
- `label` (`string`, optional): Label name or ID
- `limit` (`number`, optional): Max results (default 50, max 50). Default: `50`.
- `member` (`string`, optional): User ID, name, email, or "me"
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `query` (`string`, optional): Search project name
- `state` (`string`, optional): State type, name, or ID
- `team` (`string`, optional): Team name or ID
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_release_notes`

ListReleaseNotes · Read-only

List release notes in the workspace, optionally filtered by pipeline or covered release.

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `includeContent` (`boolean`, optional): Include markdown release notes content. Default: `false`.
- `includeReleases` (`boolean`, optional): Include associated releases. Default: `false`.
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `pipeline` (`string`, optional): Release pipeline ID, slug, or exact name
- `query` (`string`, optional): Search release notes title
- `release` (`string`, optional): Release ID or slug
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_release_pipelines`

ListReleasePipelines · Read-only

List release pipelines in the workspace.

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `includeStages` (`boolean`, optional): Include each pipeline's stages. Default: `false`.
- `includeTeams` (`boolean`, optional): Include each pipeline's teams. Default: `false`.
- `isProduction` (`boolean`, optional): Filter by production pipeline flag
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `query` (`string`, optional): Search pipeline name
- `team` (`string`, optional): Team name or ID
- `type` (`string`, optional): Pipeline type: continuous | scheduled. One of: `continuous`, `scheduled`.
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_releases`

ListReleases · Read-only

List releases in the workspace, with optional filtering by pipeline, stage, version, and text.

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `hasReleaseNotes` (`boolean`, optional): Filter to releases that do (true) or do not (false) have release notes
- `includeArchived` (`boolean`, optional): Include archived items. Default: `false`.
- `includeReleaseNotes` (`boolean`, optional): Include associated release notes. Default: `false`.
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `pipeline` (`string`, optional): Release pipeline ID, slug, or exact name
- `query` (`string`, optional): Search release name or version
- `stage` (`string`, optional): Release stage ID or exact name
- `stageType` (`string`, optional): Filter by stage lifecycle type. One of: `planned`, `started`, `completed`, `canceled`.
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)
- `version` (`string`, optional): Exact version match

Example input: `{}`

### `linearmcp_list_teams`

ListTeams · Read-only

List teams in the user's Linear workspace

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

Inputs:

- `createdAt` (`string`, optional): Created after: ISO-8601 date/duration (e.g., -P1D)
- `cursor` (`string`, optional): Next page cursor
- `includeArchived` (`boolean`, optional): Include archived teams. Default: `false`.
- `limit` (`number`, optional): Max results (default 50, max 250). Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `query` (`string`, optional): Search query
- `updatedAt` (`string`, optional): Updated after: ISO-8601 date/duration (e.g., -P1D)

Example input: `{}`

### `linearmcp_list_users`

ListUsers · Read-only

Retrieve users in the Linear workspace

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

Inputs:

- `cursor` (`string`, optional): Next page cursor
- `limit` (`number`, optional): Maximum number of users to return. Default: `50`.
- `orderBy` (`string`, optional): Sort: createdAt | updatedAt. One of: `createdAt`, `updatedAt`. Default: `updatedAt`.
- `query` (`string`, optional): Filter by name or email
- `team` (`string`, optional): Team name or ID

Example input: `{}`

### `linearmcp_search_documentation`

SearchDocumentation · Read-only

Search Linear's documentation to learn about features and usage

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

Inputs:

- `query` (`string`, required): Search query
- `page` (`number`, optional): Page number. Default: `0`.

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

### `linearmcp_create_attachment`

CreateAttachment · Write

Deprecated fallback for tiny files only. Accepts base64 file content, verifies SHA-256 checksum, and uploads it through the MCP worker. Prefer prepare_attachment_upload plus direct PUT plus create_attachment_from_upload.

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

Inputs:

- `base64Content` (`string`, required): Deprecated base64-encoded file content to upload
- `contentType` (`string`, required): MIME type for the upload (e.g., 'image/png', 'application/pdf')
- `filename` (`string`, required): Filename for the upload (e.g., 'screenshot.png')
- `issue` (`string`, required): Issue ID or identifier (e.g., LIN-123)
- `sha256` (`string`, required): Expected SHA-256 hex digest of the decoded file bytes.
- `size` (`integer`, optional): Optional expected decoded file size in bytes. Rejects the upload if it does not match.
- `subtitle` (`string`, optional): Optional subtitle for the attachment
- `title` (`string`, optional): Optional title for the attachment

Example input: `{"base64Content":"<base64Content>","contentType":"image/png","filename":"screenshot.png","issue":"<issue>","sha256":"<sha256>"}`

### `linearmcp_create_attachment_from_upload`

CreateAttachmentFromUpload · Write

Link an already-uploaded Linear assetUrl to an existing issue as an attachment.

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

Inputs:

- `assetUrl` (`string`, required): Linear upload assetUrl returned by prepare_attachment_upload
- `issue` (`string`, required): Issue ID or identifier (e.g., LIN-123)
- `subtitle` (`string`, optional): Optional attachment subtitle
- `title` (`string`, optional): Attachment title. Defaults to filename or asset URL

Example input: `{"assetUrl":"<assetUrl>","issue":"<issue>"}`

### `linearmcp_create_initiative_label`

CreateInitiativeLabel · Write

Create a new Linear initiative label

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

Inputs:

- `name` (`string`, required): Label name
- `color` (`string`, optional): Hex color code
- `description` (`string`, optional): Label description
- `isGroup` (`boolean`, optional): Is label group (not directly applicable). Default: `false`.
- `parent` (`string`, optional): Parent label group name

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

### `linearmcp_create_issue_label`

CreateIssueLabel · Write

Create a new Linear issue label

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

Inputs:

- `name` (`string`, required): Label name
- `color` (`string`, optional): Hex color code
- `description` (`string`, optional): Label description
- `isGroup` (`boolean`, optional): Is label group (not directly applicable). Default: `false`.
- `parent` (`string`, optional): Parent label group name
- `teamId` (`string`, optional): Team UUID (omit for workspace label)

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

### `linearmcp_merge_diff`

MergeDiff · Write

Merge a Linear diff or add it to the repository's merge queue

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

Inputs:

- `urlOrId` (`string`, required): Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL
- `mergeMethod` (`string`, optional): Merge method; omit to use the repository default. One of: `MERGE`, `REBASE`, `SQUASH`.

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

### `linearmcp_prepare_attachment_upload`

PrepareAttachmentUpload · Write

Prepare a direct Linear file upload for an existing issue. Workflow: 1. Call this with issue, filename, contentType, and size. 2. Upload raw bytes with PUT to uploadRequest.url. 3. After PUT succeeds, call create_attachment_from_upload with assetUrl.

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

Inputs:

- `contentType` (`string`, required): MIME type, e.g. image/png or application/pdf
- `filename` (`string`, required): Filename for the upload, e.g. screenshot.png
- `issue` (`string`, required): Issue ID or identifier (e.g., LIN-123)
- `size` (`integer`, required): Exact file size in bytes. Must be smaller than 2 GB.
- `subtitle` (`string`, optional): Suggested attachment subtitle for the finalize step
- `title` (`string`, optional): Suggested attachment title for the finalize step

Example input: `{"contentType":"image/png","filename":"screenshot.png","issue":"<issue>","size":1}`

### `linearmcp_resolve_diff_thread`

ResolveDiffThread · Write

Resolve or reopen a top-level comment thread on a Linear diff

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

Inputs:

- `threadId` (`string`, required): Top-level diff thread/comment ID
- `resolved` (`boolean`, optional): True to resolve the thread; false to reopen it. Default: `true`.

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

### `linearmcp_save_customer`

SaveCustomer · Write

Create or update a Linear customer. If id is provided, updates the existing customer; otherwise creates a new one. When creating, name is required.

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

Inputs:

- `domains` (`array`, optional): Domains to add to this customer. Append-only; existing domains are never removed
- `externalIds` (`array`, optional): External system IDs to add. Append-only; existing IDs are never removed
- `id` (`string`, optional): Customer ID. If provided, updates the existing customer
- `name` (`string`, optional): Customer name (required when creating)
- `owner` (`string`, optional): User ID, name, email, or "me"
- `revenue` (`number`, optional): Annual revenue generated by the customer
- `size` (`number`, optional): Size of the customer organization
- `status` (`string`, optional): Customer status name or ID
- `tier` (`string`, optional): Customer tier name or ID

Example input: `{}`

### `linearmcp_save_customer_need`

SaveCustomerNeed · Write

Create or update a customer need (request) in Linear. If id is provided, updates the existing need; otherwise creates a new one. When creating, body is required.

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

Inputs:

- `body` (`string`, optional): Description of the customer need (required when creating)
- `customer` (`string`, optional): Customer ID or name
- `id` (`string`, optional): Customer need ID. If provided, updates the existing need
- `issue` (`string`, optional): Issue ID or identifier (e.g., LIN-123) to associate with this need
- `priority` (`number`, optional): Whether the need is important. 0 = Not important, 1 = Important
- `project` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug to associate with this need
- `source` (`string`, optional): URL to attach as the source for this customer need, such as a transcript or support thread

Example input: `{}`

### `linearmcp_save_diff_comment`

SaveDiffComment · Write

Create, reply to, or edit a comment or persisted draft on a Linear diff. Set draft to true to save without submitting. Provide draftId to edit or submit a persisted draft, and commentId only to edit a submitted comment. Submitting an inline draft reuses its saved anchor; submitting a reply draft requires parentId again.

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

Inputs:

- `body` (`string`, required): Comment body as plain text
- `anchor` (`object`, optional): Optional comment anchor copied from a diff thread or built for a file or diff hunk
- `anchorContent` (`string`, optional): Exact source text of the anchor's end line; stored with an inline draft so it can be re-anchored after the diff receives new revisions
- `commentId` (`string`, optional): Existing comment ID to edit
- `draft` (`boolean`, optional): Save as a private persisted draft without submitting. Default: `false`.
- `draftId` (`string`, optional): Existing persisted draft ID to edit or submit
- `parentId` (`string`, optional): Top-level comment ID to reply to; also required when submitting a persisted reply draft
- `urlOrId` (`string`, optional): Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL

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

### `linearmcp_save_initiative`

SaveInitiative · Write

Create or update a Linear initiative. If id is provided, updates the existing initiative; otherwise creates a new one. When creating, name is required. To change parts of the description without resending all of it, pass patch instead of description.

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

Inputs:

- `color` (`string`, optional): Hex color
- `description` (`string`, optional): Content as Markdown. Do not escape the string, use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `icon` (`string`, optional): Icon name or emoji code (e.g. "Rocket" or ":eagle:"), not a raw Unicode emoji
- `id` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug. If provided, updates the existing initiative
- `labels` (`array`, optional): Label names or IDs as a JSON array of strings (e.g. ["Bug", "Urgent"]). Replaces the full label set; existing labels not included are removed. Omit to leave labels unchanged
- `leadTeam` (`string`, optional): Lead team name, key, or ID. Null to remove the lead team
- `name` (`string`, optional): Initiative name (required when creating)
- `owner` (`string`, optional): User ID, name, email, or "me". Null to remove
- `parentInitiatives` (`array`, optional): Parent initiatives to add. Initiative name, ID, identifier (e.g., INIT-123), or slug. Appended to existing parents
- `patch` (`array`, optional): Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full description field.
- `priority` (`integer`, optional): 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low
- `status` (`string`, optional): Initiative status (Proposed, Planned, Active, Completed, Canceled)
- `summary` (`string`, optional): Short summary (max 255 chars)
- `targetDate` (`string`, optional): Target date (ISO format)

Example input: `{}`

### `linearmcp_save_release`

SaveRelease · Write

Create or update a release. If id is provided, updates the existing release; otherwise creates a new one. When creating, name and pipeline are required. Release status is modeled as the release pipeline stage.

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

Inputs:

- `commitSha` (`string`, optional): Commit SHA associated with the release
- `completedAt` (`string`, optional): Completed timestamp (ISO DateTime, null to remove)
- `createdAt` (`string`, optional): Import/create timestamp (ISO DateTime)
- `description` (`string`, optional): Release description
- `id` (`string`, optional): Release ID or slug to update. Omit to create a new release.
- `name` (`string`, optional): Release name (required when creating)
- `pipeline` (`string`, optional): Release pipeline ID, slug, or exact name (required when creating)
- `stage` (`string`, optional): Release stage ID, exact name, or lifecycle type within the release pipeline
- `startDate` (`string`, optional): Estimated start date (ISO YYYY-MM-DD, null to remove)
- `startedAt` (`string`, optional): Started timestamp (ISO DateTime, null to remove)
- `targetDate` (`string`, optional): Estimated completion date (ISO YYYY-MM-DD, null to remove)
- `version` (`string`, optional): Version identifier

Example input: `{}`

### `linearmcp_save_release_note`

SaveReleaseNote · Write

Create or update release notes. If id is provided, updates the existing release notes; otherwise creates a new one. When creating, pipeline and either releases or a release range are required. To change parts of the content without resending all of it, pass patch instead of content.

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

Inputs:

- `content` (`string`, optional): Content as Markdown. Do not escape the string, use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `id` (`string`, optional): Release notes ID or slug to update. Omit to create new release notes.
- `patch` (`array`, optional): Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content field.
- `pipeline` (`string`, optional): Release pipeline ID, slug, or exact name (required when creating)
- `rangeFromRelease` (`string`, optional): Oldest release ID or slug in the note range
- `rangeToRelease` (`string`, optional): Newest release ID or slug in the note range
- `releases` (`array`, optional): Release IDs or slugs to include in the note
- `title` (`string`, optional): Release notes title

Example input: `{}`

### `linearmcp_submit_diff_review`

SubmitDiffReview · Write

Approve a Linear diff, request changes, or submit a review comment

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

Inputs:

- `decision` (`string`, required): Review decision: approved, changesRequested, or commented. One of: `approved`, `changesRequested`, `commented`.
- `urlOrId` (`string`, required): Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL
- `body` (`string`, optional): Optional review body; required when requesting changes or commenting

Example input: `{"decision":"approved","urlOrId":"<urlOrId>"}`

### `linearmcp_delete_attachment`

DeleteAttachment · Destructive

Delete an attachment by ID

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

Inputs:

- `id` (`string`, required): Attachment ID

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

### `linearmcp_delete_comment`

DeleteComment · Destructive

Delete a Linear comment. Inline description comments (those with non-null `quotedText`) anchor a mark in the editor, so their root cannot be deleted — delete the replies individually or resolve the thread instead.

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

Inputs:

- `id` (`string`, required): Comment ID

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

### `linearmcp_delete_customer`

DeleteCustomer · Destructive

Delete a customer in Linear

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

Inputs:

- `id` (`string`, required): Customer ID

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

### `linearmcp_delete_customer_need`

DeleteCustomerNeed · Destructive

Archive a customer need in Linear

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

Inputs:

- `id` (`string`, required): Customer need ID

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

### `linearmcp_delete_diff_comment`

DeleteDiffComment · Destructive

Delete a comment from a Linear diff

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

Inputs:

- `commentId` (`string`, required): Diff comment ID to delete

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

### `linearmcp_delete_status_update`

DeleteStatusUpdate · Destructive

Delete (archive) a project or initiative status update.

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

Inputs:

- `id` (`string`, required): Status update ID
- `type` (`string`, required): Type of status update. One of: `project`, `initiative`.

Example input: `{"id":"<id>","type":"project"}`

### `linearmcp_save_comment`

SaveComment · Destructive

Create or update a comment on a Linear issue, project, initiative, document, project milestone, or project/initiative status update. If id is provided, updates the existing comment; otherwise creates a new one. To start a new thread, pass body and exactly one of issueId, projectId, initiativeId, documentId, milestoneId, or statusUpdateId. To reply to an existing thread, pass parentId and body.

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

Inputs:

- `body` (`string`, required): Content as Markdown. Do not escape the string, use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `documentId` (`string`, optional): Document ID or slug (provide exactly one parent)
- `id` (`string`, optional): Comment ID. If provided, updates the existing comment
- `initiativeId` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug (provide exactly one parent)
- `issueId` (`string`, optional): Issue ID or identifier (e.g., LIN-123) (provide exactly one parent)
- `milestoneId` (`string`, optional): Milestone UUID (provide exactly one parent). Resolve milestone names via list_milestones first.
- `parentId` (`string`, optional): Parent comment ID (for replies, only when creating)
- `projectId` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug (provide exactly one parent)
- `statusUpdateId` (`string`, optional): Status update UUID (provide exactly one parent). Resolve status updates via get_status_updates first.
- `statusUpdateType` (`string`, optional): Type of status update named by statusUpdateId, as returned by get_status_updates. Only valid together with statusUpdateId; rejected when id or parentId is provided. One of: `project`, `initiative`.

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

### `linearmcp_save_document`

SaveDocument · Destructive

Create or update a Linear document. If id is provided, updates the existing document; otherwise creates a new one. When creating, title is required and exactly one parent (project, issue, initiative, cycle, or team) must be specified. On update, passing a parent reparents the document. To change parts of the content without resending all of it, pass patch instead of content.

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

Inputs:

- `color` (`string`, optional): Hex color
- `content` (`string`, optional): Content as Markdown. Do not escape the string, use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `cycle` (`string`, optional): Cycle name, number, or ID. When passing a name or number, also pass team to disambiguate.
- `icon` (`string`, optional): Icon name or emoji code (e.g. "Rocket" or ":eagle:"), not a raw Unicode emoji
- `id` (`string`, optional): Document ID or slug to update. Omit to create a new document.
- `initiative` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug
- `issue` (`string`, optional): Issue ID or identifier (e.g., LIN-123)
- `patch` (`array`, optional): Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full content field.
- `project` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug
- `team` (`string`, optional): Team name or ID. Attaches the document to the team, unless cycle is also passed, in which case it disambiguates the cycle.
- `title` (`string`, optional): Document title (required when creating)

Example input: `{}`

### `linearmcp_save_issue`

SaveIssue · Destructive

Create or update a Linear issue. If id is provided, updates the existing issue; otherwise creates a new one. When creating, title and team are required. Note: use assignee (not assigneeId) to set the assignee, it accepts a user ID, name, email, or "me".

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

Inputs:

- `addReleases` (`array`, optional): Release IDs or slugs to add. Append-only; existing releases are never removed
- `assignee` (`string`, optional): User ID, name, email, or 'me'. Null to remove assignee.
- `blockedBy` (`array`, optional): Issue IDs/identifiers blocking this. Append-only; existing relations are never removed
- `blocks` (`array`, optional): Issue IDs/identifiers this blocks. Append-only; existing relations are never removed
- `cycle` (`string`, optional): Cycle name, number, or ID. Pass null to remove from cycle.
- `delegate` (`string`, optional): Agent name or ID. When the user asks to delegate to "Linear" or "the Linear agent", this refers to the "Linear" app user specifically. Null to remove delegate.
- `description` (`string`, optional): Content as Markdown. Do not escape the string, use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `dueDate` (`string`, optional): Due date (ISO format). On update, pass null to remove the due date
- `duplicateOf` (`string`, optional): Issue ID this is a duplicate of. Pass null to remove.
- `estimate` (`string`, optional): Issue estimate value. On create, pass null or omit for no estimate. On update, pass null to clear the estimate; omitting leaves it unchanged. 0 is a real estimate only on teams that allow zero estimates.
- `id` (`string`, optional): Only for updating. Issue ID or identifier (e.g., LIN-123). Do NOT pass when creating.
- `labels` (`array`, optional): Label names or IDs to apply to the issue. Replaces the full label set; existing labels not included are removed.
- `links` (`array`, optional): Link attachments to add [{url, title}]. Append-only; existing links are never removed
- `milestone` (`string`, optional): Milestone name or ID
- `parentId` (`string`, optional): Parent issue ID or identifier (e.g., LIN-123). Null to remove.
- `patch` (`array`, optional): Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full description field.
- `priority` (`number`, optional): 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low
- `project` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug. Null to remove
- `relatedTo` (`array`, optional): Related issue IDs/identifiers. Append-only; existing relations are never removed
- `removeBlockedBy` (`array`, optional): Issue IDs/identifiers to remove as blockers of this issue
- `removeBlocks` (`array`, optional): Issue IDs/identifiers to stop blocking
- `removeRelatedTo` (`array`, optional): Related issue IDs/identifiers to remove
- `removeReleases` (`array`, optional): Release IDs or slugs to remove. Only valid when updating an existing issue
- `setReleases` (`array`, optional): Replace all releases on the issue with these. Cannot be combined with addReleases/removeReleases
- `slaBreachesAt` (`string`, optional): ISO-8601 timestamp when the SLA will breach. On update, pass null to remove the SLA
- `slaType` (`string`, optional): SLA day counting type: "all" or "onlyBusinessDays". Only use with slaBreachesAt; null means unset
- `state` (`string`, optional): State type, name, or ID
- `team` (`string`, optional): Team name or ID (required when creating)
- `title` (`string`, optional): Issue title (required when creating)

Example input: `{}`

### `linearmcp_save_milestone`

SaveMilestone · Destructive

Create or update a milestone in a Linear project. If id is provided, updates the existing milestone; otherwise creates a new one. When creating, name is required.

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

Inputs:

- `project` (`string`, required): Project name, ID, identifier (e.g., PROJ-123), or slug
- `description` (`string`, optional): Milestone description
- `id` (`string`, optional): Milestone name or ID. If provided, updates existing
- `name` (`string`, optional): Milestone name (required when creating)
- `targetDate` (`string`, optional): Target completion date (ISO format, null to remove)

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

### `linearmcp_save_project`

SaveProject · Destructive

Create or update a Linear project. If id is provided, updates the existing project; otherwise creates a new one. When creating, name and at least one team (via addTeams or setTeams) are required. To change parts of the description without resending all of it, pass patch instead of description.

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

Inputs:

- `addInitiatives` (`array`, optional): Initiatives to add. Initiative name, ID, identifier (e.g., INIT-123), or slug
- `addTeams` (`array`, optional): Team name or ID to add
- `color` (`string`, optional): Hex color
- `description` (`string`, optional): Content as Markdown. Do not escape the string, use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `icon` (`string`, optional): Icon name or emoji code
- `id` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug. If provided, updates the existing project
- `labels` (`array`, optional): Label names or IDs
- `lead` (`string`, optional): User ID, name, email, or 'me'. Null to remove
- `links` (`array`, optional): External resource links to add [{url, title}]. Append-only; existing links are never removed
- `name` (`string`, optional): Project name (required when creating)
- `patch` (`array`, optional): Partial edits applied to the current content, in order and atomically (one failing operation aborts the whole save). Every anchor string must match the current content exactly once. Only valid on update, in place of the full description field.
- `priority` (`integer`, optional): 0=None, 1=Urgent, 2=High, 3=Medium, 4=Low
- `removeInitiatives` (`array`, optional): Initiatives to remove. Initiative name, ID, identifier (e.g., INIT-123), or slug
- `removeTeams` (`array`, optional): Team name or ID to remove
- `setInitiatives` (`array`, optional): Replace all initiatives with these. Initiative name, ID, identifier (e.g., INIT-123), or slug. Cannot combine with addInitiatives/removeInitiatives
- `setTeams` (`array`, optional): Replace all teams with these. Cannot combine with addTeams/removeTeams
- `startDate` (`string`, optional): Start date (ISO format). Pair with startDateResolution to indicate precision (e.g. month, quarter)
- `startDateResolution` (`string`, optional): Start date resolution. One of: `halfYear`, `month`, `quarter`, `year`.
- `state` (`string`, optional): Project state
- `summary` (`string`, optional): Short summary (max 255 chars)
- `targetDate` (`string`, optional): Target date (ISO format). Pair with targetDateResolution to indicate precision (e.g. month, quarter)
- `targetDateResolution` (`string`, optional): Target date resolution. One of: `halfYear`, `month`, `quarter`, `year`.

Example input: `{}`

### `linearmcp_save_status_update`

SaveStatusUpdate · Destructive

Create or update a project/initiative status update. Omit `id` to create, provide `id` to update.

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

Inputs:

- `type` (`string`, required): Type of status update. One of: `project`, `initiative`.
- `body` (`string`, optional): Content as Markdown. Do not escape the string — use literal newlines and special characters, not escape sequences. To mention a user, use @displayName (e.g., @johndoe)
- `health` (`string`, optional): Health status of the project or initiative. One of: `onTrack`, `atRisk`, `offTrack`.
- `id` (`string`, optional): Status update ID - if provided, updates this existing update
- `initiative` (`string`, optional): Initiative name, ID, identifier (e.g., INIT-123), or slug
- `isDiffHidden` (`boolean`, optional): Deprecated. Hide diff with previous update (create only)
- `project` (`string`, optional): Project name, ID, identifier (e.g., PROJ-123), or slug

Example input: `{"type":"project"}`

## Related

Other ways to connect Linear:

- [OAuth](/agentkit/connectors/linear/): Scalekit connector, OAuth, 62 tools

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

- [Notion](/agentkit/connectors/notion/): Scalekit connector, OAuth, 51 tools
- [Airtable](/agentkit/connectors/airtable/): Scalekit connector, OAuth, 26 tools
- [Jira](/agentkit/connectors/jira/): Scalekit connector, OAuth, 374 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 |
