The integration code, as shipped

one.ie/web/src/pages/api/composio/

  • connect.ts — Starts a connection. Checks the caller may manage this workspace, then asks the provider for an auth URL.
  • redirect.ts — Sends the client to the provider to sign in.
  • callback.ts — Receives the provider’s answer and stores the connected account against the workspace.
  • verify.ts — Confirms the account came back active.
  • connections.ts — Lists the workspace’s active connected accounts.
  • toolkits.ts — Reads the provider’s catalogue. Cached in KV for six hours.
  • tools.ts — Lists the callable tools behind a connected account.
  • disconnect.ts — Removes one connected account.
  • one.ie/web/src
    • pages/api/composio
      • connect.ts
      • redirect.ts
      • callback.ts
      • verify.ts
      • connections.ts
      • toolkits.ts
      • tools.ts
      • disconnect.ts
    • lib/composio.ts
  • channels/src
    • composio.ts
    • composio-toolkits.ts
    • modifiers.ts
    • fence.ts
    • agents/builder.ts
    • aitools.ts
your machine
$ npm i -g @oneie/cli$ oneie auth login$ npx -y @oneie/mcp

Three real commands. No output is printed here because the output would have to be invented.

That is every file that decides what an agent may call.

Eight routes to connect an account, one module that computes the toolbelt, one that fences what comes back. Open any of them in the repo.

What you just looked at

  1. channels/src/composio.ts, in the tree above

    composioScoped intersects three sets — the toolkits the agent asked for, the accounts your client actually connected, and the toolkits a platform skill already covers. What survives is the toolbelt for that one turn. The belt itself is never cached; only the count of active connections is held, for sixty seconds.

  2. composio-toolkits.ts, directly under it

    SKILL_TOOLKIT_MAP is why a workspace that already runs the Gmail skill does not also load the provider’s Gmail tools. One surface per job, so the model is never shown two ways to send the same email.

  3. the FAST_PATH_MAX constant in the same file

    It is set to 20. Past twenty connected toolkits the agent stops loading tool schemas one by one and switches to the provider’s search-and-execute meta tools, so a client with a large stack does not push the model’s step out of shape.

  4. modifiers.ts and fence.ts, two lines apart

    Every integration result passes through applyModifiers on its way back, and the fence labels it as foreign data before the model reads it. Text inside a fetched email that says “ignore previous instructions” arrives as something to report, not something to obey.

  5. aitools.ts, last in the second folder

    Write tools carry needsApproval. Reads run. Anything that changes state somewhere else surfaces a confirmation in the conversation first, and the approval is what gets logged.

  6. the three commands on the right

    oneie auth login is a device flow. It opens a browser, you approve, and it mints a key carrying exactly your own authority — you are not handed one.

The path one tool call takes

Five steps, each one a route or a function you can open.

  1. Step 1 of 5

    Your client connects

    Their browser posts the toolkit they want. The route checks the caller may manage integrations for that workspace before it talks to the provider.

    POST /api/composio/connect

  2. Step 2 of 5

    The provider answers

    They sign in on the provider’s own screen. The account comes back bound to the workspace slug, not to a shared platform identity.

    /api/composio/redirect → /api/composio/callback

  3. Step 3 of 5

    A turn starts

    The agent counts active connections first. Zero means the whole integration branch is skipped for that turn.

    getConnectedCount() — channels/src/composio.ts

  4. Step 4 of 5

    The toolbelt is computed

    Scoped, full fallback, or the router path past FAST_PATH_MAX. Each call is deadline-bounded, so a slow provider costs this one turn its integration tools instead of holding the reply.

    composioScoped() · composioFallback() · routerTools()

  5. Step 5 of 5

    A write asks first

    Read tools execute. Write tools raise a confirmation in the conversation and wait for a human answer.

    needsApproval — channels/src/aitools.ts

These paths are real. Open the repo.

The connect route is the whole front door. This is its body, read line by line out of the file.

POST /api/composio/connect

src/pages/api/composio/connect.ts

Request body fields accepted by the connect route
Prop Type Default Notes
toolkit string required The provider’s toolkit slug. Missing it is a 400. src/pages/api/composio/connect.ts:39
workspace string optional Whose accounts these are. Falls back to the caller’s own slug, and is the identity the authority check runs against. src/pages/api/composio/connect.ts:43
authScheme 'API_KEY' | 'BASIC' | 'BEARER_TOKEN' | … optional For providers that are not OAuth. Chooses which credential shape is built. src/pages/api/composio/connect.ts:42
credentials Record<string, string> optional Supplied per user at initiate time. The stored auth config holds placeholders, not your client’s secret. src/pages/api/composio/connect.ts:41
alias string optional A label when one workspace connects the same provider more than once. src/pages/api/composio/connect.ts:40

The route calls requireAuthOver(request, 'manage_integrations', userId) before it reaches the provider, so connecting an account is an act of authority over that workspace, not an act of being signed in somewhere.

Point your editor at it

Paste this into Claude Code, Cursor, or any MCP client.

mcp.json

{
  "mcpServers": {
    "one": { "command": "npx",
      "args": ["-y", "@oneie/mcp"] } } }

Limits

3 rows here say no or partial. Those are the ones worth reading first.

FeatureONEZapier / MakeBuild your own
Client connects their own account, agent works inside ityou build it
Toolbelt recomputed every turn from live connectionsyou build it
Approval gate on write actions, in the conversationyou build it
Foreign tool output fenced before the model reads ityou build it
One installed skill suppresses the duplicate integration toolsyou build it
Agent consumes a third-party MCP serverNot shipped, and we are not going to imply it is. ONE runs an MCP server — @oneie/mcp, in the handoff above — so Claude Code and Cursor can call ONE. The reverse direction, an agent picking up tools from someone else’s MCP server at runtime, is not wired.
Browse the integration catalogue with no provider key configuredThe catalogue is read from the provider at request time and cached for six hours. With no key configured the list is empty and the page says so. That is also why this page prints no integration count.n/a
Total control of every adapterWriting your own adapters wins on control. You then own every provider’s auth changes, rate limits and deprecations, for as long as the client is a client.

Integration access on every plan

Included in the subscription. No per-integration charge. Annual billing pre-selected.

Starter

Core integrations · 3 clients

$500/mo
5M credits/mo
Gmail, Slack, Google Calendar
Approval gates on write actions
Email support
Most popular

Agency

Full catalogue · unlimited clients

$5,000/mo
60M credits/mo
The whole provider catalogue
HubSpot, GitHub, Linear, Salesforce, Stripe
Per-client connection limits
Priority support

Scale

Custom adapters · dedicated infrastructure

$50,000
750M credits/mo
Custom integration adapters
Your own OAuth app registration
Dedicated integration SLA
Dedicated success manager

Questions about tools

You just read the code that decides it.

Your client connects their own accounts. The agent gets what they connected, and asks before it writes.