Check and appeal UK parking tickets (PCNs): grounds, deadlines, draft letters and filing.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional. The guide, contravention-code, deadline and status tools need no key. To scan and file notices send 'Bearer <AppealGo API key>' (create one at https://appealgo.com/profile).
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Given the notice type and the date on the notice, returns the discount deadline, the challenge/representations deadline, when escalation can start, and (if you pass a rejection date) the tribunal or POPLA/IAS deadline. Statutory defaults; the notice is authoritative.
yyyy-mm-dd, the date on the notice
council_parking = Council parking PCN (windscreen or handed to you); council_postal = Council PCN by post (CCTV parking, bus lane or moving traffic outside London); london_moving = London bus lane, yellow box or banned turn (borough or TfL red route); tfl_charge = ULEZ, LEZ or Congestion Charge PCN (TfL); clean_air_zone = Clean Air Zone PCN (Birmingham, Bristol, Bath, Bradford, Portsmouth, Sheffield, Tyneside); private_anpr = Private parking charge by post (ANPR camera); private_windscreen = Private parking charge left on the windscreen
yyyy-mm-dd, the parking date if different (private ANPR/windscreen)
yyyy-mm-dd on the Notice of Rejection, if you have one
Given the notice type and the date on the notice, returns the discount deadline, the challenge/representations deadline, when escalation can start, and (if you pass a rejection date) the tribunal or POPLA/IAS deadline. Statutory defaults; the notice is authoritative.
| Argument | Type | Description |
|---|---|---|
| event_date | string | yyyy-mm-dd, the parking date if different (private ANPR/windscreen) |
| notice_date* | string | yyyy-mm-dd, the date on the notice |
| notice_type* | string | council_parking = Council parking PCN (windscreen or handed to you); council_postal = Council PCN by post (CCTV parking, bus lane or moving traffic outside London); london_moving = London bus lane, yellow box or banned turn (borough or TfL red route); tfl_charge = ULEZ, LEZ or Congestion Charge PCN (TfL); clean_air_zone = Clean Air Zone PCN (Birmingham, Bristol, Bath, Bradford, Portsmouth, Sheffield, Tyneside); private_anpr = Private parking charge by post (ANPR camera); private_windscreen = Private parking charge left on the windscreen |
| rejection_date | string | yyyy-mm-dd on the Notice of Rejection, if you have one |
| notice_to_owner_date | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"notice_type",
"notice_date"
],
"properties": {
"event_date": {
"type": "string",
"description": "yyyy-mm-dd, the parking date if different (private ANPR/windscreen)"
},
"notice_date": {
"type": "string",
"description": "yyyy-mm-dd, the date on the notice"
},
"notice_type": {
"enum": [
"council_parking",
"council_postal",
"london_moving",
"tfl_charge",
"clean_air_zone",
"private_anpr",
"private_windscreen"
],
"type": "string",
"description": "council_parking = Council parking PCN (windscreen or handed to you); council_postal = Council PCN by post (CCTV parking, bus lane or moving traffic outside London); london_moving = London bus lane, yellow box or banned turn (borough or TfL red route); tfl_charge = ULEZ, LEZ or Congestion Charge PCN (TfL); clean_air_zone = Clean Air Zone PCN (Birmingham, Bristol, Bath, Bradford, Portsmouth, Sheffield, Tyneside); private_anpr = Private parking charge by post (ANPR camera); private_windscreen = Private parking charge left on the windscreen"
},
"rejection_date": {
"type": "string",
"description": "yyyy-mm-dd on the Notice of Rejection, if you have one"
},
"notice_to_owner_date": {
"type": "string"
}
}
}Upload a photo or PDF of a UK parking ticket, council PCN, private parking charge, bus lane, ULEZ or Clean Air Zone notice. AppealGo reads it, identifies the issuer and contravention, finds the grounds to challenge it and drafts the appeal. Checking is free (fair-use cap per key per day); filing costs £7.99 or is covered by a plan, up to its appeal allowance. Provide image_url OR image_base64. Takes 20–90 seconds. Never invent notice details: report exactly what this tool returns.
| Argument | Type | Description |
|---|---|---|
| force | boolean | Scan even if this account already appealed the same notice |
| file_name | string | |
| image_url | string | Public https URL of the photo/PDF |
| content_type | string | image/jpeg, image/png, image/heic or application/pdf (for image_base64) |
| image_base64 | string | Base64 of the photo/PDF (data: URLs accepted) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"force": {
"type": "boolean",
"description": "Scan even if this account already appealed the same notice"
},
"file_name": {
"type": "string"
},
"image_url": {
"type": "string",
"description": "Public https URL of the photo/PDF"
},
"content_type": {
"type": "string",
"description": "image/jpeg, image/png, image/heic or application/pdf (for image_base64)"
},
"image_base64": {
"type": "string",
"description": "Base64 of the photo/PDF (data: URLs accepted)"
}
}
}What a two-digit council PCN contravention code means (e.g. 01, 12, 30, 34, 62), its penalty band, and the grounds that usually beat it.
| Argument | Type | Description |
|---|---|---|
| code* | string | The code on the PCN, e.g. '12' or '31J' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"code"
],
"properties": {
"code": {
"type": "string",
"description": "The code on the PCN, e.g. '12' or '31J'"
}
}
}Files the drafted appeal for a notice in the account holder's own name. This sends a real appeal to a real council or parking operator and cannot be undone, so confirm with the user first. If the notice is unpaid and not covered by a plan, returns a Stripe checkout_url (£7.99 standard); once paid, AppealGo files it automatically. Name and postal address are required (saved on the profile, or pass them here). Always show the user the checkout_url rather than claiming the appeal was filed.
| Argument | Type | Description |
|---|---|---|
| id* | string | |
| name | string | Full name the appeal is filed under |
| address | string | Full postal address including postcode |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
},
"name": {
"type": "string",
"description": "Full name the appeal is filed under"
},
"address": {
"type": "string",
"description": "Full postal address including postcode"
}
}
}Returns a full AppealGo guide as Markdown, with its sources.
| Argument | Type | Description |
|---|---|---|
| slug* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string"
}
}
}Full detail for a notice id returned by check_notice or list_my_notices.
| Argument | Type | Description |
|---|---|---|
| id* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string"
}
}
}Every notice this AppealGo account has scanned, with status and links.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Public status for a customer reference such as PCN-4471A2B9.
| Argument | Type | Description |
|---|---|---|
| reference* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"reference"
],
"properties": {
"reference": {
"type": "string"
}
}
}Find the code for a description, e.g. 'disabled bay' or 'bus lane'.
| Argument | Type | Description |
|---|---|---|
| query* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"query": {
"type": "string"
}
}
}Search plain-English guides on appealing UK parking tickets: council PCNs, private parking charges (ParkingEye, Euro Car Parks, APCOA...), bus lane, ULEZ, Clean Air Zone, Notice to Owner, TE9 witness statements, London boroughs and contravention codes. Returns slugs to pass to get_guide.
| Argument | Type | Description |
|---|---|---|
| query* | string | Free text, e.g. 'ParkingEye grace period' or 'yellow box' |
| category | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Free text, e.g. 'ParkingEye grace period' or 'yellow box'"
},
"category": {
"enum": [
"notice-types",
"operators",
"councils",
"codes"
],
"type": "string"
}
}
}