GET /
Updated Oct 1, 20262 minute read
Answer the manifest
Median sends this right after a route is connected, on every sync from the dashboard, the CLI or the API, and before the agent's first reply in every new conversation. Answer with every tool your config declares.
The signature covers the empty string as the body. A manifest may declare up to 20 tools and be up to 500 KB. version is checked, so a backend refuses a version it does not speak rather than half reading it.
A manifest Median cannot accept fails the sync. The endpoint shows Sync failed with the reason, and the agent keeps the last good tool set.
Part of Tools you serve.
Responses
| Status | Description |
|---|---|
200 | Every tool the config declares. |
401 | The signature is missing, malformed, stale, or from a different Median key. |
405 | Only GET and POST are answered. |
500 | The server has no usable Median key to verify with. |
200 body
| Field | Type | Required | Description |
|---|---|---|---|
version | 1 | Yes | The protocol version. Median refuses versions it does not speak. |
tools | object[] | Yes | Up to 20 tools, and 20 across every endpoint in the organization. |
tools[].name | string | Yes | The model's function name. Unique across every endpoint in the organization. These are reserved: searchKnowledgeBase, searchPastConversations, requestHandoff, saveVisitorDetails, resolveConversation, closeConversation, suggestKnowledge, suggestTool, reportBug, suggestImprovement, searchSignals, requestScreenshot. |
tools[].description | string | Yes | What the tool does. The agent decides when to call it by reading this. |
tools[].risk | "low" | "medium" | "reviewed" | "high" | Yes | low runs when the agent calls it. medium runs when called, and the agent is told to get the customer's yes first. reviewed asks for that yes, then waits for an automated reviewer, which may hand the call to a teammate. high waits for a teammate's approval in the conversation. |
tools[].inputSchema | object | Yes | A flat JSON Schema object of scalar fields, closed to extras. Up to 20 fields and 8,000 characters as JSON. Field names follow the tool name rule. The builder in @mediansh/agent-tools emits exactly this subset, and Median refuses anything else at sync. |
tools[].inputSchema.type | "object" | Yes | |
tools[].inputSchema.properties | object | Yes | |
tools[].inputSchema.required | string[] | No | Names from properties. |
tools[].inputSchema.additionalProperties | false | Yes | |
diagnostics | boolean | No | Whether this endpoint answers the diagnostics op. median() sets it when the config has a diagnostics function. |
Example response
{
"version": 1,
"tools": [
{
"name": "orderStatus",
"description": "Look up the status of one of the customer's orders.",
"risk": "low",
"inputSchema": {
"type": "object",
"properties": {
"orderNumber": {
"type": "string",
"description": "The order number, like ORD-1042."
}
},
"required": [
"orderNumber"
],
"additionalProperties": false
}
}
],
"diagnostics": true
}Example request
curl https://example.com/api/median/ \
-H "median-signature: $MEDIAN_SIGNATURE"