Skip to content
dhanu docs
Browse pages

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.