Skip to content
Documentation menu

Reference

MCP for developers

The API is also a remote Model Context Protocol server, so developer tools such as Claude Code can search planning applications as tools. It is the same product as the REST API: the same keys, fields, plan rules, record counting and 60 requests a minute (shared with your REST calls).

  • Server URL: https://planningsignal.co.uk/mcp
  • Transport: Streamable HTTP, stateless. Send JSON-RPC with POST; GET and DELETE return 405.
  • Authentication: the header Authorization: Bearer ps_live_... with your API key. Your client must be able to send a custom header.

Claude Code

claude mcp add --transport http planning-signal https://planningsignal.co.uk/mcp \
  --header "Authorization: Bearer ps_live_your_key_here"

Then ask, for example, "find planning applications within 500m of NW3 5NA decided this month".

Other MCP clients

Clients that connect to remote servers over Streamable HTTP and accept headers:

{
  "url": "https://planningsignal.co.uk/mcp",
  "headers": { "Authorization": "Bearer ps_live_your_key_here" }
}

Clients that only run local (stdio) servers can use the mcp-remote bridge:

{
  "mcpServers": {
    "planning-signal": {
      "command": "npx",
      "args": ["mcp-remote", "https://planningsignal.co.uk/mcp", "--header", "Authorization:${AUTH_HEADER}"],
      "env": { "AUTH_HEADER": "Bearer ps_live_your_key_here" }
    }
  }
}

To test from a terminal:

curl -s https://planningsignal.co.uk/mcp \
  -H "Authorization: Bearer ps_live_your_key_here" \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"search_applications","arguments":{"postcode":"NW3 5NA","radius_m":1000,"limit":5}}}'

Tools

search_applications

Search applications by postcode and radius, or by council. Up to 50 per call. Access: all plans, including the free demo. Each new record returned uses one record. Same data as /api/v1/applications.

InputTypeDescription
postcodestringUK postcode at the centre of the search. Give this or authority.
radius_minteger 100-20000Radius around the postcode in metres (default 1000).
authoritystringExact council name as list_authorities returns it.
keywordstringText matched against description and address (the REST q parameter).
statusenum: Undecided, Permitted, Conditions, Rejected, Withdrawn, Appeal, Unresolved, ReferredApplication status (the REST state parameter).
sincedateReceived on or after (YYYY-MM-DD).
untildateReceived on or before (YYYY-MM-DD).
decided_sincedateDecided on or after (YYYY-MM-DD).
limitinteger 1-50Results to return (default 20).
cursorstringnext_cursor from a previous result.

get_application

One application by id. Includes agent contacts on plans that have them. Access: all plans, including the free demo. Each new record returned uses one record. Same data as /api/v1/applications/:id.

InputTypeDescription
idrequiredstringApplication id (pa_...).

get_conditions

The conditions on an application's decision notice. Access: api pro, leads and national. Each new record returned uses one record. Same data as /api/v1/applications/:id/conditions.

InputTypeDescription
idrequiredstringApplication id (pa_...).

list_authorities

Council names as search_applications expects them, with counts. Free. Access: all plans, including the free demo. Free. Same data as /api/v1/authorities.

InputTypeDescription
name_containsstringOnly councils whose name contains this text.

get_usage

Your plan, allowance and records used. Free. Access: all plans, including the free demo. Free. Same data as /api/v1/usage.

No inputs.

search_applications needs a postcode or an authority and returns at most 50 applications per call.

Errors

  • A missing or invalid key is an HTTP 401 with a JSON-RPC error.
  • Problems inside a tool (plan does not include it, allowance used, rate limit, not found, bad input) come back as a tool result with isError: true and a sentence the assistant can relay, with an upgrade link where relevant.
  • Successful tool results include a usage object with records_charged, records_remaining and resets.
Keep the key out of shared config files and screenshots. Anyone holding it uses your allowance; revoke it on the API page if it leaks.

Questions? Contact us, or see the help centre.