Skip to main content

OhMyLinearMCP - unified Linear MCP (local-fast reads + official fallback/writes) on macOS

Project description

Oh My Linear MCP

Ask your agent for list_issues and watch 30k+ tokens disappear into deeply nested metadata.

oh-my-linear exists to stop that.

It reads from Linear.app's local IndexedDB cache first, returns compact shapes fast, and only goes to official Linear MCP when it actually has to.

"Show me Frontend issues"

Official-only path: big payload, high token burn
oh-my-linear path: focused fields (identifier/title/priority/state/assignee/dueDate)

Same question. Smaller context bill.

How It Works

Linear desktop app (Electron) already syncs your workspace to local IndexedDB. oh-my-linear opens that cache and routes tools with one rule set:

  1. Try refreshing local cache only when stale.
  2. Read locally first.
  3. Fallback to official only if local path is unsupported/unavailable.
  4. Compose one visible tool surface at startup:
    • local read tools stay local
    • shared local read tools synchronize their runtime-visible descriptions to the official MCP wording for discoverability/search parity
    • official tools whose names do not collide with local read tools are discovered once and exposed as passthrough tools
    • read-name collisions stay owned by the local path

Routing Policy (0.6.6)

Read path:

  • refresh_cache() is conditional:
    • refresh when TTL expired, or
    • refresh when local DB/blob mtime is newer than loaded cache
  • refresh failure does not immediately force official fallback
    • stale local cache is still used when present
  • official fallback happens when:
    • local cache is empty on cold start, or
    • handler raises LocalFallbackRequested (unsupported query/tool shape)

Write path:

  • official passthrough tool names discovered at startup (e.g. create_issue, update_issue) -> official Linear MCP direct
  • call_linear_tool_raw(name, args) remains as explicit raw passthrough

Install

Requirements:

  • macOS
  • Linear.app installed and opened at least once
  • Node.js (npx) for default official stdio bridge

Project setup helper (writes/updates <project>/.mcp.json):

uvx oh-my-linear install --project /path/to/project --name oh-my-linear --client claude

Claude Code:

claude mcp add oh-my-linear -- uvx oh-my-linear

Codex:

codex mcp add oh-my-linear -- uvx oh-my-linear

Exposed Tool Surface

oh-my-linear exposes one composed MCP surface:

visible_tools(oh-my-linear)
  = local_read_tools
  + official_tools_except_local_read_name_collisions
  + call_linear_tool_raw

Startup discovery:

  • oh-my-linear calls downstream official list_tools() once during startup
  • shared local read tools keep local execution, but adopt the exact official description text at startup
  • this keeps search/tool-selection wording consistent even when the call stays local
  • local read tool names win on collisions such as list_issues
  • the remaining official tools are registered as passthrough tools on oh-my-linear

Local-first reads:

list_issues, get_issue, list_teams, list_projects, get_team, get_project, list_users, get_user, list_issue_statuses, get_issue_status, list_comments, list_issue_labels, list_initiatives, get_initiative, list_cycles, list_documents, get_document, list_milestones, get_milestone, get_status_updates, list_project_updates

Official bridge:

  • Official tools whose names do not collide with local read tools are discovered from Linear MCP at startup and re-exposed on oh-my-linear (same tool names/descriptions, excluding local read collisions)
  • call_linear_tool_raw(name, args) remains as the raw fallback/escape hatch
  • If startup discovery fails, local read tools still load and call_linear_tool_raw remains available, but mirrored official tools may be missing until restart and shared local descriptions fall back to their built-in wording

Migration Notes

Removed tool endpoints:

  • list_official_tools
  • reconnect_official
  • refresh_cache
  • get_cache_health
  • reauth
  • official_call_tool

Replacement:

  • prefer composed official passthrough tools directly (e.g. create_issue, update_issue, ...)
  • use call_linear_tool_raw(name, args) for explicit passthrough
  • when downstream official Linear auth expires, reauthenticate by opening your client's /mcp flow and reconnecting the oh-my-linear server, then retry the original tool call

CLI entrypoints:

  • primary: oh-my-linear
  • compatibility aliases: oh-my-linearmcp, linear-mcp-fast
  • default behavior (oh-my-linear): run MCP server (serve)
  • helper command:
    • oh-my-linear install --project /path/to/project --name oh-my-linear --client claude

Configuration

Official transport:

  • LINEAR_OFFICIAL_MCP_TRANSPORT (stdio default, or http)
  • LINEAR_OFFICIAL_MCP_COMMAND (npx default)
  • LINEAR_OFFICIAL_MCP_ARGS (-y mcp-remote https://mcp.linear.app/mcp default)
  • LINEAR_OFFICIAL_MCP_ENV (JSON env for stdio child)
  • LINEAR_OFFICIAL_MCP_CWD (working directory for stdio child)
  • LINEAR_OFFICIAL_MCP_URL (https://mcp.linear.app/mcp default for http transport)
  • LINEAR_OFFICIAL_MCP_HEADERS (JSON headers for http transport)

Local refresh policy:

  • LINEAR_FAST_REFRESH_TTL_SECONDS (default 10)
  • LINEAR_FAST_ACCOUNT_EMAILS (optional account scope filter)
  • LINEAR_FAST_USER_ACCOUNT_IDS (optional account scope filter)

OAuth retry suppression:

  • LINEAR_OFFICIAL_AUTH_RETRY_COOLDOWN_SECONDS (default 300)

Troubleshooting

Official Linear auth expired or consent changed:

  1. Open your MCP client's /mcp flow.
  2. Reconnect or reauthenticate the oh-my-linear server entry.
  3. Retry the original tool call after the auth window completes.
  4. If the client is still in cooldown, reconnect once more after auth so a fresh server instance clears the suppressed retry state.

OAuth page keeps opening:

  1. Check official URL is not localhost by mistake.
  2. Finish the login/consent flow, then reconnect oh-my-linear from /mcp.
  3. Confirm auth session is valid.
  4. Avoid tight retry loops from clients.
  5. Keep cooldown enabled (LINEAR_OFFICIAL_AUTH_RETRY_COOLDOWN_SECONDS).

Local data seems stale:

  1. Open Linear.app to force sync.
  2. Lower LINEAR_FAST_REFRESH_TTL_SECONDS if you want more aggressive refresh.

npx: command not found:

  • install Node.js, or switch to LINEAR_OFFICIAL_MCP_TRANSPORT=http.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oh_my_linear-0.6.6.tar.gz (135.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oh_my_linear-0.6.6-py3-none-any.whl (134.1 kB view details)

Uploaded Python 3

File details

Details for the file oh_my_linear-0.6.6.tar.gz.

File metadata

  • Download URL: oh_my_linear-0.6.6.tar.gz
  • Upload date:
  • Size: 135.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.7

File hashes

Hashes for oh_my_linear-0.6.6.tar.gz
Algorithm Hash digest
SHA256 c729cd07a1737bc026f38619b62c2e2b9c42476f23756333c900102d5240106b
MD5 4eded98051e74e6efce71c1306c0bbd6
BLAKE2b-256 4d2d07aa19570b873ac5e33150817cd51d81bc24abdce10b70e60476bfe528ee

See more details on using hashes here.

File details

Details for the file oh_my_linear-0.6.6-py3-none-any.whl.

File metadata

File hashes

Hashes for oh_my_linear-0.6.6-py3-none-any.whl
Algorithm Hash digest
SHA256 291d70a2aca3fe2252b1c08426c184511c94eb62d55009a22010ee7facf3ef90
MD5 4a19b1ed6093af4260adfe4a373ecb06
BLAKE2b-256 c091418ebf9e7b8c2ca28075f8bb52b0c6d1bf218f3e6b470633ac93d752a411

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page