Skip to content
Zonio Developers

Connect your agent

The server lives at a single URL. Interactive clients sign in with OAuth; everything else sends an API key.

https://mcp.zonio.tech/mcp

Claude.ai and Claude Desktop

  1. Open Settings → Connectors → Add custom connector.
  2. Name it Zonio and paste https://mcp.zonio.tech/mcp.
  3. Click Connect, sign in with your Zonio account and approve the scopes.

Start a new chat and ask "What's the zoning of parcel 126101_1.0018.AR_1.100/1?" Claude will ask permission the first time it calls a Zonio tool.

Claude Code

claude mcp add --transport http zonio https://mcp.zonio.tech/mcp \
  --header "Authorization: Bearer $ZONIO_API_KEY"

Add --scope project to share it with your team through .mcp.json:

.mcp.json
{
  "mcpServers": {
    "zonio": {
      "type": "http",
      "url": "https://mcp.zonio.tech/mcp",
      "headers": { "Authorization": "Bearer ${ZONIO_API_KEY}" }
    }
  }
}

Cursor

~/.cursor/mcp.json
{
  "mcpServers": {
    "zonio": {
      "url": "https://mcp.zonio.tech/mcp",
      "headers": { "Authorization": "Bearer zk_live_…" }
    }
  }
}

VS Code (GitHub Copilot)

.vscode/mcp.json
{
  "servers": {
    "zonio": {
      "type": "http",
      "url": "https://mcp.zonio.tech/mcp",
      "headers": { "Authorization": "Bearer ${input:zonio-key}" }
    }
  },
  "inputs": [
    { "id": "zonio-key", "type": "promptString", "description": "Zonio API key", "password": true }
  ]
}

Clients without remote-server support

Use the mcp-remote bridge to expose the remote server over stdio:

{
  "mcpServers": {
    "zonio": {
      "command": "npx",
      "args": ["-y", "mcp-remote", "https://mcp.zonio.tech/mcp",
               "--header", "Authorization: Bearer ${ZONIO_API_KEY}"],
      "env": { "ZONIO_API_KEY": "zk_live_…" }
    }
  }
}

Your own agent

  • Claude API: pass the server in mcp_servers and Anthropic connects to it for you. See Build an agent with the Claude API.
  • Any MCP SDK: connect with the Streamable HTTP client transport and the Authorization header.
agent.ts
import { Client } from '@modelcontextprotocol/sdk/client/index.js'
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js'
 
const client = new Client({ name: 'my-agent', version: '1.0.0' })
await client.connect(
  new StreamableHTTPClientTransport(new URL('https://mcp.zonio.tech/mcp'), {
    requestInit: { headers: { Authorization: `Bearer ${process.env.ZONIO_API_KEY}` } },
  }),
)
 
const { tools } = await client.listTools()
const result = await client.callTool({
  name: 'search_parcels',
  arguments: { query: 'vacant plots over 1 ha zoned for logistics near the A4 in Gliwice' },
})

Limit what the agent can do

Create a dedicated key for each agent with only the scopes it needs (see Scopes). Tools outside the key's scopes are hidden from tools/list, so the model never sees them.

To exposeGive the key
Search and read-only inspectionparcels:read, search:read
+ market comparablesmarket:read
+ PDF reportsreports:create

Verify the connection

Ask your agent: "Use Zonio to tell me which layers are available." It should call list_layers and list ~45 layers. If it can't see the tools, check that the key is live (zk_live_) and that your client supports Streamable HTTP.