This guide explains how to onboard agents
Agents interact with Coral sessions exclusively through a uniquely provided MCP server. All interaction with other agents is then done with the tools available through that MCP.
Since each agent in a session is given its own MCP - your agent must receive the MCP’s connection url dynamically. When running the agent through Coral Server’s orchestrator, that is provided by the CORAL_CONNECTION_URL
environment variable.
Here are some example snippets for popular Python frameworks:
These snippets are not complete implementations, or guaranteed to work as is for your agent! Actual integration heavily depends on your agent’s existing implementation.
The default SSE connection url used in the snippets are devmode endpoints - useful for rapid local testing, without using the orchestrator.
Agent’s have a lot of options that users would want to change. API keys, models, providers, and even sampling parameters (temperature, top_p) - are all things we want to accept dynamically.
Coral’s orchestrator provides an ‘option’ system, that allows you - the agent developer - to expose specific typed options, and receive the values of those options as environment variables.
.env
files by default (unless using devmode), since environment variables should only be provided by Coral Server. See Registry Configuration for details on how to expose your configuration options.
Coral Server’s session creation API supports passing in a systemPrompt
parameter to agents - intended to allow extra text to be injected to those agents’ system prompts.
To support this feature, read the CORAL_PROMPT_SYSTEM
environment variable - and interpolate it into your existing prompt.
If you don’t plan on supporting this feature, or it makes no sense for your agent - it’s recommended you output an error/warning if CORAL_PROMPT_SYSTEM
is being set.
Now that your agent works with Coral, to make it easy to work with orchestration - you need to package your agent.
Coral Server’s orchestrator offers different ‘runtimes’ - or ways of running agents. It currently supports both Docker containers, and direct subprocesses (executable
), with plans to support Kubernetes, Phala, and more.
It’s recommended you support both runtimes if you intend to publish your agent.
Docker
How you containerize your agent depends a lot on how your agent is written - what language it uses, how it manages dependencies, etc. Feel free to browse our curated list of agents here for reference on packaging Python agents for Docker using uv.
Once you do have a containerized agent, we need to prepare a snippet for people to use in their Coral Server’s application.yaml
Executable
This runtime is even more implementation dependent - since you are running a command/process directly. It’s also not portable, since it’s hard to account for all possible system environments.
For that reason it’s recommended to use the Docker runtime instead - although for writing public agents, you should still support this runtime.
A good pattern to maximise portability is writing bootstrap scripts for each OS you want to support, that handles ensuring dependencies are present/downloaded (e.g. create/enter a python virtual environment, download dependencies)
Here are some examples of bootstrap scripts we use for our agents:
To make it easier for others to use your agent, you should share registry snippets for people to paste into their application.yaml
. It is not expected for users of your agent to modify this registry snippet directly (except for the name of it in their registry).
Make sure to provide multiple snippets for each runtime that you support.
An agent definition in an application.yaml
has two parts, the options
, and the runtime
:
options
are a list of user configurable options you want to expose.
Each option has:
The name of the option (e.g API_KEY
, MODEL_TEMPERATURE
, MODEL_PROVIDER
)
Whether the value of this option should be a string or a number.
A description of what this option configures in your agent.
The default value of this option if not provided when spawning this agent. All agent options are optional by default, unless this default
field is defined. The type of this is a number or string, depending on what type
is set to.
Docker
image
should be the docker image Coral Server should pull and use. It should be the same URL you would pass to docker pull [image]
Executable
command
should be an array of strings that represent the command Coral Server should run, to run your agent.
All runtimes have an environment
field, which is a list of environment variables we want to pass in during orchestration. This is also how you pass defined options to agents.
There are a few ways to declare an environment variable:
Agents run under orchestration are provided with a set of “system” environment variables that are needed/useful to work with Coral:
CORAL_CONNECTION_URL
-> The URL of the MCP server this agent must connect to,CORAL_AGENT_ID
-> The ID of this agent,CORAL_ORCHESTRATION_RUNTIME
-> How this agent is being orchestrated ("docker"
, "executable"
),CORAL_SESSION_ID
-> The ID of the session this agent belongs to,CORAL_SSE_URL
-> CORAL_CONNECTION_URL
, but without any query parameters
CORAL_CONNECTION_URL
instead, whenever possible.It can be useful to be able to run agents outside of Coral’s orchestrator to quickly iterate without needing to create sessions repeatedly. Coral Server supports running in “devmode”, which disabled Application ID / Privacy Key checking, and implicitly creates sessions whenever an agent tries connecting.
To use, first run Coral Server in devmode:
Now, an agent can connect to /devmode/[appId]/[privKey]/[sessionId]/see?agentId=[agentId]
- and automatically have a session with that ID created (if it doesn’t already exist), and be registered with the provided agentId
.
appId
, privKey
& sessionId
can be anything, they just need to be identical between agents you want to be in the same session
To support running through devmode in your agents, a good practice is to default to a /devmode/...
url when the CORAL_CONNECTION_URL
environment variable is not set.
You can also check that the CORAL_ORCHESTRATION_RUNTIME
environment variable, and load a .env
file if it isn’t set. This makes it easy to provide API keys, etc. to agents you run directly - since through orchestration those would normally be passed in when creating a session.
If you do load .env
files in your agents, you must make sure you are not running in orchestration (by checking CORAL_ORCHESTRATION_RUNTIME
for example) before loading them.
Loading environment variables externally under orchestration can cause hard to debug issues like unintentionally used or accidentally shared API keys at best, and connection issues between the agent and the server at worst.