Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Manage Linear issues, projects, and cycles via the Linear GraphQL API
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 307% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 269% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 436% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 181% | 0% |
| case-08 | ✗→✓ | ▲ Improved | -9% | 0% |
Query and mutate Linear data — issues, projects, cycles, and teams — using the Linear GraphQL API. Requires LINEAR_API_KEY set as an environment variable.
Generate a Personal API key at https://linear.app/settings/api — select read and write scopes.
powershell$env:LINEAR_API_KEY = "lin_api_..."
All Linear API calls are POST to https://api.linear.app/graphql.
powershellfunction Invoke-Linear($query, $variables = @{}) { $body = @{ query = $query; variables = $variables } | ConvertTo-Json -Depth 10 $headers = @{ "Authorization" = $env:LINEAR_API_KEY; "Content-Type" = "application/json" } (Invoke-RestMethod -Uri "https://api.linear.app/graphql" -Method Post -Headers $headers -Body $body).data }
powershell$q = '{ viewer { assignedIssues(first: 20, filter: { state: { type: { in: ["started","unstarted"] } } }) { nodes { identifier title priority state { name } } } } }' (Invoke-Linear $q).viewer.assignedIssues.nodes | Format-Table identifier, title, priority
powershell$q = 'query($key:String!) { team(key:$key) { issues(first:30, filter:{state:{type:{in:["started","unstarted"]}}}) { nodes { identifier title assignee { name } state { name } } } } }' (Invoke-Linear $q @{ key = "ENG" }).team.issues.nodes | Format-Table identifier, title
powershell# First get teamId $teamQ = '{ teams { nodes { id key name } } }' $teams = (Invoke-Linear $teamQ).teams.nodes $teamId = ($teams | Where-Object key -eq "ENG").id $mutation = 'mutation($input:IssueCreateInput!) { issueCreate(input:$input) { issue { identifier title url } } }' $vars = @{ input = @{ teamId = $teamId; title = "Fix login timeout bug"; description = "Users are being logged out after 5 min of inactivity."; priority = 2 } } (Invoke-Linear $mutation $vars).issueCreate.issue
powershell# Get state IDs for the team first $stateQ = 'query($key:String!) { team(key:$key) { states { nodes { id name } } } }' $states = (Invoke-Linear $stateQ @{ key = "ENG" }).team.states.nodes $doneId = ($states | Where-Object name -eq "Done").id $mutation = 'mutation($id:String! $stateId:String!) { issueUpdate(id:$id input:{stateId:$stateId}) { issue { identifier state { name } } } }' (Invoke-Linear $mutation @{ id = "ENG-42"; stateId = $doneId }).issueUpdate.issue
powershell$q = 'query($key:String!) { team(key:$key) { activeCycle { name startsAt endsAt progress issues(first:50) { nodes { identifier title state { name } } } } } }' (Invoke-Linear $q @{ key = "ENG" }).team.activeCycle | Select-Object name, progress
"Show me all my open Linear issues" → Use steps 2–3 to list viewer's assigned unstarted/in-progress issues.
"Create a Linear issue: 'Update onboarding flow' in the PRODUCT team" → Use step 5 — fetch team ID for PRODUCT, then create with given title.
"What's the progress on the current sprint?" → Use step 7 — ask user for their team key, then show activeCycle progress.
ENG-42 but mutations need the UUID — always fetch UUID from the issues listOther measured skills in the registry, with their headline benchmark lift.