Loading the documentation…

Oda as an automation server (ACP)

A DataMind Oda process can serve a program instead of a person. In the automation profile it speaks the Agent Client Protocol (ACP) over standard input and output, and your client creates, drives and closes persistent Oda sessions through it. This page covers running that server and working with it: connecting, sessions, MCP tools, permissions, model settings and limits.

Starting a profile is on Oda profiles and launchers, and the serving modes are compared on Automation with Oda. The Oda SDK overview and The Oda Remote API cover the other ways a program can drive Oda.

Start the server and connect

  1. Start Oda in the automation profile (acp) for your client. One process serves one client and runs until that client disconnects; the profile can name a default provider and model for the sessions it creates.
  2. Send initialize. The answer names the protocol version, the server's name and version, and what the connection supports: MCP servers over HTTP, image prompts when the runtime has them (audio and embedded context are not supported), sessions that can be closed, listed and resumed, and no authentication methods. A request for a version the server does not support still gets an answer that names the version the server speaks.
  3. Send authenticate. It succeeds immediately: the server requires no authentication of its own.
Note

Standard output carries protocol messages only. Keep everything else, such as a logger, off that stream: your client reads every byte of it.

The calls

Your client drives the server with these calls:

CallWhat it does
initializeOpens the connection; names the protocol version and the server.
authenticateSucceeds immediately; no authentication is required.
session/newCreates a session, with its working folder and MCP servers.
session/promptSends one prompt to a session.
session/cancel ($/cancel_request)Cancels the prompt in flight.
session/listLists the sessions that can be resumed.
session/resumeReopens a stored session.
session/set_config_optionChanges the Model or the Reasoning effort for the next turn.
session/closeCloses the session.

The server sends two kinds of message of its own: session/update, with what the session is doing while it works, and session/request_permission, a request to allow or reject one action (see Permissions).

Manage sessions

Send prompts and follow the work

The turn endsYour client is told
Completedend_turn
At its token limitmax_tokens
Cancelled by your clientcancelled
Interruptedcancelled
Blocked or failedend_turn
Aborted by a hook or another ownerend_turn

Attach MCP servers

Permissions

Choose the model and reasoning effort

Limits and unsupported surfaces

Questions, answered

How do my MCP servers' tools appear in a session?

As mcp__<server>__<tool>, where the middle part is the server's name from the declaration. A name that does not match the simple pattern of letters, digits, underscores and hyphens is normalised to fit. Several servers can be attached to one session, and the same server can be used in independent sessions.

Why was my MCP declaration refused?

Declarations are checked before the session starts, and one invalid entry stops the whole request, so nothing is left behind. Common reasons: two names normalise to the same server name (mcpServers contains duplicate normalized name: <name>), a local command is not an absolute path (mcpServers[N].command must be an absolute path), the transport is not a local command or streamable HTTP (mcpServers[N] transport <type> is not supported), or an HTTP entry's address is not an absolute HTTP(S) URL (<field> must be an absolute HTTP(S) URL). The report names the failing entry by its index.

What happens to a running prompt if my client disconnects?

The connection closes in stages: the server cancels the prompt in flight, lets the session's updates drain, flushes what is stored and releases the session. The session itself stays stored, so it can be listed and resumed later.

Do my sessions survive a restart of the server?

Yes. Listing, resuming and closing work across process restarts, and a resume continues the stored session without replaying earlier updates. Deleting a session and forking one are not supported.

Can I delete or fork a session?

No. Session deletion and forks are not supported over ACP; a session is created, prompted, closed, and resumed again later.

Why did my prompt fail?

The call answers with its reason, such as turn failed: <detail> when the turn ended in failure, or prompt was not queued: <detail> when the prompt could not be accepted. A failed turn publishes no partial output, and the session is not stuck: the prompt slot is free again, so your client can send the next prompt.

Why was my session not resumed?

Three common reasons: it is active (session is already active: <id>), it is not a stored root session (session is not resumable: <id>), or the folder you gave differs from the session's (session cwd does not match: <cwd>). Sub-agent and forked sessions cannot be resumed.

Which images can a prompt carry?

PNG, JPEG, WebP or GIF, as canonical base64, and only when the connection advertised image support and the selected model accepts image input. Otherwise the prompt is refused with inline image prompts were not advertised by this connection or model "<model>" does not declare image input.

Why is there no usage update?

A usage update appears only when the server can measure usage and the session reports a context capacity. When either is missing, the update is left out, and the rest of the updates still arrive.

How do I go back to the model's default reasoning effort?

Choose Provider default in the Reasoning effort option. It is offered when the selected model declares no default effort of its own.

Can my client answer permission requests on its own?

Yes. A request offers Allow once and Reject, and your client can answer it without a person. The choice is one-shot: it never becomes a lasting grant, so the next request asks again. With no answer, the request settles as cancelled and no access is granted; an unknown choice never grants access either.

How do I page through the session list?

session/list returns one page of up to 100 summaries by default, newest first, and carries a cursor for the next page; send the cursor back to continue. A deployment can change the page size, and a cursor the server cannot read is refused with session/list cursor is invalid.