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
- Open Settings → Connectors → Add custom connector.
- Name it Zonio and paste
https://mcp.zonio.tech/mcp. - 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:
{
"mcpServers": {
"zonio": {
"type": "http",
"url": "https://mcp.zonio.tech/mcp",
"headers": { "Authorization": "Bearer ${ZONIO_API_KEY}" }
}
}
}Cursor
{
"mcpServers": {
"zonio": {
"url": "https://mcp.zonio.tech/mcp",
"headers": { "Authorization": "Bearer zk_live_…" }
}
}
}VS Code (GitHub Copilot)
{
"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_serversand 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
Authorizationheader.
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 expose | Give the key |
|---|---|
| Search and read-only inspection | parcels:read, search:read |
| + market comparables | market:read |
| + PDF reports | reports: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.