Provides comprehensive tools for managing Linear workspace operations including issues, projects, teams, users, comments, and cycles with optimized AI-friendly interfaces and batch operations
Linear MCP Server
Streamable HTTP MCP server for Linear — manage issues, projects, teams, cycles, and comments.
Author: overment
You connect this server to your MCP client at your own responsibility. Language models can make mistakes, misinterpret instructions, or perform unintended actions. Review tool outputs, verify changes (e.g., withlist_issues), and prefer small, incremental writes.
The HTTP/OAuth layer is designed for convenience during development, not production-grade security. If deploying remotely, harden it: proper token validation, secure storage, TLS termination, strict CORS/origin checks, rate limiting, audit logging, and compliance with Linear's terms.
Comparison
Below is a comparison between the official Linear MCP (top) and this MCP (bottom).
Related MCP server: Linear MCP Server
Notice
This repo works in two ways:
As a Node/Hono server for local workflows
As a Cloudflare Worker for remote interactions
For production Cloudflare deployments, see Remote Model Context Protocol servers (MCP).
Motivation
I'm a big fan of Linear and use it daily. At the time of writing, the official MCP server isn't fully optimized for language models. This server is built with key goals in mind:
Let LLMs find Team IDs, Project IDs, Status IDs, or User IDs in a single action (
workspace_metadata) instead of multiple tool callsInclude clear MCP instructions and schema descriptions that cut API jargon
Map API responses into human-readable feedback — useful for both the LLM and user
Provide hints and suggestions for next steps, plus tips on recovering from errors
Support batch actions (e.g.,
create_issuesinstead ofcreate_issue) so the LLM can perform multiple steps in one goPrefetch related values — return both a status ID and actual status name for an issue
Hide tools not enabled in a given team's settings (like
list_cycles) to reduce noise
In short, it's not a direct mirror of Linear's API — it's tailored so AI agents know exactly how to use it effectively.
Features
✅ Issues — List, search, create, update (state, assignee, labels, priority, etc.)
✅ Projects — List, create, update projects
✅ Teams & Users — Discover workspace structure
✅ Cycles — Browse sprint/cycle planning
✅ Comments — List and add comments on issues
✅ OAuth 2.1 — Secure PKCE flow with RS token mapping
✅ Dual Runtime — Node.js/Bun or Cloudflare Workers
✅ Production Ready — Encrypted token storage, rate limiting, multi-user support
Design Principles
LLM-friendly: Tools are simplified and unified, not 1:1 API mirrors
Batch-first: Create/update operations accept arrays to minimize tool calls
Discovery-first:
workspace_metadatareturns all IDs needed for subsequent callsClear feedback: Every response includes human-readable summaries with diffs
Installation
Prerequisites: Bun, Node.js 24+, Linear account. For remote: a Cloudflare account.
Ways to Run (Pick One)
Local (API key) — Fastest start
Local + OAuth — For multi-user or token refresh
Cloudflare Worker (wrangler dev) — Local Worker testing
Cloudflare Worker (deploy) — Remote production
1. Local (API Key) — Quick Start
Run the server with your Linear Personal Access Token from Settings → Security.
Edit .env:
Connect to your MCP client:
Claude Desktop / Cursor:
2. Local + OAuth
More advanced — requires creating an OAuth application in Linear.
Create an OAuth app at Linear Settings → API → OAuth Applications
Set redirect URIs:
http://127.0.0.1:3001/oauth/callback alice://oauth/callbackCopy Client ID and Secret
Edit .env:
Tip: The Authorization Server runs on PORT+1.
Claude Desktop:
RS-Only Mode (Recommended for Remote)
Enable these flags to require RS-minted bearer tokens:
When enabled, requests without Authorization or with non-mapped tokens receive 401 with WWW-Authenticate so OAuth can start.
3. Cloudflare Worker (Local Dev)
With OAuth:
Endpoint: http://127.0.0.1:8787/mcp
4. Cloudflare Worker (Deploy)
Create KV namespace:
Update
wrangler.tomlwith KV namespace IDSet secrets:
Note:
RS_TOKENS_ENC_KEYencrypts OAuth tokens stored in KV (AES-256-GCM).
Update redirect URI and allowlist in
wrangler.tomlAdd Workers URL to your Linear OAuth app's redirect URIs
Deploy:
Endpoint: https://<worker-name>.<account>.workers.dev/mcp
Client Configuration
MCP Inspector (quick test):
Claude Desktop / Cursor:
For Cloudflare, replace URL with https://<worker-name>.<account>.workers.dev/mcp.
Tools
workspace_metadata
Discover workspace entities and IDs. Call this first when you don't know IDs.
list_issues
Search and filter issues with powerful GraphQL filtering.
create_issues
Create multiple issues in one call.
update_issues
Update issues in batch (state, labels, assignee, metadata).
Other Tools
list_my_issues— Issues assigned to current userget_issues— Fetch issues by ID (batch)list_projects/create_projects/update_projects— Manage projectslist_teams/list_users— Discover workspace structurelist_cycles— Browse team cycles (if enabled)list_comments/add_comments— Issue comments
Examples
1. List my issues due today
Response:
2. Create an issue and add it to a project
Response:
3. Batch update: reschedule + mark as Done
Response:
HTTP Endpoints
Endpoint | Method | Purpose |
| POST | MCP JSON-RPC 2.0 |
| GET | SSE stream (Node.js only) |
| GET | Health check |
| GET | OAuth AS metadata |
| GET | OAuth RS metadata |
OAuth (PORT+1):
GET /authorize— Start OAuth flowGET /oauth/callback— Provider callbackPOST /token— Token exchangePOST /revoke— Revoke tokens
Development
Architecture
Troubleshooting
Issue | Solution |
"Workspace does not exist" | Verify your OAuth app is in the correct Linear workspace. Check PROVIDER_CLIENT_ID. |
"Unauthorized" | Complete OAuth flow. Tokens may have expired. |
"State not found" | Use
to get valid stateIds for the team. |
"Rate limited" | Linear has strict rate limits. Wait and retry. |
OAuth doesn't start (Worker) |
should return
with
. |
Tools empty in Claude | Ensure Worker returns JSON Schema for
; use
. |
License
MIT