---
title: "Linear コネクタ"
description: "Tajo を介して Linear の Issue、プロジェクト、チームアクティビティデータを Brevo と同期するための完全な Linear 統合ガイド。"
url: https://tajo.io/jp/docs/connectors/custom/linear/
markdown: https://tajo.io/jp/docs/connectors/custom/linear.md
lang: ja-JP
robots: noindex
---

先行利用を申し込む

お名前と会社のメールアドレスを入力してください。Tajoへのアクセス申請を確認するためのリンクをメールでお送りします。

# Linear コネクタ

コネクターのステータス: 予定 まだ構築されていません。Tajo は現在このコネクターを実行していません。

| 送信元フィールド | 送信先フィールド | サンプル値 |
| --- | --- | --- |
| `record.id` | `source_id` | `record_1042` |
| `record.updated_at` | `updated_at` | `2026-10-18T08:00:00Z` |
| `record.value` | `value` | `sample_value` |

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 を介したリアルタイムイベント転送

## 前提条件

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

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_` で始まる)

```bash
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](https://linear.app/settings/api/applications) で OAuth アプリケーションを作成
2. リダイレクト URI を設定: `https://app.tajo.io/callbacks/linear`
3. スコープをリクエスト: `read`、`write`、`issues:create`、`comments:create`

GraphQL API

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

### Tajo への接続

```bash
# 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
```

## 設定

### 基本セットアップ

```yaml
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 属性にマッピングします。

```yaml
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
```

### イベントマッピング

```yaml
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 が使用する主要なクエリとミューテーション:

| 操作 | タイプ | 目的 |
| --- | --- | --- |
| `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 クエリの例

```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
    }
  }
}
```

## コード例

### コネクタの初期化

```javascript
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 の同期

```javascript
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 の処理

```javascript
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 を作成

```javascript
// 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 になるまでページネーションループを実行 |

### デバッグモード

```yaml
connectors:
  linear:
    debug: true
    log_level: verbose
    log_queries: true
```

### 接続テスト

```bash
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 認証取得済み

## 関連リソース

- [GitHub コネクタ](https://tajo.io/jp/docs/connectors/custom/github)
- [Jira コネクタ](https://tajo.io/jp/docs/connectors/custom/jira)
- [Notion コネクタ](https://tajo.io/jp/docs/connectors/custom/notion)
- [Brevo Contacts API](https://tajo.io/jp/docs/contact-management)
