Renly and MCP
Renly works with the Model Context Protocol in both directions. As an MCP server, it lets Claude.ai, ChatGPT, Claude Code, Cursor, VS Code and other MCP clients use your Renly agents and automations. As an MCP client, it lets your Renly agents use tools from MCP servers your admins connect, with approval by default.
At a glance. Server URL: https://renly.ai/api/mcp-server. Transport: Streamable HTTP. Protocol 2025-06-18 (also negotiates 2025-03-26 and 2024-11-05). Auth: sign in to Renly (OAuth 2.1), or an agent access key with the mcp scope sent as Authorization: Bearer rk_live_....
Claude.ai and ChatGPT: sign in
Add a custom connector with the server URL https://renly.ai/api/mcp-server. When the app asks you to connect, it opens Renly: sign in, choose the organization (and, if you like, only some of your agents), check the address you will be sent back to, and choose Allow. No key is needed.
The connection appears under Connected apps on the Agent access page, where you can disconnect it at any time.
Before you start with a key
In Renly, open the user menu and choose Agent access. Under New key, name the key after the tool that will use it, tick MCP, optionally limit it to certain agents, pick an expiry and choose Create key. Copy the key when it appears: it is shown only once. Details on the agent access keys page.
The key acts as you. Keep it out of files you commit to source control: use your client's secret prompt or an environment variable, as in the examples below.
Claude Code
Sign in, with no key:
claude mcp add --transport http renly https://renly.ai/api/mcp-server
Then run /mcp in Claude Code, choose renly and authenticate in the browser window that opens. Or use a key instead:
claude mcp add --transport http renly https://renly.ai/api/mcp-server \ --header "Authorization: Bearer rk_live_..."
Add --scope user to make Renly available in every project on your machine. Check the connection with claude mcp get renly, then ask Claude to "list my Renly agents".
"already exists"? Claude Code keeps one entry per name. If you added renly before (for example with the placeholder key), run claude mcp remove renly, then add it again. After you create a key, the Agent access page shows this command with your key already filled in.
Cursor
Add Renly to ~/.cursor/mcp.json (all projects) or .cursor/mcp.json in a project. Cursor fills ${env:NAME} from your environment, so the key can stay out of the file:
{
"mcpServers": {
"renly": {
"url": "https://renly.ai/api/mcp-server",
"headers": {
"Authorization": "Bearer ${env:RENLY_ACCESS_KEY}"
}
}
}
}
VS Code
Create .vscode/mcp.json in your workspace. The inputs entry makes VS Code prompt for the key once and store it securely:
{
"inputs": [
{
"type": "promptString",
"id": "renly-key",
"description": "Renly agent access key",
"password": true
}
],
"servers": {
"renly": {
"type": "http",
"url": "https://renly.ai/api/mcp-server",
"headers": {
"Authorization": "Bearer ${input:renly-key}"
}
}
}
}
Other clients
Any MCP client that supports remote Streamable HTTP servers can connect, either by signing in or by sending a key in the Authorization header. For client developers, Renly follows the MCP authorization specification:
- An unauthenticated request gets
401withWWW-Authenticate: Bearer resource_metadata="https://renly.ai/.well-known/oauth-protected-resource/api/mcp-server", scope="mcp". - Authorization server metadata is at
https://renly.ai/.well-known/oauth-authorization-server. Clients register with a Client ID Metadata Document (an HTTPSclient_id) or dynamic client registration at/api/oauth/register. - Authorization code flow with PKCE (
S256only) and theresourceparameter. Access tokens last one hour; refresh tokens rotate on every use, and reusing an old one ends the connection. - Redirect URIs must be HTTPS,
http://localhost/127.0.0.1(any port), or an app's own scheme, and must match what the client registered.
To test by hand with a key:
curl -s https://renly.ai/api/mcp-server \
-H "Authorization: Bearer $RENLY_KEY" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"list_agents","arguments":{}}}'
The server is stateless: it issues no Mcp-Session-Id, authenticates every request on its own and replies with plain JSON. GET and DELETE on the endpoint return 405. Batched JSON-RPC requests are refused.
Tools
| Tool | What it does |
|---|---|
list_agents | The Renly agents this key can use, with ids. Read-only. |
ask_agent | Give a task or question to an agent (agent, message, optional conversation_id to continue). Waits up to about three minutes; if the agent is still working, it returns a conversation_id to check later. |
get_conversation | The latest reply and status of a conversation started with ask_agent: working, waiting for approval, or completed. Read-only. |
list_automations | Automations you can see, with ids. Read-only. |
run_automation | Start an automation now, with optional input. It runs with its own approval steps. Returns a run id. |
get_automation_run | Status, steps and outcome of a run. Read-only. |
list_pending_approvals | Automation approvals waiting for you, with a link to approve them in Renly. Read-only. |
get_evidence | The sealed evidence record for the latest answer in a conversation: who asked, which agent and model, which tools ran, what was approved, and the seal. Read-only. |
Every tool result has a text summary for the model and structuredContent with fields such as status, conversation_id and conversation_url. Tools carry MCP annotations; the read-only ones are marked readOnlyHint: true.
Governance
- No tool can approve. When an agent needs approval,
ask_agentreturnsstatus: "waiting_for_approval", lists what is waiting, and links to the conversation. A person approves or declines there; then callget_conversationfor the result. A model calling a tool is not a person approving. - A key or connection acts as the person who made it, in the one organization it was made for, only on the agents it allows, and with that person's connectors and your organization's policies.
- Everything is visible in Renly. Each
ask_agentconversation is a Renly chat titled "MCP: ..." and is recorded as evidence like any other chat.get_conversationandget_evidenceonly read conversations started over MCP, never your ordinary chats. - Revocation is immediate. Revoke the key, or disconnect the app, on the Agent access page and the next request fails. It also stops working if the person leaves the organization. Each key or connection is limited to 60 requests a minute.
Using MCP servers inside Renly
The other direction: tools from an external MCP server become tools your Renly agents can use.
- An organization owner or admin opens organization settings, then Connectors Settings, then MCP Servers, and chooses Add Server. Remote servers use the HTTP (Remote) transport with a Server URL; authentication can be none, an API key, a bearer token or OAuth 2.0.
- Use Discover tools to load the server's tools with their descriptions and annotations.
- In the server's Approvals section, set each tool to Ask first, Run without asking or Block, or leave it on Default.
The default is that every MCP tool asks for approval before it runs, because a tool's own "read-only" label is only a hint and a hostile server could mislabel a delete. If an admin ticks Trust this server's read-only labels, tools the server marks read-only (and not destructive) run without asking. An admin's per-tool choice always wins. A tool from a server that is disabled, unknown or belongs to another organization is blocked. Where a server uses per-person sign-in, each person connects their own account from the Connectors page.
MCP servers are available to organization owners and admins where they are switched on for the organization.