Manage Linear Issues with Go MCP Server
Go-based Linear MCP server for issues and comments, with URL-aware comment resolution and read-only-by-default mode.
Maintainer of this project? Claim this page to edit the listing.
1.15.0Add to Favorites
Why it matters
Automate your Linear issue management by integrating with a powerful Go-based MCP server. Streamline issue creation, updates, searches, and comment management directly from your AI assistants.
Outcomes
What it gets done
Create, update, and search Linear issues programmatically.
Manage comments, including replies and URL-based operations.
Retrieve team and user issue information.
Integrate with AI assistants for enhanced issue tracking.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/vb-linear-go | bash Capabilities
Tools your agent gets
Creates a new Linear issue with specified details and parent-child relationships
Updates properties of an existing Linear issue like title, description, priority, and status
Searches Linear issues using flexible criteria including query text, team, status, assignee, labels
Retrieves issues assigned to a specific user or the authenticated user
Retrieves a single Linear issue by its ID
Adds a comment to an existing Linear issue with support for replies and URL support
Replies to an existing comment and automatically determines the issue from the comment
Retrieves comments on a Linear issue with pagination and thread navigation support
Overview
Linear (Go) MCP Server
A Go-based Linear MCP server for creating, searching, and updating issues and threaded comments, with URL-aware comment resolution and read-only-by-default access. Use when an AI assistant needs to read or manage Linear issues and comments, including threaded replies from pasted comment URLs.
What it does
This is a Model Context Protocol (MCP) server for Linear, written in Go, providing tools for interacting with the Linear API through MCP. It creates, updates, and searches Linear issues, retrieves issues assigned to a user, adds comments and replies to existing comments, retrieves team information, and rate-limits API requests to respect Linear's limits. A distinctive feature is URL-aware comment operations - full Linear comment URLs can be pasted directly into comment tools, with the server automatically resolving them to UUIDs rather than requiring manual ID extraction.
When to use - and when NOT to
Use this server when an AI assistant needs to read or manage Linear issues and comments, including creating parent-child sub-issue relationships and threaded comment replies. By default the server runs in read-only mode, disabling linear_create_issue, linear_update_issue, linear_add_comment, linear_reply_to_comment, and linear_update_issue_comment - pass --write-access=true to enable write operations. Currently only Cline (the VS Code extension) is supported by the automated setup command.
Capabilities
Tools include: linear_create_issue (title/team required, plus description, priority 0-4 from "no priority" to "urgent", status, labels, project, and makeSubissueOf to create a parent-child relationship, e.g. "makeSubissueOf": "ENG-42"); linear_update_issue (update title/description/priority/status by issue ID); linear_search_issues (filter by query text, team, status, assignee, labels, priority, estimate, archived inclusion, with a result limit); linear_get_user_issues (issues for a given user or the authenticated user); linear_get_issue (single issue by ID); linear_add_comment (comment on an issue, with an optional thread parameter accepting a full comment URL, UUID, shorthand, or hash to create a threaded reply, plus an optional createAsUser display name); linear_reply_to_comment (a simpler convenience tool that auto-resolves the issue from a comment reference, needing only the comment identifier and reply text); linear_get_issue_comments (paginated comment retrieval with thread navigation via a parent comment UUID); linear_update_issue_comment (edit an existing comment, also URL-aware); and linear_get_teams (list teams, optionally filtered by name substring).
How to install
Requires Go 1.23+ and a Linear API key. Pre-built binaries for Linux, macOS, and Windows are available from GitHub Releases, or downloaded automatically (e.g. curl + jq to fetch the latest Linux binary, then chmod +x). Set LINEAR_API_KEY and run ./linear-mcp-go serve (read-only by default) or ./linear-mcp-go serve --write-access for write access; the server listens for MCP requests on stdin/stdout. The setup command automates configuring an AI assistant: ./linear-mcp-go setup for Cline (the default and currently only supported tool), with flags for --write-access, and --auto-approve (either allow-read-only to auto-approve linear_search_issues/linear_get_user_issues/linear_get_issue/linear_get_teams, or a specific comma-separated tool list). ./linear-mcp-go version reports the version, git commit, and build date. This server is MIT-licensed.
Integrations
Tests use go-vcr recorded cassettes run against a dedicated linear-mcp-go-test Linear workspace, executable via go test -v ./..., with -record=true or -recordWrites=true flags (requiring TEST_LINEAR_API_KEY) to re-record cassettes, and -golden=true to update golden files. Releases are automated via GitHub Actions: pushes/PRs to main are tested automatically, and pushing a v*-pattern tag (matching the ServerVersion constant in pkg/server/server.go) triggers a release with cross-platform binaries carrying build-time git commit and date metadata.
Who it's for
Teams using Linear for issue tracking who want an AI assistant (currently Cline) to search, read, and optionally create/update issues and threaded comments directly - especially useful when working from pasted Linear comment URLs rather than manually extracting UUIDs.
Source README
Linear MCP Server
A Model Context Protocol (MCP) server for Linear, written in Go. This server provides tools for interacting with the Linear API through the MCP protocol.
Features
- Create, update, and search Linear issues
- Get issues assigned to a user
- Add comments to issues and reply to existing comments
- URL-aware comment operations - paste Linear comment URLs directly, no manual ID extraction needed
- Retrieve team information
- Rate-limited API requests to respect Linear's API limits
Prerequisites
- Go 1.23 or higher
- Linear API key
Installation
From Releases
Pre-built binaries are available for Linux, macOS, and Windows on the GitHub Releases page.
- Download the appropriate binary for your platform
- Make it executable (Linux/macOS):
chmod +x linear-mcp-go-*
- Run the binary as described in the Usage section
Automated
# Download linux binary for the latest release
RELEASE=$(curl -s https://api.github.com/repos/geropl/linear-mcp-go/releases/latest)
DOWNLOAD_URL=$(echo $RELEASE | jq -r '.assets[] | select(.name | contains("linux")) | .browser_download_url')
curl -L -o ./linear-mcp-go $DOWNLOAD_URL
chmod +x ./linear-mcp-go
# Setup the mcp server (.gitpod.yml, dotfiles repo, etc.)
./linear-mcp-go setup --tool=cline
Usage
Checking Version
To check the version of the Linear MCP server:
./linear-mcp-go version
This will display the version, git commit, and build date information.
Running the Server
- Set your Linear API key as an environment variable:
export LINEAR_API_KEY=your_linear_api_key
- Run the server:
# Run in read-only mode (default)
./linear-mcp-go serve
# Run with write access enabled
./linear-mcp-go serve --write-access
The server will start and listen for MCP requests on stdin/stdout.
Setting Up for AI Assistants
The setup command automates the installation and configuration process for various AI assistants:
# Set your Linear API key as an environment variable
# Only exception: Ona does not require this for setup!
export LINEAR_API_KEY=your_linear_api_key
# Set up for Cline (default)
./linear-mcp-go setup
# Set up with write access enabled
./linear-mcp-go setup --write-access
# Set up with auto-approval for read-only tools
./linear-mcp-go setup --auto-approve=allow-read-only
# Set up with specific tools auto-approved
./linear-mcp-go setup --auto-approve=linear_get_issue,linear_search_issues
# Set up with write access and auto-approval for read-only tools
./linear-mcp-go setup --write-access --auto-approve=allow-read-only
# Set up for a different tool (only "cline" supported for now)
./linear-mcp-go setup --tool=cline
This command:
- Checks if the Linear MCP binary is already installed
- Copies the current binary to the installation directory if needed
- Configures the AI assistant to use the Linear MCP server
- Sets up auto-approval for specified tools if requested
The --auto-approve flag can be used to specify which tools should be auto-approved in the Cline configuration:
--auto-approve=allow-read-only: Auto-approves all read-only tools (linear_search_issues,linear_get_user_issues,linear_get_issue,linear_get_teams)--auto-approve=tool1,tool2,...: Auto-approves the specified comma-separated list of tools
Currently supported AI assistants:
- Cline (VSCode extension)
By default, the server runs in read-only mode, which means the following tools are disabled:
linear_create_issuelinear_update_issuelinear_add_commentlinear_reply_to_commentlinear_update_issue_comment
To enable these tools, use the --write-access=true flag.
Available Tools
linear_create_issue
Creates a new Linear issue with specified details. Supports creating parent-child relationships (sub-issues) and assigning labels.
Parameters:
title(required): Issue titleteam(required): Team identifier (key, UUID or name)description: Issue descriptionpriority: Priority. Accepts: 0/'no priority', 1/'urgent', 2/'high', 3/'medium', 4/'low'status: Issue statusmakeSubissueOf: Create a sub-issue by specifying the parent issue ID or identifier (e.g., 'TEAM-123'). This establishes a parent-child relationship in Linear.labels: Optional comma-separated list of label IDs or names to assignproject: Optional project identifier (ID, name, or slug) to assign the issue to
Example: Creating a sub-issue
{
"title": "Implement login form validation",
"team": "ENG",
"makeSubissueOf": "ENG-42",
"description": "Add client-side validation for the login form"
}
linear_update_issue
Updates an existing Linear issue's properties.
Parameters:
id(required): Issue IDtitle: New titledescription: New descriptionpriority: Priority. Accepts: 0/'no priority', 1/'urgent', 2/'high', 3/'medium', 4/'low'status: New status
linear_search_issues
Searches Linear issues using flexible criteria.
Parameters:
query: Optional text to search in title and descriptionteamId: Filter by team IDstatus: Filter by status name (e.g., 'In Progress', 'Done')assigneeId: Filter by assignee's user IDlabels: Filter by label names (comma-separated)priority: Priority. Accepts: 0/'no priority', 1/'urgent', 2/'high', 3/'medium', 4/'low'estimate: Filter by estimate pointsincludeArchived: Include archived issues in results (default: false)limit: Max results to return (default: 10)
linear_get_user_issues
Retrieves issues assigned to a specific user or the authenticated user.
Parameters:
userId: Optional user ID. If not provided, returns authenticated user's issuesincludeArchived: Include archived issues in resultslimit: Maximum number of issues to return (default: 50)
linear_get_issue
Retrieves a single Linear issue by its ID.
Parameters:
issueId(required): ID of the issue to retrieve
linear_add_comment
Adds a comment to an existing Linear issue. Supports replying to existing comments by passing a comment identifier in the thread parameter.
Parameters:
issue(required): ID or identifier (e.g., 'TEAM-123') of the issue to comment onbody(required): Comment text in markdown formatthread: Optional comment identifier to reply to. Accepts: full Linear comment URL, UUID, shorthand (comment-abc123), or hash (abc123). Creates a threaded reply instead of a top-level comment.createAsUser: Optional custom username to show for the comment
URL Support: You can pass a full Linear comment URL (e.g., https://linear.app/.../issue/TEST-10/...#comment-abc123) directly to the thread parameter. The tool automatically resolves URLs to UUIDs before calling the API.
linear_reply_to_comment
Convenience tool for replying to an existing comment. Automatically resolves the issue from the comment, so you only need to provide the comment identifier and reply text.
Parameters:
thread(required): Comment to reply to. Accepts: full Linear comment URL, UUID, shorthand (comment-abc123), or hash (abc123)body(required): Reply text in markdown formatcreateAsUser: Optional custom username to show for the reply
Why use this tool? When you have a comment URL or ID and want to reply, this tool is simpler than linear_add_comment because you don't need to specify the issue separately. The tool automatically looks up the issue from the comment.
linear_get_issue_comments
Retrieves comments for a Linear issue with support for pagination and thread navigation.
Parameters:
issue(required): ID or identifier (e.g., 'TEAM-123') of the issue to retrieve comments forthread: Optional UUID of a parent comment to retrieve its replies. If not provided, returns top-level commentslimit: Maximum number of comments to return (default: 10)after: Cursor for pagination, to get comments after this point
Use Cases:
- View all comments on an issue
- Navigate comment threads by passing a comment UUID in the
threadparameter - Get comment UUIDs for replying (though with URL support in
linear_add_comment, this is less necessary)
linear_update_issue_comment
Updates an existing comment on a Linear issue.
Parameters:
comment(required): Comment identifier to update. Accepts: full Linear comment URL, UUID, shorthand (comment-abc123), or hash (abc123)body(required): New comment text in markdown format
URL Support: Like other comment tools, this accepts full Linear comment URLs and automatically resolves them to UUIDs.
linear_get_teams
Retrieves Linear teams with an optional name filter.
Parameters:
name: Optional team name filter. Returns teams whose names contain this string.
Test
Tests are implemented using go-vcr, and executed against https://linear.app/linear-mcp-go-test.
Execute tests
Using the existing recordings (cassettes):
go test -v ./...
Re-recording test:
Requires TEST_LINEAR_API_KEY to be set for the test workspace.
go test -v -record=true ./...
This will update all tests that don't alter remote state.
go test -v -recordWrites=true ./...
This will re-run all tests, including some that might alter the outcome of other tests cases, which might require further manual work to adjust.
go test -v -golden=true ./...
Updates all .golden fields.
Release Process
The project uses GitHub Actions for automated testing and releases. The version is managed through the ServerVersion constant in pkg/server/server.go.
Automated Testing and Building
- All pushes to the main branch and pull requests are automatically tested
- When a tag matching the pattern
v*(e.g.,v1.0.0) is pushed, a new release is automatically created - Binaries for Linux, macOS, and Windows are built and attached to the release with build-time information (git commit and build date)
Creating a New Release
Important: Version tags should only be created against the main branch after all changes have been merged.
Update the version: Modify the
ServerVersionconstant inpkg/server/server.go// ServerVersion is the version of the MCP server ServerVersion = "1.13.0"Create a PR: Submit the version update as a pull request to ensure it goes through review and testing
Merge to main: Once the PR is approved and merged to the main branch
Create and push the release tag:
# Ensure you're on the latest main branch git checkout main git pull origin main # Create and push the tag (must match the version in server.go) git tag v1.13.0 git push origin v1.13.0Automated release: The GitHub Actions workflow will automatically:
- Build binaries for all platforms with proper version information
- Create a GitHub release with the tag
- Attach the compiled binaries to the release
Version Information
The version command displays:
- Version: Read from
ServerVersionconstant inpkg/server/server.go - Git commit: Injected at build time from the current commit hash
- Build date: Injected at build time with the current timestamp
For development builds, git commit and build date will show "unknown".
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.