Problem
The CLI has no consumer-namespace commands for two fundamental operations:
- List connected apps —
composio dev connected-accounts list is developer-project-scoped and doesn't see consumer/"for you" connections
- List all available apps —
composio dev toolkits list requires composio dev init and developer project setup; there's no root-level catalog command
Real-world impact
We're building Houston, a desktop app that uses Composio for integrations. Our Integrations tab needs to show: (a) which apps the user is connected to, and (b) the full catalog of available apps. Without consumer-level commands, we resort to:
For connection status — probing each app individually via an SSRF side-channel:
// Abuse the SSRF guard in `composio proxy` to detect connections
composio proxy https://invalid.invalid/ --toolkit gmail
// "ToolRouterV2_NoActiveConnection" → not connected
// "ExternalProxy_SSRFBlocked" → connected
We run this 45 times in parallel (one subprocess per app). ~5 seconds latency.
For the app catalog — scraping composio.dev/toolkits HTML to extract initialToolkits JSON, plus a hardcoded static list of 45 popular apps with manually curated names and logo URLs.
Proposed Solution
Two new root-level commands that mirror existing developer-namespace functionality but operate in consumer mode (no project setup required):
1. composio connections
composio connections # List active connections
composio connections --toolkits gmail,slack # Filter by toolkit
composio connections --status EXPIRED # Show expired connections
2. composio apps
composio apps # Full catalog (~982 apps) with connection status
composio apps --query "email" # Search by name/description
composio apps --connected # Show only connected apps
Both commands reuse existing infrastructure:
resolveCommandProject({ mode: 'consumer' }) for consumer user ID resolution
client.connectedAccounts.list() for connection data
repo.searchToolkits() + client.toolRouter.session.toolkits() for catalog + logos + status
- Existing format utilities (
formatConnectedAccountsTable, formatToolkitsTable, etc.)
What this replaces for consumer-facing apps:
- SSRF probe trick (45 subprocess spawns → 1 command)
- Hardcoded static app catalogs
- HTML scraping of composio.dev
- ~5-second first-load latency → sub-1 second
- Polling-based connection status detection
Related
PR submitted: #3188
Problem
The CLI has no consumer-namespace commands for two fundamental operations:
composio dev connected-accounts listis developer-project-scoped and doesn't see consumer/"for you" connectionscomposio dev toolkits listrequirescomposio dev initand developer project setup; there's no root-level catalog commandReal-world impact
We're building Houston, a desktop app that uses Composio for integrations. Our Integrations tab needs to show: (a) which apps the user is connected to, and (b) the full catalog of available apps. Without consumer-level commands, we resort to:
For connection status — probing each app individually via an SSRF side-channel:
We run this 45 times in parallel (one subprocess per app). ~5 seconds latency.
For the app catalog — scraping
composio.dev/toolkitsHTML to extractinitialToolkitsJSON, plus a hardcoded static list of 45 popular apps with manually curated names and logo URLs.Proposed Solution
Two new root-level commands that mirror existing developer-namespace functionality but operate in consumer mode (no project setup required):
1.
composio connections2.
composio appsBoth commands reuse existing infrastructure:
resolveCommandProject({ mode: 'consumer' })for consumer user ID resolutionclient.connectedAccounts.list()for connection datarepo.searchToolkits()+client.toolRouter.session.toolkits()for catalog + logos + statusformatConnectedAccountsTable,formatToolkitsTable, etc.)What this replaces for consumer-facing apps:
Related
consumer-short-term-cache.tsalready callsgetConsumerConnectedToolkits()internally but doesn't expose it as a commandPR submitted: #3188