Give any MCP client your actions, never your keys

Add one URL to Claude Code, Cursor, Codex or your own agent. It lists the actions you allow, runs each call through your limits and approvals, and returns a receipt. Sign in with OAuth, or connect with a scoped API key from your server.

A few lines on your server, then connect a user.

  1. 1.Add the serverOne command or one line of config: https://api.anlyon.com/mcp.
  2. 2.Sign in and choosePick the workspace, the environment and the permissions the client gets.
  3. 3.Call by nameEach action is a tool. A gated one waits for its approver, then runs.

An MCP server that holds a provider token hands the whole token to every client that connects. Anlyon's MCP server hands over named actions, and the token stays with Anlyon.

Less risk

A client sees only the tools your grant covers, and a connection can never decide an approval it asked for.

Less cost

No MCP server of your own to host, patch and wire to each provider's API.

Less effort

One command per client. The same actions, limits and receipts as your API calls.

Whatever the client, a tool call is an action call. Checked before it leaves, recorded after.

One protocol, the same rules as every other call.

One address for every action you allow

https://api.anlyon.com/mcp is a streamable HTTP server. It signs you in with OAuth, asks which workspace and environment the client acts in, and serves the governed set: list_actions, invoke_action, a tool named action_<name> for each action, and the approval tools.

  • The tool list follows the permissions you granted
  • Approve on your behalf stays off unless you turn it on

Give an agent one integration, and nothing else

Each integration has its own MCP server. https://api.anlyon.com/mcp/github serves the GitHub actions you turned on, plus check_approval and wait_for_approval, and nothing else from your workspace. Sign-in, permissions, approvals and limits work as on the main endpoint.

  • The address is https://api.anlyon.com/mcp/<integration>
  • An action you declared yourself stays on the main endpoint
  • An address that is not an integration answers 404

Act for one user over MCP

On your server, connect with an API key and send Anlyon-End-User. Every call then uses that user's own accounts and counts against their limits, and no tool has a user field, so a prompt can't switch users. A key created with endUserRequired is refused at connection without the header.

  • A user who hasn't connected gets a tool result with a connect link
  • Approvals the user decides wait for them in your app
  • Every receipt carries the user's id

The agent waits for the yes in the same turn

A gated action returns an approval id instead of a result. wait_for_approval holds for up to 120 seconds a call, and the request that runs on the yes is the one that was reviewed. With Approve on your behalf, list_pending_approvals and decide_approval let you review from the client.

  • A connection can't decide an approval it requested
  • Your decision counts as one approver toward an N-of-M rule
  • An unknown outcome is reported as unknown, never retried

Set it up. One command for Claude Code.

Add the main endpoint, or one integration's server for an agent that needs nothing else. Then run /mcp in Claude Code, pick the server and sign in. Cursor and Codex take the same URL in their own config.

terminal
# Every action you allow, behind one sign-inclaude mcp add --transport http anlyon https://api.anlyon.com/mcp# Only GitHub, for an agent that needs nothing elseclaude mcp add --transport http anlyon-github https://api.anlyon.com/mcp/github# Cursor: .cursor/mcp.json{ "mcpServers": { "anlyon": { "url": "https://api.anlyon.com/mcp" } } }

Let your agent act for your users, safely.

A few lines of server code, then send a user a connect link. Nothing to host.

$ claude mcp add --transport http anlyon https://api.anlyon.com/mcp