Search and read UK legislation at any date, resolve citations, list amendments, track changes.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
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.
List the effects — amendments, repeals, revocations, commencements, modifications — recorded against an item (direction affected) or made by an item (direction affecting), from legislation.gov.uk's changes feeds. Filter by the other item (counterpart), by applied status (unapplied = the outstanding work on the revised text), and by provision. item may be partial (ukpga/2018 = all effects on 2018 Acts). Each effect names both sides with provision links, in-force dates, and why it is not applied. For the applied history of one provision in prose, read its annotations with uklaw_get_document.
Item path or legislation.gov.uk URI (ukpga/2018/12), or a partial path: a type (uksi) or type and year (ukpga/2018). Get a full path from uklaw_lookup_citation or uklaw_search_legislation. A pre-1963 Act takes its calendar year (ukpga/1925/20, not ukpga/Geo5/15-16/20); its effects name the regnal path, and two sessions in one year can share a number. Drafts (ukdsi, sdsi, nidsr) are not in the changes feeds.
Effects per page, or with provision the most matches returned (1–100, default 20).
next_cursor from the previous call, passed with the other inputs unchanged; omit for the first page.
unapplied: effects not yet applied to the revised text; applied: already applied; all: both.
affected: changes made to item. affecting: changes item makes to other legislation.
Keep only effects touching this provision of item (path or shorthand, e.g. section/45 or s. 45), including effects on the whole item. Needs a full item path. legislation.gov.uk cannot filter by provision, so each call scans up to 1,500 effects; continue with next_cursor.
Restrict to effects involving this other item (full or partial item path, without a provision, e.g. uksi/2019/419 or uksi/2026) — the amending item for direction affected, the amended item for affecting. A pre-1963 Act takes its calendar year, not its regnal path; drafts are not in the changes feeds.
List the effects — amendments, repeals, revocations, commencements, modifications — recorded against an item (direction affected) or made by an item (direction affecting), from legislation.gov.uk's changes feeds. Filter by the other item (counterpart), by applied status (unapplied = the outstanding work on the revised text), and by provision. item may be partial (ukpga/2018 = all effects on 2018 Acts). Each effect names both sides with provision links, in-force dates, and why it is not applied. For the applied history of one provision in prose, read its annotations with uklaw_get_document.
| Argument | Type | Description |
|---|---|---|
| item* | string | Item path or legislation.gov.uk URI (ukpga/2018/12), or a partial path: a type (uksi) or type and year (ukpga/2018). Get a full path from uklaw_lookup_citation or uklaw_search_legislation. A pre-1963 Act takes its calendar year (ukpga/1925/20, not ukpga/Geo5/15-16/20); its effects name the regnal path, and two sessions in one year can share a number. Drafts (ukdsi, sdsi, nidsr) are not in the changes feeds. |
| limit | integer | Effects per page, or with provision the most matches returned (1–100, default 20). |
| cursor | string | next_cursor from the previous call, passed with the other inputs unchanged; omit for the first page. |
| status | string | unapplied: effects not yet applied to the revised text; applied: already applied; all: both. |
| direction | string | affected: changes made to item. affecting: changes item makes to other legislation. |
| provision | string | Keep only effects touching this provision of item (path or shorthand, e.g. section/45 or s. 45), including effects on the whole item. Needs a full item path. legislation.gov.uk cannot filter by provision, so each call scans up to 1,500 effects; continue with next_cursor. |
| counterpart | string | Restrict to effects involving this other item (full or partial item path, without a provision, e.g. uksi/2019/419 or uksi/2026) — the amending item for direction affected, the amended item for affecting. A pre-1963 Act takes its calendar year, not its regnal path; drafts are not in the changes feeds. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"item"
],
"properties": {
"item": {
"type": "string",
"pattern": "^\\S+$",
"maxLength": 500,
"minLength": 1,
"description": "Item path or legislation.gov.uk URI (ukpga/2018/12), or a partial path: a type (uksi) or type and year (ukpga/2018). Get a full path from uklaw_lookup_citation or uklaw_search_legislation. A pre-1963 Act takes its calendar year (ukpga/1925/20, not ukpga/Geo5/15-16/20); its effects name the regnal path, and two sessions in one year can share a number. Drafts (ukdsi, sdsi, nidsr) are not in the changes feeds."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 100,
"minimum": 1,
"description": "Effects per page, or with provision the most matches returned (1–100, default 20)."
},
"cursor": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 500,
"description": "next_cursor from the previous call, passed with the other inputs unchanged; omit for the first page."
},
"status": {
"enum": [
"all",
"unapplied",
"applied"
],
"type": "string",
"default": "all",
"description": "unapplied: effects not yet applied to the revised text; applied: already applied; all: both."
},
"direction": {
"enum": [
"affected",
"affecting"
],
"type": "string",
"default": "affected",
"description": "affected: changes made to item. affecting: changes item makes to other legislation."
},
"provision": {
"type": "string",
"pattern": "^[A-Za-z0-9.()/\\s-]+$",
"maxLength": 200,
"description": "Keep only effects touching this provision of item (path or shorthand, e.g. section/45 or s. 45), including effects on the whole item. Needs a full item path. legislation.gov.uk cannot filter by provision, so each call scans up to 1,500 effects; continue with next_cursor."
},
"counterpart": {
"type": "string",
"pattern": "^\\S+$",
"maxLength": 500,
"minLength": 1,
"description": "Restrict to effects involving this other item (full or partial item path, without a provision, e.g. uksi/2019/419 or uksi/2026) — the amending item for direction affected, the amended item for affecting. A pre-1963 Act takes its calendar year, not its regnal path; drafts are not in the changes feeds."
}
},
"additionalProperties": false
}Read one item or one provision of UK legislation from legislation.gov.uk — as it stands now (revised), as enacted/made, or as it stood on a date — in Markdown, with its editorial status, annotations (the applied amendment history), the unapplied effects touching it, the versions available, and attribution. Provision-level reads are the main path; an item-level read returns the whole text only for small items and otherwise an outline of provision paths to read next. With match_text (item level), returns the provisions whose text matches. Revised text is an editorial consolidation that can lag: read editorial.caveat and unapplied_effects before relying on it, and use uklaw_get_amendments for every recorded effect on an item, applied or not.
| Argument | Type | Description |
|---|---|---|
| item* | string | Item path {type}/{year}/{number} — ukpga/2018/12, uksi/2019/419, eur/2016/679, ukpga/Eliz2/3-4/19 — or any legislation.gov.uk URI (a URI carrying a provision, version, or /welsh is split into those parts; a version or /welsh in the URI applies unless the version or language input is set). Get it from uklaw_lookup_citation or uklaw_search_legislation. |
| version | string | current (the latest revised text, or the original text for an item never revised), enacted (made, adopted and created are synonyms — the original text), or a date YYYY-MM-DD for the text as it stood then. Omitted: the version in an item URI, else current. A future date returns the latest version, and a date on or after the made or enactment date of an item never revised returns its original text, with a notice; version.applied reports the version served. |
| language | string | en, or cy for the Welsh text of Welsh legislation (asc, anaw, mwa, wsi). Omitted: cy when an item URI ends in /welsh, else en. English is returned, with a notice, when no Welsh text exists. |
Decode the vocabulary the other uklaw_* tools take and return: legislation type codes (ukpga, uksi, eur, …) with their labels, categories and enacted keywords; type groups; extents; version keywords; document status; annotation letters (F, C, I, M, E, P, X); effect record fields; provision path forms and shorthand; accepted citation formats; Publication Log vocabulary and read modes; data coverage; and the attribution lines. Offline — no request to legislation.gov.uk.
| Argument | Type | Description |
|---|---|---|
| topic* | string | Which table to return: types, type_groups, extents, versions, document_status, annotation_types, effects, provision_paths, citation_formats, publication_log, coverage, or attribution. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"topic"
],
"properties": {
"topic": {
"enum": [
"types",
"type_groups",
"extents",
"versions",
"document_status",
"annotation_types",
"effects",
"provision_paths",
"citation_formats",
"publication_log",
"coverage",
"attribution"
],
"type": "string",
"description": "Which table to return: types, type_groups, extents, versions, document_status, annotation_types, effects, provision_paths, citation_formats, publication_log, coverage, or attribution."
}
},
"additionalProperties": false
}Resolve a citation or short title to the canonical legislation.gov.uk item and provision: "Data Protection Act 2018 s. 45", "2018 c. 12", "S.I. 2019/419", "S.S.I. 2020/123", "S.R. 2020/12", "2020 asp 13", "Regulation (EU) 2016/679 art. 28", a legislation.gov.uk URI, or a short title. Returns the item path to pass to uklaw_get_document, and when a provision is given, whether it exists in the current version. A miss or an ambiguous title is a result with found false plus guidance or candidates, not an error. To find legislation by topic or by partial title words rather than a known citation, use uklaw_search_legislation.
| Argument | Type | Description |
|---|---|---|
| citation* | string | A citation ("2018 c. 12", "S.I. 2019/419 reg. 5", "Regulation (EU) 2016/679 art. 28"), a short title ("Data Protection Act 2018 s. 45(2)(f)"), or a legislation.gov.uk URI. uklaw_list_reference topic citation_formats lists the accepted forms. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"citation"
],
"properties": {
"citation": {
"type": "string",
"maxLength": 300,
"minLength": 1,
"description": "A citation (\"2018 c. 12\", \"S.I. 2019/419 reg. 5\", \"Regulation (EU) 2016/679 art. 28\"), a short title (\"Data Protection Act 2018 s. 45(2)(f)\"), or a legislation.gov.uk URI. uklaw_list_reference topic citation_formats lists the accepted forms."
}
},
"additionalProperties": false
}Search the UK statute book on legislation.gov.uk by full text or title, or list legislation by type and year, filtered by geographical extent and point in time. Full-text search ranks by relevance; title searches and type/year listings run newest year first and carry type and year counts (facets) to narrow with. Each result gives the item path to pass to uklaw_get_document. For a known citation or short title, uklaw_lookup_citation is cheaper and exact.
| Argument | Type | Description |
|---|---|---|
| page | integer | Page number (1–10,000). |
| text | string | Full-text query. Supports AND/OR, "quoted phrases", and stemming. Omit for a title search or a listing. |
| year | integer | Calendar year (also for pre-1963 Acts numbered by regnal year). Not combinable with year_from/year_to. |
| as_of | string | Point in time YYYY-MM-DD: only legislation as it stood on that date (items not yet enacted or made are excluded). Omit for current law. Cannot combine with extent. |
| limit | integer | Results per page (1–50). |
| title | string | Words that must all occur in the title. For a known short title or citation, uklaw_lookup_citation is exact. |
| types | array |
Read the legislation.gov.uk Publication Log for a date window of up to 31 days: new items, new revised versions, newly recorded effects, and withdrawals, newest first — the compliance-monitoring view of "what changed". Filter by content type, effect direction, category, an item or type/year, first-time items only, or event. With a full item path it reads that item's own log, usually in one call; otherwise it walks the window day by day, newest first, so a broad window may need several calls. A changes event carries no effect detail — uklaw_get_amendments with that item has it. Continue with next_cursor.
| Argument | Type | Description |
|---|---|---|
| item | string | A full item path (ukpga/2018/12) or legislation.gov.uk URI reads that item's own log; a type (uksi) or type and year (uksi/2026) narrows the day walk. Get a full path from uklaw_lookup_citation or uklaw_search_legislation. |
| event | string | Only published or only withdrawn events. Omit for both. |
| limit | integer | Most events returned by this call (1–80). |
| cursor | string | next_cursor from the previous call, passed with the other inputs unchanged; omit to start from end_date. |
| category | string | Item category: primary, secondary, or eu-origin. With content_type legislation or associated-documents only. |
| end_date | string |
| provision | string | Provision path — section/45/2/f, regulation/5, article/28/3, schedule/2/paragraph/3, part/3/chapter/2, introduction — or citation shorthand (s. 45(2)(f), reg. 5, art. 28(3), Sch. 2 para. 3), normalized before the request. Omit to read the item; an item-level outline lists the paths. |
| match_text | string | Item level only (omit provision): return the outline of provisions whose text contains this term, e.g. "processor" — 100 entries per call; outline_offset reaches the rest. |
| outline_offset | integer | Where a returned outline starts: 0 lists entries 1–100, 100 the next 100. Applies only when kind is outline (ignored when text is returned); a notice names the next offset while entries remain. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"item"
],
"properties": {
"item": {
"type": "string",
"pattern": "^[^\\s/]*(?:\\/[^\\s/]*){2,}$",
"maxLength": 500,
"minLength": 1,
"description": "Item path {type}/{year}/{number} — ukpga/2018/12, uksi/2019/419, eur/2016/679, ukpga/Eliz2/3-4/19 — or any legislation.gov.uk URI (a URI carrying a provision, version, or /welsh is split into those parts; a version or /welsh in the URI applies unless the version or language input is set). Get it from uklaw_lookup_citation or uklaw_search_legislation."
},
"version": {
"type": "string",
"pattern": "^(current|enacted|made|adopted|created|\\d{4}-\\d{2}-\\d{2})$",
"description": "current (the latest revised text, or the original text for an item never revised), enacted (made, adopted and created are synonyms — the original text), or a date YYYY-MM-DD for the text as it stood then. Omitted: the version in an item URI, else current. A future date returns the latest version, and a date on or after the made or enactment date of an item never revised returns its original text, with a notice; version.applied reports the version served."
},
"language": {
"enum": [
"en",
"cy"
],
"type": "string",
"description": "en, or cy for the Welsh text of Welsh legislation (asc, anaw, mwa, wsi). Omitted: cy when an item URI ends in /welsh, else en. English is returned, with a notice, when no Welsh text exists."
},
"provision": {
"type": "string",
"pattern": "^[A-Za-z0-9.()/\\s-]+$",
"maxLength": 200,
"description": "Provision path — section/45/2/f, regulation/5, article/28/3, schedule/2/paragraph/3, part/3/chapter/2, introduction — or citation shorthand (s. 45(2)(f), reg. 5, art. 28(3), Sch. 2 para. 3), normalized before the request. Omit to read the item; an item-level outline lists the paths."
},
"match_text": {
"type": "string",
"maxLength": 200,
"description": "Item level only (omit provision): return the outline of provisions whose text contains this term, e.g. \"processor\" — 100 entries per call; outline_offset reaches the rest."
},
"outline_offset": {
"type": "integer",
"default": 0,
"maximum": 9007199254740991,
"minimum": 0,
"description": "Where a returned outline starts: 0 lists entries 1–100, 100 the next 100. Applies only when kind is outline (ignored when text is returned); a notice names the next offset while entries remain."
}
},
"additionalProperties": false
}| Type codes (ukpga, uksi, asp, eur, …) and/or groups (all, primary, secondary, eu-origin, draft). "all" covers UK and EU-origin legislation, excluding drafts, and absorbs any other value. uklaw_list_reference topic types lists the codes. |
| extent | array | Geographical extent: england, wales, scotland, ni. An item matches when one of its provisions extends there. Cannot combine with as_of. legislation.gov.uk has not recorded provision-level extent for many recent items, so an empty result does not prove nothing extends there. |
| year_to | integer | Latest calendar year of a range; the other bound may be omitted. |
| year_from | integer | Earliest calendar year of a range; the other bound may be omitted. |
| extent_match | string | Used only with extent. applicable: a provision extends to any given extent; exact: a provision extends to exactly that set. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"page": {
"type": "integer",
"default": 1,
"maximum": 10000,
"minimum": 1,
"description": "Page number (1–10,000)."
},
"text": {
"type": "string",
"maxLength": 500,
"description": "Full-text query. Supports AND/OR, \"quoted phrases\", and stemming. Omit for a title search or a listing."
},
"year": {
"type": "integer",
"maximum": 2100,
"minimum": 1267,
"description": "Calendar year (also for pre-1963 Acts numbered by regnal year). Not combinable with year_from/year_to."
},
"as_of": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Point in time YYYY-MM-DD: only legislation as it stood on that date (items not yet enacted or made are excluded). Omit for current law. Cannot combine with extent."
},
"limit": {
"type": "integer",
"default": 20,
"maximum": 50,
"minimum": 1,
"description": "Results per page (1–50)."
},
"title": {
"type": "string",
"maxLength": 300,
"description": "Words that must all occur in the title. For a known short title or citation, uklaw_lookup_citation is exact."
},
"types": {
"type": "array",
"items": {
"enum": [
"all",
"primary",
"secondary",
"eu-origin",
"draft",
"ukpga",
"ukla",
"ukppa",
"asp",
"asc",
"anaw",
"mwa",
"ukcm",
"nia",
"nisi",
"apni",
"mnia",
"aosp",
"aep",
"aip",
"apgb",
"gbla",
"gbppa",
"uksi",
"wsi",
"ssi",
"nisr",
"ukci",
"ukmd",
"ukmo",
"uksro",
"nisro",
"eur",
"eudn",
"eudr",
"eut",
"ukdsi",
"sdsi",
"nidsr"
],
"type": "string"
},
"default": [
"all"
],
"maxItems": 39,
"description": "Type codes (ukpga, uksi, asp, eur, …) and/or groups (all, primary, secondary, eu-origin, draft). \"all\" covers UK and EU-origin legislation, excluding drafts, and absorbs any other value. uklaw_list_reference topic types lists the codes."
},
"extent": {
"type": "array",
"items": {
"enum": [
"england",
"wales",
"scotland",
"ni"
],
"type": "string"
},
"maxItems": 4,
"description": "Geographical extent: england, wales, scotland, ni. An item matches when one of its provisions extends there. Cannot combine with as_of. legislation.gov.uk has not recorded provision-level extent for many recent items, so an empty result does not prove nothing extends there."
},
"year_to": {
"type": "integer",
"maximum": 2100,
"minimum": 1267,
"description": "Latest calendar year of a range; the other bound may be omitted."
},
"year_from": {
"type": "integer",
"maximum": 2100,
"minimum": 1267,
"description": "Earliest calendar year of a range; the other bound may be omitted."
},
"extent_match": {
"enum": [
"applicable",
"exact"
],
"type": "string",
"default": "applicable",
"description": "Used only with extent. applicable: a provision extends to any given extent; exact: a provision extends to exactly that set."
}
},
"additionalProperties": false
}| Last event date, YYYY-MM-DD; defaults to start_date. The window is at most 31 days. |
| new_only | boolean | true: only events for items appearing on legislation.gov.uk for the first time. |
| direction | string | With content_type changes only: effects recorded against (affected) or made by (affecting) the item. |
| start_date* | string | First event date of the window, YYYY-MM-DD (UK local time). |
| content_type | string | legislation (documents published), changes (effects recorded), draft, or associated-documents. Omit for all. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"start_date"
],
"properties": {
"item": {
"type": "string",
"pattern": "^\\S+$",
"maxLength": 500,
"minLength": 1,
"description": "A full item path (ukpga/2018/12) or legislation.gov.uk URI reads that item's own log; a type (uksi) or type and year (uksi/2026) narrows the day walk. Get a full path from uklaw_lookup_citation or uklaw_search_legislation."
},
"event": {
"enum": [
"published",
"withdrawn"
],
"type": "string",
"description": "Only published or only withdrawn events. Omit for both."
},
"limit": {
"type": "integer",
"default": 40,
"maximum": 80,
"minimum": 1,
"description": "Most events returned by this call (1–80)."
},
"cursor": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]+$",
"maxLength": 500,
"description": "next_cursor from the previous call, passed with the other inputs unchanged; omit to start from end_date."
},
"category": {
"enum": [
"primary",
"secondary",
"eu-origin"
],
"type": "string",
"description": "Item category: primary, secondary, or eu-origin. With content_type legislation or associated-documents only."
},
"end_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Last event date, YYYY-MM-DD; defaults to start_date. The window is at most 31 days."
},
"new_only": {
"type": "boolean",
"default": false,
"description": "true: only events for items appearing on legislation.gov.uk for the first time."
},
"direction": {
"enum": [
"affected",
"affecting"
],
"type": "string",
"description": "With content_type changes only: effects recorded against (affected) or made by (affecting) the item."
},
"start_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "First event date of the window, YYYY-MM-DD (UK local time)."
},
"content_type": {
"enum": [
"legislation",
"changes",
"draft",
"associated-documents"
],
"type": "string",
"description": "legislation (documents published), changes (effects recorded), draft, or associated-documents. Omit for all."
}
},
"additionalProperties": false
}