ドキュメントを閲覧

運営元

ProjectConnector で end-user accounts を接続する

product のすべての user が自分の provider account を接続する必要がある場合は、ProjectConnector を使用します。backend は各 user を externalUserId で識別し、authorization links を作成し、connected account IDs を保存して、その user の actions を実行します。

この方法では、oo_proj_… 形式の project API key を使います。Connector が使用する personal api_… key とは別のものです。

自分の Agent に接続する

ProjectConnector は接続サービスへの呼び出しを提供します。OOMOL が外部サービスの認可、認証情報の保管、token 更新、操作の実行を処理します。製品側ではユーザー認証、アカウントの紐付け、Agent のツール handler を実装します。

Agent がバックエンドで動く場合、ツール handler から ProjectConnector を直接呼び出せます。ユーザーの端末で動く場合は、製品の認証済みバックエンドへツールリクエストを送信します。Project API key は常にバックエンドに保管します。

ホスト型の個人・チーム用 MCP 設定は OOMOL のユーザーとチームの接続用です。SaaS ユーザーのアカウントには ProjectConnector または SaaS HTTP API を使用します。MCP が必要なクライアントには、製品ユーザーを認証する MCP アダプターをバックエンドに用意します。

project を準備する

runtime flow を実装する前に、OOMOL Console で次の resources を作成します。

  1. Connector project。
  2. users が接続できる service ごとの provider config。
  3. backend secret manager に保存する project API key。

Connector for SaaS ガイドでは、Console の設定と対応する REST requests を説明しています。

インストールと初期化

npm install @oomol-lab/connector
import { ProjectConnector } from "@oomol-lab/connector";

const project = new ProjectConnector({
  apiKey: process.env.OOMOL_PROJECT_API_KEY!,
});

OAuth authorization request を作成する

自分の user database にある安定した ID を externalUserId として使用します。

const request = await project.connect.oauth("user_42", {
  service: "gmail",
  connectionName: "work",
  returnUri: "https://app.example.com/connected",
});

redirectUserTo(request.authorizationUrl);

user が認証した後、request が final state になるまで待ちます。

const connected = await project.waitForConnection(request);

if (connected.status === "connected") {
  saveConnectedAccountId(connected.connectedAccountId);
}

project.connect.oauth は、user の操作を待つ authorization request を返します。認証が成功した後にだけ、waitForConnection が request result 内の connectedAccountId を返します。

API-key provider と custom-credential provider には、connect.apiKey または connect.customCredential を使用します。これらの method は credential を検証し、connected account を同期的に返します。

1 人の user として実行する

const result = await project.execute(
  "user_42",
  "gmail.search_threads",
  { query: "is:unread" },
  { connectedAccountId: "ca-1" },
);

取得済みの場合は connectedAccountId を渡してください。特定の account を選択でき、最新の active account に依存せずに済みます。product が安定した aliases を使用する場合は、connectionName も利用できます。

同じ request または job に複数の操作が含まれる場合は、forUser で user を一度 bind します。

Slack の例では、このユーザーに「work」という名前の接続が必要です。バックエンドに保存した該当 Slack アカウントの接続名を使ってください。forUser が固定するのはユーザーだけです。アカウントは execute のオプションで選択します。

const user = project.forUser("user_42");
await user.execute(
  "slack.post_message",
  { channel: "#general", text: "shipped" },
  { connectionName: "work" },
);

操作を Agent のツールにする

以下はフレームワークに依存しないツール記述です。schema と handler を利用する Agent フレームワークに登録してください。作成前にリクエストを認証し、ユーザーの操作権限を確認して、データベースからそのユーザーの Gmail アカウントを取得します。currentUser.id はバックエンドが確定した external user ID、storedAccount.connectedAccountId はそのユーザーのアカウントです。どちらもモデルの引数から取得しません。

const searchMailTool = {
  name: "search_mail",
  description: "Search the current user's Gmail threads.",
  inputSchema: {
    type: "object",
    properties: { query: { type: "string" } },
    required: ["query"],
    additionalProperties: false,
  },
  execute: async (input: { query: string }) =>
    project.forUser(currentUser.id).execute(
      "gmail.search_threads",
      input,
      { connectedAccountId: storedAccount.connectedAccountId },
    ),
};

handler を呼ぶ前に schema で引数を検証します。モデルは検索条件だけを渡します。製品に必要な操作から始め、ユーザーが接続したサービスで絞り込んでください。SDK が全 provider の操作を Agent ツールとして自動登録することはありません。

product boundaries を明確に保つ

product は自分の users を認証し、利用できる providers と actions を管理します。project API key は backend に保管し、一貫した externalUserId を渡し、返された account selector を対応する product user と一緒に保存してください。

authorization-request と connected-account の lifecycle fields、action ごとの precise types、errors、retries、waiting options、完全な ProjectConnector API については、TypeScript SDK referenceを参照してください。

始める

始める