こんにちは!開発チームのベロシティを爆発的に高めるためのツール選定やワークフロー設計に、いつも情熱を注いでいる先輩エンジニアです。
皆さんは、日々の開発の中でこんなフラストレーションを感じたことはありませんか?
- 「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通知」が簡単に作れる。
最初は少し難しく感じるかもしれませんが、一度この仕組みの心地よさを知ってしまうと、もう手動でのタスク管理には戻れなくなりますよ。ぜひ、あなたのチームのワークフローに合わせて自由にカスタマイズしてみてください。
毎日の開発作業が、よりスマートで楽しいものになることを心から応援しています!