Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Linear MCP server

Vendor MCP
Open markdown

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.

Tools
63
What they doRead · write · destructive
37 · 14 · 1237 read14 write12 destructive
Users sign in with
OAuth app
Scalekit's or your own

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

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

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

    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

    quickstart.mts
    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)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • linearmcp_extract_imagesExtract and fetch images from markdown content.Read-only

    ExtractImages

    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.

    Inputs

    markdownstringrequired
    Markdown content containing image references (e.g., issue description, comment body)
  • linearmcp_get_agent_skillRetrieve a Linear Agent skill by ID, including its full markdown instructions.Read-only

    GetAgentSkill

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

    Inputs

    idstringrequired
    Agent skill ID
  • linearmcp_get_attachmentRetrieve an attachment's content by ID.Read-only

    GetAttachment

    Retrieve an attachment's content by ID.

    Inputs

    idstringrequired
    Attachment ID
  • linearmcp_get_diffExact lookup for a Linear diff.Read-only

    GetDiff

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

    Inputs

    urlOrIdstringrequired
    Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL
  • linearmcp_get_diff_threadsExact lookup for diff threads.Read-only

    GetDiffThreads

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

    Inputs

    urlOrIdstringrequired
    Linear review URL, diff slug, pull request ID, Linear full identifier, or GitHub PR URL
    orderBystring
    Sort: createdAt | updatedAtone of createdAtupdatedAtdefault updatedAt
    resolvedboolean
    Filter returned threads by resolved state
    threadIdstring
    Optional Linear comment UUID of any comment in the thread (not its `externalThreadId`); a reply's UUID resolves to its thread root
  • linearmcp_get_documentRetrieve a Linear document by ID or slugRead-only

    GetDocument

    Retrieve a Linear document by ID or slug

    Inputs

    idstringrequired
    Document ID or slug
  • linearmcp_get_initiativeRetrieve detailed information about a specific initiative in LinearRead-only

    GetInitiative

    Retrieve detailed information about a specific initiative in Linear

    Inputs

    querystringrequired
    Initiative name, ID, identifier (e.g., INIT-123), or slug
    includeProjectsboolean
    Include projectsdefault false
    includeSubInitiativesboolean
    Include sub-initiativesdefault false
  • linearmcp_get_issueRetrieve detailed information about an issue by ID, including attachments, git branch name, and active Triage Intelligence suggestions when the issue is in triageRead-only

    GetIssue

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

    Inputs

    idstringrequired
    Issue ID or identifier (e.g., LIN-123)
    includeCustomerNeedsboolean
    Include associated customer needsdefault false
    includeRelationsboolean
    Include blocking/related/duplicate relationsdefault false
    includeReleasesboolean
    Include associated releasesdefault false