AIエージェントを本番運用しようとした瞬間に直面するのが「認証の壁」だ。SlackのOAuth、GmailのAPIキー、NotionのトークンをエージェントにどうSecureに渡すか――そのたびに独自実装を書いていては時間がいくらあっても足りない。
Composioはこの問題をまるごと解決するSaaS統合プラットフォームだ。GitHub Stars 28k超(2026年5月時点)、1000+ツールキット、OAuth/APIキー/JWTの自動管理、そしてLangChain・CrewAI・AutoGenへの直接組み込み。エージェントがSlackにメッセージを送り、Gmailを読み取り、GitHub Issueを作る、その全工程を数行のコードで実現できる。
本記事ではインストールから始め、Auth設定・Toolset構成・Triggers・マルチユーザー対応・セキュリティまで、実務で使える実装パターンを一通り解説する。
目次
Composioとは何か
Composioはエージェント向けに設計されたSaaS統合レイヤーだ。大雑把に言えば「エージェントとあらゆるSaaS APIの間に立つ仲介プラットフォーム」で、以下を提供する。
- 1000+ツールキット: Slack・Gmail・GitHub・Notion・Linear・Salesforce・Jiraほか
- 認証の完全管理: OAuth 2.0フロー・トークンリフレッシュ・APIキー保管をComposioが担う
- メタツールによる動的ディスカバリ: エージェントが実行時に必要なツールを検索・取得できる
- Triggers: Webhook/Polling で外部イベントをエージェントに届ける
- マルチユーザー対応: ユーザーごとに独立したOAuth接続を持てる
ライセンスはMIT、GitHubリポジトリは ComposioHQ/composio。公式ドキュメントとPyPI composioも整備されており、PythonとTypeScript両方のSDKが揃っている(Python 3.10+、Node.js対応)。
SmitheryとComposio――レジストリとAPIプラットフォームの違い
当サイトでも解説したSmitheryはMCP Serverの「発見・管理レジストリ」だ。一方ComposioはSaaS APIへの「統合実行プラットフォーム」であり、役割が異なる。
| Smithery | Composio | |
|---|---|---|
| 主な役割 | MCPサーバーの検索・インストール管理 | SaaS APIへの統合・実行・認証管理 |
| プロトコル | MCP(Model Context Protocol) | REST API + ネイティブツール + MCP |
| 認証管理 | サーバーごとに別途設定 | OAuth/APIキーを一元管理 |
| Triggers | なし | Webhook/Polling対応 |
| マルチユーザー | 基本単一ユーザー | per-user OAuth対応 |
| 向いている用途 | 開発者ツールの接続・プロトタイプ | 本番SaaS統合・顧客向けエージェント |
実務では「Smitheryでツールを発見し、Composioで本番統合する」という組み合わせが自然な流れになる。ComposioはMCPプロトコルにも対応しているため、Smithery経由で接続したMCPクライアントからComposioのツール群を利用することもできる。
インストールとクイックスタート
まずパッケージをインストールする。フレームワーク統合用のサブパッケージも一緒に入れておくと後が楽だ。
# Python(コアSDK)
pip install composio
# LangChain統合
pip install composio-langchain
# CrewAI統合
pip install composio-crewai
# TypeScript(npm)
npm install @composio/core
環境変数を設定する。
export COMPOSIO_API_KEY="your_composio_api_key"
export OPENAI_API_KEY="your_openai_api_key" # LLM側のキー
最小構成のクイックスタート(Python)。
from composio import Composio
composio = Composio()
# ユーザーセッション作成
session = composio.create(user_id="user_123")
# 利用可能なツールを取得
tools = session.tools()
print(f"取得したツール数: {len(tools)}")
TypeScript版。
import { Composio } from "@composio/core";
const composio = new Composio();
// ユーザーセッション作成
const session = await composio.create("user_123");
// ツール取得
const tools = await session.tools();
console.log(`取得したツール数: ${tools.length}`);
Auth管理(OAuth / APIキーの自動処理)
ComposioがもっともエージェントのDXを改善するのがここだ。通常、SlackのOAuth 2.0フローを自前実装すると、認可URL生成・コールバック処理・トークン保管・リフレッシュ処理と数百行のコードが必要になる。Composioはこれを完全に抽象化する。
ユーザーにOAuth接続を促す場合のフロー(Python)。
from composio import Composio
composio = Composio()
session = composio.create(user_id="user_alice")
# Slack接続のURL生成
connection_request = session.connections.initiate("slack")
print(f"接続URL: {connection_request.redirect_url}")
# → このURLをユーザーに渡してSlack OAuthを完了してもらう
# 接続状態の確認
connections = session.connections.list()
for conn in connections:
print(f"接続済み: {conn.toolkit} / ステータス: {conn.status}")
重要な設計原則として、LLM(エージェント)はユーザーのOAuthトークンを直接参照しない。ComposioがVaultでトークンを管理し、エージェントはComposio API経由でのみツールを呼び出す。これをbrokered credential patternと呼ぶ。
Toolset設定(Slack・Gmail・Notion・Linear)
Composioのツールキットは TOOLKIT_ACTION という命名規則に従う。たとえばGitHubにIssueを作成するなら GITHUB_CREATE_ISSUE、Slackにメッセージをポストするなら SLACK_SEND_MESSAGE だ。
セッションから特定ツールキットのツールに絞り込む方法(TypeScript)。
import { Composio } from "@composio/core";
const composio = new Composio();
const session = await composio.create("user_alice");
// Slackツールキットのツールのみ取得
const slackTools = await session.tools({
toolkits: ["slack"],
});
// 複数ツールキットをまとめて
const tools = await session.tools({
toolkits: ["slack", "gmail", "notion", "linear"],
});
console.log("利用可能なツール:", tools.map((t) => t.name));
エージェントが動的にツールを検索するメタツールパターン(LLMが実行時に必要なツールを発見する)。
from composio import Composio
composio = Composio()
session = composio.create(user_id="user_alice")
# メタツール経由でSlack関連ツールを検索
results = session.tools.search("Slackにメッセージを送信する")
for tool in results:
print(f"発見: {tool.slug} - {tool.description}")
LangChain / CrewAI / AutoGen 連携
Composioの強みのひとつが主要AIフレームワークへのネイティブ統合だ。LangChain・CrewAI・AutoGen・OpenAI Function Calling に対応している。
LangChain Agent へのComposioツール組み込み。
from composio_langchain import ComposioToolSet
from langchain.agents import AgentExecutor, create_openai_tools_agent
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
# ComposioのLangChain用ToolSet
composio_toolset = ComposioToolSet(api_key="your_composio_api_key")
# SlackとGmailのツール取得
tools = composio_toolset.get_tools(apps=["SLACK", "GMAIL"])
# LangChain Agentに組み込み
llm = ChatOpenAI(model="gpt-4o")
prompt = ChatPromptTemplate.from_messages([
("system", "あなたは業務効率化エージェントです。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}"),
])
agent = create_openai_tools_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({
"input": "Slackの#generalチャンネルに本日のGmail未読件数を投稿してください"
})
print(result["output"])
CrewAI Agent との統合(composio-crewai使用)。
from composio_crewai import ComposioToolSet, App
from crewai import Agent, Task, Crew
# ComposioのCrewAI用ToolSet
composio_toolset = ComposioToolSet()
tools = composio_toolset.get_tools(apps=[App.GITHUB, App.NOTION])
# CrewAIエージェントに組み込み
developer_agent = Agent(
role="開発タスク管理者",
goal="GitHubとNotionを連携してタスクを管理する",
backstory="プロジェクト管理に精通したAIアシスタント",
tools=tools,
verbose=True,
)
task = Task(
description="今週のGitHub Issue一覧をNotionデータベースに同期してください",
agent=developer_agent,
expected_output="同期完了したIssueの件数とNotionページURL",
)
crew = Crew(agents=[developer_agent], tasks=[task])
result = crew.kickoff()
print(result)
カスタムTool追加
既存ツールキットにないAPIや社内システムは、カスタムツールとして追加できる。ツールはメモリ上に定義するため、アプリケーション再起動で消える点に注意(永続化が必要なら起動時に毎回登録する)。
from composio import Composio
from pydantic import BaseModel
composio = Composio()
# カスタムツールの入力スキーマ
class FetchInternalDataInput(BaseModel):
endpoint: str
filters: dict = {}
# スタンドアロンカスタムツール(認証不要)
@composio.tools.register
def fetch_internal_data(input: FetchInternalDataInput) -> dict:
"""社内データAPIからデータを取得する"""
# 実際の社内API呼び出し実装
import requests
resp = requests.get(
f"https://internal-api.example.com/{input.endpoint}",
params=input.filters,
headers={"Authorization": "Bearer internal_token"}
)
return resp.json()
TypeScript版のカスタムツール定義。
import { Composio } from "@composio/core";
import { z } from "zod";
const composio = new Composio();
const session = await composio.create("user_123");
// カスタムツール登録
const customTool = session.tools.create({
slug: "INTERNAL_FETCH_DATA",
name: "社内データ取得",
description: "社内APIからフィルタ条件に基づいてデータを取得する",
inputSchema: z.object({
endpoint: z.string().describe("取得するAPIエンドポイント"),
filters: z.record(z.string()).optional().describe("フィルタ条件"),
}),
execute: async ({ endpoint, filters }) => {
const url = new URL(`https://internal-api.example.com/${endpoint}`);
if (filters) {
Object.entries(filters).forEach(([k, v]) => url.searchParams.set(k, v));
}
const res = await fetch(url.toString());
return res.json();
},
});
Triggers(Webhook / Polling)
TriggersはエージェントをイベントドリブンにするComposioの機能だ。外部SaaSで何かが起きたとき(GitHubにPRが作られた、Gmailに新着メールが届いた等)、エージェントにイベントを届ける。
2種類のトリガーが存在する。
- Webhook トリガー: GitHub・SlackなどWebhook送信に対応したサービス向け。リアルタイムでイベントが届く
- Polling トリガー: WebhookをサポートしないGmail等向け。Composioが定期的にポーリング(最短15分間隔、カスタムOAuth利用時は1分まで短縮可能)
from composio import Composio
composio = Composio()
session = composio.create(user_id="user_alice")
# GitHub PRイベントのトリガー作成
trigger = session.triggers.create(
trigger_type="GITHUB_PULL_REQUEST_EVENT",
config={
"owner": "your-org",
"repo": "your-repo",
}
)
print(f"Trigger ID: {trigger.id}")
# Webhook エンドポイントでイベントを受信(FastAPI例)
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/composio/webhook")
async def handle_trigger(request: Request):
payload = await request.json()
event_type = payload.get("trigger_type")
data = payload.get("data", {})
if event_type == "GITHUB_PULL_REQUEST_EVENT":
pr_title = data.get("title")
pr_url = data.get("html_url")
# エージェントにイベントを渡してレビュー開始
print(f"新PR検知: {pr_title} - {pr_url}")
return {"status": "ok"}
マルチユーザー対応(per-user OAuth)
SaaSプロダクトとしてエージェントを提供する場合、ユーザーごとに独立したOAuth接続が必要になる。Composioは user_id パラメータによって各ユーザーのクレデンシャルを分離管理する。
from composio import Composio
from fastapi import FastAPI
app = FastAPI()
composio = Composio()
@app.post("/connect/slack/{user_id}")
async def connect_slack(user_id: str):
"""ユーザーにSlack OAuth接続を促すURLを返す"""
session = composio.create(user_id=user_id)
connection = session.connections.initiate("slack")
return {"oauth_url": connection.redirect_url}
@app.post("/agent/run/{user_id}")
async def run_agent(user_id: str, task: str):
"""ユーザー固有のCredentialでエージェントを実行"""
session = composio.create(user_id=user_id)
tools = await session.tools(toolkits=["slack"])
# このtoolsはuser_idのOAuthトークンで動作する
# 他ユーザーのトークンと混在しない
result = await run_agent_with_tools(tools, task)
return {"result": result}
Composio管理OAuthの場合、同じアプリのユーザー全員がレート制限を共有する点に注意が必要だ。大規模運用では、Slack等の主要サービスについて自社OAuthアプリを登録してCustom Authとして設定することで、レート制限を独立させられる。
セキュリティ(Vault / スコープ設計)
Composioはトークン・APIキーなどすべてのクレデンシャルをVaultに暗号化保管する。エージェントのアプリケーションコードや環境変数にシークレットを置く必要がなく、Composio APIの呼び出しだけで認証済みリクエストが通る。
スコープ設計の原則として、エージェントに必要最小限のスコープのみを要求する。OAuth Appを設定する際にスコープを明示的に指定できる。
from composio import Composio
composio = Composio()
# カスタムOAuthアプリの設定(最小スコープ原則)
# Composioダッシュボードまたは以下のようにSDK経由で設定
session = composio.create(user_id="user_alice")
# Slackに必要なスコープだけを指定して接続を開始
connection = session.connections.initiate(
"slack",
# channels:read と chat:write のみ要求(admin権限は不要)
scopes=["channels:read", "chat:write"]
)
print(f"最小権限OAuth URL: {connection.redirect_url}")
セキュリティチェックリストとして以下を確認しておきたい。
- COMPOSIO_API_KEYは環境変数で管理し、コードにハードコードしない
- OAuthスコープは最小権限の原則に従う
- Composioダッシュボードでツール呼び出しログを定期的に確認する
- 不要になったユーザーのConnectedAccountは削除する
- 本番環境では自社OAuthアプリ(Custom Auth)を使ってレート制限を独立させる
失敗パターン4選
Composio導入時によくつまずくポイントを整理した。
1. OAuthコールバックURLの設定漏れ
Slack・GitHub等のOAuthアプリ設定で、ComposioのリダイレクトURLを許可リストに追加していないと接続が失敗する。Composioダッシュボードに表示されるコールバックURLを各サービスのOAuthアプリ設定に追加すること。
2. Pollingトリガーの間隔設定ミス
Composio管理OAuthのPollingトリガーは最短15分間隔(2026年5月以降のデフォルト)。「Gmailの新着を即時検知したい」という用途には合わない。1分間隔が必要なら自社OAuthアプリ(Custom Auth)に切り替えること。
3. カスタムツールの永続化忘れ
カスタムツールはメモリ上にのみ存在し、アプリ再起動で消える。サーバーレス環境やコンテナ再起動が頻繁な環境では、起動処理(lifespan/startup hook)でツール登録を毎回実行する設計にすること。
4. マルチユーザーのレート制限共有
Composio管理OAuthを使うと、同アプリの全ユーザーがAPIレート制限を共有する。エンタープライズ向けSaaS開発では、主要ツールキットのOAuthアプリを自社で登録してCustom Authを使い、レート制限を独立させるアーキテクチャが推奨される。
まとめ
ComposioはAIエージェントとSaaS API統合の「見えない配管工事」を一手に引き受けるプラットフォームだ。認証・スコープ管理・トークン保管・マルチユーザー分離といったインフラ側の複雑さを吸収し、開発者はエージェントのロジック本体に集中できる。
GitHubスターは28k超と成長が速く、LangChain・CrewAIなど主要フレームワークのエコシステムとの統合も整備されている。本番エージェント開発で外部SaaS統合が必要になったタイミングが、Composio導入を検討する最適なタイミングだ。
関連記事: Smithery完全ガイド2026|MCP Serverレジストリ・発見・管理では、MCPサーバーの発見・管理レジストリを解説している。Composioと組み合わせることでAIエージェントの統合基盤を網羅できる。
この記事を読んで導入イメージが固まってきた方へ
UravationではAIエージェント導入の研修・コンサルを行っています。