TwinDocs
Develop with your Twin

Act on your connected providers

List, read and change things in the apps you have connected, such as Outlook, Asana, Xero and GitHub, from Claude, ChatGPT or the Twin CLI, under your Twin's rules.

Your Twin sessions can read and act on the apps you have connected. An external agent can make the same calls directly, without asking the Twin's own agent. Each call runs on your own connection, as a Twin run with no model, under the same rules as a session: what the Twin withholds, it withholds here too.

OperationRESTMCPTwin CLITypeScript SDK
twin.provider-actions.listGET /api/twin/provider-actionstwin_provider_actionstwin providers actionstwinProviders.listActions
twin.provider-actions.readPOST /api/twin/provider-actions/readstwin_provider_readtwin providers readtwinProviders.read
twin.provider-actions.writePOST /api/twin/provider-actions/writestwin_provider_writetwin providers writetwinProviders.write
twin.provider-actions.call.getGET /api/twin/provider-actions/calls/{callId}twin_provider_call_resulttwin providers calltwinProviders.getCall

Find an action

The list shows the providers you have connected and what each offers you, with each action's effect (read, write or destructive) and whether it sends anything outside MLX. Name up to 10 actions to get their arguments as input schemas.

An action that can't run says why:

  • read_withheld: a live read that every Twin run withholds, because nothing limits it to what you can see (for example a workspace-wide key). Where a synced copy exists, the message names it.
  • session_only: a tool served by a provider's own MCP server. These stay with Twin sessions, except Slack's read-only tool.
  • needs_approval: your organisation asks for approval on it, which these calls can't give.

"Your mail in MLX" holds actions on your own mail as the Twin keeps it: find attachments in your synced Gmail, add chosen ones to a channel, and run an Inbox item's action at its source, such as archiving the email.

Read and write

A read needs twin.read. A write needs twin.providers.write, which a connection holds only when you tick it on the consent screen. In the CLI, run twin login --provider-writes. Clients such as Claude and ChatGPT ask you before a write, because the write tool is marked destructive.

Every write takes an idempotencyKey. Sending the same key again returns the first outcome and never acts twice. The CLI makes a key for each command unless you give one.

A call returns at once with its id. Read it with twin_provider_call_result, or twin providers read --wait, until it completes or fails. A completed call returns what the action gave back, as a Twin session's agent reads it. Mail actions complete straight away.

On this page