io.github.cyanheads/uk-parliament-mcp-server
Search UK Parliament bills, members, votes, Hansard, written questions, and committees.
Que pouvez-vous faire avec io.github.cyanheads/uk-parliament-mcp-server ?
- 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
- Hansard coverage is source-specific: the archive starts on 22 November 1803, the Spoken API minimum date is unknown, and there is no automatic historical-archive fallback
- Provenance — source API, request URL, retrieval timestamp, and licence link accompany source records;
appliedreports effective selections and limits - Whole-record pagination —
page.returned,hasMore, andnextCursordescribe actually emitted records, withtotalonly when known; every response stays under 24,000 bytes across both output surfaces - Lossless large records —
delivery: "full" | "outline" | "fragment"; an oversized record returnscontentPagedescriptors, and repeating the original inputs plus eachcontentCursorreconstructs it exactly - Compact JSON — content renders complete values as reversible JSON blocks with clickable source links. An outline entry's optional
jsonValueis complete JSON text you can decode directly; itscontentCursorstill retrieves the same value. Fragment sizes a...
Installation
Ajoutez ceci à la configuration MCP de votre client (Claude Desktop : claude_desktop_config.json ; Cursor : .cursor/mcp.json ; VS Code et les autres utilisent la même forme « mcpServers »).
claude mcp add --transport http uk-parliament-mcp-server 'https://uk-parliament.caseyjhand.com/mcp'
{
"mcpServers": {
"uk-parliament-mcp-server": {
"type": "http",
"url": "https://uk-parliament.caseyjhand.com/mcp"
}
}
}
@cyanheads/uk-parliament-mcp-serverclaude mcp add uk-parliament-mcp-server -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/uk-parliament-mcp-server@0.1.2
{
"mcpServers": {
"uk-parliament-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/uk-parliament-mcp-server@0.1.2"
],
"env": {
"MCP_LOG_LEVEL": "info"
}
}
}
}
Variables d'environnement
MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
@cyanheads/uk-parliament-mcp-serverclaude mcp add uk-parliament-mcp-server -e 'MCP_TRANSPORT_TYPE=<MCP_TRANSPORT_TYPE>' -e 'MCP_HTTP_HOST=127.0.0.1' -e 'MCP_HTTP_PORT=3010' -e 'MCP_HTTP_ENDPOINT_PATH=/mcp' -e 'MCP_PUBLIC_URL=<MCP_PUBLIC_URL>' -e 'MCP_AUTH_MODE=none' -e 'MCP_LOG_LEVEL=info' -- npx -y @cyanheads/uk-parliament-mcp-server@0.1.2
{
"mcpServers": {
"uk-parliament-mcp-server": {
"command": "npx",
"args": [
"-y",
"@cyanheads/uk-parliament-mcp-server@0.1.2"
],
"env": {
"MCP_TRANSPORT_TYPE": "<MCP_TRANSPORT_TYPE>",
"MCP_HTTP_HOST": "127.0.0.1",
"MCP_HTTP_PORT": "3010",
"MCP_HTTP_ENDPOINT_PATH": "/mcp",
"MCP_PUBLIC_URL": "<MCP_PUBLIC_URL>",
"MCP_AUTH_MODE": "none",
"MCP_LOG_LEVEL": "info"
}
}
}
}
Variables d'environnement
MCP_TRANSPORT_TYPESelects the HTTP transport.MCP_HTTP_HOSTThe hostname for the HTTP server.MCP_HTTP_PORTThe port to run the HTTP server on.MCP_HTTP_ENDPOINT_PATHThe endpoint path for the MCP server.MCP_PUBLIC_URLPublic origin override for deployments behind a TLS-terminating reverse proxy (e.g. https://mcp.example.com).MCP_AUTH_MODEAuthentication mode to use: 'none', 'jwt', or 'oauth'.MCP_LOG_LEVELSets the minimum log level for output (e.g., 'debug', 'info', 'warn').
Documentation
Tirée du README du projet sur GitHub, actualisée chaque semaine. Les liens ouvrent GitHub.
Sommaire
@cyanheads/uk-parliament-mcp-server
Search UK Parliament bills, members, votes, Hansard, written questions, and committees via MCP. STDIO or Streamable HTTP.
9 Tools
Public Hosted Server: https://uk-parliament.caseyjhand.com/mcp
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 publications across their distinct identifiers. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above; no API key is required.
Tools
| Tool | Description |
|---|---|
ukparl_lookup_reference | Resolve filter IDs, identifier namespaces, and historical coverage guidance |
ukparl_search_bills | Search and order bill summaries by title, House, session, sponsor, department, stage, type, and status |
ukparl_get_bill | Retrieve bill details, stages, publications, amendments, and ping-pong motions |
ukparl_search_members | Find current and former MPs and peers, including dated membership searches |
ukparl_get_member | Retrieve profiles, roles, committee seats, official contacts, interests, and voting history |
ukparl_search_divisions | Search House-scoped divisions and member votes; inspect metadata, voters, and party totals |
ukparl_search_hansard | Search spoken contributions with complete source text where supplied |
ukparl_search_questions | Search question and answer previews or retrieve complete question details |
ukparl_get_committee | Discover committees and business; retrieve memberships, publications, and written/oral evidence metadata |
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 filters- Identifier guidance distinguishes reference
stageIdfrom bill-specificbillStageId, House-scoped division IDs, Questions API IDs from UINs, and committee person IDs from Members API IDs departmentsIDs feedukparl_search_bills.departmentId; they are distinct from Written Questions answering-body IDs
ukparl_search_bills tool
- Optional
query, currenthouse,originatingHouse,sessionId,memberId,departmentId,stageIds, andbillTypeIds; each ID array accepts up to 20 entries. Defaults to 10 bills, capped at 20 sortOrder:TitleAscending,TitleDescending,DateUpdatedAscending, orDateUpdatedDescending; omission preserves source ordering. OptionalisDefeatedandisWithdrawnaccept true or false.inAmendableStage: truerestricts to amendable stages; false leaves results unrestricted- Results 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 50 - Stage, 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 text - Only
section: "amendments"acceptsamendmentNumber(a string retaining letter suffixes), officialdecision, and sponsoringmemberIdfilters. Filters apply before source pagination; singular retrieval still usesitemId - Missing entities return
found: falsewithguidance.section: "publications"deriveslegislationHandoff(authoritative_link,not_enacted, orunavailable) from the bill's published documents; only supplied legislation.gov.uk links establish a statute handoff - Overview reads metadata only. Unless
isActis explicitly false, itsunavailablehandoff explains that publications remain unchecked; repeat with the samebillIdandsection: "publications"to discover statute links
ukparl_search_members tool
- Optional
name,constituency(source location text: constituency name or postcode),partyId, andhouse;currentOnlydefaults tofalse, including current and former members. Defaults to 10 rows, capped at 20 asOfselects membership on a realYYYY-MM-DDdate and acceptsname, pagination, andcurrentOnly: falsealongside it; returned latest profile fields are not a historical snapshot- Summary 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 periods houseis 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 10 - Other 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_content - Detail 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 - Search with
memberIdreturnsmemberVote: { memberId, lobby, wasTeller }on each result, using the House's recorded lobby. A missing result does not imply abstention
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 window detailLevel: "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,uin, asking-membermemberId,answeringMemberId,house, up to 20answeringBodyIds,answered, and inclusivetabledFrom/tabledTo/answeredFrom/answeredTodates (YYYY-MM-DD). Defaults to 10 previews, capped at 20- Search 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 aquestionId uinretains leading zeros and normalizes theHLprefix. Without dates, reused UINs can return candidates across sessions; combinetabledFrom/tabledToand House filters to narrow them, then retrieve a returnedquestionId- Results distinguish
detailLevel: "summary"from"complete"; detail misses returnfound: falsewithguidance. Attachments are links and metadata, not downloaded files
ukparl_get_committee tool
mode: "search"(default) acceptsquery,house(commons,lords,joint), andstatus: Current|Former|All, default 10/cap 20.detail,members, andpublicationsrequirecommitteeId;inquiriesaccepts it optionally for committee-specific or cross-committee discovery. 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 charactersinquiriesacceptsstatus: Open|Closed,acceptingEvidence, inclusiveopenedFrom/openedTodates, andsortOrder: DateOpenedNewest|DateOpenedOldest|PublicationDateAscending|PublicationDateDescending.acceptingEvidence: truerestricts to accepting businesses; false is unrestricted. All business types remain labelled byisInquirypublicationsaccepts repeatedpublicationTypeIds, inclusivepublishedFrom/publishedTodates, andsortOrder: PublicationDateAscending|PublicationDateDescending|ResponseDateAscending|ResponseDateDescending. Omitted filters preserve source defaultsevidencerequiresbusinessIdandevidenceType: written|oral;evidence_detailrequiresevidenceIdand the sameevidenceType. These IDs occupy separate written/oral namespaces. Records retain typed entities andsourcePathrelationships, witnesses, organisations, dates, source state, and supplied document links. Publications remain separate reports, responses, and correspondence; no mode downloads or extracts documents
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
- Hansard coverage is source-specific: the archive starts on 22 November 1803, the Spoken API minimum date is unknown, and there is no automatic historical-archive fallback
Agent-friendly output:
- Provenance — source API, request URL, retrieval timestamp, and licence link accompany source records;
appliedreports effective selections and limits - Whole-record pagination —
page.returned,hasMore, andnextCursordescribe actually emitted records, withtotalonly when known; every response stays under 24,000 bytes across both output surfaces - Lossless large records —
delivery: "full" | "outline" | "fragment"; an oversized record returnscontentPagedescriptors, and repeating the original inputs plus eachcontentCursorreconstructs it exactly - Compact JSON — content renders complete values as reversible JSON blocks with clickable source links. An outline entry's optional
jsonValueis complete JSON text you can decode directly; itscontentCursorstill retrieves the same value. Fragment sizes adapt to the response budget; concatenate their JSON text before decoding - Explicit recovery —
invalid_cursorrestarts a selection;source_changedrestarts content retrieval after an upstream revision. Search previews, missing records, and unavailable collections remain distinct - Selector errors name each missing or incompatible field and its repair in deterministic order, before network requests; existing error reasons and recovery hints remain stable
Getting started
Connect to the hosted instance, no install:
claude mcp add --transport http uk-parliament-mcp-server https://uk-parliament.caseyjhand.com/mcp
Or run it locally:
claude mcp add uk-parliament-mcp-server -- npx -y @cyanheads/uk-parliament-mcp-server
For other clients, add this to the MCP config file:
{
"mcpServers": {
"uk-parliament-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/uk-parliament-mcp-server"]
}
}
}
No API key is required. For Docker or a source build, see Running the server.
Configuration
| Variable | Description | Default |
|---|---|---|
MCP_TRANSPORT_TYPE | Transport: stdio or http. | stdio |
MCP_HTTP_PORT | Initial HTTP server port; startup logs report the bound port after collision retries. | 3010 |
MCP_HTTP_HOST | HTTP bind address. | 127.0.0.1 |
MCP_HTTP_ENDPOINT_PATH | HTTP MCP endpoint. | /mcp |
MCP_SESSION_MODE | HTTP session mode: stateless, stateful, or auto. | stateless |
MCP_AUTH_MODE | Authentication: none, jwt, or oauth. | none |
MCP_LOG_LEVEL | Log level (debug, info, warning, error, etc.). | info |
LOGS_DIR | Directory for log files (Node.js only). | <app-root>/logs |
STORAGE_PROVIDER_TYPE | Storage backend: in-memory, filesystem, supabase, cloudflare-kv/r2/d1. | in-memory |
OTEL_ENABLED | Enable OpenTelemetry. | false |
See .env.example for the common framework overrides. There are no server-specific environment variables.
Running the server
Local development
Requires Bun v1.4.0 or higher (or Node.js v24+) and internet access to the official Parliament APIs.
- Clone and install:
git clone https://github.com/cyanheads/uk-parliament-mcp-server.git cd uk-parliament-mcp-server && bun install cp .env.example .env # edit .env for transport, logging, or authentication overrides as needed - Build and run the production version:
# One-time build bun run rebuild # Run the built server bun run start:http # or bun run start:stdio - Run checks and tests:
bun run devcheck # Lints, formats, type-checks, and more bun run test # Runs the test suite
Docker
docker run --rm -p 3010:3010 ghcr.io/cyanheads/uk-parliament-mcp-server:latest
The image defaults to HTTP transport, stateless sessions, and logs to /var/log/uk-parliament-mcp-server. For an MCP client using stdio, use "command": "docker" with "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/uk-parliament-mcp-server:latest"]. Build locally with docker build -t uk-parliament-mcp-server .; --build-arg OTEL_ENABLED=false omits the optional OpenTelemetry peers.
Project structure
| Directory | Purpose |
|---|---|
src/mcp-server/tools/definitions | Nine tool definitions (*.tool.ts). |
src/services/parliament-http | Fixed-origin transport, provenance, cursors, and lossless content delivery. |
src/services/bills | Bill search, scrutiny records, publications, and reference directories. |
src/services/members | Member discovery, profiles, biographies, interests, and voting history. |
src/services/divisions | Commons/Lords division metadata and recorded voter collections. |
src/services/hansard | Spoken contribution search and historical coverage metadata. |
src/services/questions | Written question previews and complete question/answer records. |
src/services/committees | Committee business, memberships, publications, evidence metadata, and typed relationships. |
tests/ | Unit and integration tests, mirroring the src/ structure. |
Development guide
See CLAUDE.md for development guidelines and architectural rules. The short version:
- Handlers throw, framework catches — no
try/catchin tool logic - Use
ctx.logfor logging,ctx.statefor storage - Register new tools and resources in the
createApp()arrays insrc/index.ts - Wrap 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 test
License
Apache-2.0 — see LICENSE 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.
Questions fréquentes
Qu'est-ce que io.github.cyanheads/uk-parliament-mcp-server ?
Search UK Parliament bills, members, votes, Hansard, written questions, and committees.
Comment installer io.github.cyanheads/uk-parliament-mcp-server ?
Il fonctionne comme serveur distant. Dans Claude Code : claude mcp add --transport http uk-parliament-mcp-server 'https://uk-parliament.caseyjhand.com/mcp'. Pour les autres clients, collez la configuration JSON de cette page dans leurs réglages MCP.
Faut-il une clé API pour io.github.cyanheads/uk-parliament-mcp-server ?
Son entrée au registre n'indique aucune clé ni secret obligatoire. Certaines fonctions peuvent tout de même demander un compte auprès du service auquel il se connecte.
io.github.cyanheads/uk-parliament-mcp-server est-il open source ?
Oui. Son code est sur GitHub sous licence Apache-2.0.
Qui maintient io.github.cyanheads/uk-parliament-mcp-server ?
Il est publié par cyanheads. AI.tn le référence sans le maintenir ni le recommander.
Issu du registre MCP officiel. Être listé n'est pas une recommandation : vérifiez le code et les permissions d'un serveur avant de lui donner accès à vos données.