Linear コネクタ

Linear ワークスペースを Brevo に接続し、Tajo を介して顧客向けの Issue トラッキング、製品アップデート通知、開発マイルストーンキャンペーンを実現します。

概要

プロパティ
プラットフォームLinear
カテゴリカスタム
セットアップの複雑さ簡単
公式統合いいえ
同期データIssue、プロジェクト、ユーザー、イベント
API タイプGraphQL API
認証OAuth 2.0 / Personal API Key
ベース URLhttps://api.linear.app/graphql

機能

  • Issue イベント同期 - Issue 作成、更新、完了イベントを Brevo 連絡先タイムラインに転送
  • プロジェクトマイルストーンのトラッキング - プロジェクトが主要マイルストーンに達したときに Brevo キャンペーンをトリガー
  • 顧客 Issue のリンク - サポート可視化のために Linear Issue を Brevo 連絡先に関連付け
  • ラベルベースのセグメンテーション - Linear ラベルを Brevo 連絡先属性にマッピング
  • サイクル分析 - チームパフォーマンスレポート用にスプリント/サイクル完了データを同期
  • Webhook 駆動の自動化 - Linear Webhook を介したリアルタイムイベント転送

前提条件

開始する前に、以下を準備してください。

  1. 管理者アクセス権を持つ Linear ワークスペース
  2. 設定済みの Personal API キーまたは OAuth アプリケーション
  3. API アクセス可能な Brevo アカウント
  4. 有効なサブスクリプションを持つ Tajo アカウント

認証

Linear は Personal API キーと OAuth 2.0 をサポートしています。

オプション 1: Personal API Key

  1. Linear > Settings > API > Personal API keys に移動
  2. Create key をクリック
  3. 「Tajo Integration」と名前を付ける
  4. 生成されたキーをコピー(lin_api_ で始まる)
Terminal window
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

複数のワークスペースを対象とする統合の場合:

  1. linear.app/settings/api/applications で OAuth アプリケーションを作成
  2. リダイレクト URI を設定: https://app.tajo.io/callbacks/linear
  3. スコープをリクエスト: readwriteissues:createcomments:create

GraphQL API

Linear は GraphQL API のみを使用します。すべてのクエリとミューテーションは単一のエンドポイント https://api.linear.app/graphql を経由します。Tajo はすべての GraphQL クエリ構築を自動的に処理します。

Tajo への接続

Terminal window
# 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_UPDATED

API エンドポイント

Linear は単一の GraphQL エンドポイントを使用します。Tajo が使用する主要なクエリとミューテーション:

操作タイプ目的
issuesQueryIssue を一覧表示およびフィルタリング
issueQueryID で単一の Issue を取得
projectsQueryすべてのプロジェクトを一覧取得
cyclesQueryサイクル(スプリント)を一覧取得
teamsQueryワークスペースチームを一覧取得
usersQueryワークスペースメンバーを一覧取得
viewerQuery認証済みユーザー情報を取得
issueCreateMutation新しい Issue を作成
issueUpdateMutation既存の Issue を更新
commentCreateMutationIssue にコメントを追加
webhookCreateMutationWebhook を登録

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 UnauthorizedAPI キーが無効または失効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

接続テスト

Terminal window
tajo connectors test linear
# ✓ GraphQL API 接続成功
# ✓ ワークスペースアクセスを確認
# ✓ チームリスト読み取り可能
# ✓ Issue クエリ操作可能
# ✓ Webhook 登録が利用可能

ベストプラクティス

  1. リアルタイムには Webhook を使用する - ポーリングの代わりに Issue 変更用に Webhook を登録
  2. チームでフィルタリング - API 使用を減らすため関連チームの Issue のみ同期
  3. GraphQL クエリを最適化する - 複雑度制限内に収めるため必要なフィールドのみをリクエスト
  4. ラベルをセグメントにマッピングする - Linear ラベルを使用して Brevo 連絡先セグメンテーションを推進
  5. ページネーションを処理する - 完全なデータのため常に hasNextPage を確認し endCursor を使用
  6. Webhook 署名を検証する - 常に Linear-Signature ヘッダーを検証

セキュリティ

  • API キー認証 - ワークスペースにスコープされた個人キー
  • OAuth 2.0 - マルチワークスペース統合用の安全な認可フロー
  • HTTPS のみ - すべての API 通信は TLS 1.2 以上で暗号化
  • Webhook 署名 - HMAC ベースの署名検証
  • 暗号化されたストレージ - API キーは Tajo で保存時に暗号化
  • SOC 2 コンプライアンス - Linear プラットフォームは SOC 2 Type II 認証取得済み

関連リソース

Subscribe to updates

developer-docs

Drop your email or phone number — we'll send you what matters next.

auto-detect
AIアシスタント

こんにちは!ドキュメントについて何でもお聞きください。