# Hugging Face MCP Course Unit3.1: Pull Request Agent構築 学習メモ
Table of Contents
Hugging Face MCP Course の Unit3.1 を学習したメモ。MCPを活用してHugging Face Hubのモデルリポジトリに自動的にタグ付けを行うPull Request Agentを構築する実践的なプロジェクト。Webhook統合、リアルタイム処理、本番環境でのデプロイまでを含む本格的なアプリケーション開発を学ぶ。
プロジェクト概要
Pull Request Agentとは
Hugging Face Hubのモデルリポジトリにおいて、ディスカッションやコメントの内容を分析し、適切なタグを自動的に提案・追加するエージェント。モデル作成者が手動でタグ付けする手間を省き、すぐに使えるプルリクエストを提供することが目的。
MCP を Webhookリスナーや自動化ワークフローと統合する現実世界のアプリケーション例として設計されている。
システムアーキテクチャ
プロジェクトは以下の主要コンポーネントで構成される:
- MCPサーバー (
mcp_server.py
): Hugging Face Hubとのやり取りを抽象化 - Webhookリスナー (
app.py
): リアルタイムイベントの受信と処理 - MCPクライアント: WebhookハンドラーとMCPサーバー間の橋渡し
- 設定ファイル群: 依存関係管理とデプロイ設定
エージェントの機能
- 明示的タグ抽出:
tag: pytorch
、#transformers
などの直接的なメンション - 暗黙的タグ認識: 自然言語からの文脈的なタグ推定
- タグ検証: 既知の機械学習/AIカテゴリに対する妥当性チェック
- プルリクエスト生成: 適切な説明文付きでの自動PR作成
開発環境のセットアップ
プロジェクト構造
hf-pr-agent
ディレクトリ内に以下のファイルを配置:
mcp_server.py
: MCPサーバーのコードapp.py
: アプリケーションのエントリーポイントrequirements.txt
: 依存関係リストpyproject.toml
: プロジェクト設定env.example
: 環境変数のテンプレートcleanup.py
: クリーンアップスクリプトDockerfile
: コンテナ化設定
依存関係管理
uv
というモダンなPythonツールを使用して依存関係を管理。主要な依存関係:
fastapi
: WebAPIフレームワークuvicorn
: ASGIサーバーgradio
: テスト用インターフェースhuggingface-hub[mcp]
: Hugging Face Hub API(MCP対応)pydantic
: データバリデーションpython-multipart
: マルチパート処理requests
: HTTP通信python-dotenv
: 環境変数管理fastmcp
: FastMCPライブラリ
pyproject.toml
ファイルでプロジェクトメタデータと依存関係を定義し、hatchling
を使用したビルド設定も含める。
環境変数の設定
env.example
ファイルで必要な環境変数をドキュメント化:
HF_TOKEN
: Hugging Face APIトークンWEBHOOK_SECRET
: WebhookシークレットHF_MODEL
: 使用するモデル名HF_PROVIDER
: プロバイダー設定
Webhookシークレットはpython -c "import secrets; print(secrets.token_hex(32))"
で生成し、.env
ファイルに設定。機密情報の漏洩防止のため.gitignore
への追加が重要。
MCPサーバーの実装
アーキテクチャと目的
MCPサーバーはプルリクエストエージェントの中核として、Hugging Face Hubとのやり取りを抽象化する。Hub APIとの複雑なやり取りを簡素化し、以下の主要ツールを提供:
get_current_tags
: 現在のタグを取得add_new_tag
: プルリクエストを通じて新しいタグを追加
基本設定とクライアント初期化
必要なライブラリ(fastmcp
、huggingface_hub
、dotenv
)をインポートし、環境変数からHugging Faceトークンを読み込む。トークンが存在する場合は認証されたAPIクライアントを作成し、FastMCPサーバーを初期化。
トークンがない場合でもサーバーが起動できるよう、条件付きでAPIクライアントを作成する設計。
get_current_tagsツールの実装
指定されたモデルリポジトリから既存のタグを取得するツール。実装のポイント:
- APIクライアントの存在確認とエラーハンドリング
- Hub APIを使用したモデル情報の取得
- タグの抽出とJSON形式での返却
- 詳細なエラーメッセージの提供
MCPサーバーとクライアント間の通信にはJSON文字列を使用することが重要。
add_new_tagツールの実装
プルリクエストを通じて新しいタグをリポジトリに追加するツール。処理フローは以下:
- 事前チェック: APIクライアントの存在確認
- 重複確認: 現在のリポジトリ状態を取得し、新しいタグの存在をチェック
- モデルカード処理: 既存のモデルカードをロードまたは新規作成
- タグリスト更新: 新しいタグを追加してモデルカードを更新
- プルリクエスト作成:
create_commit
関数でコミットとPRを自動生成
プルリクエストのタイトルと説明は詳細に記述し、変更内容と理由を明確に伝える。
エラーハンドリングとロギング
自動化されたアプリケーションでは、リアルタイムでログを確認できないため、詳細なログが重要。エラー処理には完全なトレースバックを含めることで、問題の特定と解決を容易にする。
無限ループの防止
create_commit
関数はコミットごとにプルリクエストを作成するため、マージされていないプルリクエストが存在する場合、無限ループが発生する可能性がある。この問題を防止するためのチェックが実装されている。
MCPクライアントの実装
概要とアーキテクチャ
MCPクライアントはWebhookハンドラーとMCPサーバー間の橋渡し役として機能。FastAPIアプリケーション(app.py
)に統合され、MCPサーバーへの接続を管理し、ツール実行のためのシームレスなインターフェースを提供。
Agentクラスの活用
huggingface_hub
のAgent
クラスを使用。このクラスは言語モデル機能とMCPツールの統合を単一のコンポーネントで提供し、MCPサポートが組み込まれている。
Agentインスタンスの管理
グローバル変数agent_instance
を使用してAgentインスタンスを一度だけ作成し、複数のリクエストで再利用。get_agent()
関数は既存のインスタンスがない場合にのみ新しいAgentインスタンスを作成。
設定項目:
model
: モデル名(HF_MODEL
)provider
: プロバイダー(DEFAULT_PROVIDER
)api_key
: APIキー(HF_TOKEN
)servers
: MCPサーバーへの接続設定
stdio
接続タイプを使用してMCPサーバーをサブプロセスとして起動し、標準入出力で通信。agent_instance.load_tools()
でMCPサーバーから利用可能なツールを検出。
ツールの自動検出と実行
Agentは自然言語の指示に基づいて、適切なツールを自動選択・実行:
get_current_tags
で既存のタグを確認- 新しいタグと比較して重複をチェック
- 必要に応じて
add_new_tag
でプルリクエストを作成 - 実行内容の概要を提供
タグ抽出ロジック
extract_tags_from_text
関数は複数の戦略でテキストからタグを抽出:
- 明示的パターン: “tags: pytorch, transformers”
- ハッシュタグ: “#pytorch #nlp”
- 自然な言及: “This transformers model does text-generation”
RECOGNIZED_TAGS
リストを使用して関連性の高いML/AIタグに焦点を当て、不適切なタグの追加を防止。
パフォーマンス考慮事項
本番環境では以下の最適化を実装:
- Singletonパターン: MCPサーバーの起動オーバーヘッド削減
- 非同期処理: 複数のWebhookリクエストの同時処理
- BackgroundTasks: Webhookレスポンスの高速化(1秒以内)
Webhookリスナーの実装
役割と重要性
Hugging Face Hubからのリアルタイムイベント(ディスカッションの作成や更新)を受信するWebhookリスナーは、プルリクエストエージェントのエントリーポイントとして機能。MCPを活用したタグ付けワークフローをトリガーし、ディスカッションやコメントに対する迅速な対応を可能にする。
Webhookはプッシュ通知として機能し、Hugging Face Hubからアプリケーションにイベントが積極的に送信されるため、変更をポーリングする必要がない。
Webhookフローとセキュリティ
処理フロー:
- ユーザーアクション(コメントの作成)
- Hubイベントの生成
- Webhookの配信(POSTリクエスト)
- 認証(Webhookシークレットの検証)
- 処理(タグの抽出)
- アクション(プルリクエストの作成)
X-Webhook-Secret
ヘッダーを使用してWebhookシークレットを検証することで、不正なリクエストからアプリケーションを保護。
FastAPIによるWebhookハンドラ
段階的な構築プロセス:
- 基本設定: 必要なimport、環境変数の設定、CORSミドルウェアの追加
- データモデル:
WebhookEvent
クラスの定義 - Webhookハンドラ: メインの処理ロジックの実装
Webhookハンドラの主要機能
- データ検証: 受信したWebhookデータの妥当性確認
- イベントフィルタリング: 新規ディスカッションコメントのみを処理
- 非同期処理:
background_tasks.add_task()
を使用した高速レスポンス
非同期処理により、Webhookエンドポイントは迅速に応答でき(10秒以内)、同時に複雑な処理をバックグラウンドで実行。
コメント処理ロジック
process_webhook_comment
関数の処理内容:
- Webhookデータからの情報抽出(コメント内容、ディスカッションタイトル、リポジトリ名)
- タグの抽出と重複排除
- MCPエージェントへの自然言語プロンプト提供
- 処理進行状況の
tag_operations_store
への記録
監視とヘルスチェック
重要なエンドポイント:
/health
: コンポーネントの構成状況を確認/operations
: 最近のWebhook処理アクティビティを確認
これらのエンドポイントにより、構成の問題を迅速に特定し、ログを掘り下げることなくアプリケーションのアクティビティを監視可能。
Hugging Face Hubでの設定
Webhookの設定項目:
- 対象リポジトリ
- Webhook URL
- シークレット
- サブスクライブするイベント(“Community (PR & discussions)”)
テストリポジトリで最初に設定し、正しく動作することを確認してから多くのリポジトリに拡張することが推奨される。
テスト方法
2つのテスト方法:
- ローカルテスト: スクリプトを使用してWebhookリクエストをシミュレート
- シミュレーションエンドポイント: アプリケーションのインターフェースからさまざまなシナリオをテスト
シミュレーションエンドポイントは、実際のリポジトリディスカッションを作成せずに、さまざまなタグの組み合わせやエッジケースをテストするのに有効。
デプロイメントと本番環境
Hugging Face Spacesへのデプロイ
コンテナ化されたデプロイメントの要素:
- 環境変数管理: シークレットの安全な管理
- バックグラウンドタスク処理: Webhook応答の最適化
- Gradioインターフェース: テストとモニタリング用
必要なファイル構成
Dockerfile
: コンテナ設定requirements.txt
: 依存関係pyproject.toml
: プロジェクト設定env.example
: 設定テンプレート
まとめと学習ポイント
MCPの実践的活用
このプロジェクトを通じて、MCPが単なる概念実証ではなく、実際の本番環境で使用できる強力なツールであることを学んだ。Webhook統合、リアルタイム処理、エラーハンドリングなど、実世界のアプリケーションに必要な要素を全て含んでいる。
重要な技術ポイント
- セキュアなWebhook検証: 不正なリクエストからの保護
- 非同期処理: 高速なレスポンスと複雑な処理の両立
- エラーハンドリング: 詳細なログとトレースバック
- パフォーマンス最適化: Singletonパターンとバックグラウンドタスク
ベストプラクティス
- Webhookの応答は迅速に(10秒以内)返す
- 時間のかかる処理にはバックグラウンドタスクを使用
- 機密情報の適切な管理
- 段階的なテストとデプロイ
huggingface_hub
のAgent
クラスは、MCPツールの統合と言語モデルの推論の両方を提供し、PRエージェントのようなインテリジェントな自動化ワークフローの構築に最適なソリューションであることが確認できた。