🚀 議会MCPサーバー
このMCPサーバーは、https://developer.parliament.uk/ のサブセットに大まかに対応し、さらに追加の意味検索機能を提供します。
🚀 クイックスタート
ローカルのElasticsearchを使用する場合
以下が必要です。
- DockerとDocker Compose
- Node.js(mcp-remote用)
- Claude Desktop(または他のMCPクライアント)
- APIアクセスを持つAzure OpenAIアカウント
プロジェクトのルートにある.env.example
をコピーして.env
ファイルを作成し、必要な変数を置き換えてください。
.env
ファイルを設定した後、2025年6月のいくつかのサンプルデータでMCPサーバーとElasticsearchデータベースを一度にセットアップするには、次のコマンドを実行します。
make dev_setup_from_scratch
これが実行されたら、次の設定を使用してMCPサーバーに接続できます。
{
"mcpServers": {
"parliament-mcp": {
"command": "npx",
"args": ["mcp-remote", "http://localhost:8080/mcp/", "--allow-http", "--debug"]
}
}
}
✨ 主な機能
利用可能なMCPツール
MCPサーバーは、議会調査を支援する11のツールを公開しています。
search_constituency
- 選挙区を名前で検索するか、IDで選挙区の詳細を取得します。
get_election_results
- 選挙区または特定の議員の選挙結果を取得します。
search_members
- 下院または上院の議員をさまざまな基準で検索します。
get_detailed_member_information
- 議員の伝記、連絡先、関心分野、投票記録を含む詳細情報を取得します。
get_state_of_the_parties
- 特定の日付の特定の議院の政党状況を取得します。
get_government_posts
- すべての政府職の完全なリストと現在の担当者を取得します。
get_opposition_posts
- すべての野党職の完全なリストと現在の担当者を取得します。
get_departments
- 政府省庁の参照データを取得します。
search_parliamentary_questions
- トピック、日付、政党、または議員によって議会の書面質問(PQ)を検索します。
search_debates
- 関連する討論を見つけるために討論のタイトルを検索します。
search_contributions
- ハンサードの議会記録を検索して、討論中の実際の発言を見つけます。
📦 インストール
手動設定
1. リポジトリをクローンし、環境を設定してサービスを起動する
Elasticsearch設定に関する注意
システムは、Elasticsearchに接続するための2つの方法をサポートしています。
- ローカル/セルフホスト:
ELASTICSEARCH_HOST
、ELASTICSEARCH_PORT
、およびELASTICSEARCH_SCHEME
を使用します。
- Elasticsearch Cloud:
ELASTICSEARCH_CLOUD_ID
とELASTICSEARCH_API_KEY
を使用します(ホスト、ポート、およびスキームを自動的に設定します)。
git clone git@github.com:i-dot-ai/parliament-mcp.git
cd parliament-mcp
cp .env.example .env
nano .env
docker-compose up --build
サービスは以下の場所で利用できます。
- MCPサーバー:
http://localhost:8080/mcp/
- Elasticsearch:
http://localhost:9200
2. mcp-remoteをインストールする
npm install -g mcp-remote
3. Elasticsearchを初期化し、データをロードする
docker compose exec mcp-server uv run parliament-mcp --log-level INFO init-elasticsearch
docker compose exec mcp-server uv run parliament-mcp load-data hansard --from-date 2025-06-23 --to-date 2025-06-27
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
4. Claude Desktopを設定する
Claude Desktopの設定ファイルに以下を追加します。
- 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"
]
}
}
}
この設定を自動生成することもできます。
make mcp_claude_config
5. Claude Desktopを再起動する
Claudeはこれで議会MCPツールにアクセスできるはずです。
💻 使用例
Claudeに接続したら、次のような自然言語クエリを使用できます。
基本的な使用法
- "気候変動政策に関する議会質問を検索してください"
- "保守党議員による医療資金に関する質問を見つけてください"
- "先週の教育に関する最近の質問を表示してください"
- "予算討論に関する発言を検索してください"
- "ケイアー・スターマーの経済政策に関する演説を見つけてください"
- "上院の移民に関する討論を表示してください"
- "バーミンガム・エッジバストンの議員の詳細情報を取得してください"
- "2024年に選出された労働党議員を検索してください"
- "郵便番号SW1A 0AAの選挙区情報を見つけてください"
- "現在の政府閣僚を表示してください"
- "下院の政党状況を取得してください"
- "すべての野党影子内閣の職務をリストアップしてください"
- "人工知能規制に関する討論を検索してください"
- "わずかな差で勝利した選挙区の選挙結果を見つけてください"
- "政府省庁とその責任を表示してください"
高度な使用法
ログとデバッグ
サーバーログを表示する:
docker-compose logs mcp-server
Claude設定でデバッグモードを有効にする:--debug
フラグを追加します。
Elasticsearchの状態を確認する:
curl http://localhost:9200/_cat/health?v
make es_health
📚 ドキュメント
開発
ローカル開発の前提条件
- Python >= 3.12
- uv(Pythonパッケージマネージャー)
- DockerとDocker Compose
- Node.js(mcp-remote用)
ローカル開発のセットアップ
-
uvをインストールする(まだインストールされていない場合):
curl -LsSf https://astral.sh/uv/install.sh | sh
-
プロジェクトをクローンしてセットアップする:
git clone <repository>
cd parliament-mcp
uv sync --extra dev
-
利用可能なMakeコマンド:
make install
make test
make test_integration
make lint
make format
make safe
make pre-commit-install
make pre-commit
make run
make stop
make logs
make mcp_test
make es_health
-
MCPサーバーをローカルで実行する:
make run_mcp_server
uv run parliament-mcp serve
プロジェクト構造
parliament-mcp/
├── parliament_mcp/ # 主要なPythonパッケージ
│ ├── cli.py # CLIインターフェース
│ ├── models.py # データモデル
│ ├── mcp_server/ # MCPサーバーの実装
│ │ ├── api.py # APIエンドポイントとツール定義
│ │ ├── handlers.py # Elasticsearchクエリハンドラー
│ │ ├── main.py # FastAPIアプリケーションのセットアップ
│ │ └── utils.py # ユーティリティ関数
│ └── ... # その他のモジュール
├── tests/ # テストスイート
│ ├── mcp_server/ # MCPサーバーのテスト
│ └── ... # その他のテスト
├── Dockerfile.mcp-server # MCPサーバーのコンテナ構成
├── docker-compose.yaml # サービスオーケストレーション
└── README.md # このファイル
CLIコマンド
このプロジェクトには、データ管理とサーバー操作のための統一されたCLIが含まれています。
parliament-mcp init-elasticsearch
parliament-mcp serve
parliament-mcp load-data hansard --from-date "3 days ago" --to-date "today"
parliament-mcp load-data parliamentary-questions --from-date "2025-01-01"
parliament-mcp delete-elasticsearch
データ構造
システムは、2種類の主要な議会文書で動作します。
議会質問(インデックス:parliamentary_questions
):
- 質問と回答のテキストに対する意味検索付きの書面質問
- 質問者と回答者の議員情報
- 日付、参照番号、および省庁詳細
ハンサードの発言(インデックス:hansard_contributions
):
- 議会討論の口頭発言
- 完全な発言テキストに対する意味検索
- 発言者情報と討論の文脈
- 議院(下院/上院)と開会日
データロードプロセス:
- 取得:議会API(ハンサードAPI、議会質問API)からデータを取得します。
- 変換:計算されたフィールドを持つ構造化モデルに変換します。
- 埋め込み:Azure OpenAIを使用して意味検索用にデータを埋め込みます。
- インデックス化:適切なマッピングでElasticsearchにインデックス化します。
データは公式の議会APIから自動的にロードされるため、手動で文書を作成する必要はありません。
毎日のデータ取り込み
Elasticsearch内のデータを最新の状態に保つために、毎日のデータ取り込みメカニズムが提供されています。これは、hansard
とparliamentary-questions
の両方のソースから過去2日間のデータをロードします。
手動で毎日の取り込みを実行するには:
make ingest_daily
これは次と同等です。
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"
自動的な毎日の取り込みには、cronジョブを使用できます。以下は、標準のcronとAWS EventBridge cronの例です。
標準Cron
このcronジョブは、毎日午前4時に実行されます。
0 4 * * * cd /path/to/parliament-mcp && make ingest_daily
AWS EventBridge Cron
このAWS EventBridge cron式は、毎日UTC午前4時に実行されます。
cron(0 4 * * ? *)
AWS Lambdaデプロイに関する注意事項
毎日の取り込みタスクを実行するためのDockerベースのAWS Lambdaイメージが提供されています。
1. Lambdaコンテナイメージをビルドする
提供されているMakefile
のターゲットを使用してDockerイメージをビルドします。
make docker_build_lambda
これにより、parliament-mcp-lambda:latest
という名前のDockerイメージが作成されます。
2. Lambdaをローカルでテストする
AWS Lambda Runtime Interface Emulator(RIE)を使用して、Lambda関数をローカルでテストできます。これはベースイメージに含まれています。
前提条件:
- ローカルのElasticsearchコンテナが実行中である必要があります(
docker compose up -d elasticsearch
)。
- Lambdaコンテナイメージがビルドされている必要があります(
make docker_build_lambda
)。
コンテナを実行する:
必要な環境変数を提供する便利な方法は、.env
ファイルと一緒に--env-file
フラグを使用することです。ただし、コンテナがローカルマシン上で実行されているサービスに接続できるように、ELASTICSEARCH_HOST
をオーバーライドする必要があります。
docker run --rm -p 9000:8080 \
--env-file .env \
-e ELASTICSEARCH_HOST="host.docker.internal" \
parliament-mcp-lambda:latest
関数をトリガーする:
新しいターミナルを開き、次のcurl
コマンドを実行してテスト呼び出しを送信します。from_date
とto_date
パラメーターはオプションです。指定されない場合、デフォルトで過去2日間のすべてのデータがロードされます。
curl -X POST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"from_date": "2025-06-23", "to_date": "2025-06-27"}'
3. AWSでLambdaを構成する
イメージをECRにプッシュしたら、次の構成でLambdaを作成できます。
ELASTICSEARCH_HOST
、ELASTICSEARCH_PORT
、およびELASTICSEARCH_SCHEME
を使用して、Elasticsearchクラスターを指すように設定します。
- デフォルトのタイムアウトを約10分に増やして、取り込みが十分な時間で完了するようにします。
- AWSのcron形式を使用して、毎日午前4時にタスクをスケジュールします -
cron(0 4 * * ? *)
- 取り込みが十分な時間で完了するように、デフォルトのタイムアウトを約10分に増やすことを忘れないでください。
🔧 技術詳細
トラブルシューティング
一般的な問題
MCP接続問題
- MCPサーバーがポート8080で実行されていることを確認してください。
- MCPサーバーは
/{MCP_ROOT_PATH}/mcp
で実行され、/MCP_ROOT_PATH
ではありません。
- Claude Desktopの設定が正しいことを確認してください。
データロード失敗
.env
ファイルのAzure OpenAI資格情報を確認してください。
- Elasticsearchが実行中でアクセス可能であることを確認してください。
- 議会APIへのネットワーク接続を確認してください。
- 詳細なログを表示するには
--ll DEBUG
フラグを使用してください。
Elasticsearchの問題
- 推論エンドポイントが作成されていることを確認してください:
parliament-mcp init-elasticsearch
。
- https://elasticvue.com/ を使用してElasticsearchインスタンスを検査してください。
📄 ライセンス
MITライセンス - 詳細についてはLICENSE
ファイルを参照してください。