Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Recently observed → Live
Live → Recently observed
Added "committees_search_businesses" and "hmrc_get_manual_page"; changed the definition of "committees_search_evidence", "hmrc_search_guidance", "legislation_get_section" and 4 more (35 tools before, 37 now)
USE THIS TOOL WHENyou have a committee_id and want theretrievingoralcommitteeandevidence,writtenespeciallyevidenceforsubmittedantoidentifiedit.inquiry. Returns ONE PAGE of evidence (default 20) ⟨70 unchanged words⟩ submissions, re-call with offset=offset+returned while has_more is true.AuthoritativeFor inquiry-specific research, first call committees_search_businesses and pass its exact committee_business_id; this filters at the authoritative sourceforbeforeparliamentarypagination. Source:committeeUKevidence.
USE THIS TOOL WHENsearching GOV.UK fordiscovering HMRCtaxGOV.UK guidance on atopic (VAT, income tax, corporation tax, etc.).topic. Returnsmatching guidanceofficial-search titles, URLs,summariesdescriptions, andlast-updatedpublisheddates.dates;SearchesdescriptionsthedoofficialnotGOV.UKestablishcontenttheAPI
⟨26 unchanged words⟩ in-force metadata. Returns the provision's own text andits ownheading—, never aneighbouringor enclosing Part/Chapter's content.neighbouring Part/Chapter. Also returnsterritorialextent,in-forcein-force/prospectivestatusdata, andprospective flag. Contentcapped per max_chars (default 10,000, ~2,500 tokens) — raise for unusually longtruncationdefinitionmetadata.sections;Passcheckthecontent_truncatedbare
⟨18 unchanged words⟩ (parts, chapters, individual sections/regulations/articles). Returnsstructural elements withXMLidids andtitle,titles in document order,e.g.'section-47: Definitions' for an Act or 'regulation-4: Maximum weekly working time' for an SI. Individual provisions are listed alongside their enclosing Part/Chapter/crossheading headings — both levels matter: the heading entries give you the document'sincludingshapeParts,the provision entries givechapters,youcrossheadings,whatandtoprovisions;passatorare
⟨52 unchanged words⟩ you already know the value. For currency-driven searches("the recent Renters' Rights Act"), query by phrasealoneand read theyear from the resultsreturned—year; guessinga year and filtering byanitexactzeroesyearresultscanwhenzerowrong.results. For broader concept queries across content, set `fulltext=True`.AuthoritativesourceIffor
⟨7 unchanged words⟩ topic, bill title, or text phrase. Returns source-backed contributions with citation-grade metadata: member_id,attributed_to,column_ref, debate_id, debate_ext_id, contribution_ext_id, and public URL.AFTERThe independent corpus envelope is optional enrichment: if it cannot be retrieved after one bounded retry, contributions still return with enrichment_status="degraded" and an explicit warning; omitted corpus totals and previews must not be inferred. AFTER calling, drill intofull content via read_resource(uri="hansard://debate/{debate_ext_id}/header")— or,equivalently,callparliament_get_debate_contributions(debate_ext_id) for the samecontent
Read a registered server resourcebyURI,itsnotURI.an ordinary web URL.ForUSEstaticWHENresources,youprovidehavetheaexactjudgment://,URI.legislation://,Forhansard://,templatedorresources,
Search Committee Inquiries and Business — USE THIS TOOL WHEN identifying a committee inquiry or business before evidence retrieval. Returns official business IDs, titles, types, dates, and report/status metadata. AFTER calling, use an exact ID as committee_business_id in committees_search_evidence. Source: UK Parliament Committees API CommitteeBusiness endpoint.
Read HMRC Internal Manual Page — USE THIS TOOL WHEN a cited HMRC internal-manual page must be read. Returns bounded source-order text, canonical URL, manual reference, source metadata, and retrieval provenance. AFTER calling, cite or analyse only returned text; if retrieval fails, do not infer the page's contents. Source: the allowlisted official GOV.UK HMRC internal-manual page.
Recently observed → Live
Live → Recently observed
Recently observed → Live
Live → Recently observed
Recently observed → Live
Live → Recently observed
Recently observed → Live
Live → Recently observed
Certificate recorded, valid to 2026-11-19
Authorization not required
Changed the definition of "bills_search_bills", "committees_search_evidence", "hmrc_get_vat_rate" and 1 more
⟨16 unchanged words⟩ a paginated page of bill summaries (title, originating and current house, current stage, whetherit became an Act). AFTER calling, pass ⟨21 unchanged words⟩
⟨13 unchanged words⟩ default":null,"description":"Filter by originatinghouse.house: the House the bill was introduced in, wherever it sits now. Omit (or 'All') for all houses."},"limit":{"default"
First tool surface recorded: 35 tools (server version 0.6.1)
Showing the latest 16 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
{"additionalProperties":false,"properties":{"committee_business_id":{"anyOf":[{"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Exact official inquiry/business ID from committees_search_businesses. Applies the source filter before pagination; do not infer this from a title."},"committee_id":{"description":"Committee ID from committees_search_committees ⟨136 unchanged words⟩ ":2147483647,"minimum":0,"type":"integer"},"published_from":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Optional inclusive source publication-date lower bound (YYYY-MM-DD). Applied upstream before pagination."},"published_to":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Optional inclusive source publication-date upper bound (YYYY-MM-DD). Applied upstream before pagination."}},"required":["committee_id"],"type":"object"}
⟨64 unchanged words⟩ per item.","items":{"properties":{"datecommittee_businesses":{"description":"Source inquiry/business identities associated with this evidence item","items":{"description":"Source-supplied parliamentary committee business or inquiry identity.","properties":{"close_date":{"anyOf":[{"format":"date","type" ⟨2 unchanged words⟩ null"}],"default":null,"description":"DateSource-suppliedthebusiness closing date"},"id":{"description":"Official CommitteeBusiness ID; use as committee_business_id for exact evidencewasfiltering","type":"integer"},"is_inquiry":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Source-suppliedgiventype flag; null when absent"},"latest_report":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"default":null,"description":"Source-supplied latest-report metadata, unmodified when present"},"open_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Source-supplied business opening date"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source-supplied business status where present"},"title":{"description":"Source-supplied inquiry orsubmittedbusiness title","type":"string"},"type":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source-supplied business type name, e.g. Inquiry"}},"required":["id","title"],"type":"object"},"type":"array"},"date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Compatibility date: oral meeting_date when present, otherwise publication_date; use the source-specific fields for research"},"document":{"anyOf":[{"properties":{"document_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Source document ID"},"files":{"description":"Source-supplied document file metadata","items":{"properties":{"file_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source-supplied document filename"},"format":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source-supplied document file format"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Source-supplied document file size in bytes"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source-supplied file URL; null means the source supplied no direct URL"}},"type":"object"},"type":"array"}},"type":"object"},{"type":"null"}],"default":null,"description":"Source document metadata; null when no document is supplied"},"hc_number":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source HC paper number where supplied"},"id":{"description":"Evidence item ID","type":"integer"},"internal_reference":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source internal submission reference, usually for written evidence"},"legacy_html_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source legacy HTML URL where supplied"},"legacy_pdf_url":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source legacy PDF URL where supplied"},"meeting_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Source oral-evidence meeting date; null for written evidence or absent source data"},"publication_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Source publication date; null only when the upstream record omits it"},"session":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Source parliamentary session description where supplied"},"title":{"description":"Evidence title ⟨256 unchanged words⟩
{"description":"Container for legislation search results.","properties":{"fallback_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Typed upstream reason that triggered the automatic full-text fallback, or null when the requested route completed normally."},"results":{"description":"Matching legislation items", ⟨190 unchanged words⟩ ,"type":"object"},"type":"array"},"search_mode":{"default":"title","description":"Route that produced these results. fulltext_fallback means the title route was unavailable because legislation.gov.uk returned a typed WAF/non-XML failure, so the server retried once using the documented full-text route; relevance may therefore be broader than title search.","enum":["title","fulltext","fulltext_fallback"],"type":"string"},"total":{"description":"Total number ⟨9 unchanged words⟩
before
{"description":"Result of a Hansard debate search.\n\nWraps the list of matching contributions with the query, filters,\nand corpus-level facet counts so the client sees a real nested object\non the wire.","properties":{"contributions":{"description":"Matching Hansard contributions with full citation metadata.","items":{"description":"A single Hansard debate contribution with citation-grade metadata.\n\nField provenance maps to the upstream hansard-api.parliament.uk\n`Contributions[i]` payload, so callers can footnote a contribution\nwithout re-querying.","properties":{"attributed_to":{"description":"Full citable attribution string, verbatim from Hansard, e.g. 'The Minister of State, DESNZ (Lord Whitehead) (Lab)' or 'Lord Pannick (CB)'. This is the authoritative citation text — quote it as-is rather than reconstructing it from other fields.","type":"string"},"chamber_section":{"description":"Hansard section bucket (Section): 'Commons Chamber', 'Lords Chamber', 'Westminster Hall', 'Written Answers', 'Written Statements'.","type":"string"},"column_end":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"The last Hansard column number this contribution spans, e.g. when a long speech runs across columns 200–203. Equal to `column_start` for short contributions. Same population semantics as `column_start`."},"column_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Hansard internal page-marker code from HansardSection (e.g. 'BE-BG1', 'AA-AD'). NOT the citable column number that appears in an OSCOLA footnote — see `column_start` / `column_end` for those, which are only available when reading the contribution via hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}. From parliament_search_hansard, only this page-marker is exposed."},"column_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"The citable Hansard column number where this contribution begins, e.g. 200, 1162. Extracted from `data-column-number` markers in the contribution HTML. Populated only when reading via the contribution resource — `parliament_search_hansard` returns this as None because Hansard's /search.json strips the column markers. To get the real column number for a search hit, read hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}."},"constituency":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Constituency (Commons only; None for Lords). Not currently populated from AttributedTo — see `party`'s note on why positional parsing of that string is unsafe; use parliament_find_member for authoritative constituency."},"contribution_ext_id":{"description":"ContributionExtId GUID — stable citation key. Use as {contribution_ext_id} in hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}.","type":"string"},"date":{"description":"Date the contribution was made (SittingDate)","format":"date","type":"string"},"debate_ext_id":{"description":"DebateSectionExtId GUID. Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header.","type":"string"},"debate_id":{"description":"Integer DebateSectionId — internal Hansard identifier","type":"integer"},"debate_title":{"description":"Title of the debate or question (DebateSection)","type":"string"},"house":{"description":"House of Parliament (House)","enum":["Commons","Lords"],"type":"string"},"member_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Members API integer ID. Use as {member_id} in hansard://member/{member_id}/biography for the member's role history. None for a collective or otherwise unresolved attribution (e.g. 'Hon. Members') — Hansard itself has no member to identify there."},"member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Authoritative display name of the contributing member — populated ONLY when the source endpoint itself supplies a real name field, never derived by parsing `attributed_to`. Populated from Hansard's MemberName field on the search endpoints (parliament_search_hansard, parliament_member_debates). ALWAYS None from parliament_get_debate_contributions (backed by /debates/Debate/{ext}.json), because DebateItem has no MemberName field at all — only `AttributedTo` (a citation-display string) and `member_id`. AttributedTo's shape varies unpredictably (own name first, hereditary-title styling, ministerial office, chair/speaker role, annotations, collective labels — e.g. 'Lord Pannick (CB)' vs 'The Earl of Devon (CB)' vs 'Madam Deputy Speaker (Judith Cummins)' vs 'Madam Deputy Speaker' alone, all verified live) with no positional rule that reliably recovers the person's name across all of them — two earlier attempts ('use the last parenthesis', then 'unless it starts with `The `') were each falsified by a real, live counterexample. `attributed_to` is preserved in full instead of being decomposed into a guess. Resolve authoritative identity via `member_id` and parliament_find_member when this is None."},"party":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ALWAYS None. Hansard's AttributedTo is a citation-display string Hansard composes for readability, not structured party data — neither the search-contributions nor the debate-items schema declares a Party field, and the parenthesised text varies by convention (constituency, party, office, 'Maiden Speech', a virtual-attendance marker, or nothing at all) in ways that cannot be told apart by position alone. Guessing a party from it previously produced fabricated values for ministers/officeholders (e.g. party='Lucy Powell' for 'The Leader of the House of Commons (Lucy Powell)'). For a member's authoritative party, resolve `member_id` via parliament_find_member against the Members API's structured latestParty field."},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Upstream relevance score (Rank). Higher = more relevant to the query."},"text":{"description":"Contribution text (capped per max_text_chars on the input; default 3000). Source: ContributionTextFull when text_mode='full', ContributionText preview otherwise.","type":"string"},"url":{"description":"Public hansard.parliament.uk URL for this contribution (synthesised from House/Date/DebateSectionExtId/ContributionExtId).","type":"string"}},"required":["attributed_to","date","debate_title","debate_id","debate_ext_id","contribution_ext_id","chamber_section","house","text","url"],"type":"object"},"type":"array"},"date_range":{"anyOf":[{"maxItems":2,"minItems":2,"prefixItems":[{"format":"date","type":"string"},{"format":"date","type":"string"}],"type":"array"},{"type":"null"}],"default":null,"description":"(min, max) SittingDate of returned contributions, or None if empty"},"from_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Start date filter applied, if any"},"has_more":{"default":false,"description":"True if a full page was returned (more may exist; re-call with offset=offset+limit)","type":"boolean"},"house":{"default":"both","description":"House filter applied","enum":["Commons","Lords","both"],"type":"string"},"house_breakdown":{"additionalProperties":{"type":"integer"},"description":"Counts by house across the returned page","type":"object"},"limit":{"default":20,"description":"Page size requested","type":"integer"},"member_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Members API integer ID filter applied, if any (echoed from input)."},"offset":{"default":0,"description":"Skip applied to this page (Hansard API: skip)","type":"integer"},"party_breakdown":{"additionalProperties":{"type":"integer"},"description":"ALWAYS EMPTY. Hansard's contribution schema has no structured party field (see HansardContribution.party) — an aggregation over unjustified values would just be a party-shaped guess. Kept as a field (rather than removed) for schema stability. For real party facets, resolve member_id per contribution via parliament_find_member; this tool does not do that automatically — it would cost one extra HTTP call per distinct member in the page.","type":"object"},"query":{"description":"The phrase that was searched in Hansard","type":"string"},"text_mode":{"default":"preview","description":"Whether contribution `text` carries the upstream preview or full body (still capped).","enum":["preview","full"],"type":"string"},"to_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"End date filter applied, if any"},"top_debates":{"description":"Top-ranked debates touching this topic (from upstream Debates[] preview, capped at 4 by Hansard's /search.json). Each entry's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header.","items":{"description":"A top debate section returned as a search/lookup preview or aggregate result.","properties":{"contribution_count":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Number of contributions in this debate. Populated only when the emitting tool fetches the debate's full Items list (today: parliament_lookup_by_column). Null on preview arrays where the secondary fetch is too costly."},"date":{"description":"Sitting date of the debate","format":"date","type":"string"},"debate_ext_id":{"description":"Debate GUID. Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header.","type":"string"},"debate_id":{"description":"Internal Hansard debate ID.","type":"integer"},"debate_title":{"description":"Debate title","type":"string"},"house":{"description":"House","enum":["Commons","Lords"],"type":"string"},"relevance_rank":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Upstream Hansard relevance score for this debate against the search query (0–100). Populated for relevance-scored searches (parliament_search_hansard, parliament_policy_position_summary). Null for column-lookup matches — the column-search endpoint does not rank."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Human-readable Hansard publication state (Swagger Source enum name). Tells a lawyer the citation's finality — RollingHansard/DailyHansard are pre-consolidation, BoundVolume/Historic are final bound volumes. Does NOT indicate whether the citation resolves: column lookup resolves across all four states."},"source_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Raw Hansard Overview.Source ordinal: 1=RollingHansard, 2=DailyHansard, 3=BoundVolume, 4=Historic. Populated only when the emitting tool fetches the debate payload (today: parliament_lookup_by_column); null otherwise."}},"required":["debate_id","debate_ext_id","debate_title","date","house"],"type":"object"},"type":"array"},"top_divisions":{"description":"Top-ranked divisions touching this topic (from upstream Divisions[] preview, capped at 4). Each entry's `id` chains to votes_get_division; `debate_section_ext_id` chains back to the parent debate.","items":{"description":"A single division (formal parliamentary vote) — lightweight match shape.\n\nReturned as a preview slice on `parliament_search_hansard`'s `top_divisions`\nand as the full element of `parliament_get_debate_divisions`'s output.\n\nField provenance maps to the upstream `DivisionOverview` Swagger definition;\nthe live `/debates/divisions/{ext}` endpoint returns most integer/boolean\nvalues as strings, which the parser converts.","properties":{"ayes_count":{"description":"Number of Aye votes.","minimum":0,"type":"integer"},"date":{"description":"Sitting date of the division (Date).","format":"date","type":"string"},"debate_section":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Parent debate title (DebateSection), e.g. 'Renters' Rights Bill'."},"debate_section_ext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Parent debate GUID (DebateSectionExtId). Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header to read the surrounding debate context."},"external_id":{"description":"Division GUID (ExternalId). Stable identifier for cross-reference.","type":"string"},"house":{"description":"House where the division was held.","enum":["Commons","Lords"],"type":"string"},"id":{"description":"Hansard-side division ID — distinct ID-space from the Lords/Commons Votes API. This value does NOT chain to votes_get_division (different API). For per-member voting, see `votes_id` below — populated when cross-resolution succeeded.","type":"integer"},"motion_text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The motion being voted on (TextBeforeVote), e.g. 'Division on Motion A1'. This is the citable description of what the division decided."},"noes_count":{"description":"Number of Noe votes.","minimum":0,"type":"integer"},"number":{"description":"Division number within the sitting (e.g. '1', '2').","type":"string"},"result_text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The result statement (TextAfterVote), e.g. 'Motion A1 disagreed.'"},"time":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Time of the division as HH:MM:SS, or None when the upstream omits it."},"votes_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Lords/Commons Votes API division ID, cross-resolved from the upstream by (date + house + number). Use as the `division_id` input to votes_get_division for the full member-by-member voting record. None when the cross-resolve found no match (e.g. some Daily Part divisions are recorded in Hansard before the Votes API publishes them)."}},"required":["id","external_id","number","date","house","ayes_count","noes_count"],"type":"object"},"type":"array"},"total":{"description":"Number of contributions returned in this call","type":"integer"},"total_committees":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalCommittees."},"total_corpus":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Total contributions in Hansard matching this query (TotalContributions). Use to decide whether to paginate further or escalate to parliament_policy_position_summary."},"total_corrections":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalCorrections — published corrections to the Hansard record."},"total_debates":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalDebates — distinct debates touching this topic."},"total_divisions":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalDivisions. Non-zero → consider `top_divisions` previews below or chain to votes_search_divisions."},"total_members":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalMembers — member-name matches in the corpus."},"total_petitions":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalPetitions."},"total_written_answers":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalWrittenAnswers."},"total_written_statements":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalWrittenStatements."}},"required":["query","total"],"type":"object"}after
{"description":"Result of a Hansard debate search.\n\nWraps the list of matching contributions with the query, filters,\nand corpus-level facet counts so the client sees a real nested object\non the wire.","properties":{"contributions":{"description":"Matching Hansard contributions with full citation metadata.","items":{"description":"A single Hansard debate contribution with citation-grade metadata.\n\nField provenance maps to the upstream hansard-api.parliament.uk\n`Contributions[i]` payload, so callers can footnote a contribution\nwithout re-querying.","properties":{"attributed_to":{"description":"Full citable attribution string, verbatim from Hansard, e.g. 'The Minister of State, DESNZ (Lord Whitehead) (Lab)' or 'Lord Pannick (CB)'. This is the authoritative citation text — quote it as-is rather than reconstructing it from other fields.","type":"string"},"chamber_section":{"description":"Hansard section bucket (Section): 'Commons Chamber', 'Lords Chamber', 'Westminster Hall', 'Written Answers', 'Written Statements'.","type":"string"},"column_end":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"The last Hansard column number this contribution spans, e.g. when a long speech runs across columns 200–203. Equal to `column_start` for short contributions. Same population semantics as `column_start`."},"column_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Hansard internal page-marker code from HansardSection (e.g. 'BE-BG1', 'AA-AD'). NOT the citable column number that appears in an OSCOLA footnote — see `column_start` / `column_end` for those, which are only available when reading the contribution via hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}. From parliament_search_hansard, only this page-marker is exposed."},"column_start":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"The citable Hansard column number where this contribution begins, e.g. 200, 1162. Extracted from `data-column-number` markers in the contribution HTML. Populated only when reading via the contribution resource — `parliament_search_hansard` returns this as None because Hansard's /search.json strips the column markers. To get the real column number for a search hit, read hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}."},"constituency":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Constituency (Commons only; None for Lords). Not currently populated from AttributedTo — see `party`'s note on why positional parsing of that string is unsafe; use parliament_find_member for authoritative constituency."},"contribution_ext_id":{"description":"ContributionExtId GUID — stable citation key. Use as {contribution_ext_id} in hansard://debate/{debate_ext_id}/contribution/{contribution_ext_id}.","type":"string"},"date":{"description":"Date the contribution was made (SittingDate)","format":"date","type":"string"},"debate_ext_id":{"description":"DebateSectionExtId GUID. Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header.","type":"string"},"debate_id":{"description":"Integer DebateSectionId — internal Hansard identifier","type":"integer"},"debate_title":{"description":"Title of the debate or question (DebateSection)","type":"string"},"house":{"description":"House of Parliament (House)","enum":["Commons","Lords"],"type":"string"},"member_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Members API integer ID. Use as {member_id} in hansard://member/{member_id}/biography for the member's role history. None for a collective or otherwise unresolved attribution (e.g. 'Hon. Members') — Hansard itself has no member to identify there."},"member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Authoritative display name of the contributing member — populated ONLY when the source endpoint itself supplies a real name field, never derived by parsing `attributed_to`. Populated from Hansard's MemberName field on the search endpoints (parliament_search_hansard, parliament_member_debates). ALWAYS None from parliament_get_debate_contributions (backed by /debates/Debate/{ext}.json), because DebateItem has no MemberName field at all — only `AttributedTo` (a citation-display string) and `member_id`. AttributedTo's shape varies unpredictably (own name first, hereditary-title styling, ministerial office, chair/speaker role, annotations, collective labels — e.g. 'Lord Pannick (CB)' vs 'The Earl of Devon (CB)' vs 'Madam Deputy Speaker (Judith Cummins)' vs 'Madam Deputy Speaker' alone, all verified live) with no positional rule that reliably recovers the person's name across all of them — two earlier attempts ('use the last parenthesis', then 'unless it starts with `The `') were each falsified by a real, live counterexample. `attributed_to` is preserved in full instead of being decomposed into a guess. Resolve authoritative identity via `member_id` and parliament_find_member when this is None."},"party":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"ALWAYS None. Hansard's AttributedTo is a citation-display string Hansard composes for readability, not structured party data — neither the search-contributions nor the debate-items schema declares a Party field, and the parenthesised text varies by convention (constituency, party, office, 'Maiden Speech', a virtual-attendance marker, or nothing at all) in ways that cannot be told apart by position alone. Guessing a party from it previously produced fabricated values for ministers/officeholders (e.g. party='Lucy Powell' for 'The Leader of the House of Commons (Lucy Powell)'). For a member's authoritative party, resolve `member_id` via parliament_find_member against the Members API's structured latestParty field."},"rank":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Upstream relevance score (Rank). Higher = more relevant to the query."},"text":{"description":"Contribution text (capped per max_text_chars on the input; default 3000). Source: ContributionTextFull when text_mode='full', ContributionText preview otherwise.","type":"string"},"url":{"description":"Public hansard.parliament.uk URL for this contribution (synthesised from House/Date/DebateSectionExtId/ContributionExtId).","type":"string"}},"required":["attributed_to","date","debate_title","debate_id","debate_ext_id","contribution_ext_id","chamber_section","house","text","url"],"type":"object"},"type":"array"},"date_range":{"anyOf":[{"maxItems":2,"minItems":2,"prefixItems":[{"format":"date","type":"string"},{"format":"date","type":"string"}],"type":"array"},{"type":"null"}],"default":null,"description":"(min, max) SittingDate of returned contributions, or None if empty"},"enrichment_status":{"default":"complete","description":"Whether the optional /search.json corpus envelope was retrieved. 'degraded' means contribution results are source-backed and usable, but corpus totals and previews were unavailable.","enum":["complete","degraded"],"type":"string"},"from_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Start date filter applied, if any"},"has_more":{"default":false,"description":"True if a full page was returned (more may exist; re-call with offset=offset+limit)","type":"boolean"},"house":{"default":"both","description":"House filter applied","enum":["Commons","Lords","both"],"type":"string"},"house_breakdown":{"additionalProperties":{"type":"integer"},"description":"Counts by house across the returned page","type":"object"},"limit":{"default":20,"description":"Page size requested","type":"integer"},"member_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Members API integer ID filter applied, if any (echoed from input)."},"offset":{"default":0,"description":"Skip applied to this page (Hansard API: skip)","type":"integer"},"party_breakdown":{"additionalProperties":{"type":"integer"},"description":"ALWAYS EMPTY. Hansard's contribution schema has no structured party field (see HansardContribution.party) — an aggregation over unjustified values would just be a party-shaped guess. Kept as a field (rather than removed) for schema stability. For real party facets, resolve member_id per contribution via parliament_find_member; this tool does not do that automatically — it would cost one extra HTTP call per distinct member in the page.","type":"object"},"query":{"description":"The phrase that was searched in Hansard","type":"string"},"text_mode":{"default":"preview","description":"Whether contribution `text` carries the upstream preview or full body (still capped).","enum":["preview","full"],"type":"string"},"to_date":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"End date filter applied, if any"},"top_debates":{"description":"Top-ranked debates touching this topic (from upstream Debates[] preview, capped at 4 by Hansard's /search.json). Each entry's `debate_ext_id` chains to hansard://debate/{debate_ext_id}/header.","items":{"description":"A top debate section returned as a search/lookup preview or aggregate result.","properties":{"contribution_count":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Number of contributions in this debate. Populated only when the emitting tool fetches the debate's full Items list (today: parliament_lookup_by_column). Null on preview arrays where the secondary fetch is too costly."},"date":{"description":"Sitting date of the debate","format":"date","type":"string"},"debate_ext_id":{"description":"Debate GUID. Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header.","type":"string"},"debate_id":{"description":"Internal Hansard debate ID.","type":"integer"},"debate_title":{"description":"Debate title","type":"string"},"house":{"description":"House","enum":["Commons","Lords"],"type":"string"},"relevance_rank":{"anyOf":[{"minimum":0,"type":"integer"},{"type":"null"}],"default":null,"description":"Upstream Hansard relevance score for this debate against the search query (0–100). Populated for relevance-scored searches (parliament_search_hansard, parliament_policy_position_summary). Null for column-lookup matches — the column-search endpoint does not rank."},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Human-readable Hansard publication state (Swagger Source enum name). Tells a lawyer the citation's finality — RollingHansard/DailyHansard are pre-consolidation, BoundVolume/Historic are final bound volumes. Does NOT indicate whether the citation resolves: column lookup resolves across all four states."},"source_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Raw Hansard Overview.Source ordinal: 1=RollingHansard, 2=DailyHansard, 3=BoundVolume, 4=Historic. Populated only when the emitting tool fetches the debate payload (today: parliament_lookup_by_column); null otherwise."}},"required":["debate_id","debate_ext_id","debate_title","date","house"],"type":"object"},"type":"array"},"top_divisions":{"description":"Top-ranked divisions touching this topic (from upstream Divisions[] preview, capped at 4). Each entry's `id` chains to votes_get_division; `debate_section_ext_id` chains back to the parent debate.","items":{"description":"A single division (formal parliamentary vote) — lightweight match shape.\n\nReturned as a preview slice on `parliament_search_hansard`'s `top_divisions`\nand as the full element of `parliament_get_debate_divisions`'s output.\n\nField provenance maps to the upstream `DivisionOverview` Swagger definition;\nthe live `/debates/divisions/{ext}` endpoint returns most integer/boolean\nvalues as strings, which the parser converts.","properties":{"ayes_count":{"description":"Number of Aye votes.","minimum":0,"type":"integer"},"date":{"description":"Sitting date of the division (Date).","format":"date","type":"string"},"debate_section":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Parent debate title (DebateSection), e.g. 'Renters' Rights Bill'."},"debate_section_ext_id":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Parent debate GUID (DebateSectionExtId). Use as {debate_ext_id} in hansard://debate/{debate_ext_id}/header to read the surrounding debate context."},"external_id":{"description":"Division GUID (ExternalId). Stable identifier for cross-reference.","type":"string"},"house":{"description":"House where the division was held.","enum":["Commons","Lords"],"type":"string"},"id":{"description":"Hansard-side division ID — distinct ID-space from the Lords/Commons Votes API. This value does NOT chain to votes_get_division (different API). For per-member voting, see `votes_id` below — populated when cross-resolution succeeded.","type":"integer"},"motion_text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The motion being voted on (TextBeforeVote), e.g. 'Division on Motion A1'. This is the citable description of what the division decided."},"noes_count":{"description":"Number of Noe votes.","minimum":0,"type":"integer"},"number":{"description":"Division number within the sitting (e.g. '1', '2').","type":"string"},"result_text":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"The result statement (TextAfterVote), e.g. 'Motion A1 disagreed.'"},"time":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"Time of the division as HH:MM:SS, or None when the upstream omits it."},"votes_id":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Lords/Commons Votes API division ID, cross-resolved from the upstream by (date + house + number). Use as the `division_id` input to votes_get_division for the full member-by-member voting record. None when the cross-resolve found no match (e.g. some Daily Part divisions are recorded in Hansard before the Votes API publishes them)."}},"required":["id","external_id","number","date","house","ayes_count","noes_count"],"type":"object"},"type":"array"},"total":{"description":"Number of contributions returned in this call","type":"integer"},"total_committees":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalCommittees."},"total_corpus":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"Total contributions in Hansard matching this query (TotalContributions). Use to decide whether to paginate further or escalate to parliament_policy_position_summary."},"total_corrections":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalCorrections — published corrections to the Hansard record."},"total_debates":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalDebates — distinct debates touching this topic."},"total_divisions":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalDivisions. Non-zero → consider `top_divisions` previews below or chain to votes_search_divisions."},"total_members":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalMembers — member-name matches in the corpus."},"total_petitions":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalPetitions."},"total_written_answers":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalWrittenAnswers."},"total_written_statements":{"anyOf":[{"type":"integer"},{"type":"null"}],"default":null,"description":"TotalWrittenStatements."},"upstream_warnings":{"description":"Explicit warnings for unavailable optional upstream enrichment. Do not infer omitted corpus totals or previews when this is non-empty.","items":{"description":"A failed optional Hansard upstream call retained with its provenance.","properties":{"detail":{"description":"Bounded upstream failure detail; it does not describe contribution content.","type":"string"},"endpoint":{"description":"Hansard endpoint whose optional enrichment was unavailable.","type":"string"},"error_category":{"description":"Safe failure category for the unavailable optional enrichment.","enum":["transient","unknown"],"type":"string"},"retry_attempted":{"description":"True when the bounded one-retry policy was used.","type":"boolean"}},"required":["endpoint","retry_attempted","error_category","detail"],"type":"object"},"type":"array"}},"required":["query","total"],"type":"object"}{"additionalProperties":false,"properties":{"uri":{"description":"TheA server resource URIofsuchtheasresourcejudgment://...,tolegislation://...,readhansard://..., or server://about","type":"string"}},"required": ⟨3 unchanged words⟩
⟨104 unchanged words⟩ null,"description":"Full long title"},"originating_house":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"House where the bill was introduced (what the search `house` filter matches)"},"short_title":{"description":"Short title of the ⟨116 unchanged words⟩
⟨18 unchanged words⟩ Returns ONE PAGE of evidence (default 20).plus `total`, the source's count of matching items. evidence_type='both' lists all oral evidence first, then all written evidence, each newest-published first as the source orders it. Free-text titles are cappedper max_title_chars;witness lists are capped at 10 per item. Anorganisation witness (nonamed individual) is rendered as'<Organisation> (<Role>)'; a nullentry means the source gave noname for that witness at all. Forcommittees with many submissions,re-call with offset=offset+returnedwhile has_more is true. Authoritative source for parliamentary committee evidence.
⟨33 unchanged words⟩ :"Maximum evidence items to return. Default 20.WhenFor evidence_type='both'thealimitpageismaysplitholdacrossonly oral,andonly written,(roughlyorhalftheeach).last oral items followed by the first written items.","maximum":100,"minimum":1,"type ⟨52 unchanged words⟩ 0. Re-call with offset=offset+returned while has_more is true. For evidence_type='both' this is a position in the combined sequence (all oral evidence, then all written evidence).","maximum":20002147483647
⟨16 unchanged words⟩ offset=offset+returned while has_more is True.\nWhen evidence_type=\"both\",oral and written evidence are\ninterleavedtheinsequenceabeingsinglepaged`evidence`islistallandoral\nevidencethefollowedlimitbyisallsplit\nacrosswrittenboth.evidence.","properties":{"committee_id":{"description": ⟨223 unchanged words⟩ },"has_more":{"description":"True ifthereevidence
USE THIS TOOL WHEN youhaveknowathe UKcommodityVAT category name for a good or servicedescriptionand want its VATrate category.treatment.Returns the rate (standard 20%, reduced 5%, zeroExact0%,named-categoryexempt)lookup,which static-tablenotcategoryamatchedfree-text(`matched_category`),VATtheclassifierGOV.UKorsourcetaxpage, andadvice.anyTherelevantqueryconditionsmustorequalexceptions. Matchingaiscategorywhole-phrasename,most-specific-wins: 'hot food' matches the standard-rated 'hotignoringfood'onlyexceptioncase,not the broader zero-rated 'food'categoryspacing,evenhyphensthoughand'food'apostropheisstyle.aExtrasubstringqualifyingofwordsthearequery. IMPORTANTnever discarded:when no specific category matches (or the'petmatchfood' isambiguousbetween two equally specificitscategories),own`matched_category`category,`rate`and`rate_percentage` are ALL null — this'babytoolfood'neverisfabricatesnota standard-rate default. Treat'food'. Aamatchnullreturns `rate`as "not determined"(standard,not as any real VAT categoryreduced,and consult `notes`zero/orhmrc_search_guidanceexempt),instead of assuming 20%. `verified_on` says when this entry`rate_percentage` (or,None foraexempt),nullconditionsresultin `notes`, thetable'sGOV.UKcategory set) was`source_url`,lastandcheckedthatagainstentry'sGOV.UK/HMRC`verified_on`guidancedate. An—unresolveda minorityqueryofreturnsentriesno(currentlyrate:food`matched_category`,hot food`rate`,energy-savingmaterials/solar panels) were checked live for this fix; everything else was last reviewed wholesale on 22 Nov 2023 (Autumn Statement)`rate_percentage` andmayhave`verified_on`changedaresince.all`effective_from`null,isnever aSEPARATE, usually-nulldefault.field: the rate's own known legalItscommencement`notes`date,listpopulatedtheonly wherecategoryspecificallynames.evidencedAFTER(e.g.anenergy-savingunresolvedmaterialsresult,1 Aprilretry2022) — never treatwith anull `effective_from` as meaninglistedthenamerateoriscallnew.hmrc_search_guidance.
⟨14 unchanged words⟩ not a live HMRC/GOV.UK query.\n\n`matched_category` is None whenevernothespecificquerytableiscategorynotmatched\n(includingexactly agenuine tie betweentable\ncategorytwonameequally-specific(orcategoriesalias).In\nthatIn that case `rate`and, `rate_percentage` and\n`verified_on` are ALSO None — this toolnever\nfabricatesnever fabricates
⟨9 unchanged words⟩ votes by topic, date, or member. Returns one page of division summaries (title, date, vote counts,pass/fail).plus `total`, the source's count of all matching divisions. While `has_more` is true, re-call with offset=offset+returned. AFTER calling, pass division_id + house into ⟨14 unchanged words⟩
⟨34 unchanged words⟩ ,"description":"Maximum divisions to return. Default2525.(The Lords API honours up to 100; the Commons APImax-per-page).returns at most 25 per call, so page by `returned`, not `limit`.","maximum":100,"minimum":1,"type ⟨41 unchanged words⟩ offset=offset+returned while has_more is true.","maximum":20002147483647,"minimum":0,"type":"integer"}, ⟨44 unchanged words⟩
⟨135 unchanged words⟩ {"default":false,"description":"True ifadivisionsfullbeyondpagethiswaspagereturnedexist (moreoffsetmay+existreturned < total)","type":"boolean"},"house": ⟨7 unchanged words⟩ "default":25,"description":"Page size requested (the Commons API returns at most 25 regardless)","type":"integer"},"offset":{ ⟨23 unchanged words⟩ any (None = browse recent)"},"totalreturned":{"description":"Number of divisions returned in this call","type":"integer"},"total":{"description":"Total divisions matching the filters, from the source API's searchTotalResults count","type":"integer"}},"required":["house","returned","total"],"type":"object"}
⟨23 unchanged words⟩ , reduced 5%, zero 0%, exempt),effectivewhichdatestatic-table category matched (`matched_category`), the GOV.UK source page, and any relevant conditions or exceptions. Matching is whole-phrase, most-specific-wins: 'hot food' matches the standard-rated 'hot food' exception, not the broader zero-rated 'food' category, even though 'food' is a substring of the query. IMPORTANT:Useswhen no specific category matches (or the match is ambiguous between two equally specific categories), `matched_category`, `rate` and `rate_percentage` are ALL null — this tool never fabricates astaticstandard-ratelookupdefault.tableTreatcurrenta null `rate` as "not determined", not as any real VAT category, and consult `notes` / hmrc_search_guidance instead of assuming 20%. `verified_on` says when this entry (or, for a null result, the table's category set) was last checked against GOV.UK/HMRC guidance — a minority of entries (currently: food, hot food, energy-saving materials/solar panels) were checked live for this fix; everything else was last reviewed wholesale on 22 Nov 2023 (AutumnStatement).Ratesand may have changedinsince.subsequent`effective_from`Budgetsis—aforSEPARATE, usually-nulltime-sensitivefield:advicethe rate's own known legal commencement date,verifypopulatedagainstonly whereGOV.UKspecificallyviaevidencedhmrc_search_guidance.(e.g. energy-saving materials, 1 April 2022) — never treat a null `effective_from` as meaning the rate is new.
{"description":"VAT rate for a commodity orservice.service.\n\nBacked by a small static lookup table, not a live HMRC/GOV.UK query.\n\n`matched_category` is None whenever no specific table category matched\n(including a genuine tie between two equally-specific categories). In\nthat case `rate` and `rate_percentage` are ALSO None — this tool never\nfabricates a rate for an unresolved query. Callers must not assume a\ndefault (e.g. standard 20%) when `rate` is None; read `notes` for\nguidance on where to check instead.","properties":{"commodity_code":{"description": ⟨5 unchanged words⟩ ,"type":"string"},"effective_from":{"anyOf":[{"format":"date","type":"string"},{"type":"null"}],"default":null,"description":"Datefromthewhichrepresented VAT treatment is known, on researched evidence, to have taken legal effect. None when no such commencement date has been established for this entry — that is common and does NOT imply the rateappliesis new, uncertain, or unmatched. For data currency (when this entry was last checked against GOV.UK/HMRC guidance) see `verified_on` instead — the two are deliberately independent."},"formatmatched_category":{"dateanyOf",
⟨13 unchanged words⟩ the parsed text of a specific section, regulation, or article, with extent and in-force metadata. Returnsfullthesectionprovision's own text,and its own heading — never a neighbouring or enclosing Part/Chapter's content. Also returns territorial extent, in-force status, andprospective flag. Contentcapped per max_chars (default 10,000,~2,500 tokens) — raise forunusually long definition sections; checkcontent_truncated in theresponse. Works uniformly across Act sections ('section-N'), SI regulations ('regulation-N'), and SI articles ('article-N') — pass the bare number regardless of which the document uses; you don't need to know which noun applies. Raises a not_found error (rather than returning a plausible but wrong node) if the number doesn't exist in this document — check legislation_get_toc for valid numbers. ALWAYS check `extent` — a section may apply ⟨50 unchanged words⟩
⟨62 unchanged words⟩ :"integer"},"section":{"description":"SectionProvision number, e.g. '47' or'12A'.'12A' — works for Act sections, SI regulations, and SI articles alike. Use the numeric part only — not'section-47'.'section-47'/'regulation-47'/'article-47'. Schedules are not currently supported.","maxLength": ⟨51 unchanged words⟩
⟨14 unchanged words⟩ structural table of contents (parts, chapters,sections,individualschedulessections/regulations/articles). Returns structural elements with XML id and title, in document order, e.g. 'section-47: Definitions' for an Act or 'regulation-4: MaximumDefinitions'.weekly working time' for an SI. Individual provisions are listed alongside their enclosing Part/Chapter/crossheading headings — both levels matter: the heading entries give you the document's shape, the provision entries give you what to pass to legislation_get_section. A provision with no heading in the source (rare) is listed as a bare id with no title. AFTER calling, pass the numericsectionidentifier (use '47', NOT 'section-47') into ⟨68 unchanged words⟩
⟨94 unchanged words⟩ ,"type":"integer"},"is_current":{"anyOf":[{"type":"boolean"},{"type":"null"}],"default":null,"description":"Whether the member currently sits","type"in priority order:"boolean(1) the source's own membershipStatus.statusIsActive when membershipStatus is present — authoritative, used directly; (2) False when membershipStatus is null/absent but this record's own membershipEndDate is set — an authoritative end date, not an inference from how other records look; (3) None when neither is available — genuinely indeterminate, not fabricated as True or False. A null membershipStatus is NOT by itself read as 'ended'."},"name":{"description":"Full display ⟨13 unchanged words⟩ :["id","name","party","house","is_current"],"type":"object"},"type": ⟨25 unchanged words⟩
⟨63 unchanged words⟩ :{"description":"Full citable attribution string, verbatim from Hansard, e.g. 'The Minister of State, DESNZ (Lord Whitehead) (Lab)' or 'Lord Pannick (CB)'.IncludesThisrole-at-timeisofthecontributionauthoritativeforcitationministerialtextinterventions.— quote it as-is rather than reconstructing it from other fields.","type":"string"},"chamber_section":{ ⟨189 unchanged words⟩ ":"Constituency (Commons only; None for Lords). Not currently populated from AttributedTo — see `party`'s note on why positional parsing of that string is unsafe; use parliament_find_member for authoritative constituency."},"contribution_ext_id":{"description":"ContributionExtId GUID ⟨92 unchanged words⟩ ://member/{member_id}/biography for the member's role history. None for a collective or otherwise unresolved attribution (e.g. 'Hon. Members') — Hansard itself has no member to identify there."},"member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"NameAuthoritative display name of the contributing member(— populated ONLY when the source endpoint itself supplies a real name field, never derived by parsing `attributed_to`. Populated from Hansard's MemberName field on the search endpoints (parliament_search_hansard, parliament_member_debates)". ALWAYS None from parliament_get_debate_contributions (backed by /debates/Debate/{ext}.json),"type":"because DebateItem has no MemberName field at all — only `AttributedTo` (a citation-display string) and `member_id`. AttributedTo's shape varies unpredictably (own name first, hereditary-title styling, ministerial office, chair/speaker role, annotations, collective labels — e.g. 'Lord Pannick (CB)' vs 'The Earl of Devon (CB)' vs 'Madam Deputy Speaker (Judith Cummins)' vs 'Madam Deputy Speaker' alone, all verified live) with no positional rule that reliably recovers the person's name across all of them — two earlier attempts ('use the last parenthesis', then 'unless it starts with `The `') were each falsified by a real, live counterexample. `attributed_to` is preserved in full instead of being decomposed into a guess. Resolve authoritative identity via `member_id` and parliament_find_member when this is None."},"party":{"anyOf":[{"type ⟨2 unchanged words⟩ null"}],"default":null,"description":"PoliticalALWAYS None. Hansard's AttributedTo is a citation-display string Hansard composes for readability, not structured partyaffiliationdataparsed— neither the search-contributions nor the debate-items schema declares a Party field, and the parenthesised text varies by convention (constituency, party, office, 'Maiden Speech', a virtual-attendance marker, or nothing at all) in ways that cannot be told apart by position alone. Guessing a party from it previously produced fabricated values for ministers/officeholders (e.g. party='Lucy Powell' for 'The Leader of thetrailingHouse'of Commons (PartyLucy Powell)').suffixForinaAttributedTomember's authoritative party, resolve `member_id` via parliament_find_member against the Members API's structured latestParty field."},"rank":{"anyOf":[{"type ⟨52 unchanged words⟩ ,"type":"string"}},"required":["member_name","attributed_to","date","debate_title","debate_id", ⟨86 unchanged words⟩
⟨63 unchanged words⟩ :{"description":"Full citable attribution string, verbatim from Hansard, e.g. 'The Minister of State, DESNZ (Lord Whitehead) (Lab)' or 'Lord Pannick (CB)'.IncludesThisrole-at-timeisofthecontributionauthoritativeforcitationministerialtextinterventions.— quote it as-is rather than reconstructing it from other fields.","type":"string"},"chamber_section":{ ⟨189 unchanged words⟩ ":"Constituency (Commons only; None for Lords). Not currently populated from AttributedTo — see `party`'s note on why positional parsing of that string is unsafe; use parliament_find_member for authoritative constituency."},"contribution_ext_id":{"description":"ContributionExtId GUID ⟨92 unchanged words⟩ ://member/{member_id}/biography for the member's role history. None for a collective or otherwise unresolved attribution (e.g. 'Hon. Members') — Hansard itself has no member to identify there."},"member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"NameAuthoritative display name of the contributing member(— populated ONLY when the source endpoint itself supplies a real name field, never derived by parsing `attributed_to`. Populated from Hansard's MemberName field on the search endpoints (parliament_search_hansard, parliament_member_debates)". ALWAYS None from parliament_get_debate_contributions (backed by /debates/Debate/{ext}.json),"type":"because DebateItem has no MemberName field at all — only `AttributedTo` (a citation-display string) and `member_id`. AttributedTo's shape varies unpredictably (own name first, hereditary-title styling, ministerial office, chair/speaker role, annotations, collective labels — e.g. 'Lord Pannick (CB)' vs 'The Earl of Devon (CB)' vs 'Madam Deputy Speaker (Judith Cummins)' vs 'Madam Deputy Speaker' alone, all verified live) with no positional rule that reliably recovers the person's name across all of them — two earlier attempts ('use the last parenthesis', then 'unless it starts with `The `') were each falsified by a real, live counterexample. `attributed_to` is preserved in full instead of being decomposed into a guess. Resolve authoritative identity via `member_id` and parliament_find_member when this is None."},"party":{"anyOf":[{"type ⟨2 unchanged words⟩ null"}],"default":null,"description":"PoliticalALWAYS None. Hansard's AttributedTo is a citation-display string Hansard composes for readability, not structured partyaffiliationdataparsed— neither the search-contributions nor the debate-items schema declares a Party field, and the parenthesised text varies by convention (constituency, party, office, 'Maiden Speech', a virtual-attendance marker, or nothing at all) in ways that cannot be told apart by position alone. Guessing a party from it previously produced fabricated values for ministers/officeholders (e.g. party='Lucy Powell' for 'The Leader of thetrailingHouse'of Commons (PartyLucy Powell)').suffixForinaAttributedTomember's authoritative party, resolve `member_id` via parliament_find_member against the Members API's structured latestParty field."},"rank":{"anyOf":[{"type ⟨52 unchanged words⟩ ,"type":"string"}},"required":["member_name","attributed_to","date","debate_title","debate_id", ⟨86 unchanged words⟩
⟨522 unchanged words⟩ null"}],"default":null,"description":"Party affiliationNotparsedderivable from Hansard's AttributedTo (see HansardContribution.party) — would require resolving member_id via parliament_find_member. Currently unused: top_contributors is always empty (see PolicyPositionSummary.by_party)."}},"required":["member_id","member_name" ⟨349 unchanged words⟩
⟨68 unchanged words⟩ :{"description":"Full citable attribution string, verbatim from Hansard, e.g. 'The Minister of State, DESNZ (Lord Whitehead) (Lab)' or 'Lord Pannick (CB)'.IncludesThisrole-at-timeisofthecontributionauthoritativeforcitationministerialtextinterventions.— quote it as-is rather than reconstructing it from other fields.","type":"string"},"chamber_section":{ ⟨189 unchanged words⟩ ":"Constituency (Commons only; None for Lords). Not currently populated from AttributedTo — see `party`'s note on why positional parsing of that string is unsafe; use parliament_find_member for authoritative constituency."},"contribution_ext_id":{"description":"ContributionExtId GUID ⟨92 unchanged words⟩ ://member/{member_id}/biography for the member's role history. None for a collective or otherwise unresolved attribution (e.g. 'Hon. Members') — Hansard itself has no member to identify there."},"member_name":{"anyOf":[{"type":"string"},{"type":"null"}],"default":null,"description":"NameAuthoritative display name of the contributing member(— populated ONLY when the source endpoint itself supplies a real name field, never derived by parsing `attributed_to`. Populated from Hansard's MemberName field on the search endpoints (parliament_search_hansard, parliament_member_debates)". ALWAYS None from parliament_get_debate_contributions (backed by /debates/Debate/{ext}.json),"type":"because DebateItem has no MemberName field at all — only `AttributedTo` (a citation-display string) and `member_id`. AttributedTo's shape varies unpredictably (own name first, hereditary-title styling, ministerial office, chair/speaker role, annotations, collective labels — e.g. 'Lord Pannick (CB)' vs 'The Earl of Devon (CB)' vs 'Madam Deputy Speaker (Judith Cummins)' vs 'Madam Deputy Speaker' alone, all verified live) with no positional rule that reliably recovers the person's name across all of them — two earlier attempts ('use the last parenthesis', then 'unless it starts with `The `') were each falsified by a real, live counterexample. `attributed_to` is preserved in full instead of being decomposed into a guess. Resolve authoritative identity via `member_id` and parliament_find_member when this is None."},"party":{"anyOf":[{"type ⟨2 unchanged words⟩ null"}],"default":null,"description":"PoliticalALWAYS None. Hansard's AttributedTo is a citation-display string Hansard composes for readability, not structured partyaffiliationdataparsed— neither the search-contributions nor the debate-items schema declares a Party field, and the parenthesised text varies by convention (constituency, party, office, 'Maiden Speech', a virtual-attendance marker, or nothing at all) in ways that cannot be told apart by position alone. Guessing a party from it previously produced fabricated values for ministers/officeholders (e.g. party='Lucy Powell' for 'The Leader of thetrailingHouse'of Commons (PartyLucy Powell)').suffixForinaAttributedTomember's authoritative party, resolve `member_id` via parliament_find_member against the Members API's structured latestParty field."},"rank":{"anyOf":[{"type ⟨52 unchanged words⟩ "type":"string"}},"required":["member_name","attributed_to","date","debate_title","debate_id"," ⟨151 unchanged words⟩ :{"type":"integer"},"description":"CountsALWAYSbyEMPTY. Hansard's contribution schema has no structured partyacrossfieldthe(seereturnedHansardContribution.party)page— an aggregation over unjustified values would just be a party-shaped guess. Kept as a field (rather than removed) for schema stability. For real party facets, resolve member_id per contribution via parliament_find_member; this tool does not do that automatically — it would cost one extra HTTP call per distinct member in the page.","type":"object"},"query":{ ⟨839 unchanged words⟩