Linear MCP logo

Integrate Linear MCP with your AI CRM

Linear MCP lets agents find, create, and update issues, projects, comments, and related planning objects in a Linear workspace.

Explore Triggers and Actions

Create attachment

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`. CRITICAL: Do not print base64Content and then copy it into this tool call. Opaque base64 copied through model-visible text is easy to corrupt. Generate base64Content mechanically from the source bytes and pass it through a programmatic argument construction path whenever available. Before calling this tool, verify the values are consistent: Unix-like shells: file="/path/to/file" base64Content=$(base64 < "$file" | tr -d '\n\r') sha256=$(shasum -a 256 "$file" | awk '{print $1}') decodedSha256=$(printf '%s' "$base64Content" | base64 -d | shasum -a 256 | awk '{print $1}') size=$(wc -c < "$file" | tr -d ' ') # optional; stat can also get file byte size decodedSize=$(printf '%s' "$base64Content" | base64 -d | wc -c | tr -d ' ') PowerShell: $file = 'C:\path\to\file' $bytes = [IO.File]::ReadAllBytes($file) $base64Content = [Convert]::ToBase64String($bytes) $sha256 = (Get-FileHash -Algorithm SHA256 -Path $file).Hash.ToLower() $size = $bytes.Length # optional $decoded = [Convert]::FromBase64String($base64Content) $decodedStream = [IO.MemoryStream]::new($decoded) $decodedSha256 = (Get-FileHash -Algorithm SHA256 -InputStream $decodedStream).Hash.ToLower() $decodedSize = $decoded.Length decodedSha256 must equal sha256. If you pass size, decodedSize must equal size. Pass `sha256`. Passing `size` is optional, but recommended for clearer mismatch errors.

ActionTry it

Create attachment from upload

Link an already-uploaded Linear assetUrl to an existing issue as an attachment. Use this only after: 1. prepare_attachment_upload returned an assetUrl and uploadRequest. 2. The client successfully PUT raw file bytes to uploadRequest.url. This tool does not upload file content. It only creates the Linear attachment row. If the direct upload failed or the signed URL expired, rerun prepare_attachment_upload and upload again.

ActionTry it

Create initiative label

Create a new Linear initiative label

ActionTry it

Create issue label

Create a new Linear issue label

ActionTry it

Delete attachment

Delete an attachment by ID

ActionTry it

Delete comment

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.

ActionTry it

Delete customer

Delete a customer in Linear

ActionTry it

Delete customer need

Archive a customer need in Linear

ActionTry it

Delete diff comment

Delete a comment or persisted draft from a Linear diff

ActionTry it

Delete status update

Delete (archive) a project or initiative status update.

ActionTry it

Extract images

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.

ActionTry it

Get agent skill

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

ActionTry it

Get attachment

Retrieve an attachment's content by ID.

ActionTry it

Get diff

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

ActionTry it

Get diff threads

Exact lookup for diff threads and the authenticated user's drafts. Use with review URLs, GitHub PR URLs, Linear full identifiers, UUIDs, or slugs.

ActionTry it

Get document

Retrieve a Linear document by ID or slug

ActionTry it

Get initiative

Retrieve detailed information about a specific initiative in Linear

ActionTry it

Get issue

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

ActionTry it

Get issue status

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

ActionTry it

Get milestone

Retrieve details of a specific milestone by ID or name

ActionTry it

Get project

Retrieve details of a specific project in Linear

ActionTry it

Get release

Retrieve details of a release by ID or slug.

ActionTry it

Get release note

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

ActionTry it

Get status updates

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

ActionTry it

Get team

Retrieve details of a specific Linear team

ActionTry it

Get template

Retrieve a Linear template by ID or name: the content it pre-fills, the ids it applies, its sub-issues, and its form fields. Pass the template to save_issue or save_project to apply it. References come back as ids, so read a name with the matching tool when you need one. A form template collects its answers through a form, so applying one here creates an issue with the form unanswered.

ActionTry it

Get user

Retrieve details of a specific Linear user

ActionTry it

Get workspace

Retrieve the connected Linear workspace

ActionTry it

List agent skills

List Linear Agent skills available to the authenticated user.

ActionTry it

List comments

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.

ActionTry it

List customers

List customers in the user's Linear workspace

ActionTry it

List cycles

Retrieve cycles for a specific Linear team

ActionTry it

List diffs

List Linear diff pull requests visible to the authenticated user

ActionTry it

List documents

List documents in the user's Linear workspace

ActionTry it

List initiative labels

List available initiative labels in the Linear workspace

ActionTry it

List initiatives

List initiatives in the user's Linear workspace

ActionTry it

List issue labels

List available issue labels in a Linear workspace or team

ActionTry it

List issue statuses

List available issue statuses in a Linear team

ActionTry it

List issues

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.

ActionTry it

List milestones

List all milestones in a Linear project

ActionTry it

List project labels

List available project labels in the Linear workspace

ActionTry it

List projects

List projects in the user's Linear workspace

ActionTry it

List release notes

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

ActionTry it

List release pipelines

List release pipelines in the workspace.

ActionTry it

List releases

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

ActionTry it

List teams

List teams in the user's Linear workspace

ActionTry it

List templates

List the Linear issue, project, and document templates available to the authenticated user. Use this to find the template a team expects, then call get_template for its content.

ActionTry it

List users

Retrieve users in the Linear workspace

ActionTry it

Merge diff

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

ActionTry it

Prepare attachment upload

Prepare a direct Linear file upload for an existing issue. Workflow: 1. Call this tool with issue, filename, contentType, and size. 2. Upload raw bytes with PUT to uploadRequest.url outside MCP. 3. All headers in uploadRequest.headers are part of the signed request, so send them verbatim. 4. After PUT succeeds, call create_attachment_from_upload with assetUrl to link it to the issue. Do not base64-encode or transform the file. Use curl --data-binary @path or fetch(url, { method: 'PUT', body: blob }). Omitting or modifying any signed header, including casing, will return HTTP 403. The signed URL must be used within 60 seconds or it will expire. Upload sequencing: Prepare, PUT, and finalize one file before calling this tool for another file. Do not batch multiple prepare_attachment_upload calls before starting the PUTs because earlier signed URLs can expire while later files are prepared. Example: curl -X PUT --data-binary @file.png \ -H "content-type: image/png" \ -H "x-goog-content-length-range: N,N" \ -H "cache-control: public, max-age=31536000" \ -H 'Content-Disposition: attachment; filename="file.png"' \ "<uploadRequest.url>"

ActionTry it

Resolve diff thread

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

ActionTry it

Save comment

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` — comments on issues/projects/initiatives become top-level discussion threads; comments on documents/milestones become description comments. A status update holds a single thread, so a comment on an update that already has one is added to it as a reply. To reply to an existing thread, pass `parentId` and `body`; the reply inherits the parent's thread type, so no entity reference is needed. Parent reference fields are ignored when `id` or `parentId` is provided (`statusUpdateType` is rejected instead).

ActionTry it

Save customer

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

ActionTry it

Save customer need

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.

ActionTry it

Save diff comment

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.

ActionTry it

Save document

Create or update a Linear document. If `id` is provided, edits 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`.

ActionTry it

Save initiative

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`.

ActionTry it

Save issue

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

ActionTry it

Save milestone

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.

ActionTry it

Save project

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. Pass `template` to create the project from a project template. To change parts of the description without resending all of it, pass `patch` instead of `description`.

ActionTry it

Save release

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.

ActionTry it

Save release note

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`.

ActionTry it

Save status update

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

ActionTry it

Search documentation

Search Linear's documentation to learn about features and usage

ActionTry it

Share issue

Share an issue with a workspace user who cannot otherwise access it. Use this tool only when the user explicitly asks to share the issue.

ActionTry it

Submit diff review

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

ActionTry it

Unshare issue

Remove a workspace user's shared access to an issue. Use this tool only when the user explicitly asks to stop sharing the issue.

ActionTry it

How the Linear MCP integration works

The Linear MCP integration connects your Dench AI CRM directly to Linear MCP, so agents can read and act on your Linear MCP data as part of everyday work — answering questions in chat, keeping your CRM in sync, and running automations without anyone copying data between tools.

67 actions are available for agents to invoke on your behalf. Every call runs through Linear MCP's own authorization, scoped to the account you connect.

Set up Linear MCP in Dench

  1. 1

    Sign in to your Dench workspace and open Integrations.

  2. 2

    Find Linear MCP and click Connect — you'll authorize access through Linear MCP's own sign-in flow. No API keys or code required.

  3. 3

    Ask an agent to use Linear MCP in chat, or call it from an automation.

  4. 4

    Manage or disconnect the connection any time from workspace settings.

Frequently asked questions

How does the Linear MCP integration work with Dench?

The Dench Linear MCP integration connects your AI CRM to Linear MCP, so AI agents can work with your Linear MCP data as part of chats, automations, and CRM workflows. You connect your account once, and every agent in your workspace can use it — governed by your workspace permissions.

What actions can AI agents perform with Linear MCP via Dench?

The Linear MCP integration currently exposes 67 actions, including Create attachment, Create attachment from upload, Create initiative label, Create issue label, Delete attachment, and Delete comment. Agents invoke them on your behalf from chat or from automations.

Do I need to write code to connect Linear MCP to Dench?

No. You connect Linear MCP from your Dench workspace using Linear MCP's own sign-in and authorization flow — no API keys to copy, no glue code to maintain.

Is the Linear MCP integration secure?

Connections are authorized through Linear MCP's own authentication flow, and Dench stores only the authorization needed to act on your behalf. You can review and disconnect the Linear MCP connection from your workspace settings at any time.

Linear MCP | Dench AI CRM