Noriyo Akita's Today I Learned

# 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: プルリクエストを通じて新しいタグを追加

基本設定とクライアント初期化

必要なライブラリ(fastmcphuggingface_hubdotenv)をインポートし、環境変数からHugging Faceトークンを読み込む。トークンが存在する場合は認証されたAPIクライアントを作成し、FastMCPサーバーを初期化。

トークンがない場合でもサーバーが起動できるよう、条件付きでAPIクライアントを作成する設計。

get_current_tagsツールの実装

指定されたモデルリポジトリから既存のタグを取得するツール。実装のポイント:

  • APIクライアントの存在確認とエラーハンドリング
  • Hub APIを使用したモデル情報の取得
  • タグの抽出とJSON形式での返却
  • 詳細なエラーメッセージの提供

MCPサーバーとクライアント間の通信にはJSON文字列を使用することが重要。

add_new_tagツールの実装

プルリクエストを通じて新しいタグをリポジトリに追加するツール。処理フローは以下:

  1. 事前チェック: APIクライアントの存在確認
  2. 重複確認: 現在のリポジトリ状態を取得し、新しいタグの存在をチェック
  3. モデルカード処理: 既存のモデルカードをロードまたは新規作成
  4. タグリスト更新: 新しいタグを追加してモデルカードを更新
  5. プルリクエスト作成: create_commit関数でコミットとPRを自動生成

プルリクエストのタイトルと説明は詳細に記述し、変更内容と理由を明確に伝える。

エラーハンドリングとロギング

自動化されたアプリケーションでは、リアルタイムでログを確認できないため、詳細なログが重要。エラー処理には完全なトレースバックを含めることで、問題の特定と解決を容易にする。

無限ループの防止

create_commit関数はコミットごとにプルリクエストを作成するため、マージされていないプルリクエストが存在する場合、無限ループが発生する可能性がある。この問題を防止するためのチェックが実装されている。

MCPクライアントの実装

概要とアーキテクチャ

MCPクライアントはWebhookハンドラーとMCPサーバー間の橋渡し役として機能。FastAPIアプリケーション(app.py)に統合され、MCPサーバーへの接続を管理し、ツール実行のためのシームレスなインターフェースを提供。

Agentクラスの活用

huggingface_hubAgentクラスを使用。このクラスは言語モデル機能と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は自然言語の指示に基づいて、適切なツールを自動選択・実行:

  1. get_current_tagsで既存のタグを確認
  2. 新しいタグと比較して重複をチェック
  3. 必要に応じてadd_new_tagでプルリクエストを作成
  4. 実行内容の概要を提供

タグ抽出ロジック

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フローとセキュリティ

処理フロー:

  1. ユーザーアクション(コメントの作成)
  2. Hubイベントの生成
  3. Webhookの配信(POSTリクエスト)
  4. 認証(Webhookシークレットの検証)
  5. 処理(タグの抽出)
  6. アクション(プルリクエストの作成)

X-Webhook-Secretヘッダーを使用してWebhookシークレットを検証することで、不正なリクエストからアプリケーションを保護。

FastAPIによるWebhookハンドラ

段階的な構築プロセス:

  1. 基本設定: 必要なimport、環境変数の設定、CORSミドルウェアの追加
  2. データモデル: WebhookEventクラスの定義
  3. 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つのテスト方法:

  1. ローカルテスト: スクリプトを使用してWebhookリクエストをシミュレート
  2. シミュレーションエンドポイント: アプリケーションのインターフェースからさまざまなシナリオをテスト

シミュレーションエンドポイントは、実際のリポジトリディスカッションを作成せずに、さまざまなタグの組み合わせやエッジケースをテストするのに有効。

デプロイメントと本番環境

Hugging Face Spacesへのデプロイ

コンテナ化されたデプロイメントの要素:

  • 環境変数管理: シークレットの安全な管理
  • バックグラウンドタスク処理: Webhook応答の最適化
  • Gradioインターフェース: テストとモニタリング用

必要なファイル構成

  • Dockerfile: コンテナ設定
  • requirements.txt: 依存関係
  • pyproject.toml: プロジェクト設定
  • env.example: 設定テンプレート

まとめと学習ポイント

MCPの実践的活用

このプロジェクトを通じて、MCPが単なる概念実証ではなく、実際の本番環境で使用できる強力なツールであることを学んだ。Webhook統合、リアルタイム処理、エラーハンドリングなど、実世界のアプリケーションに必要な要素を全て含んでいる。

重要な技術ポイント

  • セキュアなWebhook検証: 不正なリクエストからの保護
  • 非同期処理: 高速なレスポンスと複雑な処理の両立
  • エラーハンドリング: 詳細なログとトレースバック
  • パフォーマンス最適化: Singletonパターンとバックグラウンドタスク

ベストプラクティス

  • Webhookの応答は迅速に(10秒以内)返す
  • 時間のかかる処理にはバックグラウンドタスクを使用
  • 機密情報の適切な管理
  • 段階的なテストとデプロイ

huggingface_hubAgentクラスは、MCPツールの統合と言語モデルの推論の両方を提供し、PRエージェントのようなインテリジェントな自動化ワークフローの構築に最適なソリューションであることが確認できた。

My avatar

Thanks for reading my blog post! Feel free to check out my other posts or contact me via the social links in the footer.


More Posts