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.
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.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.authenticate. It succeeds immediately: the server requires no authentication of its own.Standard output carries protocol messages only. Keep everything else, such as a logger, off that stream: your client reads every byte of it.
session/ new needs an absolute working folder (cwd must be an absolute path: <cwd>), and a session keeps one folder only (additionalDirectories is not supported). Declare its MCP servers here. An empty session is stored before the call returns.session/ list returns the sessions that can be resumed, newest first, with a cursor for the next page (up to 100 summaries per page by default). It leaves out sessions that are live in the process, subagent sessions, forked sessions, and sessions whose folder is missing or relative. A cursor it cannot read is refused: session/ list cursor is invalid.session/ resume reopens a stored root session: it checks the folder, restores the latest model route, reconnects the MCP servers the request declares, and does not replay earlier updates. Its refusals: session is already active: <id>, session is not resumable: <id>, session cwd does not match: <cwd>.session/ close cancels what is running, lets the session's updates and subagent work drain, flushes what is stored and releases the session. A failure in that sequence is reported (session close failed: <detail>), and new work sent during the close is refused with session is closing: <id>. After a close, the session can be listed and resumed again.unknown session: <id>.session/ prompt carries text, images, or both. Text blocks next to each other are joined, and a resource link is rendered into the message text. A prompt that ends up with no text and no images is refused as empty prompt.image mimeType must be image/ png, image/ jpeg, image/ webp, or image/ gif or image data must be canonical base64. An image is admitted only when the connection advertised image support, the runtime can store it, and the selected model accepts image input.a prompt is already in flight for this session until the first settles.session/ cancel (or $/ cancel_request) cancels the prompt in flight, and it settles as cancelled. With nothing in flight, it cancels autonomous work, and an unknown session id makes it a no-op.session/ update messages: thought chunks, message chunks, tool calls that start and then complete or fail, and a usage update when usage can be measured.| The turn ends | Your client is told |
|---|---|
| Completed | end_turn |
| At its token limit | max_tokens |
| Cancelled by your client | cancelled |
| Interrupted | cancelled |
| Blocked or failed | end_turn |
| Aborted by a hook or another owner | end_turn |
turn failed: <detail>.mcpServers[N] transport <type> is not supported.mcp__<server>__<tool>. A server name that does not match the simple pattern of letters, digits, underscores and hyphens is normalised.mcpServers contains duplicate normalized name: <name>, mcpServers[N]. command must be an absolute path, mcpServers[N] is invalid: <detail>, <field> must be an absolute HTTP(S) URL.session/ request_permission request offers two one-shot choices, Allow once and Reject. Your client can answer it automatically; neither choice is a lasting grant, so the next request asks again.session/ set_config_option offers a Model selector and a Reasoning effort selector. The effort selector appears only when the exact model declares reasoning, and it includes a Provider default choice when the model declares no default effort of its own.unknown model option: <value>, unknown reasoning effort for <provider>/ <model>: <value>, unknown session config option: <configId>.session/ load, session deletion, forks, additional directories, SSE and ACP transports for MCP, modes, commands, plans, terminals, client filesystem operations, and elicitation.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.
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].), 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.
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.
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.
No. Session deletion and forks are not supported over ACP; a session is created, prompted, closed, and resumed again later.
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.
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.
Choose Provider default in the Reasoning effort option. It is offered when the selected model declares no default effort of 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.
session/ 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/.