mcpbeat

Ops Linear

davepoon/ops-linear

Linear command center. Shows current sprint, creates/updates issues, manages priorities, syncs with GSD phases.

1k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
3248
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/davepoon/buildwithclaude --skill ops-linear

What it tells the agent to use

found in the instruction text
WebFetch fetches pages from the network

The instruction itself

13 sections, as written by the author

OPS ► LINEAR COMMAND CENTER

Runtime Context

Before executing, load available context:

  • Secrets: Linear API key required for MCP fallback queries.

Secret Resolution

  • Check $LINEAR_API_KEY env var
  • Then: Doppler MCP tools (mcp__doppler__*) — if Doppler MCP server is configured
  • Then: doppler secrets get LINEAR_API_KEY --plain (if doppler CLI configured in prefs)
  • Then: use password_manager_config.query_cmd from ${CLAUDE_PLUGIN_DATA_DIR:-$HOME/.claude/plugins/data/ops-ops-marketplace}/preferences.json
  • If unavailable, use Linear MCP tools exclusively (no curl fallback possible)
  • Preferences: Read ${CLAUDE_PLUGIN_DATA_DIR}/preferences.json for secrets_manager / doppler config.

CLI/API Reference

Linear GraphQL (fallback when MCP unavailable)

| Command | Usage | Output |

|---------|-------|--------|

| curl -X POST https://api.linear.app/graphql -H "Authorization: $LINEAR_API_KEY" -H "Content-Type: application/json" -d '{"query":"{ issues(filter: {state: {type: {in: [\"started\",\"unstarted\"]}}}) { nodes { id title state { name } priority assignee { name } } } }"}' | Active issues | JSON |

| curl -X POST https://api.linear.app/graphql -H "Authorization: $LINEAR_API_KEY" -H "Content-Type: application/json" -d '{"query":"{ cycles(filter: {isActive: {eq: true}}) { nodes { id number startsAt endsAt } } }"}' | Current cycles | JSON |


Phase 1 — Load data

Run in parallel:

  • mcp__linear__list_teams — get all team IDs
  • mcp__linear__list_issues — get issues with cycle filter (use GraphQL fallback for cycle queries if needed)

Then fetch issues for the current cycle: mcp__linear__list_issues filtered to current cycle ID.


Route by $ARGUMENTS

| Argument | Action |

| --------------- | --------------------------------------- |

| (empty), sprint | Show current sprint board |

| backlog | Show unassigned/unscheduled issues |

| create [title] | Create a new issue (prompt for details) |

| update [id] | Update issue by ID |

| sync | Sync GSD phases to Linear issues |

| [issue-id] | Show and edit that specific issue |


Sprint board view

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
 LINEAR ► SPRINT [N] — [start] → [end]
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

IN PROGRESS
 [id]  [priority]  [title]  [assignee]  [estimate]

TODO
 [id]  [priority]  [title]  [assignee]  [estimate]

DONE THIS SPRINT
 [id]  [title]  [completed date]

BLOCKED / CANCELLED
 [id]  [title]  [reason]

──────────────────────────────────────────────────────
 Sprint velocity: [done points] / [total points] ([%])
──────────────────────────────────────────────────────

Use batched AskUserQuestion calls (max 4 options each):

AskUserQuestion call 1:

  [Create new issue]
  [Update issue status]
  [Move issue to/from sprint]
  [More...]

AskUserQuestion call 2 (only if "More..."):

  [View backlog]
  [Sync with GSD phases]

Create issue flow

Collect from user (or parse from $ARGUMENTS):

  • Title
  • Team (list choices if ambiguous)
  • Priority (urgent/high/medium/low)
  • Cycle (current sprint or backlog)
  • Assignee (optional)
  • Estimate (optional)

Use mcp__linear__create_issue to create. Confirm: Created [id]: [title]


GSD sync flow

Read all active GSD STATE.md files across projects. For each active phase:

  • Check if a Linear issue exists with matching phase reference.
  • If not, offer to create one.
  • If status differs (GSD says done, Linear says in-progress), offer to sync.

Update Linear issues to match GSD phase completion status.

Use AskUserQuestion after displaying any view to get the next action.


Native tool usage

Tasks — sprint work tracking

When the user starts working on a Linear issue, use TaskCreate to track it locally. Update with TaskUpdate as the issue progresses. This bridges Linear state with local session state.

WebFetch — Linear API fallback

When Linear MCP tools hit quota limits or fail, fall back to WebFetch with the Linear GraphQL API:

WebFetch(url: "https://api.linear.app/graphql", method: "POST", headers: {"Authorization": "$LINEAR_API_KEY"}, body: '{"query":"{ issues(filter: {cycle: {id: {eq: \"<id>\"}}}}) { nodes { id title state { name } } } }"}')

How to use it

Copy the folder

Take davepoon/ops-linear from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.