MCP for agents

An assistant can buy an address and bring up a tunnel without a human in the loop. The free trial is what makes it work — there is no card to ask anyone for.

The endpoint

https://api.anchoredip.com/api/mcp/

Streamable HTTP transport. One endpoint, POST JSON-RPC, answers application/json. The server is stateless: it streams nothing and holds no session, so you may send initialize and never mention it again. Protocol versions 2025-06-18, 2025-03-26 and 2024-11-05 are spoken; we answer in yours where we can.

No authentication to connect. Ordering is what needs a credential, and the credential is issued by ordering.

Adding it to a client

Claude Code

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

Claude Desktop — claude_desktop_config.json

{
  "mcpServers": {
    "anchoredip": {
      "type": "http",
      "url": "https://api.anchoredip.com/api/mcp/"
    }
  }
}

Cursor — .cursor/mcp.json

{
  "mcpServers": {
    "anchoredip": { "url": "https://api.anchoredip.com/api/mcp/" }
  }
}

anything speaking raw JSON-RPC

curl -s https://api.anchoredip.com/api/mcp/ \
  -H 'Content-Type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

The tools

ToolArgumentsWhat it does
list_plansThe catalogue with live prices, term lengths and which payment methods each plan accepts.
order_leaseplan, organization_name, country, billing_emailPlaces an order. Returns the access token — the only credential for that lease. A trial activates immediately.
lease_statusaccess_tokenAddresses held, tunnels, expiry, what is owed.
create_tunnelaccess_token, routing_mode?, transport?, label?Provisions a peer and returns its configuration file, once.
set_reverse_dnsaccess_token, address, hostnamePublishes a PTR record. An empty hostname removes it.

Four calls, start to finish

1 — what is on offer

{"jsonrpc":"2.0","id":1,"method":"tools/call",
 "params":{"name":"list_plans","arguments":{}}}

2 — order the free trial

{"jsonrpc":"2.0","id":2,"method":"tools/call",
 "params":{"name":"order_lease","arguments":{
   "plan":"trial",
   "organization_name":"Example GmbH",
   "country":"DE",
   "billing_email":"ops@example.com"}}}

3 — check what it got

{"jsonrpc":"2.0","id":3,"method":"tools/call",
 "params":{"name":"lease_status","arguments":{"access_token":"…"}}}

4 — get a working config

{"jsonrpc":"2.0","id":4,"method":"tools/call",
 "params":{"name":"create_tunnel","arguments":{
   "access_token":"…",
   "routing_mode":"full",
   "label":"agent-provisioned"}}}

The fourth response contains the whole .conf. Write it to a file and run wg-quick up.

Notes for whoever is driving

The access token is shown once and is not recoverable from the protocol. Give it to the user in plain sight and tell them to keep it — do not summarise it away. It can be re-sent to the billing email from /leases, and that is the only route back.
The configuration contains a private key and is returned once. Write it to a file for the user in the same turn. Nothing stores it.

Choose the routing mode deliberately. source is the default and leaves the machine's default route alone, but it is written with wg-quick PostUp rules and runs on Linux under wg-quick and nowhere else. A desktop or mobile client reads it, finds no routes to install and fails to connect while logging nothing. For anything but a Linux host, ask for full.

Report the price honestly. An annual plan quotes a monthly headline like everyone else; charged_per_term_usd is what the customer actually pays, and it is twelve times bigger.

IPv6 is delegated but not yet reachable from the public internet — our upstream does not carry the announcement. It works between the customer's own machines over the tunnel today. Say so rather than offering it as an internet-facing address; anything the internet must reach needs the IPv4 on a paid plan.

Limits and safety

Ordering through MCP is throttled exactly as ordering through the website is — five an hour — because it costs us the same. Reading the catalogue is not rationed at that rate, so an assistant exploring the tools does not exhaust the budget before it can buy anything.

Every tool goes through the same code the website uses. There is no separate ordering path here that could allocate an address the allocator would have refused.

Requests carrying a browser Origin header from an unknown site are refused, as the specification requires. MCP clients send none and are unaffected.