This page is up to date, and intended for version 1.0 of the Coral Server and Coral Studio.

Prerequisites

  • A running instance of Coral Server
  • An existing agent you want to onboard to Coral

Modifying your agent

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.

Connect to Coral

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.
from camel.toolkits.mcp_toolkit import MCPClient
from camel.utils.mcp_client import ServerConfig

coral_url = os.getenv(
    "CORAL_CONNECTION_URL",
    default = "http://localhost:5555/sse/v1/devmode/exampleApplication/privkey/session1/?agentId=example_agent"
)
coral_mcp = MCPClient(
    ServerConfig(
        url=coral_url,
        timeout=3000000.0, # These timeouts are large since wait_for_mentions, etc. can take a long time to resolve.
        sse_read_timeout=3000000.0,
        terminate_on_close=True,
        prefer_sse=True
    ),
    timeout=3000000.0
)
The default SSE connection url used in the snippets are devmode endpoints - useful for rapid local testing, without using the orchestrator.

Agent Configuration

Agents 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.
This means you should not load .env files by default (unless using devmode), since environment variables should only be provided by Coral Server.
See Agent Options for details on how to expose your configuration options.

Packaging your agent

Now that your agent works with Coral, to make it work with orchestration - you need to package your agent. In the root of your agent repository/folder, create a coral-agent.toml file. This is the entrypoint for your agent from Coral’s POV. For example, for local use of agents - these files are referenced by your coral server’s registry.toml. An agent definition starts with basic metadata:
[agent]
name = "name-of-my-agent"
version = "0.1.0" # agent version (should be semver)
description = "Description of this agent's capabilities, that is shown to other agents"

Agent Options

Coral’s orchestrator allows you to expose specific typed options, to be passed to your agent on instantiation as environment variables1.
1 Future runtimes may pass options to agents via something other than environment variables
options are a map of option names, to user configurable options you want to expose. Each option has:
type
'string' | 'number'
required
Whether the value of this option should be a string or a number.
description
string
required
A description of what this option configures in your agent.
default
string | number
The default value of this option if not provided when spawning this agent. The type of this is a number or string, depending on what type is set to.
required
boolean
Whether this option is required. false by default.

Agent Runtimes

Coral Server’s orchestrator supports different ‘runtimes’ - or ways of running agents. It currently supports both Docker containers, and local subprocesses, with plans to support Kubernetes, Phala, and more.
It’s recommended you support Docker if you intend to publish your agent, or export it as a remote agent (closed beta).

Orchestration Environment

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
    • You should use CORAL_CONNECTION_URL instead, whenever possible.

Devmode

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:
./gradlew run --dev
Now, an agent can connect to /sse/v1/devmode/[appId]/[privKey]/[sessionId]/?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 /sse/v1/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.