OpenClaw plugin that connects your agent to Gmail, Sentry, and other services through Composio's Tool Router.
openclaw plugins install @customclaw/composio- Install spec:
@customclaw/composio - Plugin id:
composio(used inplugins.entries.*andplugins update)
-
Get an API key from platform.composio.dev/settings
-
Run the guided setup:
openclaw composio setupOr add manually to ~/.openclaw/openclaw.json:
{
"plugins": {
"entries": {
"composio": {
"enabled": true,
"config": {
"apiKey": "your-api-key",
"defaultUserId": "my-app-user-123",
"allowedToolkits": ["gmail", "sentry"]
}
}
}
}
}You can also set COMPOSIO_API_KEY as an environment variable.
- Restart the gateway.
If you upgraded from an older config shape where keys like defaultUserId or allowedToolkits
were placed directly under plugins.entries.composio, rerun:
openclaw composio setupLegacy mixed entry-level config keys are now rejected at runtime.
The plugin gives your agent three tools:
composio_search_tools— discovers relevant Composio actions from natural-language intentcomposio_execute_tool— runs a Composio action (e.g.GMAIL_FETCH_EMAILS,SENTRY_LIST_ISSUES)composio_manage_connections— checks connection status and generates OAuth links when a toolkit isn't connected yet
composio_execute_tool also accepts optional user_id and connected_account_id fields for deterministic account selection when multiple accounts exist.
The agent handles the rest. Ask it to "check my latest emails" and it will call the right tool, prompt you to connect Gmail if needed, and fetch the results.
openclaw composio setup # interactive setup for ~/.openclaw/openclaw.json
openclaw composio list --user-id user-123 # list available toolkits for a user scope
openclaw composio status [toolkit] --user-id user-123 # check connection status in a user scope
openclaw composio accounts [toolkit] # inspect connected accounts (id/user_id/status)
openclaw composio connect gmail --user-id user-123 # open OAuth link for a specific user scope
openclaw composio disconnect gmail --user-id user-123 # remove a connection in that user scope
openclaw composio search "send email" --user-id user-123| Key | Description |
|---|---|
apiKey |
Composio API key (required) |
defaultUserId |
Default Composio user_id scope when --user-id is not provided |
allowedToolkits |
Only allow these toolkits (e.g. ["gmail", "sentry"]) |
blockedToolkits |
Block specific toolkits |
readOnlyMode |
Blocks likely-destructive actions by token matching (delete/update/create/send/etc.); use allowedToolSlugs to override safe exceptions |
sessionTags |
Optional Tool Router tags (readOnlyHint, destructiveHint, idempotentHint, openWorldHint) |
allowedToolSlugs |
Optional explicit allowlist of UPPERCASE tool slugs |
blockedToolSlugs |
Explicit denylist of UPPERCASE tool slugs |
Composio connections are scoped by user_id. If a toolkit is connected in the dashboard
under one user ID but OpenClaw checks another (for example default), status and execution
may look disconnected.
Tips:
- Set
defaultUserIdin plugin config for your app's primary identity. - Prefer passing
user_id/--user-idexplicitly when checking status, connecting, disconnecting, or executing tools. - Use
openclaw composio accounts <toolkit>to discover whichuser_idowns active connections.
openclaw plugins update composio
openclaw gateway restartgit clone https://github.com/customclaw/composio.git
cd composio
npm install
npm run build
npm testCOMPOSIO_LIVE_TEST=1 \
COMPOSIO_API_KEY=your_key \
npm run test:liveOptional env vars for execution/disconnect paths:
COMPOSIO_LIVE_USER_IDCOMPOSIO_LIVE_TOOLKIT(default:gmail)COMPOSIO_LIVE_TOOL_SLUGCOMPOSIO_LIVE_TOOL_ARGS(JSON)COMPOSIO_LIVE_CONNECTED_ACCOUNT_IDCOMPOSIO_LIVE_EXPECT_EXECUTE_SUCCESS=1COMPOSIO_LIVE_ALLOW_DISCONNECT=1(destructive, opt-in)
Based on the Composio plugin from openclaw-composio by ComposioHQ. See THIRD-PARTY-NOTICES.