MCP server
Point an MCP client at a Radioso workspace and it can list and search documents, pull a grounded answer with citations, and create or update content — the same operations the dashboard and REST API expose, reached as MCP tools instead of HTTP calls. Point a converse-capable client at one agent instead, and it holds an actual conversation with that agent’s persona, directives, and routines, the way a user would.
This page is about Radioso running an MCP server that a client connects into. If you’re looking for the other direction — an agent skill that calls out to someone else’s MCP server as a tool — see Agents and skills. The two are unrelated: this page’s server accepts MCP calls, that skill kind makes them.
Two surfaces, two credentials
Radioso’s MCP server exposes two surfaces, and they don’t share credentials — a workspace API token is rejected by the converse endpoints, and a converse grant or converse session token is rejected by the workspace tools.
- Workspace document tools are retrieval-first and scoped to a whole workspace. They authenticate with a workspace API token and don’t carry any agent’s persona or configuration. Use this surface when a client should search, read, or manage the workspace’s documents.
- Agent converse surface binds a client to one agent’s turn loop. It authenticates with a per-agent converse grant, exchanged for a short-lived session token. Use this surface when the client should hold a conversation and behave like that agent.
Both surfaces call the same underlying Radioso backend, but the workspace tools never apply an agent’s persona, directives, or routines — they answer from retrieval alone.
Enable it
Choose a deployment shape
Run MCP merged into the backend, or run it as its own process (packages/radioso-mcp-server). Self-hosted operators can do either; if you’re calling a Radioso-hosted instance, whoever operates it has already made this choice, and you only need the resulting host and token.
Merged mode is the simpler self-hosted default: set RADIOSO_MCP_ENABLED=true and leave RADIOSO_MCP_STANDALONE=false on the backend. MCP mounts at RADIOSO_MCP_MOUNT_PATH (default /mcp) on the backend’s own origin, and clients send the workspace API token directly as the bearer token — no separate exchange step.
Standalone mode runs the package as a separate HTTP process, which is the better fit when MCP needs public HTTPS exposure but the main backend should stay internal. It requires RADIOSO_BASE_URL pointed at the backend and a RADIOSO_MCP_SIGNING_SECRET set to a non-default value on both the MCP process and the backend, so the backend can verify MCP-attributed traffic. Clients exchange a workspace API token for a short-lived access token first, then use that token as the bearer credential.
You can run both at once — merged mode for same-host access and a standalone deployment for public connector traffic — sharing session state between them with RADIOSO_MCP_REDIS_URL set on both.
Confirm the backend reaches the target Radioso instance
Standalone mode calls GET /api/v1/workspace/mcp/context on RADIOSO_BASE_URL to negotiate workspace identity and supported tools before granting anything to a client. If that call fails, the standalone server has no route to the backend it’s supposed to front.
Mint the credential you need
For workspace document tools, use a workspace API token. For the converse surface, a workspace admin mints a per-agent converse grant (below).
A workspace API token only works against the instance that issued it. A token minted on https://api.radioso.ai will not authenticate against https://api-us.radioso.ai, a self-hosted deployment, or http://localhost:8080 — match the token to the host in every example below.
Workspace document tools
Client config: Cursor
Same-host merged mode, using the workspace API token directly:
{
"mcpServers": {
"radioso": {
"url": "https://api.radioso.ai/mcp",
"headers": {
"Authorization": "Bearer radioso_your_workspace_token"
}
}
}
}Local development against a backend you’re running yourself:
{
"mcpServers": {
"radioso-local": {
"url": "http://localhost:8080/mcp",
"headers": {
"Authorization": "Bearer radioso_your_workspace_token"
}
}
}
}Standalone mode needs a short-lived access token instead of the workspace token. Exchange one from the standalone server’s origin:
source <(
RADIOSO_WORKSPACE_TOKEN=radioso_your_workspace_token \
pnpm --dir packages/radioso-mcp-server run -s token:exchange
)That sets RADIOSO_MCP_ACCESS_TOKEN in your shell. Point Cursor’s config at the standalone server with that token:
{
"mcpServers": {
"radioso": {
"url": "http://127.0.0.1:8787/mcp",
"headers": {
"Authorization": "Bearer ${env:RADIOSO_MCP_ACCESS_TOKEN}"
}
}
}
}Rerun the exchange when the token expires (RADIOSO_MCP_ACCESS_TOKEN_TTL_SECONDS, default 900 seconds).
If you open Cursor from the Dock, Spotlight, or a launcher instead of a terminal, install the token into the GUI app’s environment first, since a GUI-launched app doesn’t inherit your shell’s exported variables:
RADIOSO_WORKSPACE_TOKEN=radioso_your_workspace_token \
pnpm --dir packages/radioso-mcp-server run -s cursor:prepare -- --openCursor can also spawn the MCP server itself over stdio instead of connecting to a running HTTP process — set RADIOSO_BASE_URL and RADIOSO_API_TOKEN and point Cursor’s config at dist/src/cli/stdio.js.
Client config: Claude Desktop
Claude Desktop’s remote connector runs from Anthropic’s infrastructure, not your laptop, so http://127.0.0.1:8787/mcp and http://localhost:8080/mcp are both unreachable from it. It needs a public HTTPS deployment:
- Deploy the MCP server (merged or standalone) behind a public HTTPS URL, for example
https://mcp.example.com/mcp. - In Claude, open Customize → Connectors and add a custom connector pointed at that URL.
- Authenticate the connector with a token minted through the exchange flow above; the package doesn’t implement a native OAuth connector flow, so if your deployment fronts the exchange endpoint with its own OAuth layer, supply that client ID and secret in Claude’s advanced settings instead.
- Enable the connector in a conversation.
For localhost-only Claude Desktop access, use the stdio compatibility entrypoint described above rather than the remote connector flow.
The tools
All tool arguments are validated with Zod before Radioso executes them; a request with a missing or malformed field is rejected before it reaches the backend.
describe_capabilities— no arguments. Returns the read and write tools this session was granted, any tools that require host-side approval, and basic workspace and upstream API metadata.list_documents— optionalcursor(string),limit(1–100),offset(integer ≥ 0). Lists workspace documents.get_document—documentId(string, required). Fetches one document.search_documents—query(string, required, up to 4000 characters), optionalmetadataFilter. Searches workspace documents.answer_grounded—query(string, required), optionalmetadataFilter, optionalconversationContext(previousUserMessages,previousAssistantMessages,followUpToMessageId) for rewrite continuity across a caller-managed thread. Returns a grounded answer with citations from workspace retrieval. It does not create an assistant conversation and does not carry any agent’s persona.create_document(requires approval by default) —titleandcontent(strings, required), optionalmetadata, optionalexternalDocumentId.update_document(requires approval by default) — same fields ascreate_documentplusdocumentId(required).delete_document(requires approval by default) —documentId(string, required).reprocess_document(requires approval by default) —documentId(string, required), optionaldocumentEnrichmentOverride("on"or"off"). Requeues the document through the backend’s document processing path; the override applies only to the job this call creates, not to workspace or source-level ingestion settings.
describe_capabilities, list_documents, get_document, search_documents, and answer_grounded are read tools. The other four are write tools, and every write tool advertises requiresApproval: true in its MCP tool definition by default, so hosts that read that field — Cursor, Claude Desktop, the ChatGPT app — show their own confirmation prompt before calling it. The Radioso MCP server itself has no separate server-side approval gate beyond the workspace API token’s own permissions; a headless client that ignores requiresApproval can still call a write tool if the token allows it.
An operator can narrow which tools are granted per workspace with RADIOSO_MCP_ALLOWED_READ_TOOLS, RADIOSO_MCP_ALLOWED_WRITE_TOOLS, RADIOSO_MCP_APPROVAL_REQUIRED_WRITE_TOOLS, or a RADIOSO_MCP_WORKSPACE_POLICIES_PATH policy file keyed by workspace ID. Left unset, all nine tools above are granted and all four write tools require approval.
Agent converse surface
The converse surface authorizes exactly one agent — the client never sees other agents, workspace settings, or document management outside that agent’s own documents.
Mint a converse grant
A workspace admin creates a grant with the workspace API token. The plaintext token is returned once, on creation:
POST /api/v1/agents/{agentId}/mcp-converse-grants
Authorization: Bearer <workspace API token>
Content-Type: application/json
{ "label": "Cursor on my laptop" }{
"grant": { "id": "...", "label": "Cursor on my laptop", "tokenPrefix": "radioso_", "createdAt": "..." },
"token": "radioso_..."
}GET, rotate (POST .../rotate), and DELETE on the same path list, rotate, and revoke a grant. Revoking, disabling, or rotating a grant stops its existing sessions immediately, because every converse request re-checks the grant.
Exchange the grant for a session
POST /api/v1/mcp/converse/session
Content-Type: application/json
{ "launchToken": "radioso_...", "client": { "name": "cursor" } }{
"sessionToken": "<session token>",
"expiresAt": "...",
"agent": { "id": "...", "name": "Support" },
"conversationId": "..."
}Use the returned sessionToken as the bearer token for the tools below. There’s no agent ID in those requests — the agent is fixed by the grant. Re-exchange the grant when the session expires.
The tools and resources
ask_agent—message(string, required). Runs the agent’s full turn loop — persona, directives, routines, history — and continues the same conversation across calls. This is the stateful, interactive tool.answer_grounded—query(string, required), optionalmaxResults(1–20). Returns one grounded answer with citations from the bound agent’s own retrieval configuration: its query rewrite, rerank, source scope, and citation policy. Stateless and read-only, with no conversation, persona, or routines. This is a different tool from the workspace-scopedanswer_groundedabove — same name, agent-bound instead of workspace-bound, and a smaller argument set.- Agent documents as MCP resources —
GET /api/v1/mcp/converse/resourceslists resources scoped to what the agent can see;GET /api/v1/mcp/converse/resources/{resourceId}reads one. Content is sanitized for a public surface — no internal document or chunk IDs.
Authentication boundaries
- The converse surface accepts only converse session tokens minted through the exchange above. A workspace API token is rejected.
- A converse grant is bound to the
mcp-conversechannel; embed and public-chat launch tokens are rejected, so a public website token can’t be reused to converse over MCP. - A converse grant is a secret credential — unlike an embed token, it’s never exposed in client-side surfaces. Store it the way you’d store any workspace secret.
- There’s no standard MCP OAuth 2.1 front door for the converse surface. Public connectors such as Claude or ChatGPT authenticate with a session token minted through the grant exchange, held server-side by whatever fronts the connector.
Auth and token model, end to end
| Surface | Credential | Scope | Where it’s minted |
|---|---|---|---|
| Workspace document tools, merged mode | Workspace API token | Whole workspace | Workspace settings |
| Workspace document tools, standalone mode | Short-lived MCP access token | Whole workspace, further narrowed by requestedTools at exchange | POST {mcp-server}/v1/auth/exchange, using a workspace API token |
| Agent converse surface | Converse grant, exchanged for a session token | One agent | POST /api/v1/agents/{agentId}/mcp-converse-grants, using a workspace API token |
Every path above still starts from a workspace API token — the standalone exchange and the converse grant both need one to mint their own shorter-lived credential. See Authentication for how to get one.
Common failure modes
401from the MCP endpoint in merged mode — usually a workspace API token that’s missing, revoked, or issued by a different Radioso instance than the one you’re calling.- A tool call succeeds against the workspace tools but the converse tools reject the same token, or vice versa — expected. The two surfaces don’t share credentials by design; use a workspace API token for
/mcpdocument tools and a converse session token for/api/v1/mcp/converse/*. - Claude Desktop or a ChatGPT app can’t reach a locally running MCP server — these are hosted remote connectors that call from provider infrastructure, not from your machine. Deploy the server behind a public HTTPS URL, or use the stdio entrypoint for local-only access instead.
- A write tool call is silently skipped in a host UI — the host is honoring
requiresApproval: trueand waiting for you to confirm. Check the host’s own approval prompt rather than the Radioso server logs. - Standalone mode refuses to start —
RADIOSO_MCP_SIGNING_SECRETmust be an explicit, non-default value in remote HTTP mode; the built-in stdio compatibility secret is rejected outside stdio. reprocess_documentdidn’t change how future uploads are enriched —documentEnrichmentOverrideonly applies to the single reprocessing job that call created, not to the workspace ingestion setting or the source-level override.
Read next
- Authentication — how workspace API tokens and sessions work across all of Radioso’s surfaces.
- Agents and skills — the reverse direction: binding an agent skill to an external MCP server.
- Documents and search — the REST endpoints the workspace document tools call.
- Chat and history — the assistant chat API the converse surface’s
ask_agentruns underneath.