Skip to main content
The Linear provider fetches issues from your Linear workspace using Linear’s official MCP server. It handles OAuth authentication automatically.

Setup

Add Linear to your project configuration:
[[providers.linear]]
# No configuration needed - OAuth flow triggered on first use
On first use, Colin opens a browser for Linear OAuth authorization. Tokens are stored persistently at ~/.colin/mcp-oauth/. If you encounter authentication errors, clear your OAuth tokens and re-authenticate:
colin mcp auth clear

Functions

issue(id)

Fetch a single issue by identifier or UUID.
{{ colin.linear.issue("ENG-123").content }}
{{ colin.linear.issue("ENG-123").title }}
{{ colin.linear.issue("ENG-123").state }}
Arguments:
ArgumentRequiredDefaultDescription
idYesIssue identifier (e.g., “ENG-123”) or UUID
watchNoTrueTrack for staleness detection
Returns: LinearIssueResource with:
AttributeDescription
contentIssue title and description as markdown
identifierIssue identifier (e.g., “ENG-123”)
titleIssue title
urlLinear issue URL
stateCurrent state (e.g., “In Progress”, “Done”)
priorityPriority level (0=none, 1=urgent, 2=high, 3=medium, 4=low)
assigneeAssignee name or None
issue_idIssue UUID

issues(...)

Search and list issues.
{% for issue in colin.linear.issues(team="Engineering") %}
- {{ issue.identifier }}: {{ issue.title }} ({{ issue.state }})
{% endfor %}
Arguments:
ArgumentRequiredDefaultDescription
queryNoSearch query string
teamNoFilter by team name or ID
assigneeNoFilter by assignee (name, email, or “me”)
stateNoFilter by state name or ID
limitNo20Maximum number of results
watchNoTrueTrack for staleness detection
Returns: LinearIssuesResource containing matching issues. Supports iteration and length:
Found {{ colin.linear.issues(team="Engineering") | length }} issues

{% for issue in colin.linear.issues(assignee="me", state="In Progress") %}
- {{ issue.identifier }}: {{ issue.title }}
{% endfor %}

Dependency Tracking

Both issue() and issues() track dependencies by default. Documents recompile when tracked issues change:
{# Recompiles when the issue is updated #}
{{ colin.linear.issue("ENG-123").content }}

{# Recompiles when any matching issue changes #}
{% for issue in colin.linear.issues(team="Engineering") %}
{{ issue.title }}
{% endfor %}
Opt out of tracking with watch=False:
{{ colin.linear.issue("ENG-123", watch=False).content }}
{{ colin.linear.issues(team="Engineering", watch=False) }}

Staleness Detection

The Linear provider uses updatedAt timestamps for staleness detection. When a tracked issue is modified in Linear, the document is marked stale and recompiled on the next build.

Examples

Sprint Status Report

---
title: Sprint Status
---
# Current Sprint

{% set in_progress = colin.linear.issues(team="Engineering", state="In Progress") %}
{% set done = colin.linear.issues(team="Engineering", state="Done") %}

## In Progress ({{ in_progress | length }})

{% for issue in in_progress %}
- **{{ issue.identifier }}**: {{ issue.title }}
  - Assignee: {{ issue.assignee or "Unassigned" }}
{% endfor %}

## Completed ({{ done | length }})

{% for issue in done %}
- {{ issue.identifier }}: {{ issue.title }}
{% endfor %}

Issue Detail Skill

---
title: Issue Tracker
---
# How to Use This Skill

Ask me about any issue by its identifier (e.g., "What's the status of ENG-123?").

## Recent Issues

{% for issue in colin.linear.issues(assignee="me", limit=5) %}
### {{ issue.identifier }}: {{ issue.title }}

**State:** {{ issue.state }}
**Priority:** {{ issue.priority or "None" }}

{{ issue.content }}

---
{% endfor %}