Linear MCP Server
Provides tools for searching, creating, updating, and managing Linear issues, teams, workflow states, and comments, enabling AI agents to interact with Linear issue tracking.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Linear MCP Servershow my high priority issues"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Linear MCP Server
A Model Context Protocol (MCP) server that enables AI agents like Claude to interact with Linear issue tracking. Search, create, update issues, and more - all through natural language.
ā” 30-Second Quick Start
git clone https://github.com/yourusername/linear-mcp-server.git
cd linear-mcp-server
npm install
npm run setup:claude YOUR_LINEAR_API_KEYDone! Restart Claude Desktop and start using Linear:
"Show me all issues assigned to me"
"Create a bug report for the login page"
"What teams do I have access to?"
Get your API key from Linear Settings
Related MCP server: Linear MCP Server
What Can You Do?
Once set up, you can ask Claude to:
š Search & Browse
"Show me all high-priority bugs assigned to me"
"Find issues related to authentication in the Engineering team"
"What are my current tasks?"
⨠Create & Update
"Create a new feature request for dark mode in the Design team"
"Update issue ENG-123 to high priority and assign it to me"
"Add a comment to issue PROJ-456 with a status update"
š Get Information
"What teams do I have in Linear?"
"Show me the workflow states for the Engineering team"
"Get the details of issue ENG-789"
All 9 Available Tools
Tool | Description |
| Search and filter Linear issues with powerful queries |
| Create new issues with priority, assignee, and more |
| Modify existing issues (title, description, assignee, priority, state) |
| Retrieve detailed information about a specific issue |
| Get all issues assigned to you |
| List all teams in your workspace |
| View workflow states/statuses for a team |
| Add comments to issues (supports Markdown) |
| Verify API connectivity and authentication |
Features
Core Functionality
Search Issues: Search for issues in Linear with filters for team, status, and assignee
Create Issues: Create new issues in Linear with title, description, assignee, and priority
Update Issues: Modify existing issues including title, description, assignee, priority, and workflow state
Get Issue by ID: Retrieve a specific issue with full details
List Teams: Get a list of all teams in your Linear workspace
Get My Issues: Retrieve issues assigned to the current user with enhanced filtering
Workflow States: List all workflow states/statuses for a team
Add Comments: Add comments to existing issues
Health Check: Verify API connectivity and authentication status
Performance & Reliability
Rate Limiting: Built-in throttling (10 req/sec) to prevent API abuse
Viewer Caching: 5-minute cache for user info reduces API calls by ~95%
Input Validation: Zod-based schema validation for all tool inputs
Error Context: Detailed error messages with relevant parameters for debugging
Enhanced Issue Data: Issues include comprehensive team and project information
Code Quality
Type Safety: Fully typed interfaces with no
anytypesJSDoc Documentation: Comprehensive API documentation with examples
Test Coverage: 98.89% statement coverage with 170 passing tests
Clean Architecture: Service layer with singleton pattern
Logging: Advanced logging with Pino (stderr-only, no stdout pollution)
MCP Protocol Compliance: Full adherence to Model Context Protocol standards
Recent Improvements āØ
Version 0.4.0 brings significant enhancements:
ā New Tools: Added
get_issue,get_workflow_states,add_comment, andhealth_checkā Rate Limiting: Prevents API abuse with 10 req/sec throttling
ā Performance: Viewer caching reduces API calls by ~95%
ā Validation: Zod schemas for all inputs with helpful error messages
ā Documentation: Comprehensive JSDoc with examples for all methods
ā Type Safety: Eliminated all
anytypes for better TypeScript supportā Testing: 170 passing tests with 98.89% code coverage
ā Error Context: Detailed error messages with relevant parameters
Architecture
src/
āāā index.ts # Main MCP server entry point
āāā types.ts # TypeScript interfaces and type definitions
āāā utils/
ā āāā config.ts # Configuration management with validation
ā āāā error.ts # Error handling utilities and custom error classes
ā āāā logger.ts # Enhanced logging with Pino integration
ā āāā validation.ts # Zod schemas for input validation
āāā services/
āāā linearService.ts # Linear API service with rate limiting and cachingInstallation & Setup
Automatic Setup (Recommended)
The fastest way to get started with Claude Desktop:
# 1. Install dependencies and build
npm install
# 2. Run setup with your Linear API key
npm run setup:claude YOUR_LINEAR_API_KEY
# 3. Restart Claude Desktop - you're done!The setup script will:
ā Build the project automatically if needed
ā Verify your API key works
ā Configure Claude Desktop for your OS
ā Show personalized examples using your teams
Configuration
Create a .env file in the root directory with the following variables:
LINEAR_API_KEY=your_linear_api_key
LOG_LEVEL=info
NODE_ENV=developmentEnvironment Variables
Variable | Description | Default | Required |
LINEAR_API_KEY | Your Linear API key | - | ā Yes |
LOG_LEVEL | Logging level (trace, debug, info, warn, error) | info | No |
NODE_ENV | Environment (development, production) | development | No |
PORT | Port for HTTP server (if used) | 3000 | No |
ENABLE_RATE_LIMIT | Enable rate limiting | false | No |
RATE_LIMIT_MAX | Maximum requests per window | 100 | No |
RATE_LIMIT_WINDOW_MS | Rate limit window in milliseconds | 60000 | No |
Getting Your Linear API Key
Go to Linear Settings
Click "Create API Key"
Give it a descriptive name and select appropriate scopes
Copy the generated key to your
.envfile
Usage
Run as MCP Server
The primary use case is as an MCP server that connects via stdio:
npm startDevelopment Mode
For development with watch mode:
npm run watchIntegration with MCP Clients
This server is designed to work with MCP-compatible clients. The server communicates via stdio transport and provides nine main tools:
search_issues- Search and filter Linear issues with enhanced team/project informationcreate_issue- Create new issues in Linearupdate_issue- Modify existing issues including title, description, assignee, priority, and stateget_issue- Retrieve a specific issue by ID with full detailsget_my_issues- Get issues assigned to the current user with comprehensive filteringget_teams- List all teams in the workspaceget_workflow_states- List all workflow states for a teamadd_comment- Add a comment to an issuehealth_check- Verify API connectivity and authentication
Client Integration
Claude Desktop
Automatic Setup (see Installation section above) is recommended.
Manual Setup - If you prefer to configure manually:
macOS/Linux
Edit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"mcpServers": {
"linear": {
"command": "node",
"args": ["/path/to/your/linear-mcp-server/build/index.js"],
"env": {
"LINEAR_API_KEY": "your_linear_api_key_here"
}
}
}
}Windows
Edit %APPDATA%/Claude/claude_desktop_config.json:
{
"mcpServers": {
"linear": {
"command": "node",
"args": ["C:\\path\\to\\your\\linear-mcp-server\\build\\index.js"],
"env": {
"LINEAR_API_KEY": "your_linear_api_key_here"
}
}
}
}VS Code Integration
For VS Code with MCP extension support:
Install an MCP-compatible extension (e.g., "MCP Client")
Add server configuration to VS Code settings:
{
"mcp.servers": {
"linear": {
"command": "node",
"args": ["/path/to/your/linear-mcp-server/build/index.js"],
"env": {
"LINEAR_API_KEY": "your_linear_api_key_here"
}
}
}
}Cursor IDE Integration
For Cursor IDE with MCP support:
Open Cursor Settings (Cmd/Ctrl + ,)
Search for "MCP" or "Model Context Protocol"
Add server configuration:
{
"mcp.servers": {
"linear": {
"command": "node",
"args": ["/path/to/your/linear-mcp-server/build/index.js"],
"env": {
"LINEAR_API_KEY": "your_linear_api_key_here"
}
}
}
}Or use the Cursor command palette:
Press Cmd/Ctrl + Shift + P
Type "MCP: Add Server"
Enter the server details when prompted
Continue.dev Integration
For Continue.dev (VS Code/JetBrains extension):
Add to your ~/.continue/config.json:
{
"mcpServers": {
"linear": {
"command": "node",
"args": ["/path/to/your/linear-mcp-server/build/index.js"],
"env": {
"LINEAR_API_KEY": "your_linear_api_key_here"
}
}
}
}Other MCP Clients
For any MCP-compatible client, use these connection details:
Transport: stdio
Command:
node /path/to/linear-mcp-server/build/index.jsEnvironment: Set
LINEAR_API_KEYto your Linear API key
Using with NPX (Alternative)
You can also install and run globally using npx:
# Install globally
npm install -g linear-mcp-server
# Use with Claude Desktop
{
"mcpServers": {
"linear": {
"command": "npx",
"args": ["linear-mcp-server"],
"env": {
"LINEAR_API_KEY": "your_linear_api_key_here"
}
}
}
}Docker Integration
Run the server in a Docker container:
# Dockerfile
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY build/ ./build/
EXPOSE 3000
CMD ["node", "build/index.js"]# Build and run
docker build -t linear-mcp-server .
docker run -e LINEAR_API_KEY=your_key linear-mcp-serverVerification
After setting up the integration, verify it's working:
Claude Desktop: Look for Linear tools in the available tools list
VS Code: Check the MCP extension status for successful connection
Command Line: Test the server directly:
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | npm startYou should see a response listing all nine available tools: search_issues, create_issue, update_issue, get_issue, get_my_issues, get_teams, get_workflow_states, add_comment, and health_check.
API Reference
Tool: search_issues
Search for issues in Linear with advanced filtering options.
Input Schema:
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search query"
},
"teamId": {
"type": "string",
"description": "Team ID to filter by"
},
"status": {
"type": "string",
"description": "Status to filter by"
},
"assigneeId": {
"type": "string",
"description": "Assignee ID to filter by. Use 'me' to filter by the current user"
},
"limit": {
"type": "number",
"description": "Maximum number of issues to return"
}
},
"required": ["query"]
}Response:
{
"issues": [
{
"id": "issue-id",
"identifier": "TEAM-123",
"title": "Issue title",
"description": "Issue description",
"status": "In Progress",
"url": "https://linear.app/team/issue/TEAM-123",
"assignee": "John Doe",
"createdAt": "2023-01-01T00:00:00.000Z",
"team": {
"id": "team-id",
"name": "Team Name",
"key": "TEAM"
},
"project": {
"id": "project-id",
"name": "Project Name",
"url": "https://linear.app/project/project-id",
"status": "Active"
}
}
]
}Tool: create_issue
Create a new issue in Linear with full customization options.
Input Schema:
{
"type": "object",
"properties": {
"teamId": {
"type": "string",
"description": "Team ID"
},
"title": {
"type": "string",
"description": "Issue title"
},
"description": {
"type": "string",
"description": "Issue description"
},
"assigneeId": {
"type": "string",
"description": "Assignee ID. Use 'me' to assign to the current user"
},
"priority": {
"type": "number",
"description": "Issue priority (0-4)"
}
},
"required": ["teamId", "title"]
}Response:
{
"id": "issue-id",
"identifier": "TEAM-123",
"title": "Issue title",
"url": "https://linear.app/team/issue/TEAM-123"
}Tool: update_issue
Update an existing issue in Linear with comprehensive modification options.
Input Schema:
{
"type": "object",
"properties": {
"issueId": {
"type": "string",
"description": "Issue ID to update"
},
"title": {
"type": "string",
"description": "New issue title"
},
"description": {
"type": "string",
"description": "New issue description"
},
"assigneeId": {
"type": "string",
"description": "New assignee ID. Use 'me' to assign to current user, empty string to unassign"
},
"priority": {
"type": "number",
"description": "New issue priority (0-4)"
},
"stateId": {
"type": "string",
"description": "New workflow state ID"
}
},
"required": ["issueId"]
}Response:
{
"id": "issue-id",
"identifier": "TEAM-123",
"title": "Updated issue title",
"url": "https://linear.app/team/issue/TEAM-123",
"status": "In Progress"
}Tool: get_my_issues
Get issues assigned to the current user with enhanced filtering and information.
Input Schema:
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Maximum number of issues to return (default: 50, max: 250)"
}
}
}Response:
{
"issues": [
{
"id": "issue-id",
"identifier": "TEAM-123",
"title": "Issue title",
"description": "Issue description",
"status": "In Progress",
"url": "https://linear.app/team/issue/TEAM-123",
"assignee": "John Doe",
"createdAt": "2023-01-01T00:00:00.000Z",
"team": {
"id": "team-id",
"name": "Team Name",
"key": "TEAM"
},
"project": {
"id": "project-id",
"name": "Project Name",
"url": "https://linear.app/project/project-id",
"status": "Active"
}
}
]
}Tool: get_teams
Get all teams in the workspace.
Input Schema:
{
"type": "object",
"properties": {}
}Response:
{
"teams": [
{
"id": "team-id",
"name": "Team Name",
"key": "TEAM",
"description": "Team description"
}
]
}Tool: get_issue
Get a specific issue by ID with full details.
Input Schema:
{
"type": "object",
"properties": {
"issueId": {
"type": "string",
"description": "The ID of the issue to retrieve"
}
},
"required": ["issueId"]
}Response:
{
"id": "issue-id",
"identifier": "TEAM-123",
"title": "Issue title",
"description": "Issue description",
"status": "In Progress",
"url": "https://linear.app/team/issue/TEAM-123",
"assignee": "John Doe",
"createdAt": "2023-01-01T00:00:00.000Z",
"team": {
"id": "team-id",
"name": "Team Name",
"key": "TEAM"
},
"project": {
"id": "project-id",
"name": "Project Name",
"url": "https://linear.app/project/project-id",
"status": "Active"
}
}Tool: get_workflow_states
Get all workflow states (statuses) for a specific team.
Input Schema:
{
"type": "object",
"properties": {
"teamId": {
"type": "string",
"description": "The ID of the team"
}
},
"required": ["teamId"]
}Response:
{
"states": [
{
"id": "state-id",
"name": "In Progress",
"type": "started",
"description": "Work is in progress",
"position": 1
},
{
"id": "state-id-2",
"name": "Done",
"type": "completed",
"description": "Work is completed",
"position": 2
}
]
}Tool: add_comment
Add a comment to an existing issue.
Input Schema:
{
"type": "object",
"properties": {
"issueId": {
"type": "string",
"description": "The ID of the issue to comment on"
},
"body": {
"type": "string",
"description": "The comment text (supports markdown)"
}
},
"required": ["issueId", "body"]
}Response:
{
"id": "comment-id",
"body": "This is my comment",
"createdAt": "2023-01-01T00:00:00.000Z",
"issueId": "issue-id"
}Tool: health_check
Check the health and connectivity of the Linear API.
Input Schema:
{
"type": "object",
"properties": {}
}Response:
{
"status": "healthy",
"apiConnected": true,
"userId": "user-id",
"userName": "John Doe"
}Or if unhealthy:
{
"status": "unhealthy",
"apiConnected": false,
"error": "Error message"
}Development
Project Structure
src/index.ts: Main server entry point with MCP protocol handlingsrc/types.ts: TypeScript type definitions for all interfacessrc/utils/: Utility modules for configuration, logging, and error handlingsrc/services/: Business logic layer for Linear API interactions
Key Design Patterns
Singleton Pattern: Used for services to ensure single instance management
Error Boundary Pattern: Comprehensive error handling at all levels
Configuration Pattern: Centralized configuration with validation
Service Layer Pattern: Clean separation between API logic and MCP handling
Available Scripts
npm run build # Build TypeScript to JavaScript
npm run watch # Watch mode for development
npm start # Start the MCP server
npm test # Run all tests with coverage
npm run setup:claude # Auto-configure Claude Desktop
npm run repair:claude # Fix malformed Claude Desktop configTesting
The project includes comprehensive test coverage:
# Run all tests
npm test
# Watch mode for test development
npm test -- --watch
# Run specific test file
npm test -- tests/unit/services/linearService.test.tsCurrent Test Coverage:
Overall: 98.89% statement coverage
linearService.ts: 98.24% coverage
170 passing tests across unit and integration suites
Tests include:
Unit tests for LinearService methods
Integration tests for MCP tool handlers
Configuration validation tests
Error handling scenarios
Troubleshooting
Common Issues
"Missing LINEAR_API_KEY": Ensure your
.envfile exists and contains a valid Linear API key"Server does not support tools": This indicates an MCP client compatibility issue
"Failed to fetch teams": Check your Linear API key permissions
JSON syntax errors in Claude config: Use the repair script to fix malformed configuration files
MCP Communication Issues
If you encounter JSON parsing errors or communication issues with MCP clients (Cursor, Claude Desktop, etc.):
Symptoms
"Expected ',' or ']' after array element in JSON at position X"
"Unexpected token 'X' is not valid JSON"
Client shows "Client error for command" repeatedly
MCP tools not appearing or failing to execute
Root Cause
These issues typically occur when log output interferes with JSON-RPC communication. The MCP protocol requires:
stdout: JSON-RPC messages ONLY
stderr: All logging output
Solutions
ā Server-Side (Already Fixed in v0.3.1+) The server now properly separates logging from JSON-RPC communication:
# Logs go to stderr, JSON-RPC to stdout
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | node build/index.jsā Client-Side Verification
Restart your MCP client (Cursor, Claude Desktop, etc.) after updating
Check client logs for successful connection messages
Test basic functionality: Try listing tools or calling a simple tool
ā Manual Testing
# Test tools list (should return clean JSON)
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/list"}' | node build/index.js
# Test simple tool call
echo '{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": {"name": "get_teams", "arguments": {}}}' | node build/index.jsā Debug Mode For troubleshooting, enable debug logging (outputs to stderr):
LOG_LEVEL=debug
NODE_ENV=developmentIf issues persist after updating to v0.3.1+, please check that you're using the latest build:
npm run build # Rebuild with latest fixesJSON Configuration Errors
If you see JSON parsing errors like "Unexpected token" or "is not valid JSON" in Claude Desktop configuration:
Quick Fix
# Run the repair script to fix JSON syntax issues
npm run repair:claude
# Then try setting up again
npm run setup:claudeManual Fix
Close Claude Desktop completely
Navigate to the config file location:
macOS:
~/Library/Application Support/Claude/claude_desktop_config.jsonWindows:
%APPDATA%/Claude/claude_desktop_config.jsonLinux:
~/.config/Claude/claude_desktop_config.json
Delete the config file (a backup will be created automatically)
Run the setup script again:
npm run setup:claude
Debugging
Enable debug logging by setting LOG_LEVEL=debug in your .env file:
LOG_LEVEL=debugThis will provide detailed logs of all API calls and server operations.
Performance
The server is optimized for performance with:
Rate Limiting: Throttles API calls to 10 requests/second to prevent API abuse
Viewer Caching: 5-minute TTL cache for user information reduces API calls by ~95%
Parallel Processing: Concurrent API calls using
Promise.all()Singleton Pattern: Efficient resource management
Structured Logging: Minimal performance overhead (stderr-only)
TypeScript: Compile-time optimizations
Input Validation: Fast Zod-based schema validation
License
MIT
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Development Setup
Fork the repository
Clone your fork:
git clone https://github.com/yourusername/linear-mcp-server.gitInstall dependencies:
npm installCreate a
.envfile with your Linear API keyMake your changes
Run tests:
npm testSubmit a pull request
Code Style
Use TypeScript for all new code
Follow the existing code organization patterns
Add appropriate error handling
Include JSDoc comments for public APIs
Ensure all tests pass
Available Tools
9 toolsadd_commentA
Add a comment to an existing issue in Linear. Comments support Markdown formatting. Examples: 'Add a comment to issue ENG-123', 'Comment on the bug report with an update'
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The comment text (supports Markdown formatting for rich text) | |
| issueId | Yes | The ID of the issue to comment on |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses Markdown support and that the issue must already exist, but it does not mention permissions, side effects (e.g., notifications), or error behavior. This is modest disclosure but not comprehensive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states the core purpose, the second provides two concrete examples. No wasted words, front-loaded, and each sentence earns its place by aiding the agent in understanding what the tool does and how to invoke it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter tool with no annotations or output schema, the description covers the essential purpose, Markdown support, and expected input. It does not explain return values or error handling, but the simplicity of the tool makes this omission acceptable, though not ideal.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both parameters, and the schema descriptions already explain 'body' (including Markdown support) and 'issueId'. The description does not add significant extra parameter semantics beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states the action ('Add a comment'), the target ('an existing issue in Linear'), and the scope. It differentiates from siblings like create_issue and update_issue by focusing specifically on comments. The examples provide natural language patterns for invocation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use this to comment on an existing issue. It does not explicitly list alternatives or exclusions, but the phrasing 'existing issue' implies it is not for creating or updating issues. The examples further clarify appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_issueA
Create a new issue in Linear with full customization. Examples: 'Create a bug report for login issues', 'Add a feature request to implement dark mode', 'Create a high-priority task and assign it to me'
| Name | Required | Description | Default |
|---|---|---|---|
| title | Yes | Issue title - should be clear and concise | |
| teamId | Yes | Team ID (use get_teams to find available teams) | |
| priority | No | Issue priority: 0=None, 1=Low, 2=Medium, 3=High, 4=Urgent | |
| assigneeId | No | Assignee ID. Pro tip: Use 'me' to assign to yourself | |
| description | No | Detailed issue description (supports Markdown formatting) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It conveys 'full customization' and includes a useful tip about assigneeId='me', but it omits details about side effects, required prerequisites like teamId, or the creation process being immediate. There is a gap in behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise: one clear sentence plus three illustrative examples. It is front-loaded with the core purpose and contains no redundant text. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description gives a solid overview but could be more complete given no annotations and no output schema. It does not mention prerequisites like using get_teams for teamId (though the schema does) or what the response looks like. However, the examples and 'full customization' cover much of the context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all 5 parameters with 100% description coverage, so the description adds minimal extra value. The examples map to parameters ('high-priority' to priority, 'assign to me' to assigneeId), but this does not go beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action 'Create a new issue in Linear' with a specific verb and resource, and differentiates it from sibling tools like update_issue and get_issue. The examples further clarify the intended use cases.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context through examples (bug report, feature request, task) but does not explicitly contrast with alternatives like update_issue or state when not to use it. It leaves room for inference rather than giving explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_issueC
Get detailed information about a specific issue by its ID. Examples: 'Get the details of issue ENG-123', 'Show me issue PROJ-456'
| Name | Required | Description | Default |
|---|---|---|---|
| issueId | Yes | The unique ID of the issue to retrieve (e.g., 'abc123-def456-...'). Note: This is the internal UUID, not the identifier like 'ENG-123' |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only says 'detailed information' and does not mention error behavior, permissions, response format, or what happens if the issue is not found. The examples also mislead by suggesting the ID is a human-readable key, contradicting the schema's note about UUIDs, which could cause failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with a clear purpose, but the examples are wasted space and misleading. A concise description should not contain counterproductive example values that conflict with the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter getter with no output schema, the description should cover error handling, authentication/prerequisites, and return value expectations. It does none of this, and the misleading ID examples create a significant completeness gap. The schema partially compensates, but the description still falls short.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully covers the issueId parameter, describing it as an internal UUID and explicitly noting it is NOT a key like 'ENG-123'. However, the tool description adds no useful parameter semantics and instead uses the exact wrong format in its examples, actively misguiding the agent. This fails to add value and creates contradiction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves detailed information about a specific issue by its ID, distinguishing it from sibling tools like search_issues or update_issue. However, the examples use human-readable keys like 'ENG-123' while the schema clarifies the parameter expects an internal UUID, slightly muddying the resource identity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit guidance is provided on when to use this tool vs alternatives. It implies usage for a specific issue ID but does not mention that search_issues is for finding issues by criteria or that get_my_issues returns issues for the current user. There is no when-not-to-use information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_my_issuesA
Get all issues assigned to you in Linear. Perfect for daily standup prep or checking your current workload. Examples: 'What issues are assigned to me?', 'Show my current tasks'
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of issues to return (default: 50, max: 250) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It states the read-only scope ('all issues assigned to you') which implies safety, but it does not disclose pagination, ordering, or response behavior for empty results. This is a minimal disclosure, yielding a score of 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core action, followed by relevant use cases and examples. Every sentence adds value, and it is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple tool with one optional parameter and no output schema. The description provides clear purpose, usage context, and examples. It could be more complete by hinting at the return format (e.g., a list of issues) but is adequate for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter 'limit' is fully described in the schema with a clear explanation and default/max values. The description itself adds no additional meaning to the parameter. Since schema coverage is 100%, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get all issues assigned to you in Linear.' This uses a specific verb and resource, and distinguishes it from siblings like search_issues (searching) and get_issue (single issue). The examples further reinforce the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: 'Perfect for daily standup prep or checking your current workload.' It implies when to use this tool but does not explicitly mention exclusions or alternatives such as search_issues for broader queries, preventing a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_teamsA
Get all teams in your Linear workspace. Use this to find team IDs for creating issues or filtering searches. Example: 'Show me all my Linear teams'
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of explaining behavior. It implies a read-only list operation ('Get all teams'), but does not disclose output format, pagination, or whether archived teams are included. The behavioral information is minimal and could be more transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured: a direct statement of function, a practical use case, and an example. Every sentence contributes value without unnecessary verbosity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple zero-parameter list tool, the description covers the essential purpose and usage. However, since there is no output schema or annotations, it leaves a few gaps such as return format and team visibility, but these are minor for a straightforward list endpoint.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the baseline of 4 applies. The description adds no parameter-specific details, but none are needed since there are no inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves all teams in the user's Linear workspace. It distinguishes itself from sibling tools by focusing on the team resource, and the example provides a concrete natural-language trigger.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'find team IDs for creating issues or filtering searches.' This gives clear context, though it does not mention exclusions or alternatives because no sibling tool handles teams.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_workflow_statesA
Get all workflow states (statuses) for a specific team. Use this to find state IDs when updating issues. Examples: 'Show workflow states for the Engineering team', 'What statuses are available?'
| Name | Required | Description | Default |
|---|---|---|---|
| teamId | Yes | The ID of the team (use get_teams to find team IDs) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It states the tool retrieves all workflow states for a team, implying a read-only operation. However, it does not mention the return format, any filtering limitations, or whether archived states are included. This is adequate but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and front-loaded with the core function, followed by a usage note and practical examples. Every sentence adds value, with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read tool with no output schema, the description provides adequate context: what it does, why to use it, and example queries. It does not describe the response structure, but the note about finding state IDs implies the response contains IDs. This is complete enough for the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents teamId fully, including how to find team IDs via get_teams. The description adds only the phrase 'for a specific team,' which is already implied by the parameter. With 100% schema coverage, the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Get all workflow states (statuses) for a specific team.' It specifies the resource (workflow states) and the scope (specific team), and distinguishes itself by noting its use case 'to find state IDs when updating issues', which differentiates it from sibling tools like update_issue.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use the tool: 'Use this to find state IDs when updating issues.' It gives clear context and examples but does not explicitly mention when not to use it or name alternatives. Since the siblings do not include another workflow-state lookup tool, this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_checkA
Verify that the Linear API connection is working and check authentication status. Use this to troubleshoot connection issues. Example: 'Check if Linear API is working'
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It indicates the tool checks connection and auth status but does not describe what happens on failure, whether it makes network calls, or what the return format looks like. This is adequate for a simple health check but lacks depth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two compact sentences plus a short example. It is front-loaded with the core action and resource, and every sentence adds value. No wasted words or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's extreme simplicity (no params, no output schema), the description covers the essential context: what it verifies and when to use it. It does not describe the response format, but for a health check, the purpose and usage are sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema coverage is 100% vacuously. As per guidelines, the baseline for zero parameters is 4. The description does not need to add parameter meaning since there are none, and it appropriately focuses on the tool's purpose.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Verify') and resource ('Linear API connection') and clearly states the additional check of authentication status. It is easily distinguished from sibling tools like search_issues and create_issue, which operate on domain data rather than connection health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states 'Use this to troubleshoot connection issues' and gives a natural language example. It does not mention when not to use or alternative tools, but the when-to-use guidance is clear enough for a health check utility.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_issuesB
Search for issues in Linear with powerful filtering options. Examples: 'Find all high-priority bugs assigned to me', 'Show open issues in the Engineering team', 'Search for issues about authentication'
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of issues to return (default: 50) | |
| query | Yes | Search query - can be keywords, issue identifiers, or descriptions to search for | |
| status | No | Status to filter by (e.g., 'In Progress', 'Done', 'Todo') | |
| teamId | No | Team ID to filter results (use get_teams to find team IDs) | |
| assigneeId | No | Assignee ID to filter by. Pro tip: Use 'me' to filter by the current user |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing behavioral traits. It mentions 'powerful filtering options' and gives examples, but it does not describe what fields are returned, pagination, sorting, or any limitations. Since there is no output schema, the agent is left without crucial information about the tool's behavior beyond the act of searching.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is brief and front-loaded with the action, followed by three relevant examples. Every sentence earns its place; there is no filler or redundancy. It is a model of concise, informative writing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has moderate complexity (5 parameters) and full schema coverage, but lacks an output schema and annotations. The description provides examples but does not explain the response format or any important behavioral details (e.g., whether results are paginated, how limit works). It is adequate for basic use but leaves gaps that could affect correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers 100% of the parameters with descriptions, so the baseline is 3. The description's examples add some context for how the query parameter can be used (natural language queries), but it does not provide additional meaning for the other parameters beyond what the schema already states. The schema itself is sufficiently descriptive, including the 'me' tip for assigneeId.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: 'Search for issues in Linear with powerful filtering options.' This uses a specific verb (search) and resource (issues in Linear). It is distinguishable from siblings like get_issue (retrieve a single issue) and get_my_issues (list current user's issues), though it doesn't explicitly differentiate itself from those tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The examples provide concrete usage scenarios ('Find all high-priority bugs assigned to me', 'Show open issues in the Engineering team') that imply when to use this tool. However, it does not explicitly state when to use this versus sibling tools like get_my_issues or get_issue, nor does it mention any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_issueA
Update an existing issue in Linear - modify title, description, assignee, priority, or workflow state. Examples: 'Update issue ENG-123 to high priority', 'Assign issue ENG-456 to me', 'Change the description of issue ENG-789'
| Name | Required | Description | Default |
|---|---|---|---|
| title | No | New issue title | |
| issueId | Yes | Issue ID to update (the unique identifier like 'ENG-123') | |
| stateId | No | New workflow state ID (use get_workflow_states to find state IDs) | |
| priority | No | New issue priority: 0=None, 1=Low, 2=Medium, 3=High, 4=Urgent | |
| assigneeId | No | New assignee ID. Pro tip: Use 'me' to assign to yourself, or empty string '' to unassign | |
| description | No | New issue description (supports Markdown formatting) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It reveals that the tool mutates an existing issue but gives no additional context: no mention of partial update semantics, persistence/irreversibility, required permissions, or response behavior. It also does not note that unspecified fields remain unchanged, which is a key behavioral trait for an update operation. The only implied behavior is that it modifies the issue, which is already evident from the tool name.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence that states the purpose and lists key fields, followed by three succinct, high-signal examples. Every element earns its place; there is no fluff or repetition of schema details. The structure is easy to parse quickly, making it ideal for AI consumption.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 6 parameters, 1 required, and no output schema, the description sufficiently covers the core usage but has minor gaps. It does not mention that only provided fields are updated (partial update), nor does it describe the return value or error behavior. However, the schema supplies parameter details, and the examples provide enough context for typical use cases. The sibling tools like get_issue and create_issue are implicitly differentiated by 'existing issue', so overall it is reasonably complete for a tool of this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema covers all parameters with 100% description coverage, so the baseline is 3. The tool description adds value through its examples: 'Update issue ENG-123 to high priority' maps to priority and issueId, 'Assign issue ENG-456 to me' illustrates the special assigneeId value 'me', and 'Change the description of issue ENG-789' demonstrates description usage. These examples reinforce parameter semantics beyond the schema definitions, earning a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Update') and resource ('existing issue in Linear'), and enumerates the modifiable fields (title, description, assignee, priority, workflow state). This clearly distinguishes it from siblings like create_issue, search_issues, and get_issue, as it specifically targets existing issues. The examples provide concrete usage patterns, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states 'existing issue', implying it should be used for modifications, not creation. It lists the fields that can be updated, which signals when to use this tool. However, it does not explicitly mention alternatives (e.g., use create_issue for new issues) or exclusions, leaving some guidance implied rather than explicit. The examples show common scenarios but no direct comparison to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.
9 tool updates
v0.3.1- First observed
add_comment - First observed
create_issue - First observed
get_issue - First observed
get_my_issues - First observed
get_teams - First observed
get_workflow_states - First observed
health_check - First observed
search_issues - First observed
update_issue
TDQS
Each tool has a clear purpose, but search_issues and get_my_issues both retrieve issues, which could cause confusion. However, the descriptions clarify that get_my_issues is a shortcut for issues assigned to the current user.
All tools follow a consistent verb_noun pattern (e.g., search_issues, create_issue, update_issue). health_check is a slight deviation but still understandable and consistent with common health check naming.
Nine tools provide a focused set for interacting with Linear's core entities. This is well-scoped and avoids bloat while covering essential operations.
The tool set covers issue lifecycle (create, update, search, get, comment) and team/status retrieval. Missing operations like delete issue or update/delete comments are minor gaps that agents can work around.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Connectors
Search, read and create Linear issues, projects, teams and cycles.
Linear MCP ā wraps the Linear GraphQL API (OAuth)
MCP server for Linear project management and issue tracking
Manage Superlist tasks and lists in plain language from any MCP-compatible AI agent.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI models to interact with Linear for issue tracking and project management through capabilities like creating/searching issues, managing sprints, and retrieving workflow states.-
- AlicenseNot gradedqualityDmaintenanceAllows LLMs to integrate with Linear's issue tracking system, enabling them to create, update, search, and comment on issues through the Linear API.713MIT
- AlicenseBqualityDmaintenanceEnables AI assistants to interact with Linear's project management system through its GraphQL API, supporting issue creation and management, team operations, project setup, status updates, and commenting.3229MIT
- AlicenseBqualityDmaintenanceEnables interaction with Linear's API to manage issues, projects, and teams. Supports creating, updating, searching, and deleting issues, along with project management and team operations through API key authentication.13288MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/anthonylimo90/linear-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server