Planning applications MCP for ChatGPT, Claude and your agents
Plota is in ChatGPT's plugin directory, and any other assistant that speaks MCP takes it from one URL. It can then search planning applications across every UK planning authority, read a record in full, check what constrains a site, compare how councils decide, and pull appeals and expiring consents, all on your Plota account.

The server URL
Add this URL to your assistant and choose sign-in (OAuth) when it asks. You are sent to Plota to sign in with your account email, the same one as the API dashboard, My areas and portfolio monitoring, and you press Allow. There is no key to paste. No account yet? Enter your email and a free demo account is set up as you connect.
https://api.plota.co.uk/v1/oauth/mcp
Use counts against your account's plan exactly as an API call does, and an upgrade is picked up without reconnecting. See and end your connections under MCP in the API dashboard.
Or put an API key in the URL
For Cursor, VS Code, scripts and any client that cannot sign in. Get a key at /api-access (a demo key is free) and put it in the URL.
https://api.plota.co.uk/v1/mcp/YOUR_API_KEY
Streamable HTTP, stateless, JSON in and JSON out. Clients that can send headers may use https://api.plota.co.uk/v1/mcp with Authorization: Bearer YOUR_API_KEY instead of the key in the path.
Set up your client
ChatGPT
- Open Plota in ChatGPT's plugin directory and press Try in chat.
- When ChatGPT asks you to connect, a Plota page opens. Sign in with your account email and press Allow. No account yet? A free demo account is set up as you sign in.
- Ask a planning question. ChatGPT calls Plota as the conversation needs it.
To use an API key instead, make your own plugin: Settings, then Security and login, turn on Developer mode; Plugins, the plus button, the key URL above, and No authentication. ChatGPT reads a plugin of your own's tool list once, when it is created.
Claude
- Settings, then Connectors, then Add custom connector.
- Name: Plota. URL: the sign-in URL above.
- Connect. A Plota page opens: sign in, then press Allow.
- Enable it in a conversation and ask a planning question.
Claude Code: claude mcp add --transport http plota https://api.plota.co.uk/v1/oauth/mcp, then /mcp to sign in.
Cursor, Windsurf, VS Code
Add a remote MCP server of type HTTP. Where the client supports sign-in, the sign-in URL works; otherwise use the key URL. For Cursor:
{
"mcpServers": {
"plota": { "url": "https://api.plota.co.uk/v1/mcp/YOUR_API_KEY" }
}
}
What the assistant can do
One tool per API operation, generated from the OpenAPI description, so a new endpoint is a new tool the same day. Four more sit beside them: investigate_site, which answers for one address in a single call (what is at it, what is around it, what constrains it and how its council decides); search and fetch, the pair ChatGPT looks for; and find_council, which turns a council name into the slug the other tools take.
A reply gives the assistant one line per record to read, with the full records once as structured data. Searches leave out applicant, agent and site constraints unless they are asked for; get_application returns all of it for the record that matters. A whole council reference, such as LA04/2022/1694/F, finds that application exactly, archive records included on a paid plan. Tools that change the account or spend allowance tell the assistant to confirm with you first.
Applications
search_applicationsThe main way to find applications, and the right tool whenever any part of the question can be named as a filter. Exact filters: postcode (full or district), council slug, nation, category slug(s), keyword q, normalised stage, procedure, received and decided date ranges, the last sale price of the property (min_price, max_price; Pro plan and above), or a lat/lng radius. Returns records with address, proposal, status, dates, category, the last sale of the property and links to the Plota page and the council record, plus meta.next_cursor for the next page. Read the council slug from find_council and category slugs from list_categories. Records come back without contacts or constraints unless asked for.get_applicationOne planning application in full by its Plota id (the id field from any search result): proposal, address, status, decision, dates, category, documents count, links, and on Pro the planning constraints at the site. On paid plans it also gives the UPRN held for the property (plota_uprn) and, where its freehold parcel is identified with confidence, the freehold outline; on Pro every sale of the property (HM Land Registry price paid). This is where the enrichment lives, so search widely and then call this on the one or two that matter. Applicant and agent where held with include_contacts true.nearby_applicationsPlanning applications near a point, ordered by distance: give lat and lng, a full UK postcode, an address (geocoded live) or a uprn, with a radius in metres (max 5000). With a uprn the applications carrying it come first (matched_by uprn), and the radius defaults to 15 m.application_historyThe status and decision timeline of one application: every recorded status change with its date.search_appealsDecided planning appeals from the Planning Inspectorate: filter by council, outcome (allowed, dismissed, split), type, decision date range, reference or postcode.associated_applicationsThe family an application belongs to: earlier and later applications on the same site (outline, reserved matters, amendments, discharge of conditions, appeals).searchFallback lookup for a phrase that cannot be broken into filters: a building or estate by name, a street, a council reference, or words from a proposal. Up to ten results with id, title and URL; call fetch with an id for the full record, including historical results. Reference-shaped queries rank exact references first across live and plan-entitled historical records, followed by text mentions. Check the council when several exact matches exist. Whenever the question names a council, a place, a category, a stage, a date range or a number of homes, use search_applications instead for explicit filters.fetchThe simple document retrieval pair is search then fetch: fetch an id from search as full text with proposal, address, council, status, decision, dates, category and links. For structured analysis and optional contact or constraint fields, use search_applications and get_application.
Sites
site_constraintsWhat the national datasets put at a coordinate, a full postcode or an address (geocoded live): flood zones (and the same grown for climate change), surface water flood risk (England), flood defences, green belt, conservation areas, listed buildings and their outlines, scheduled monuments, national landscapes, tree preservation orders and single protected trees, rights of way, farmland grades, radon, coal mining, national infrastructure projects, London protected views and public transport access (PTAL) and more. Pro plan and above; a demo key gets 20 checks to try it.investigate_siteThe planning context of ONE property or site in a single call: applications at or beside the site, applications that may be at it, the families those belong to (amendments, discharges of conditions, reserved matters, appeals), the nearest applications around it, larger housing schemes nearby, the planning constraints at the point (flood zone, conservation area, listed buildings, green belt and the rest) and the council's decision times and approval rate. Use it for "what should I know about planning at or around this address"; give an address, a full postcode, a UPRN, or lat and lng. Do not use it for a filtered search across an area or for several sites: that is search_applications or nearby_applications. It returns evidence with links, not a judgement. It makes up to seven ordinary API requests on the account; a section the plan does not include comes back marked unavailable with the reason, and the rest still answers.
Decisions
decision_statsDecision times and approval rates. source=auto (default) tries the register, then official MHCLG aggregates only when the council lacks register decision dates and no window, specific segment or rankings were requested. source=register keeps register-only behaviour. source=mhclg requests official English council aggregates for their stated reporting period: omit window, segment and rankings. The response labels its actual source; official aggregates have median_days null and timing_metrics_available false.expiring_consentsPermitted full and outline consents whose statutory time limit falls in the coming months, for a council or a bounding box: sites where permission will lapse unless work starts.
Reference
application_documentsThe documents on one application's council file: title, type, date and group (decision, statements, plans, forms, comments, other), newest first. group=plans for plans and elevations. Titles naming a member of the public are marked names_person. Links go to the council's documents page, where every file opens.list_councilsThe councils Plota monitors with slug, nation, region and coverage. Filter by nation, region, a name fragment (q) or coverage_status; unfiltered it is every authority Plota covers, so filter when looking for one.list_categoriesThe planning categories (slug and label) used by the category filter. Call once and reuse the slugs.find_councilResolve a council name to the slug every other tool takes: "Waltham Forest" gives waltham-forest. Give any fragment of the name; add nation or region to narrow it. Use this rather than list_councils, which returns every authority.
Account
list_alertsThe saved alerts on this account.create_alertSave an alert that emails the account owner about new applications: type radius (a postcode, address or lat/lng with radius_km 0.25, 0.5, 1, 2 or 5), council (a slug from list_councils) or national (one category from list_categories across a nation). Optional type_filter (categories), min_dwellings and max_dwellings (homes), procedure (e.g. outline or full,outline), q (keywords), frequency daily/weekly/fortnightly, label. The account owner is emailed a confirmation. Plan caps apply. Confirm the area, filters and frequency with the user before calling.update_alertChange a saved alert: frequency, label, type_filter, exclude_trees, or paused true/false. This changes what the account owner is emailed: confirm the change with the user before calling.delete_alertDelete a saved alert by id. Confirm with the user before calling.get_alertOne saved alert by id.alert_matchesApplications that matched a saved alert in the last N days.create_exportBulk export of matching records in one call (plan-gated). Every row counts against the monthly row allowance and cannot be refunded, so use search_applications for browsing and confirm the filters and the intent with the user before calling.list_webhooksThe webhooks registered on this account.create_webhookRegister an HTTPS endpoint to receive application.match.created events for a saved alert (payload, signature and retries: https://plota.co.uk/api-docs#webhooks). Confirm the URL with the user before calling.delete_webhookDelete a webhook by id. Confirm with the user before calling.test_webhookSend a signed test event to a webhook by id. This calls the customer's endpoint: confirm with the user before calling.
Things to ask
- "What planning applications are pending within 300 m of SW11 2PF?"
- "Is this site in a conservation area or a flood zone, and are there listed buildings nearby?"
- "How long does Wandsworth take to decide householder applications, and how does that compare with the national figure?"
- "Which consents in Bristol lapse in the next six months?"
- "Show me appeals allowed against Wiltshire refusals this year."
- "Export every new-homes application in Cornwall received since June."
- "Which applications are linked to Oldham application HOU/355665/26?"
- "Email me every week about new applications within 1 km of SW11 2PF."
Allowance and privacy
Every tool call is one API request on the key, counted against the same request and records allowance as any other call on the plan. Applicant and agent details also draw on the plan's contact allowance, and an export counts every row it returns. There is no separate MCP price, and the demo key works for trying it out. The API pricing page has the plans.
Plota sees what it sees for any API call: the request, the key, the time and the size of the response, in the API request log. The conversation stays with the assistant. Nothing an assistant asks is used to train anything.
A connection made by signing in holds no key: Plota keeps a record of it and hashed access tokens, and you can end it at any time from connected assistants. The privacy policy covers connected assistants.
The key in the URL is the credential. Paste the URL into the connector and nowhere else, and rotate the key from the API dashboard if it is ever exposed. The API terms apply to use through MCP as they do to any other call.
Questions
What is MCP?
The Model Context Protocol is the open standard AI assistants use to call outside tools. A connector is a server that offers tools; the assistant reads the tool list, decides which to call, and reads the result. Plota offers one tool per API operation, so an assistant can search applications, read one record, check what constrains a site, compare decision times and more, with the figures coming from Plota rather than from memory.
Which assistants work with it?
Any client that speaks MCP over HTTP: ChatGPT, where Plota is in the plugin directory, Claude on the web and in Claude Desktop, Cursor, Windsurf, VS Code with Copilot, and agent frameworks.
Do I need an API key?
No. Add the server URL, choose sign-in, and sign in with your Plota account; a new address gets a free demo account as it connects. A key in the URL is there for tools that cannot sign in.
How is use charged?
Every tool call is one API request on your account, under the same request and records allowance as any other call on the plan. There is no separate MCP price. A demo account works for trying it out.
Is the key in the URL safe?
The key is the credential, so the URL is a password: paste it into the connector and nowhere else. Clients that can send headers may use the bare URL with an Authorization header instead. Keys can be rotated at any time from the API dashboard.
What does Plota see?
The same as for any API call: the request, the key it was made with, the time and the size of the response, kept in the API request log. The conversation itself stays with the assistant.