【入門編】LinearのAPIとWebhooks入門!Slack通知や独自カスタムBotを自作して開発フローを自動化する – プロジェクト・ナレッジ管理活用バイブル

こんにちは!開発チームのベロシティを爆発的に高めるためのツール選定やワークフロー設計に、いつも情熱を注いでいる先輩エンジニアです。

皆さんは、日々の開発の中でこんなフラストレーションを感じたことはありませんか?

  • 「GitHubのPRとLinearのタスクのステータス同期を手動でやるのが面倒くさい…」
  • 「Slackに飛んでくる通知が画一的すぎて、本当に重要な情報(緊急のバグやブロッカー)が見落とされがち…」
  • 「社内の特定の業務フローに合わせたカスタム自動化を組み込みたいのに、既存の連携機能では物足りない…」

これらの課題、すべてLinearのGraphQL APIとWebhooksを使いこなすことで、綺麗に、かつエレガントに解決できます。

今回は、数あるタスク管理ツールの中でも圧倒的なモダンさと高速さを誇る「Linear」のAPIとWebhooksの扉を叩き、あなたとチームの開発体験を劇的にアップデートする実践的な方法を一緒に見ていきましょう。

これをマスターすれば、毎日の煩雑な手作業から解放され、本当に価値のあるコードを書く時間に集中できるようになりますよ。

—

1. なぜLinearなのか? — APIファースト設計が生み出す拡張性の高さ

世の中にタスク管理ツールは数あれど、なぜLinearがエンジニアからこれほど熱狂的に支持されているのか。その最大の理由は、「APIファースト」で作られている点にあります。

LinearのUIで操作できることは、基本的にすべて裏側のGraphQL API経由でも実行可能です。つまり、あなたのアイデア次第で、Linearを単なる「タスク管理ボード」から「開発インフラストラクチャの中心ハブ」へと進化させることができるのです。

Linear APIの2大武器

1. GraphQL API: 欲しい情報だけを、1度のリクエストで、正確に取得・操作できる。RESTのように何度もリクエストを投げる必要はありません。
2. Webhooks: Linear内で何かしらのイベント(issueの作成、ステータス変更、コメントなど)が起きた瞬間に、外部のサーバーへリアルタイムに通知を飛ばせる。

この2つを組み合わせることで、「Slackとの高度な連携」「社内独自Botによる自動アサイン」「CI/CDパイプラインとの完全統合」などが自由自在になります。

—

2. 基礎セットアップ:Linear APIの認証と「Hello World」

まずは、LinearのAPIと会話するための第一歩を踏み出しましょう。

Step 1: パーソナルアクセストークンの発行

テストや個人スクリプトの作成には、パーソナルアクセストークン(Personal API Key)を使用するのが一番手軽です。

1. Linearの右上のプロフィールアイコンから Settings を開く。
2. 左メニューの API をクリック。
3. Personal API keys セクションで Create key を押す。
4. 適切なラベル(例: `local-automation-script`)をつけ、必要な権限(Read/Write)を付与してトークンを発行する。
5. 発行されたトークンは二度と表示されないため、安全な場所に必ず保存してください。

Step 2: 最初のGraphQLリクエスト(Hello World)

LinearのAPIエンドポイントは `https://api.linear.app/graphql` です。
ターミナルから `curl` を使って、あなたのワークスペースに存在するチーム一覧を取得してみましょう。

curl -X POST \
https://api.linear.app/graphql \
-H “Authorization: YOUR_PERSONAL_API_KEY” \
-H “Content-Type: application/json” \
-H “Accept: application/json” \
–data ‘{
“query”: “{ teams { nodes { id name key } } }”
}’

うまく設定できていれば、次のようなJSONレスポンスが返ってくるはずです。

{
“data”: {
“teams”: {
“nodes”: [
{
“id”: “uuid-string-here”,
“name”: “Engineering”,
“key”: “ENG”
}
]
}
}
}

おめでとうございます!これでLinearのAPIをプログラムから操作する基盤が整いました。

—

3. Webhooksの設定方法:イベントをリアルタイムでキャッチする

次は、Linear側で起きた出来事を外部(自作のサーバーやスクリプト)に通知する Webhooks の設定です。

Webhooksの仕組み

1. Linearで「Issueが作成された」「ステータスが Done になった」などのイベントが発生。
2. Linearのサーバーが、あらかじめ登録しておいたあなたのサーバーのURL(エンドポイント)へHTTP POSTリクエストを送信。
3. あなたのサーバー側でそのデータを受け取り、Slackに通知したり、別のシステムを叩いたりする。

連携の手順

1. Linearの Settings > API > Webhooks から Create webhook を選択。
2. 通知を受け取りたいエンドポイントのURL(後述するNode.js/ExpressサーバーのURLなど)を入力。
3. 購読したいイベント(例: `Issue` の `create`, `update`)を選択して保存。

—

4. 実践!Slackへの詳細な通知カスタマイズと自動化スクリプト

ここからが本番です。
「Linearの標準Slack連携だと、ちょっと情報量が多くて見づらい」「特定のチームの、特定の優先度のタスクだけメンション付きでSlackに飛ばしたい」といった現場の要望を叶える、Node.js (Express) を使った中継サーバーのサンプルコードをご紹介します。

アーキテクチャのイメージ

[Linear] –(Webhooks POST)–> [自作Expressサーバー] –(Slack Webhook)–> [Slack Channel]

1. プロジェクトの準備

適当なディレクトリでプロジェクトを初期化し、必要なパッケージをインストールします。

mkdir linear-bot-proxy
cd linear-bot-proxy
npm init -y
npm install express body-parser axios dotenv

2. 自動化スクリプトのコード (`server.js`)

以下のコードを `server.js` として保存してください。コード内のコメントをしっかりと読んで、仕組みを理解していきましょう。

require(‘dotenv’).config();
const express = require(‘express’);
const bodyParser = require(‘body-parser’);
const axios = require(‘axios’);

const app = express();
const PORT = process.env.PORT || 3000;

// LinearからのWebhooksはJSON形式で送られてくるため、body-parserでパースする
app.use(bodyParser.json());

// SlackへのWebhook URL(あらかじめSlack側でIncoming Webhooksを作成しておく)
const SLACK_WEBHOOK_URL = process.env.SLACK_WEBHOOK_URL;

app.post(‘/webhook/linear’, async (req, res) => {
const eventType = req.headers[‘linear-event’]; // どんなイベントか (例: Issue)
const data = req.body;

console.log(`[Linear Webhook] Received event: ${eventType}, action: ${data.action}`);

// 例として、新しいIssueが作成された(create)かつ、優先度が「Urgent(緊急)」の場合のみSlackに通知する
if (eventType === ‘Issue’ && data.action === ‘create’) {
const issue = data.data;

// 優先度 1 = Urgent
if (issue.priority === 1) {
const slackMessage = {
text: `🚨 【緊急タスク検知】 🚨\n> <${issue.url}|${issue.title}>\n担当者: <@${issue.assignee?.name || '未割り当て'}>\nチームの皆さん、確認をお願いします!`
};

try {
await axios.post(SLACK_WEBHOOK_URL, slackMessage);
console.log(‘Successfully sent alert to Slack!’);
} catch (error) {
console.error(‘Failed to send message to Slack:’, error.message);
}
}
}

// Linearへは速やかに200 OKを返す(タイムアウトを防ぐため)
res.status(200).send(‘Event received’);
});

app.listen(PORT, () => {
console.log(`Linear automation server is running on port ${PORT}`);
});

3. 環境変数の設定 (`.env`)

同じディレクトリに `.env` ファイルを作成し、ご自身のSlack Webhook URLを設定します。

PORT=3000
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK/URL

4. ローカルでの動作テスト (ngrokの活用)

ローカル環境(`http://localhost:3000`)で動いているサーバーにLinearからWebhooksを飛ばすために、ngrokなどのトンネリングツールを使うのが開発時の定番テクニックです。

別ターミナルで実行
ngrok http 3000

表示されたパブリックURL(例: `https://xxxx-xx-xx.ngrok-free.app/webhook/linear`)をLinearのWebhook設定画面に登録すれば、今すぐローカル環境でテストが可能です!

—

5. さらに先へ:開発フローを自動化するアイデア

この仕組みを手に入れたあなたなら、次のような高度な自動化も簡単に実装できるようになります。

1. GitHub PR連動の自動化:
GitHub ActionsからLinearのGraphQL APIを叩き、PRが作成されたらLinearのステータスを「In Review」に自動変更する。
2. デプロイ完了通知:
本番環境へのデプロイパイプライン(CD)が成功した際に、Linear APIを使って、そのリリースに含まれていたすべてのIssueのステータスを「Complete」に一括移行する。
3. スタックしたタスクの検出:
定期実行スクリプト(Cronなど)でLinear APIをポーリングし、「In Progress」のまま3日以上動いていないタスクを検出してSlackのチャンネルにアラートを飛ばす。

—

まとめ

今回は、LinearのGraphQL APIの基本と、Webhooksを使ったSlack通知のカスタマイズ、そして自作の自動化サーバーの構築方法について解説しました。

  • LinearはAPIファーストで作られており、開発体験を拡張するためのフックが豊富に揃っている。
  • Webhooksを使うことで、Linearのイベントをトリガーにリアルタイムで外部システムを動かせる。
  • ちょっとした中継サーバーを挟むだけで、チームのニーズに合わせた「痒いところに手が届くSlack通知」が簡単に作れる。

最初は少し難しく感じるかもしれませんが、一度この仕組みの心地よさを知ってしまうと、もう手動でのタスク管理には戻れなくなりますよ。ぜひ、あなたのチームのワークフローに合わせて自由にカスタマイズしてみてください。

毎日の開発作業が、よりスマートで楽しいものになることを心から応援しています!

タイトルとURLをコピーしました