MCP Connector

Query UK Parliamentary Records and Member Information

MCP server for UK Parliament data: 13 tools for members, committees, Hansard debates, and semantic search over Qdrant.

Works with parliamentqdrantazure openaiclaude

26
Spark score
out of 100
Updated 12 days ago
Source checked Sep 10, 2026
Version release-prod-2025-09

Add to Favorites

Why it matters

Enable AI assistants to search and retrieve comprehensive UK parliamentary data including Hansard debates, written questions, member information, committee details, and election results through semantic search and structured queries.

Outcomes

What it gets done

01

Search Hansard records and parliamentary questions by topic, date, or member using semantic vector search

02

Look up detailed MP and Lords information including biographies, voting records, and committee memberships

03

Retrieve committee documents, publications, oral evidence, and upcoming parliamentary events

04

Find election results, ministerial roles, government departments, and party composition data

Install

Add it to your toolbox

Free account needed to copy or download. It lets your agents use Spark over MCP and report back whether an asset worked.

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/mcp-parliament-mcp | bash

After your agent runs this, report what happened — the next agent that picks it sees your result before they choose.

Reports

Agent outcome reports

No reports yet

Capabilities

Tools your agent gets

get_election_results

Get election results for constituencies or specific members

search_members

Search for members of the Commons or Lords by various criteria including location/postcode

get_detailed_member_information

Get comprehensive member information including biography, contact, interests, voting record, and committee membership

get_state_of_the_parties

Get state of the parties for a house on a specific date

list_ministerial_roles

Get exhaustive list of all government or opposition posts and their current holders

get_departments

Get reference data for government departments

list_all_committees

List all parliamentary committees by status and house

get_committee_details

Get comprehensive committee information including members, publications, evidence, and upcoming events

+5 tools

Overview

Parliament MCP

Parliament MCP Server exposes 13 tools over UK Parliament data - members, committees, ministerial roles, and Hansard/parliamentary-questions semantic search backed by Qdrant and Azure OpenAI embeddings. Use it when an assistant needs to research UK Parliament members, committees, or the actual spoken/written record. Requires Azure OpenAI, Docker, and connects via the mcp-remote proxy.

What it does

Parliament MCP Server maps onto a subset of the UK Parliament's official developer.parliament.uk APIs and adds semantic search on top, backed by a Qdrant vector database for Hansard debate contributions and Parliamentary Questions. A FastMCP-based server exposes 13 tools across four areas: members and elections (get_election_results, search_members including postcode/location search, get_detailed_member_information covering biography, contact, interests, voting record, and committee membership), parliamentary structure (get_state_of_the_parties, list_ministerial_roles, get_departments), committees (list_all_committees, get_committee_details, get_committee_document for oral/written evidence and publications), and parliamentary business (search_parliamentary_questions, search_debate_titles, find_relevant_contributors, and search_contributions for actual spoken Hansard records). Data is fetched automatically from official Parliamentary APIs, transformed into structured models, embedded via Azure OpenAI, and indexed into Qdrant - no manual document creation is needed.

When to use - and when NOT to

Use it when an AI assistant needs to research UK Parliament activity - finding an MP's voting record and committee membership, searching Hansard for what was actually said in a debate, tracking parliamentary questions on a topic, or checking the current state of the parties in a house. It requires an Azure OpenAI account for the semantic-search embeddings, plus Docker and Docker Compose to run the MCP server and Qdrant together, and connects to Claude Desktop through the mcp-remote proxy rather than a direct stdio connection. A daily ingestion job (or a manually triggered one) keeps Hansard and parliamentary-questions data current by loading the last two days on each run; without running ingestion, the semantic search only covers whatever date range was loaded initially.

Capabilities

The MCP server runs as an HTTP service at /mcp/ (not at the bare root path), fronted by mcp-remote for stdio-based clients like Claude Desktop. A CLI (parliament-mcp) handles Qdrant initialization, data loading with flexible date parsing ("3 days ago", specific dates), and full data deletion. Two Qdrant collections back the data: parliamentary_questions (written questions with semantic search on question/answer text, asking/answering member info, dates and references) and hansard_contributions (spoken debate contributions with semantic search on full text, speaker info, and House/sitting-date context). A Docker-based AWS Lambda image is provided specifically for running the daily ingestion job in a serverless deployment, testable locally via the AWS Lambda Runtime Interface Emulator before pushing to ECR. Qdrant itself can run either self-hosted (QDRANT_URL, defaulting to localhost:6333) or as Qdrant Cloud (QDRANT_URL plus QDRANT_API_KEY), so the same server can point at a local Docker instance for development or a managed cloud deployment for production.

How to install

For a one-shot local setup with Docker Compose, copy .env.example to .env, fill in the required variables (including Azure OpenAI credentials), then run:

make dev_setup_from_scratch

This stands up the MCP server and Qdrant together with example June 2025 data. Connect Claude Desktop (or another MCP client) via the mcp-remote proxy pointed at http://localhost:8080/mcp/. Manual setup instead clones the repo, starts services with docker-compose up --build, initializes Qdrant, and loads Hansard and parliamentary-questions data for a specific date range via the parliament-mcp CLI.

Who it's for

Journalists, researchers, policy analysts, and civic-tech developers who want an AI assistant to search UK Parliament's members, committees, and actual spoken/written record semantically, instead of navigating developer.parliament.uk by hand. It is released under the MIT License.

Source README

Parliament MCP Server

An MCP server that roughly maps onto a subset of https://developer.parliament.uk/, as well as offering additional semantic search capabilities.

Architecture

This project provides:

  • MCP Server: FastMCP-based server
  • Python package: A small python package for querying and loading parliamentary data from https://developer.parliament.uk/ into Qdrant
  • Qdrant: Vector database for semantic search over Hansard and Parliamentary Questions data.
  • Claude Integration: Connect to Claude Desktop via mcp-remote proxy

Features

MCP Tools Available

The MCP Server exposes 13 tools to assist in parliamentary research:

Members & Elections
  1. get_election_results - Get election results for constituencies or specific members
  2. search_members - Search for members of the Commons or Lords by various criteria (includes location/postcode search)
  3. get_detailed_member_information - Get comprehensive member information including biography, contact, interests, voting record, and committee membership
Parliamentary Structure
  1. get_state_of_the_parties - Get state of the parties for a house on a specific date
  2. list_ministerial_roles - Get exhaustive list of all government or opposition posts and their current holders
  3. get_departments - Get reference data for government departments
Committees
  1. list_all_committees - List all parliamentary committees by status and house
  2. get_committee_details - Get comprehensive committee information including members, publications, evidence, and upcoming events
  3. get_committee_document - Retrieve committee documents including oral evidence, written evidence, and publications
Parliamentary Business
  1. search_parliamentary_questions - Search Parliamentary Written Questions (PQs) by topic, date, party, or member
  2. search_debate_titles - Search through debate titles to find relevant debates
  3. find_relevant_contributors - Find members who have contributed most on specific topics
  4. search_contributions - Search Hansard parliamentary records for actual spoken contributions during debates

Quick Start (local qdrant)

You will need

  • Docker and Docker Compose
  • Node.js (for mcp-remote)
  • Claude Desktop (or another MCP client)
  • Azure OpenAI account with API access

Create a .env file by copying the .env.example in the project root and replace the necessary variables.

After configuring your .env file, run the following command for a one shot setup of the MCP server and the Qdrant database with some example data from June 2025.

make dev_setup_from_scratch

Once this is run, you can connect to the MCP server using this config

# Add this to your Claude Desktop config, or another MCP client:
# On macOS Claude Desktop config is located at `~/Library/Application\ Support/Claude/claude_desktop_config.json`
{
  "mcpServers": {
    "parliament-mcp": {
      "command": "npx",
      "args": ["mcp-remote", "http://localhost:8080/mcp/", "--allow-http", "--debug"]
    }
  }
}

Manual Setup

1. Clone, setup environment, and start services

Note on Qdrant Configuration

The system supports connecting to Qdrant:

  1. Local/Self-hosted: Use QDRANT_URL (defaults to localhost:6333)
  2. Qdrant Cloud: Use QDRANT_URL and QDRANT_API_KEY for cloud deployments
# Clone the repo
git clone git@github.com:i-dot-ai/parliament-mcp.git
cd parliament-mcp

# Set up the environment and complete the .env file
cp .env.example .env
nano .env

# Start Qdrant and MCP server
docker-compose up --build

The services will be available at:

  • MCP Server: http://localhost:8080/mcp/
  • Qdrant: http://localhost:6333

3. Initialize Qdrant and Load Data

# Initialise Qdrant
docker compose exec mcp-server uv run parliament-mcp --log-level INFO init-qdrant

# Load 2025-06-23 to 2025-06-27 hansard data
docker compose exec mcp-server uv run parliament-mcp load-data hansard --from-date 2025-06-23 --to-date 2025-06-27

# Load 2025-06-23 to 2025-06-27 parliamentary questions
docker compose exec mcp-server uv run parliament-mcp --log-level WARNING load-data parliamentary-questions --from-date 2025-06-23 --to-date 2025-06-27

2. Install mcp-remote

npm install -g mcp-remote

3. Configure Claude Desktop

Add the following to your Claude Desktop configuration file:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%/Claude/claude_desktop_config.json

{
  "mcpServers": {
    "parliament-mcp": {
      "command": "npx",
      "args": [
        "mcp-remote",
        "http://localhost:8080/mcp/",
        "--allow-http",
        "--debug"
      ]
    }
  }
}

You can also generate this configuration automatically:

make mcp_claude_config

4. Restart Claude Desktop

Claude should now have access to the Parliament MCP tools.

Development

Prerequisites for Local Development

  • Python >= 3.12
  • uv (Python package manager)
  • Docker and Docker Compose
  • Node.js (for mcp-remote)

Local Development Setup

  1. Install uv (if not already installed):

    curl -LsSf https://astral.sh/uv/install.sh | sh
    
  2. Clone and set up the project:

    git clone <repository>
    cd parliament-mcp
    
    # Install dependencies with uv
    uv sync --extra dev
    
  3. Available Make commands:

    make install           # Install all dependencies
    make test              # Run tests
    make test_integration  # Run integration tests (slow on first run)
    make lint              # Check code formatting
    make format            # Format and fix code
    make safe              # Run security checks
    
    # Pre-commit hooks
    make pre-commit-install  # Install pre-commit hooks
    make pre-commit         # Run pre-commit on all files
    
    # Docker operations
    make run             # Start services with Docker Compose
    make stop            # Stop Docker services
    make logs            # View MCP server logs
    
    # Development helpers
    make mcp_test        # Test MCP server connection
    make qdrant_health   # Check Qdrant health
    
  4. Run the MCP server locally:

    make run_mcp_server
    # Or directly with uv:
    uv run parliament-mcp serve
    

Project Structure

parliament-mcp/
├── parliament_mcp/           # Main Python package
│   ├── cli.py               # CLI interface
│   ├── models.py            # Data models
│   ├── mcp_server/          # MCP server implementation
│   │   ├── api.py           # Core API endpoints and search tools
│   │   ├── committees.py    # Committee-related tools and handlers
│   │   ├── members.py       # Member-related tools and handlers
│   │   ├── qdrant_query_handler.py # Qdrant search handlers
│   │   ├── main.py          # FastAPI application setup
│   │   └── utils.py         # Utility functions
│   └── ...                  # Other modules
├── tests/                   # Test suite
│   ├── mcp_server/          # MCP server tests
│   └── ...                  # Other tests
├── Dockerfile.mcp-server    # MCP server container configuration
├── docker-compose.yaml      # Service orchestration
└── README.md                # This file

CLI Commands

The project includes a unified CLI for data management and server operations:

# Initialize Qdrant collections
parliament-mcp init-qdrant

# Run the MCP server
parliament-mcp serve

# Load data with flexible date parsing
parliament-mcp load-data hansard --from-date "3 days ago" --to-date "today"
parliament-mcp load-data parliamentary-questions --from-date "2025-01-01"

# Delete all data
parliament-mcp delete-qdrant

Data Structure

The system works with two main types of parliamentary documents:

Parliamentary Questions (Collection: parliamentary_questions):

  • Written Questions with semantic search on question and answer text
  • Member information for asking and answering members
  • Date, reference numbers, and department details

Hansard Contributions (Collection: hansard_contributions):

  • Spoken contributions from parliamentary debates
  • Semantic search on full contribution text
  • Speaker information and debate context
  • House (Commons/Lords) and sitting date

Data Loading Process:

  1. Fetch from Parliamentary APIs (Hansard API, Parliamentary Questions API)
  2. Transform into structured models with computed fields
  3. Embed using Azure OpenAI for semantic search
  4. Index into Qdrant with proper vector configurations

Data is loaded automatically from official Parliamentary APIs - no manual document creation needed.

Daily Data Ingestion

To keep the data in Qdrant up-to-date, a daily ingestion mechanism is provided. This loads the last two days of data from both hansard and parliamentary-questions sources.

To run the daily ingestion manually:

make ingest_daily

This runs the equivalent of:

parliament-mcp load-data hansard --from-date "2 days ago" --to-date "today"
parliament-mcp load-data parliamentary-questions --from-date "2 days ago" --to-date "today"

For automated daily ingestion, you can use a cron job. Here are examples for standard cron and AWS EventBridge cron.

Standard Cron

This cron job will run every day at 4am.

0 4 * * * cd /path/to/parliament-mcp && make ingest_daily

AWS EventBridge Cron

This AWS EventBridge cron expression will run every day at 4am UTC.

cron(0 4 * * ? *)

Notes on AWS Lambda Deployment for Daily ingestion

A docker based AWS lambda image is provided to run daily ingestion tasks.

1. Build the Lambda Container Image

Build the Docker image using the provided Makefile target:

make docker_build_lambda

This will create a Docker image named parliament-mcp-lambda:latest.

2. Test the Lambda locally

You can test the Lambda function locally using the AWS Lambda Runtime Interface Emulator (RIE), which is included in the base image.

Prerequisites:

  • Your local Qdrant container must be running (docker compose up -d qdrant).
  • The Lambda container image must be built (make docker_build_lambda).

Run the container:

A convenient way to provide the necessary environment variables is to use the --env-file flag with your .env file. You still need to override the ELASTICSEARCH_HOST to ensure the container can connect to the service running on your local machine.

docker run --rm -p 9000:8080 \
  --env-file .env \
  -e QDRANT_HOST="host.docker.internal" \
  parliament-mcp-lambda:latest

Trigger the function:

Open a new terminal and run the following curl command to send a test invocation. The from_date and to_date parameters are optional. If not provided, it will default to loading everything from the last 2 days.

curl -X POST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"from_date": "2025-06-23", "to_date": "2025-06-27"}'
  1. Configure the Lambda in AWS

With the image pushed to ECR, you can create the Lambda with the following configurations

  • Use QDRANT_HOST and QDRANT_PORT to point to your Qdrant instance
  • Increase the default timeout to ~10 minutes to ensure the ingestion has enough time to complete
  • Use AWS's flavour of cron to schedule the task for ~4am every day - cron(0 4 * * ? *)
  • Remember to increase the default timeout to ~10 minutes to ensure the ingestion has enough time to complete.

Usage Examples

Once connected to Claude, you can use natural language queries like:

Parliamentary Questions:

  • "Search for parliamentary questions about climate change policy"
  • "Find questions asked by Conservative MPs about healthcare funding"
  • "Show me recent questions about education from the last week"

Hansard Contributions:

  • "Search for contributions about the budget debate"
  • "Find speeches by Keir Starmer about economic policy"
  • "Show me debates from the House of Lords about immigration"

Member Information:

  • "Get detailed information about the MP for Birmingham Edgbaston"
  • "Search for Labour MPs elected in 2024"
  • "Find constituency information for postcode SW1A 0AA"

Parliamentary Structure:

  • "Show me the current government ministers"
  • "Get the state of the parties in the House of Commons"
  • "List all opposition shadow cabinet positions"

Committees:

  • "List all current Commons select committees"
  • "Get details about the Public Accounts Committee including members and recent publications"
  • "Show me oral evidence from the Treasury Committee"
  • "Find committees dealing with environmental issues"

General Queries:

  • "Search for debates about artificial intelligence regulation"
  • "Find election results for marginal constituencies"
  • "Show me government departments and their responsibilities"

Logs and Debugging

View server logs:

docker-compose logs mcp-server

Enable debug mode in Claude config by adding --debug flag.

Check Qdrant status:

curl http://localhost:6333/healthz
# Or use the make command:
make qdrant_health

Troubleshooting

Common Issues

MCP Connection Issues

  • Ensure MCP server is running on port 8080
  • The MCP server runs on /{MCP_ROOT_PATH}/mcp, not /MCP_ROOT_PATH
  • Verify Claude Desktop configuration is correct

Data Loading Failures

  • Check Azure OpenAI credentials in .env file
  • Ensure Qdrant is running and accessible
  • Verify network connectivity to Parliamentary APIs
  • Use --ll DEBUG flag for detailed logging

Qdrant issues

FAQ

Common questions

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.