一键导入
linear
Manage issues, projects, and cycles in Linear
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Manage issues, projects, and cycles in Linear
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
Query and search AWS CloudWatch Logs and run Logs Insights queries
Query events, run HogQL analytics, and access product data
Query Sentry issues, events, and releases for error monitoring and triage
Analyze the codebase database schema, query patterns, and business domain to build a data-agent skill. Use when setting up a new project, after schema changes, or when the data-agent skill needs updating.
Configure the Byaan MCP server in AI coding assistants (Claude Code, Cursor, Codex CLI). Detects the local project, builds the correct stdio config, and installs it into the chosen tool. Only works for local/community mode — not the Mac desktop app.
Initialize Byaan development environment using Docker. Builds and starts backend and frontend containers with SQLite, opens the browser, learns the codebase, and configures MCP. Use when setting up the project for the first time.
| name | linear |
| display_name | Linear |
| description | Manage issues, projects, and cycles in Linear |
| emoji | ⬡ |
| homepage | https://linear.app |
| api | {"base_url":"https://api.linear.app","domain":"linear.app","type":"graphql","auth":{"type":"api_key"}} |
| credentials | [{"key":"api_key","label":"API Key","placeholder":"lin_api_...","help":"Personal API key from Linear Settings → Security & Access → Personal API keys. Starts with 'lin_api_'."}] |
Use the Linear GraphQL API to manage issues, projects, cycles, and teams.
Before using this skill, you need to create a Personal API key in Linear:
lin_api_)You do not need to handle authentication manually. When you call execute_skill_api(), the system automatically:
Authorization: <api_key> header (no Bearer prefix)Just call the API with skill name, endpoint path, and GraphQL query — authentication is handled for you.
Linear uses GraphQL. Call execute_skill_api() with these parameters:
execute_skill_api(
skill_name="linear",
endpoint_path="/graphql",
is_graphql=True,
graphql_query="query { viewer { id name } }",
graphql_variables="{}" # Optional JSON string for variables
)
Parameters:
skill_name: Always "linear"endpoint_path: Always "/graphql"is_graphql: Always Truegraphql_query: The GraphQL query or mutation stringgraphql_variables: Optional JSON string of variables for parameterized queriesExample with variables:
execute_skill_api(
skill_name="linear",
endpoint_path="/graphql",
is_graphql=True,
graphql_query="query GetIssue($id: String!) { issue(id: $id) { title } }",
graphql_variables="{\"id\": \"ABC-123\"}"
)
You must query for IDs before creating an issue. Here's the workflow:
query {
teams {
nodes {
id
name
key
}
}
}
query {
users {
nodes {
id
name
email
}
}
}
query {
workflowStates(filter: { team: { id: { eq: "team-uuid" } } }) {
nodes {
id
name
type
}
}
}
mutation {
issueCreate(
input: {
teamId: "team-uuid"
title: "Fix login bug"
description: "Users can't log in on mobile"
priority: 2
assigneeId: "user-uuid"
stateId: "state-uuid"
}
) {
success
issue {
id
identifier
url
}
}
}
Three approaches depending on what you need:
query {
issueSearch(query: "bug fix", first: 20) {
nodes {
id
identifier
title
url
state {
name
}
}
}
}
query {
issues(filter: { assignee: { isMe: { eq: true } } }, first: 20) {
nodes {
id
identifier
title
url
state {
name
}
}
}
}
query {
issue(id: "ABC-123") {
id
identifier
title
description
url
state {
name
}
assignee {
name
email
}
priority
dueDate
}
}
Use the filter parameter to narrow results:
# Issues assigned to current user
issues(filter: { assignee: { isMe: { eq: true } } })
# Unassigned issues
issues(filter: { assignee: { null: true } })
# High priority issues (1=Urgent, 2=High)
issues(filter: { priority: { lte: 2 } })
# Issues in specific state
issues(filter: { state: { name: { eq: "In Progress" } } })
# Issues in a specific team
issues(filter: { team: { key: { eq: "ENG" } } })
# Issues in a project
issues(filter: { project: { id: { eq: "project-uuid" } } })
# Issues with a specific label
issues(filter: { labels: { name: { eq: "bug" } } })
# Issues updated in last 7 days
issues(filter: { updatedAt: { gte: "2024-01-01T00:00:00Z" } })
# Combine filters
issues(filter: {
and: [
{ assignee: { isMe: { eq: true } } },
{ state: { type: { eq: "started" } } }
]
})
Linear uses cursor-based pagination:
first: Number of results per request (max 250)after: Cursor from previous response to get next pageResponse includes pageInfo:
hasNextPage: true if more results existendCursor: Use as after in next requestExample pagination flow:
# First request
query {
issues(first: 50) {
nodes {
id
identifier
title
}
pageInfo {
hasNextPage
endCursor
}
}
}
# If hasNextPage is true, get next page
query {
issues(first: 50, after: "cursor-from-previous-response") {
nodes {
id
identifier
title
}
pageInfo {
hasNextPage
endCursor
}
}
}
Get current user:
query {
viewer {
id
name
email
}
}
List issues:
query {
issues(first: 20) {
nodes {
id
identifier
title
url
state {
name
}
assignee {
name
}
priority
dueDate
createdAt
}
}
}
Get issue by identifier:
query {
issue(id: "ABC-123") {
id
identifier
title
description
url
state {
name
}
assignee {
name
email
}
team {
name
key
}
priority
dueDate
labels {
nodes {
name
color
}
}
comments {
nodes {
body
user {
name
}
createdAt
}
}
}
}
List teams:
query {
teams {
nodes {
id
name
key
}
}
}
List projects:
query {
projects(first: 20) {
nodes {
id
name
state
url
teams {
nodes {
name
}
}
}
}
}
List users:
query {
users {
nodes {
id
name
email
active
}
}
}
List workflow states for a team:
query {
workflowStates(filter: { team: { key: { eq: "ENG" } } }) {
nodes {
id
name
type
}
}
}
List labels:
query {
issueLabels(first: 50) {
nodes {
id
name
color
}
}
}
Create issue:
mutation {
issueCreate(
input: {
teamId: "team-uuid"
title: "Fix login bug"
description: "Users can't log in on mobile"
priority: 2
dueDate: "2024-02-15"
}
) {
success
issue {
id
identifier
url
}
}
}
Update issue:
mutation {
issueUpdate(
id: "issue-uuid"
input: { stateId: "state-uuid", assigneeId: "user-uuid", priority: 1 }
) {
success
issue {
identifier
state {
name
}
}
}
}
Add label to issue:
mutation {
issueAddLabel(id: "issue-uuid", labelId: "label-uuid") {
success
issue {
labels {
nodes {
name
}
}
}
}
}
Remove label from issue:
mutation {
issueRemoveLabel(id: "issue-uuid", labelId: "label-uuid") {
success
}
}
Add comment:
mutation {
commentCreate(input: { issueId: "issue-uuid", body: "Fixed in PR #456" }) {
success
comment {
id
body
}
}
}
Create label:
mutation {
issueLabelCreate(
input: { teamId: "team-uuid", name: "needs-review", color: "#ff6b6b" }
) {
success
issueLabel {
id
name
}
}
}
Create project:
mutation {
projectCreate(input: { name: "Q1 Roadmap", teamIds: ["team-uuid"] }) {
success
project {
id
name
url
}
}
}
Lower number = higher priority:
Workflow states have these types:
backlog — Not yet plannedunstarted — Planned but not startedstarted — In progresscompleted — Donecanceled — Won't doidentifier vs id: Use identifier (e.g., "ABC-123") when querying a specific issue. Use id (UUID) for mutations and setting relations. The issue(id:) query accepts both formats.
Required fields for issueCreate: Only teamId and title are required. Query teams first to get the teamId.
State IDs are team-specific: Each team has its own workflow states. Query workflowStates for the specific team before setting stateId.
Priority numbers are inverted: 1 is highest priority (Urgent), 4 is lowest (Low). 0 means no priority.
New issues default to Backlog: If you don't specify stateId, new issues go to the team's first Backlog state.
Finding IDs before mutations: Always query for UUIDs first. You can't use identifiers like "ABC-123" for assigneeId, stateId, labelId, etc.
Issue URL format: Issues have a url field that returns the direct link to the issue in Linear. Always include it when creating or fetching issues.
includeArchived parameter: By default, archived items are excluded. Add includeArchived: true to include them in queries.
first for pagination (max 250 per request)key is the short identifier shown in issue numbers (e.g., "ENG" in "ENG-123")