MCP server
Connect an AI client over MCP
Dhanu is a remote Model Context Protocol server, point Claude, Cursor or any MCP client at it with an API key and it can create tasks, talk to staff, run workflows and search the brain.
Dhanu ships a remote MCP server at https://api.dhanu.ai/api/pub/v1/mcp. Any
client that speaks the Model Context Protocol over
Streamable HTTP can connect with an API key and use the workspace as tools: hand work
to a staff member, read the reply, run a workflow, search what the workspace already
knows.
It is the same surface as the REST API, not a second one: every tool calls the
service its REST endpoint calls, is gated by the same scope (tasks.create,
staff.read, brain.search, …) and is metered and logged like any other public
call, a tool the key may not call is simply not listed.
Connect
The server is stateless: send JSON-RPC requests to the URL with the key as a bearer token and no session id.
{
"mcpServers": {
"dhanu": {
"type": "http",
"url": "https://api.dhanu.ai/api/pub/v1/mcp",
"headers": { "Authorization": "Bearer dhanu_sk_live_…" }
}
}
}
That shape works for Claude Desktop and Claude Code (claude mcp add --transport http dhanu https://api.dhanu.ai/api/pub/v1/mcp --header "Authorization: Bearer …"),
Cursor, Windsurf and most other clients; use a test key while wiring it up and the
tools answer with fixtures instead of touching the workspace.
What the client sees
initialize negotiates protocol version 2025-06-18 (or 2025-03-26 /
2024-11-05 if the client asks for one of those) and announces the tools
capability. tools/list returns the tools the key’s scope
allows, each with a JSON-schema input. tools/call returns the result as text and
as structuredContent; a failed call, a task that does not exist, a scope the key
lacks, invalid arguments, comes back as a tool result with isError: true, so the
model can read the reason and recover. There are no resources, prompts or
server-initiated streams, so a GET to the URL answers 405.
Safety
The key is the boundary. A tool never widens what the key can do, and everything a
client sends becomes an ordinary task the workspace can see, with a staff run
behind it, a create_task from an MCP client is treated exactly like a message from
the API channel: non-interactive, and its text is framed as untrusted data. Scope
the key to tasks.read and brain.search for a client that should only look.