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, the serving modes are compared on Automation clients, and the protocol, call by call, is in Automation with ACP.

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, 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.

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 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.