uk-parliament-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@uk-parliament-mcp-serverWhat bills about climate change are currently in Parliament?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Overview
Westminster records from the official UK Parliament Bills, Members, Commons and Lords Votes, Hansard, Written Questions, and Committees APIs. Search parliamentary business, retrieve selected records and source links, and trace members, bills, votes, answers, and committee evidence across their distinct identifiers. Runs as a stdio process or a local Streamable HTTP server; no API key is required.
Tools
Tool | Description |
| Resolve filter IDs, identifier namespaces, and historical coverage guidance |
| Search bill summaries by title, House, session, sponsor, stage, and bill type |
| Retrieve bill details, stages, publications, amendments, and ping-pong motions |
| Find current and former MPs and peers, including dated membership searches |
| Retrieve profiles, roles, committee seats, official contacts, interests, and voting history |
| Search House-scoped divisions and inspect metadata, voters, and party totals |
| Search spoken contributions with complete source text where supplied |
| Search question and answer previews or retrieve complete question details |
| Discover committees and retrieve memberships, business, and publication metadata |
Related MCP server: UK Parliament MCP Server
Capability reference
ukparl_lookup_reference tool
topic:identifiers,coverage,bill_stages,bill_types,parties,departments, oranswering_bodies; live directories default to 10 rows, capped at 20, with optionalnameContainsAND-token filteringhouseis required only forparties; that directory covers active parties in the selected House, not every historical party. Static guides accept neither House nor name filtersIdentifier guidance distinguishes reference
stageIdfrom bill-specificbillStageId, House-scoped division IDs, Questions API IDs from UINs, and committee person IDs from Members API IDs
ukparl_search_bills tool
Optional
query,house,sessionId,memberId,stageIds, andbillTypeIds; each ID array accepts up to 20 entries. Defaults to 10 bills, capped at 20Results are
detailLevel: "summary"withbillId, provenance, and collection continuation; no current-session scope is inferred. Resolve reference filters withukparl_lookup_reference
ukparl_get_bill tool
Required
billId;sectiondefaults tooverview, or selectsstages,stage,publications,amendments,amendment,motions, ormotion. Collections default to 20 records, capped at 50Stage, amendment, and motion selections require the bill-specific
billStageIdfromstages; singular amendment/motion retrieval also needsitemIdfrom the parent collection (amendmentIdfor amendments,motion.idfor motions). Amendment/motion lists are summaries; singular selectors retrieve complete textMissing entities return
found: falsewithguidance.legislationHandoff.statusisauthoritative_link,not_enacted, orunavailable; only actual supplied legislation.gov.uk links establish a statute handoff
ukparl_search_members tool
Optional
name,constituency(source location text),partyId, andhouse;currentOnlydefaults tofalse, including current and former members. Defaults to 10 rows, capped at 20asOfselects membership on a realYYYY-MM-DDdate and accepts onlynameand pagination alongside it; returned latest profile fields are not a historical snapshotSummary hits carry
memberIdforukparl_get_member,source, andpage; unknown source fields remain absent or null
ukparl_get_member tool
Required
memberId;section:profile(default),roles,committee_seats,contact,interests, orvoting. Roles withoutcategoryreturns an availability outline; select a returned category for whole role periodshouseis required for interests and voting, and omitted elsewhere. Local histories default to 20 rows, capped at 50; voting uses native 20-row pages regardless oflimitfoundandguidancedistinguish missing members and unavailable source collections. Interest trees and committee relationships retain source pointers; voting preserves recorded lobby and teller facts without inferring abstention or lifetime participation
ukparl_search_divisions tool
Required
house:commonsorlords;mode:search(default),detail,voters, orparty_totals. Search acceptsquery,memberId, and inclusivestartDate/endDate; defaults to 5 divisions, capped at 10Other modes require a
divisionIdfrom the same House. Voters default to 20 rows, capped at 50, with exact sourcepartylabels andlobby: Commonsaye,no,not_recorded; Lordscontent,not_contentDetail preserves headline counts and teller identities;
partyTotalscounts listed non-tellers and tellers separately.not_recordedis the source list, never an abstention claim; member searches include teller participation
ukparl_search_hansard tool
Optional
query,memberId,house, inclusivestartDate/endDate, and numericdebateSectionId; defaults to 5 contributions, capped at 20. Dates areYYYY-MM-DD, with no inferred windowdetailLevel: "complete"carries full source contribution text, including HTML;summarymeans the source supplied only a preview. Section filtering does not establish a complete debate transcriptcoveragereports historical limitations, including the 2004–2006 website warning; empty results do not prove no debate occurred. Narrow date windows after timeouts; useukparl_lookup_referencewithtopic: "coverage"for archive guidance
ukparl_search_questions tool
mode: "search"(default) acceptsquery,memberId,house, up to 20answeringBodyIds,answered, and inclusivetabledFrom/tabledTo/answeredFrom/answeredTodates (YYYY-MM-DD). Defaults to 10 previews, capped at 20Search includes all sessions and withdrawn questions; omitted
answeredincludes either state.mode: "detail"takes a returnedquestionIdalone for complete question/answer HTML, corrections, and attachment metadata; a UIN is not aquestionIdResults distinguish
detailLevel: "summary"from"complete"; detail misses returnfound: falsewithguidance. Attachments are links and metadata, not downloaded files
ukparl_get_committee tool
mode: "search"(default) acceptsqueryandhouse(commons,lords,joint), default 10/cap 20.detail,members,inquiries, andpublicationsrequirecommitteeId; nested collections default to 20/cap 50inquiryrequiresbusinessId;publicationrequirespublicationId.businessIdcan also filter publications.membershipselectsall(default),current, orformerin members mode;queryin inquiries/publications requires at least two charactersinquiriesincludes all committee business types, labelled byisInquiry. Records retain typed entities andsourcePathrelationships; publications return evidence/report metadata and document links, without downloads or text extraction
Features
Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.
UK Parliament-specific:
Keyless, read-only access to seven official Westminster API origins; devolved legislatures are outside scope
Separate identifier namespaces and explicit source selections, with no inferred current session or date window
Shared per-origin backpressure, bounded retries, and a 45-second call deadline across related requests
Historical coverage remains source-specific: the Hansard archive starts on 22 November 1803, the Spoken API minimum date is unknown, and no automatic historical-archive fallback is performed
Agent-friendly output:
Provenance — source API, request URL, retrieval timestamp, and licence link accompany source records;
appliedreports effective selections and limitsWhole-record pagination —
page.returned,hasMore, andnextCursordescribe actual emitted records, withtotalonly when known. Repeat the same filters and effective limit when following a cursorLossless large records —
delivery: "full" | "outline" | "fragment"separates complete payloads fromcontentPagecontinuations. Repeat the original tool inputs plus eachcontentCursor, follow all outline entries and continuations, concatenate consecutive fragments before JSON-decoding once, and reconstruct the selected record before advancingcollectionPageExplicit recovery —
invalid_cursorrestarts a selection;source_changedrestarts content retrieval after an upstream revision. Search previews, missing records, and unavailable collections remain distinct
Getting started
Add the following to your MCP client configuration file.
{
"mcpServers": {
"uk-parliament-mcp-server": {
"type": "stdio",
"command": "bunx",
"args": ["@cyanheads/uk-parliament-mcp-server@latest"],
"env": { "MCP_TRANSPORT_TYPE": "stdio", "MCP_LOG_LEVEL": "info" }
}
}
}Or with npx (no Bun required):
{
"mcpServers": {
"uk-parliament-mcp-server": {
"type": "stdio",
"command": "npx",
"args": ["-y", "@cyanheads/uk-parliament-mcp-server@latest"],
"env": { "MCP_TRANSPORT_TYPE": "stdio", "MCP_LOG_LEVEL": "info" }
}
}
}Or with Docker:
{
"mcpServers": {
"uk-parliament-mcp-server": {
"type": "stdio",
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/uk-parliament-mcp-server:latest"]
}
}
}For Streamable HTTP, set the transport and start the server:
MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 bun run start:http
# Server listens at http://localhost:3010/mcpPrerequisites
Bun v1.4.0 or higher (or Node.js v24+).
Internet access to the official Parliament APIs; no API key is required.
Installation
Clone the repository:
git clone https://github.com/cyanheads/uk-parliament-mcp-server.gitNavigate into the directory:
cd uk-parliament-mcp-serverInstall dependencies:
bun installConfigure environment:
cp .env.example .env
# edit .env for transport, logging, or authentication overrides as neededConfiguration
Variable | Description | Default |
| Transport: |
|
| Initial HTTP server port; startup logs report the bound port after collision retries. |
|
| HTTP bind address. |
|
| HTTP MCP endpoint. |
|
| HTTP session mode: |
|
| Authentication: |
|
| Log level ( |
|
| Directory for log files (Node.js only). |
|
| Storage backend: |
|
| Enable OpenTelemetry. |
|
See .env.example for the common framework overrides. There are no server-specific environment variables.
Running the server
Local development
Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdioRun checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Project structure
Directory | Purpose |
| Nine tool definitions ( |
| Fixed-origin transport, provenance, cursors, and lossless content delivery. |
| Bill search, scrutiny records, publications, and reference directories. |
| Member discovery, profiles, biographies, interests, and voting history. |
| Commons/Lords division metadata and recorded voter collections. |
| Spoken contribution search and historical coverage metadata. |
| Written question previews and complete question/answer records. |
| Committee business, membership, publication metadata, and typed relationships. |
| Unit and integration tests, mirroring the |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
Handlers throw, framework catches — no
try/catchin tool logicUse
ctx.logfor logging,ctx.statefor storageRegister new tools and resources in the
createApp()arrays insrc/index.tsWrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
Contributing
Issues are welcome. Run checks and tests before submitting:
bun run devcheck
bun run testLicense
This project is licensed under the Apache 2.0 License. See the LICENSE file for details.
Contains Parliamentary information licensed under the Open Parliament Licence v3.0 where applicable. Personal data, parliamentary marks, and third-party rights are excluded; preserve the source's notices and check rights before reusing excluded material. This software is independent and does not imply parliamentary endorsement.
This server cannot be deployed
Maintenance
Related MCP Connectors
Search MPs and Lords, fetch profiles, synopses, and Westminster constituencies
UK Parliament MCP — Members, Bills, Hansard APIs
Search Parliamentary questions and motions from UK House of Commons
Query UK Parliament, elections, crime stats, ONS census data, and national archives
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides access to live UK Parliament data including bills, votes, MP profiles, and financial interests without requiring an API key. It enables users to track parliamentary rebellions, search petitions, and cross-reference voting records with declared financial interests.54 npm9MIT
- AlicenseNot gradedqualityBmaintenanceEnables querying UK Parliament data including MPs, Lords, bills, Hansard debates, and divisions.6 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables tracking of Canadian federal parliamentary records by searching bills, members, House divisions, and indexed Hansard speeches, then retrieving detailed dossiers, profiles, tallies, and full speech text from official public sources. Runs over STDIO or Streamable HTTP with no API key required.57 npm1Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables discovery and retrieval of European Parliament procedures, MEPs, plenary votes, documents, speeches, and questions from the Open Data API over STDIO or Streamable HTTP.Apache 2.0