mcpField
L
linear

linear

github.com/odysseus0生産性82541 回インストール2 週間前に更新
リポジトリ

linear について

Symphony のアプリサーバーが提供する GraphQL クライアントを通じて Linear の課題を扱うスキルです。課題の照会・更新、節目ごとの作業記録同期、添付、ファイルのアップロード、課題作成に対応します。

主な機能

  1. 01Linear 課題の照会と更新
  2. 02節目ごとの作業記録コメント同期
  3. 03課題の状態遷移管理
  4. 04GitHub PR と URL の添付
  5. 05ファイルのアップロードと課題作成

活用シーン

  1. 01Linear 課題への実装進捗の記録
  2. 02チームの状態 ID を使った課題状態の変更
  3. 03GitHub PR の課題へのリンク
  4. 04課題の作成とファイル添付

MCP 対応

Symphony のアプリサーバーが公開する `linear_graphql` クライアントツールで Linear を操作します。認証はクライアントツールが処理します。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/odysseus0/symphony --skill linear

インストール後、Claude Code で/linearを入力して読み込まれたか確認します。

詳細

Linear GraphQL

Linear のすべての操作は、Symphony のアプリサーバーが公開する linear_graphql クライアントツールを通じて実行します。認証は自動的に処理されます。

{
  "query": "query or mutation document",
  "variables": { "optional": "graphql variables" }
}

ツール呼び出しごとに操作は 1 つだけ実行してください。ツール呼び出しが完了していても、トップレベルの errors 配列がある場合は操作に失敗しています。

作業用メモ

ワークスペース内にローカルの workpad.md を維持してください。自由に編集し(API コストはゼロです)、マイルストーン(計画の確定、実装の完了、検証の完了)のタイミングで Linear に同期します。細かな変更のたびに同期しないでください。

初回の同期 — コメントを作成して、ID を保存します。

mutation CreateComment($issueId: String!, $body: String!) {
  commentCreate(input: { issueId: $issueId, body: $body }) {
    success
    comment { id }
  }
}

返された comment.id を .workpad-id に書き込み、以降の同期で更新できるようにします。

2 回目以降の同期 — .workpad-id を読み込み、既存のコメントを更新します。

mutation UpdateComment($id: String!, $body: String!) {
  commentUpdate(id: $id, input: { body: $body }) { success }
}

Issue の照会

オーケストレーターは起動時に、Issue のコンテキスト(識別子、タイトル、説明、状態、ラベル、URL)をプロンプトに挿入します。通常、再読み込みは不要です。

再読み込みが必要な場合は、手元にある情報に対して最も絞り込んだ検索方法を使います。

# By ticket key (e.g. MT-686)
query($key: String!) {
  issue(id: $key) {
    id identifier title url description
    state { id name type }
    project { id name }
  }
}

コメントと添付ファイルについては、次のとおりです。

query($id: String!) {
  issue(id: $id) {
    comments(first: 50) { nodes { id body user { name } createdAt } }
    attachments(first: 20) { nodes { url title sourceType } }
  }
}

状態の遷移

まずチームの状態を取得し、その後、正確な stateId を指定して移動します。

query($id: String!) {
  issue(id: $id) {
    team { states { nodes { id name } } }
  }
}
mutation($id: String!, $stateId: String!) {
  issueUpdate(id: $id, input: { stateId: $stateId }) {
    success
    issue { state { name } }
  }
}

PR または URL の添付

# GitHub PR (preferred for PRs)
mutation($issueId: String!, $url: String!, $title: String) {
  attachmentLinkGitHubPR(issueId: $issueId, url: $url, title: $title, linkKind: links) {
    success
  }
}

# Plain URL
mutation($issueId: String!, $url: String!, $title: String) {
  attachmentLinkURL(issueId: $issueId, url: $url, title: $title) {
    success
  }
}

ファイルのアップロード

次の 3 つの手順で行います。

  1. アップロード URL を取得します。
mutation($filename: String!, $contentType: String!, $size: Int!) {
  fileUpload(filename: $filename, contentType: $contentType, size: $size, makePublic: true) {
    success
    uploadFile { uploadUrl assetUrl headers { key value } }
  }
}
  1. 返されたヘッダーを使って、ファイルのバイト列を uploadUrl に PUT します(curl を使用)。
  2. コメントまたは作業用メモに assetUrl を ![説明](url) の形式で埋め込みます。

Issue の作成

まず、プロジェクトのスラッグを ID に解決します。

query($slug: String!) {
  projects(filter: { slugId: { eq: $slug } }) {
    nodes { id teams { nodes { id key states { nodes { id name } } } } }
  }
}

次に、Issue を作成します。

mutation($input: IssueCreateInput!) {
  issueCreate(input: $input) {
    success
    issue { identifier url }
  }
}

$input のフィールドは、title、teamId、projectId、および任意の description、priority(0~4)、stateId です。関連付けを行う場合は、続けて次の操作を実行します。

mutation($input: IssueRelationCreateInput!) {
  issueRelationCreate(input: $input) { success }
}

入力:issueId、relatedIssueId、type(blocks または related)。

ルール

  • イントロスペクションは禁止です。 __type または __schema クエリは絶対に使わないでください。Linear スキーマ全体(約 20 万文字)が返され、コンテキストウィンドウを無駄に消費します。必要なパターンはすべて上記に記載されています。
  • クエリの範囲を絞り、必要なフィールドだけを指定してください。
  • 作業用メモは変更のたびではなく、マイルストーンで同期してください。
  • 状態を遷移させる場合は、必ず最初にチームの状態を取得してください。状態 ID をハードコードしてはいけません。
  • GitHub PR には、汎用 URL 添付より attachmentLinkGitHubPR を優先してください。

コメント