汎用コネクタの構築:SaaS のロングテール

SchemaBridge Team · 2026-01-22 · SaaS, Integration, Webhooks

公式 SDK のないレガシー SaaS やニッチな SaaS を接続する。汎用的な Webhook パターン。

SaaS のロングテール:「ビッグ 10」の API の先へ

Stripe、Salesforce、AWS 向けの統合を構築するなら、あなたは幸運です。これらのプロバイダーには一流のドキュメント、12 言語の公式 SDK、そして Stack Overflow 上の巨大なコミュニティがあります。接続は解決済みの問題です。npm install stripe を実行し、数行のコードをコピーすれば完了です。

しかし、現代の企業は「ビッグ 10」の SaaS プラットフォームだけで動いているわけではありません。ニッチな SaaS プロバイダーのロングテール、業界特化型のバーティカル製品、そして時代に取り残されたレガシーシステムの上で動いています。ベトナムの地域給与計算プロバイダー、ドイツの医療機器専門クラウド、あるいは 2012 年から API ドキュメントが更新されていないレガシーな物流 ERP と連携する必要があるかもしれません。

こうしたプロバイダーに SDK があることはまれです。ドキュメントはパスワード保護された PDF や、メールでアクセスを申請しなければならない非公開 Wiki であることが多く、認証方式も標準的ではありません(独自ヘッダー、ローテーションする IP ホワイトリスト、SOAP ベースのセッショントークンなど)。

多くの統合プロジェクトが行き詰まるのはここです。独自のボイラープレート、壊れやすい XML パーサー、独自の認証ハンドラーという沼に沈んでいきます。チームはこれらのサービス向けの「ラッパー」の構築に何か月も費やし、結局その運用保守が悪夢であることに気づくのです。

汎用コネクタパターン:設計段階からスキーマレス

SchemaBridge では別の道を提唱しています。独自ラッパーよりも設定を、です。これを可能にするプリミティブが GATEWAY vertex、つまりワークフローグラフ内の設定可能な HTTP クライアントステップです。再利用可能な設定(ベース URL、ヘッダー、認証)は、ワークスペースの custom app として一度登録しておけば、それを使うすべての gateway に事前入力されます。

このモデルにおける汎用コネクタとは、新しいコードを書くことなく、ニッチなサービス向けに「パラメータ化」された gateway にすぎません。統合の問題を「コーディングの問題」から「設定の問題」へと変えるのです。

汎用コネクタの構造

SchemaBridge では、呼び出しは gateway vertex の設定によって記述されます。設定が定義するのはインタラクションの「形」であり、コードではありません。

{
  "id": "fetch_order",
  "type": "GATEWAY",
  "config": {
    "url": "= 'https://api.localpayroll.vn/v1/orders/' & payload.id",
    "method": "GET",
    "headers": {
      "X-VN-Auth-Token": "{{ secrets.VN_PAYROLL_TOKEN }}"
    }
  }
}

url は受信ペイロードに対して評価される JSONata 式で、{{ secrets.VN_PAYROLL_TOKEN }} は暗号化されたワークスペースシークレットへの参照です。シークレットはリクエストがプラットフォームを出る時点で初めて解決されるため、トークンがワークフロー定義に現れることはありません。gateway は HTTP(GET、POST、PUT、DELETE)を話し、レスポンスを response.statusCode と response.body として返します。JSON のボディはパース済みで届き、それ以外は生の文字列として届きます。そのレスポンスの解釈(何を「承認」とみなすか、エラーコードを取り出すなど)は、JSONata で記述された下流の TRANSFORMATION ステップの役割です。

「コネクタロジック」を設定に移すことで、プロバイダーごとの独自マイクロサービスが不要になります。シークレットの注入と一時的な障害のリトライはエンジンが処理します。あなたが用意するのは「座標」だけです。

汎用的な Webhook 取り込み:仕様がない?問題ありません

Webhook の取り込みはインターネットの無法地帯です。プロバイダーごとにデータの送り方がまったく異なります。

エッジでの正規化

SchemaBridge の entry point(ワークフローを開始する Webhook URL)は設計段階からスキーマレスです。事前に宣言されたスキーマなしで、任意の JSON オブジェクトのボディを受け付けます。

1. 契約なしでの取り込み:ボディはそのまま保存されます(リクエストのヘッダーは呼び出しの認証にのみ使われます)。エッジではスキーマに対する検証を一切行わないため、プロバイダーがフィールドを追加したり名前を変更したりしてもイベントが弾かれることはありません(「書き込み時検証」の脆さを回避します)。

2. 遅延変換:JSONata を使い、ワークフローのルーティングに必要な特定のフィールドだけを抽出します。

正直に言えば制約が 1 つあります。ボディは JSON でなければなりません。XML やフォームエンコードされたデータを送信するプロバイダーの場合は、entry point の前に、生のペイロードを JSON エンベロープで包む小さなリレーが必要です。

双方向ブリッジ:「受領してから取得する」パターン

ロングテールのプロバイダーの多くは不透明な Webhook を送ってきます。何かが起きたことは教えてくれても、何が起きたかは教えてくれません。受け取る Webhook は { "event": "order_updated", "id": 12345 } のようなものです。実際のデータを得るには、相手の API を呼び返す必要があります。

これをスクリプトで手作りすると、競合状態と孤立イベントが起きやすくなります。

SchemaBridge はこれを永続的なライフサイクルにします。

1. Entry Point(受信):ID を含む Webhook を受け取り、実行(run)の開始として永続化します。

2. Delay(任意):永続的な DELAY ステップ(例:delaySeconds: 5)で、プロバイダー側が整合するまでの時間を確保します。

3. Gateway(送信):プロバイダーの API を呼び出し、オブジェクト全体を取得します。

エンジンがこれをオーケストレーションするため、「取得」呼び出しでの一時的な障害(5xx、429、ネットワークエラー)は指数バックオフでリトライされ、プロバイダーが過負荷の場合はその後さらに数回、アドミッション制御を通じて再ディスパッチされます(maxAutoRetries、デフォルトは 3)。それを過ぎてもプロバイダーがダウンしたままなら、実行は目に見える形で失敗し、元の Webhook ペイロードは永続化されたまま残ります。プロバイダーが復旧したら、失敗したステップから再試行できます。従来のスクリプトなら単にクラッシュし、元のイベントを失ってしまうでしょう。

汎用コネクタのためのエキスパートチェックリスト

ロングテールのプロバイダー向けに汎用アダプターを構築する際は、次の機能を確認してください。

1. 認証の柔軟性:独自ヘッダー、暗号化ストアからのシークレット注入、ローテーションするトークンに対応できるか?

2. フォーマット耐性:プロバイダーが JSON 以外を返したとき、パーサーのクラッシュではなく、生のレスポンスにアクセスできるか?

3. 遅延バインディング:JSONata のような言語を使い、取り込み後にデータをマッピングできるか?

4. リトライと復旧:一時的な障害は自動でリトライされるか?障害がリトライよりも長引いた場合、後でそのステップを再実行できるようにイベントが保持されるか?

5. 監査可能性:調査が必要になったとき、認証情報をワークフロー定義に書き込むことなく、実際の呼び出しのリクエストと生のレスポンスを確認できるか?

結論:API からの締め出しの終わり

つながった世界では、どのプロバイダーも統合するには「小さすぎる」「古すぎる」ということがあってはなりません。独自コードのラッパーから設定可能な汎用コネクタへ移行することで、SaaS のロングテールへの参入障壁をなくします。基盤となる API がどれほど断片化していても、エコシステム全体を単一の視覚的な状態へとつなぐ力が手に入ります。「ロングテール」を負債から資産へと変えるのです。

同じ議論はいまやエージェントにも当てはまります。既存の API から MCP サーバーを構築する方法をご覧ください。

「Building the Bridge」シリーズの関連記事:コンプライアンスと監査。

詳しく見る