Linear コネクタ
Linear ワークスペースを Brevo に接続し、Tajo を介して顧客向けの Issue トラッキング、製品アップデート通知、開発マイルストーンキャンペーンを実現します。
概要
| プロパティ | 値 |
|---|---|
| プラットフォーム | Linear |
| カテゴリ | カスタム |
| セットアップの複雑さ | 簡単 |
| 公式統合 | いいえ |
| 同期データ | Issue、プロジェクト、ユーザー、イベント |
| API タイプ | GraphQL API |
| 認証 | OAuth 2.0 / Personal API Key |
| ベース URL | https://api.linear.app/graphql |
機能
- Issue イベント同期 - Issue 作成、更新、完了イベントを Brevo 連絡先タイムラインに転送
- プロジェクトマイルストーンのトラッキング - プロジェクトが主要マイルストーンに達したときに Brevo キャンペーンをトリガー
- 顧客 Issue のリンク - サポート可視化のために Linear Issue を Brevo 連絡先に関連付け
- ラベルベースのセグメンテーション - Linear ラベルを Brevo 連絡先属性にマッピング
- サイクル分析 - チームパフォーマンスレポート用にスプリント/サイクル完了データを同期
- Webhook 駆動の自動化 - Linear Webhook を介したリアルタイムイベント転送
前提条件
開始する前に、以下を準備してください。
- 管理者アクセス権を持つ Linear ワークスペース
- 設定済みの Personal API キーまたは OAuth アプリケーション
- API アクセス可能な Brevo アカウント
- 有効なサブスクリプションを持つ Tajo アカウント
認証
Linear は Personal API キーと OAuth 2.0 をサポートしています。
オプション 1: Personal API Key
- Linear > Settings > API > Personal API keys に移動
- Create key をクリック
- 「Tajo Integration」と名前を付ける
- 生成されたキーをコピー(
lin_api_で始まる)
curl -X POST https://api.linear.app/graphql \ -H "Authorization: $LINEAR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"query": "{ viewer { id name email } }"}'オプション 2: OAuth 2.0
複数のワークスペースを対象とする統合の場合:
- linear.app/settings/api/applications で OAuth アプリケーションを作成
- リダイレクト URI を設定:
https://app.tajo.io/callbacks/linear - スコープをリクエスト:
read、write、issues:create、comments:create
GraphQL API
Linear は GraphQL API のみを使用します。すべてのクエリとミューテーションは単一のエンドポイント https://api.linear.app/graphql を経由します。Tajo はすべての GraphQL クエリ構築を自動的に処理します。
Tajo への接続
# Personal API Key を使用tajo connectors install linear \ --api-key $LINEAR_API_KEY
# OAuth を使用tajo connectors install linear \ --client-id $LINEAR_CLIENT_ID \ --client-secret $LINEAR_CLIENT_SECRET設定
基本セットアップ
connectors: linear: enabled: true
sync: issues: true projects: true cycles: true users: true
teams: - key: "ENG" sync_to_list: 38 - key: "SUPPORT" sync_to_list: 39
issue_states: - Backlog - Todo - "In Progress" - Done - Canceledフィールドマッピング
Linear のユーザーと Issue データを Brevo 属性にマッピングします。
field_mapping: # ユーザーフィールド id: LINEAR_USER_ID email: email name: FIRSTNAME
# 連絡先イベントにマッピングされた Issue メトリクス last_issue_identifier: LAST_LINEAR_ISSUE last_issue_state: LAST_ISSUE_STATUS last_issue_priority: LAST_ISSUE_PRIORITY total_issues: LINEAR_ISSUE_COUNT
# プロジェクトデータ current_project: ACTIVE_PROJECT team_key: LINEAR_TEAMイベントマッピング
event_mapping: Issue.create: ISSUE_CREATED Issue.update: ISSUE_UPDATED Issue.remove: ISSUE_DELETED Comment.create: COMMENT_ADDED Project.update: PROJECT_UPDATED Cycle.update: CYCLE_UPDATEDAPI エンドポイント
Linear は単一の GraphQL エンドポイントを使用します。Tajo が使用する主要なクエリとミューテーション:
| 操作 | タイプ | 目的 |
|---|---|---|
issues | Query | Issue を一覧表示およびフィルタリング |
issue | Query | ID で単一の Issue を取得 |
projects | Query | すべてのプロジェクトを一覧取得 |
cycles | Query | サイクル(スプリント)を一覧取得 |
teams | Query | ワークスペースチームを一覧取得 |
users | Query | ワークスペースメンバーを一覧取得 |
viewer | Query | 認証済みユーザー情報を取得 |
issueCreate | Mutation | 新しい Issue を作成 |
issueUpdate | Mutation | 既存の Issue を更新 |
commentCreate | Mutation | Issue にコメントを追加 |
webhookCreate | Mutation | Webhook を登録 |
GraphQL クエリの例
query GetIssues($filter: IssueFilter, $first: Int, $after: String) { issues(filter: $filter, first: $first, after: $after) { nodes { id identifier title state { name } priority assignee { email name } labels { nodes { name } } createdAt updatedAt } pageInfo { hasNextPage endCursor } }}コード例
コネクタの初期化
import { TajoClient } from '@tajo/sdk';
const tajo = new TajoClient({ apiKey: process.env.TAJO_API_KEY, brevoApiKey: process.env.BREVO_API_KEY});
await tajo.connectors.connect('linear', { apiKey: process.env.LINEAR_API_KEY});Issue の同期
await tajo.connectors.sync('linear', { type: 'incremental', resources: ['issues'], teams: ['ENG', 'SUPPORT'], since: '2024-01-01'});
const status = await tajo.connectors.status('linear');console.log(status);// {// connected: true,// lastSync: '2024-03-15T18:00:00Z',// issuesTracked: 3200,// projectsMonitored: 8,// usersLinked: 45// }Linear Webhook の処理
app.post('/webhooks/linear', async (req, res) => { const event = req.body;
// Webhook 署名を検証 const signature = req.get('Linear-Signature'); if (!verifyLinearSignature(req.body, signature)) { return res.status(401).send('Unauthorized'); }
await tajo.connectors.handleWebhook('linear', { type: event.type, action: event.action, payload: { issueId: event.data?.id, identifier: event.data?.identifier, title: event.data?.title, state: event.data?.state?.name, assigneeEmail: event.data?.assignee?.email } });
res.status(200).send('OK');});Brevo イベントから Issue を作成
// Brevo 連絡先がリクエストを送信したときに Linear Issue を作成tajo.events.on('contact.event', async (event) => { if (event.name === 'FEATURE_REQUEST') { await tajo.connectors.create('linear', { teamId: 'ENG', title: `Feature Request: ${event.data.subject}`, description: event.data.description, priority: 3, labelIds: ['feature-request'] }); }});レート制限
Linear は GraphQL API にレート制限を適用します。
| 制限タイプ | 値 |
|---|---|
| リクエストレート | API キーあたり 1 時間に 1,500 リクエスト |
| クエリ複雑度 | リクエストあたり 10,000 複雑度ポイント |
| ページネーション | ページあたり最大 250 ノード(デフォルト 50) |
| Webhook | 無制限の受信イベント |
複雑度予算
Linear は複雑度ベースのレート制限システムを使用します。単純なクエリほどポイントが少なくなります。Tajo は必要なフィールドのみをリクエストし、効率的なページネーションを使用することで複雑度を最小化するようにクエリを最適化します。
制限を超えると、Linear は Retry-After ヘッダー付きで 429 Too Many Requests を返します。
トラブルシューティング
一般的な問題
| 問題 | 原因 | 解決策 |
|---|---|---|
| 401 Unauthorized | API キーが無効または失効 | Linear 設定で新しい API キーを生成 |
| クエリエラー | GraphQL 構文が無効 | Linear の API エクスプローラーでクエリを検証 |
| Issue の欠落 | チームアクセスが制限されている | API キーの所有者が対象チームへのアクセス権を持つことを確認 |
| Webhook が発火しない | URL が間違っているか無効化されている | Linear Settings > API > Webhooks で Webhook ステータスを確認 |
| ページネーション不完全 | after カーソルの欠落 | hasNextPage が false になるまでページネーションループを実行 |
デバッグモード
connectors: linear: debug: true log_level: verbose log_queries: true接続テスト
tajo connectors test linear# ✓ GraphQL API 接続成功# ✓ ワークスペースアクセスを確認# ✓ チームリスト読み取り可能# ✓ Issue クエリ操作可能# ✓ Webhook 登録が利用可能ベストプラクティス
- リアルタイムには Webhook を使用する - ポーリングの代わりに Issue 変更用に Webhook を登録
- チームでフィルタリング - API 使用を減らすため関連チームの Issue のみ同期
- GraphQL クエリを最適化する - 複雑度制限内に収めるため必要なフィールドのみをリクエスト
- ラベルをセグメントにマッピングする - Linear ラベルを使用して Brevo 連絡先セグメンテーションを推進
- ページネーションを処理する - 完全なデータのため常に
hasNextPageを確認しendCursorを使用 - Webhook 署名を検証する - 常に
Linear-Signatureヘッダーを検証
セキュリティ
- API キー認証 - ワークスペースにスコープされた個人キー
- OAuth 2.0 - マルチワークスペース統合用の安全な認可フロー
- HTTPS のみ - すべての API 通信は TLS 1.2 以上で暗号化
- Webhook 署名 - HMAC ベースの署名検証
- 暗号化されたストレージ - API キーは Tajo で保存時に暗号化
- SOC 2 コンプライアンス - Linear プラットフォームは SOC 2 Type II 認証取得済み