mcpField
L
linear

linear

github.com/openai生産性27.9k222 回インストール6 週間前に更新
リポジトリ

linear について

linearは、Symphonyのapp-serverセッションでLinear GraphQLを直接操作するスキルです。Linearデータを扱う人向けに、セッション設定済みの認証を使い、Issueやコメント、添付ファイルの管理とスキーマ確認を行えます。

主な機能

  1. 01範囲を絞ったGraphQLクエリとミューテーション
  2. 02キーや識別子によるIssue検索
  3. 03Issueの状態とコメントの更新
  4. 04GitHub PRとURLのリンク
  5. 05GraphQLスキーマ操作の確認

活用シーン

  1. 01Symphonyセッション中のIssue詳細の検索
  2. 02チームの状態を確認してからIssueを移動
  3. 03コメントや添付ファイルの追加・編集

インストール

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

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

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

詳細

Linear GraphQL

Symphony の app-server セッション中に、Linear GraphQL を直接操作する場合にこのスキルを使用します。

主なツール

Symphony の app-server セッションで提供される linear_graphql クライアントツールを使用します。 このツールは、セッション用に Symphony で設定された Linear 認証を再利用します。

ツールの入力:

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

ツールの動作:

  • 1 回のツール呼び出しにつき、GraphQL オペレーションを 1 つ送信します。
  • トップレベルの errors 配列がある場合は、ツール呼び出し自体が完了していても、GraphQL オペレーションは失敗したものとして扱います。
  • クエリとミューテーションの対象を絞り、必要なフィールドのみを指定します。

不慣れなオペレーションの確認

不慣れなミューテーション、入力型、オブジェクトのフィールドが必要な場合は、linear_graphql を使って対象を絞ったイントロスペクションを行います。

ミューテーション名の一覧:

query ListMutations {
  __type(name: "Mutation") {
    fields {
      name
    }
  }
}

特定の入力オブジェクトの確認:

query CommentCreateInputShape {
  __type(name: "CommentCreateInput") {
    inputFields {
      name
      type {
        kind
        name
        ofType {
          kind
          name
        }
      }
    }
  }
}

一般的なワークフロー

キー、識別子、または ID でイシューをクエリする

次の順に試します。

  • MT-686 のようなチケットキーがある場合は、issue(id: $key) から始めます。
  • 識別子による検索が必要な場合は、issues(filter: ...) に切り替えます。
  • 内部イシュー ID を取得したら、対象を絞って読み取るため、issue(id: $id) を優先します。

イシューキーで検索:

query IssueByKey($key: String!) {
  issue(id: $key) {
    id
    identifier
    title
    state {
      id
      name
      type
    }
    project {
      id
      name
    }
    branchName
    url
    description
    updatedAt
    links {
      nodes {
        id
        url
        title
      }
    }
  }
}

識別子フィルターで検索:

query IssueByIdentifier($identifier: String!) {
  issues(filter: { identifier: { eq: $identifier } }, first: 1) {
    nodes {
      id
      identifier
      title
      state {
        id
        name
        type
      }
      project {
        id
        name
      }
      branchName
      url
      description
      updatedAt
    }
  }
}

キーを内部 ID に解決:

query IssueByIdOrKey($id: String!) {
  issue(id: $id) {
    id
    identifier
    title
  }
}

内部 ID が分かった後にイシューを読み取る:

query IssueDetails($id: String!) {
  issue(id: $id) {
    id
    identifier
    title
    url
    description
    state {
      id
      name
      type
    }
    project {
      id
      name
    }
    attachments {
      nodes {
        id
        title
        url
        sourceType
      }
    }
  }
}
イシューのチームワークフロー状態をクエリする

イシューの状態を変更する際に正確な stateId が必要な場合は、変更前にこれを使用します。

query IssueTeamStates($id: String!) {
  issue(id: $id) {
    id
    team {
      id
      key
      name
      states {
        nodes {
          id
          name
          type
        }
      }
    }
  }
}
既存のコメントを編集する

linear_graphql を通じて commentUpdate を使用します。

mutation UpdateComment($id: String!, $body: String!) {
  commentUpdate(id: $id, input: { body: $body }) {
    success
    comment {
      id
      body
    }
  }
}
コメントを作成する

linear_graphql を通じて commentCreate を使用します。

mutation CreateComment($issueId: String!, $body: String!) {
  commentCreate(input: { issueId: $issueId, body: $body }) {
    success
    comment {
      id
      url
    }
  }
}
イシューを別の状態に移動する

移動先の stateId を指定して issueUpdate を使用します。

mutation MoveIssueToState($id: String!, $stateId: String!) {
  issueUpdate(id: $id, input: { stateId: $stateId }) {
    success
    issue {
      id
      identifier
      state {
        id
        name
      }
    }
  }
}
GitHub PR をイシューに添付する

PR をリンクする場合は、GitHub 固有の添付ミューテーションを使用します。

mutation AttachGitHubPR($issueId: String!, $url: String!, $title: String) {
  attachmentLinkGitHubPR(
    issueId: $issueId
    url: $url
    title: $title
    linkKind: links
  ) {
    success
    attachment {
      id
      title
      url
    }
  }
}

通常の URL 添付でよく、GitHub 固有のリンクメタデータが不要な場合は、次を使用します。

mutation AttachURL($issueId: String!, $url: String!, $title: String) {
  attachmentLinkURL(issueId: $issueId, url: $url, title: $title) {
    success
    attachment {
      id
      title
      url
    }
  }
}
スキーマの確認で使用するイントロスペクションのパターン

正確なフィールドやミューテーションの形式が不明な場合は、次を使用します。

query QueryFields {
  __type(name: "Query") {
    fields {
      name
    }
  }
}
query IssueFieldArgs {
  __type(name: "Query") {
    fields {
      name
      args {
        name
        type {
          kind
          name
          ofType {
            kind
            name
            ofType {
              kind
              name
            }
          }
        }
      }
    }
  }
}
コメントに動画をアップロードする

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

  1. fileUpload を使って linear_graphql を呼び出し、uploadUrl、assetUrl、必要なアップロードヘッダーを取得します。
  2. fileUpload から返されたヘッダーをそのまま指定し、curl -X PUT でローカルファイルのバイトデータを uploadUrl にアップロードします。
  3. commentCreate(または commentUpdate)を使って linear_graphql を再度呼び出し、コメント本文に取得した assetUrl を含めます。

使用するミューテーション:

mutation FileUpload(
  $filename: String!
  $contentType: String!
  $size: Int!
  $makePublic: Boolean
) {
  fileUpload(
    filename: $filename
    contentType: $contentType
    size: $size
    makePublic: $makePublic
  ) {
    success
    uploadFile {
      uploadUrl
      assetUrl
      headers {
        key
        value
      }
    }
  }
}

使用ルール

  • コメントの編集、アップロード、アドホックな Linear API クエリには linear_graphql を使用します。
  • すでに把握している情報に合致するものの中で、最も対象を絞ったイシュー検索方法を優先します。 キー -> 識別子検索 -> 内部 ID の順に試します。
  • 状態を遷移させる場合は、まずチームの状態を取得し、ミューテーション内で状態名をハードコードせず、正確な stateId を使用します。
  • GitHub PR を Linear イシューにリンクする場合は、汎用 URL 添付より attachmentLinkGitHubPR を優先します。
  • GraphQL アクセス用に、新たな生トークンを使うシェルヘルパーを追加しないでください。
  • アップロードでシェルを使う必要がある場合は、fileUpload から返された署名付きアップロード URL に限って使用してください。これらの URL には、必要な認証情報がすでに含まれています。

コメント