| name | go-linear |
| description | Linear issue tracking CLI with smart filtering and aggregation (project) |
go-linear MCP Skill
Linear CLI for AI agents. Requires LINEAR_API_KEY env var.
Decision Guide
| Goal | Tool | Key flags |
|---|
| Count issues | issue list | --team=ENG --count |
| Find by criteria | issue list | --assignee=me --state="In Progress" |
| Find by text | issue search | "auth bug" |
| Get one issue | issue get | ENG-123 |
| Get comments for issue | comment list | --issue=ENG-123 |
| Who completed work? | user completed | --team=ENG --completed-after=7d |
| Team workload | team get | ENG (returns issueCount) |
| Rate limits | status | |
| Archive issue | issue archive | ENG-123 or --trash |
| Restore archived | issue unarchive | ENG-123 |
| List sub-initiatives | initiative list-sub | <parent-initiative> |
| Remove team member | team remove-member | --team=ENG --user=alice@co.com |
Core Patterns
Filtering (names, not UUIDs)
--team=Engineering # or team key: --team=ENG
--assignee=me # or email: --assignee=alice@example.com
--creator=me # who created it
--state="In Progress" # workflow state name
--priority=1 # 0=none, 1=urgent, 2=high, 3=normal, 4=low
--label=bug # repeatable: --label=bug --label=security
Date Filters
--created-after=yesterday
--created-after=7d # 7 days ago
--created-after=2w # 2 weeks ago
--created-after=2025-01-15
--completed-before=today
Output Optimization
--output=json # ALWAYS use for parsing
--count # Returns {"count": N} - 99% fewer tokens
--fields=defaults # 8 fields vs 50+ (80% reduction)
--fields=id,title,url # Specific fields only
--fields=defaults,labels # Add to defaults
Pagination
--limit=50 # Default, max varies
--after=<cursor> # From pageInfo.endCursor
Discovery Commands
| Need | Command |
|---|
| Team names/keys | team list --output=json |
| User emails | user list --output=json |
| Workflow states | state list --output=json |
| State types | state list --type=started (triage/backlog/unstarted/started/completed/canceled) |
| Labels | label list --output=json |
| Labels by team | label list --team=ENG --output=json |
| Projects | project list --output=json |
| Active cycles | cycle list --active --output=json |
| Current user | viewer --output=json |
| Workspace | organization --output=json |
| Rate limits | status --output=json |
Workflows
Issue Investigation
go-linear issue get ENG-123 --output=json
go-linear comment list --issue=ENG-123 --output=json
go-linear issue list --parent=ENG-123 --output=json
Triage Check
go-linear issue list --state=Triage --team=ENG --count
go-linear issue list --state=Triage --team=ENG --output=json
Team Productivity
go-linear user completed --team=ENG --completed-after=7d --output=json
go-linear user completed --user=me --completed-after=yesterday --output=json
Create Issue
go-linear issue create \
--team=ENG \
--title="Fix auth bug" \
--priority=1 \
--assignee=me \
--label=bug \
--output=json
Update Issue
go-linear issue update ENG-123 --state=Done --priority=2 --output=json
go-linear issue update ENG-123 --add-label=reviewed --remove-label=needs-review
go-linear issue update ENG-456 --parent=ENG-123
go-linear issue update ENG-456 --parent=none
Batch Update (max 50)
go-linear issue batch-update \
--state=Triage \
--has-suggested-teams \
--set-state=Backlog \
--dry-run
go-linear issue batch-update \
--state=Triage \
--has-suggested-teams \
--set-state=Backlog \
--yes
Link GitHub PR
go-linear attachment link-github \
--issue=ENG-123 \
--url=https://github.com/owner/repo/pull/42 \
--output=json
go-linear issue update ENG-123 --link-pr=owner/repo#42
Link External Resources
go-linear attachment link-url \
--issue=ENG-123 \
--url=https://docs.example.com/spec \
--title="Design Spec" \
--output=json
go-linear attachment link-slack \
--issue=ENG-123 \
--url=https://workspace.slack.com/archives/C123/p1234567890 \
--output=json
go-linear attachment create \
--issue=ENG-123 \
--title="Build #42" \
--url=https://ci.example.com/42 \
--metadata='{"status":"passed"}' \
--output=json
Issue Relationships
go-linear issue relate ENG-123 ENG-124 --type=blocks
go-linear issue list --has-blocking --team=ENG --output=json
go-linear issue list --has-blocked-by --team=ENG --output=json
Comments
go-linear comment create --issue=ENG-123 --body="Fixed in PR #42" --output=json
go-linear comment list --issue=ENG-123 --output=json
go-linear comment list --creator=me --created-after=7d --output=json
Reactions
go-linear reaction create --issue=ENG-123 --emoji=👍 --output=json
go-linear reaction create --comment=<uuid> --emoji=🎉 --output=json
Favorites (Stars)
go-linear favorite create --issue=ENG-123 --output=json
go-linear favorite create --project="Q1 Platform" --output=json
Cycles (Sprints)
go-linear cycle list --active --team=ENG --output=json
go-linear cycle create \
--team=ENG \
--starts-at=2025-01-15 \
--ends-at=14d \
--name="Sprint 42" \
--output=json
go-linear issue update ENG-123 --cycle=<cycle-uuid>
go-linear issue update ENG-123 --cycle=none
Projects & Milestones
go-linear project list --health=onTrack --output=json
go-linear project milestone-create \
--project="Q1 Platform" \
--name="Alpha Release" \
--target-date=2025-02-15 \
--output=json
Notifications
go-linear notification subscribe --project="Q1 Platform" --output=json
go-linear notification subscribe --team=ENG --output=json
Advanced Filters (issue list)
AI Triage Suggestions
--has-suggested-teams
--has-suggested-assignees
--has-suggested-labels
--has-suggested-projects
Relationships
--has-children
--has-blocking
--has-blocked-by
--has-duplicate
--has-related
--parent=ENG-123
People
--comment-by=me
--comment-by=alice@co.com
--subscriber=me
--attachment-by=me
--delegate=me
SLA & Customer
--sla-status=Breached
--has-needs
--customer-count=5
Text Search
--title="auth"
--description="login"
--comment-contains="fixed"
Error Recovery
| Error | Solution |
|---|
| "team not found" | Run team list to discover valid names/keys |
| "ambiguous match: found X teams" | Use team key (ENG) not full name |
| "user not found" | Run user list to discover emails |
| "state not found" | Run state list to discover state names |
| "must specify either --user or --team" | Flags are mutually exclusive |
| Rate limited | Check status, wait and retry |
| "LINEAR_API_KEY required" | Set environment variable |
Tool Categories
Safe (Read-Only) - Execute freely
*_list, *_get, *_search, status, viewer, organization
Creates - Safe, reversible via delete
*_create, *_relate, *_link-*, *_add-label, *_subscribe
Updates - Modifies data
*_update, *_remove-label, *_archive, *_unsubscribe
Archive/Restore - Reversible
*_archive, *_unarchive (issues, initiatives, projects, teams, documents)
Deletes - Permanent, confirm with user
*_delete, *_unrelate
Archive vs Delete
| Action | Command | Reversible | Notes |
|---|
| Hide from views | issue archive | Yes | Use unarchive to restore |
| Trash (30-day) | issue archive --trash | Yes | Auto-deletes after 30 days |
| Permanent | issue delete --permanent | No | Immediate, no grace period |
| Default delete | issue delete | Yes (30 days) | Goes to trash first |
Output Structures
List commands
{
"nodes": [{...}, {...}],
"pageInfo": {"hasNextPage": true, "endCursor": "cursor..."}
}
With --count
{"count": 23}
Get commands
{"id": "...", "identifier": "ENG-123", "title": "...", ...}
Mutations
{"success": true, "id": "...", ...}
Efficiency Tips
- Start with --count - Know scope before fetching details
- Use --fields=defaults - 80% token reduction
- user completed - Replaces 5-step workflow
- batch-update - Update 50 issues in one call
- Always --output=json - Machine-readable output
- Use team keys -
ENG not Engineering to avoid ambiguity