Microsoft Foundry マルチエージェントにGitHub MCPを使わせる

この記事は、Insight Edge Advent Calendar 2025 の14日目の記事です!!

はじめに

こんにちは、Engineerの熊田です。 AIエージェント開発やMCP(Model Context Protocol)を使った外部連携が昨今は盛り上がっていますね。一方で、エージェント同士の連携を実装したり、外部ツールとの統合を一から構築したりするのは簡単でない作業です。

本記事では、マルチエージェントシステムを簡単に構築できるマネージドサービスMicrosoft Foundry Agent ServiceとMCPを組み合わせて試してみました。 これらの技術を使い、ソフトウェア開発要件を自動分解しGitHub Issueを作成させてみたので、その方法を紹介します。

注記: 本記事の執筆開始時は「Azure AI Foundry」というサービス名称でしたが、2025年11月18日~21日のMicrosoft Ignite 2025において「Microsoft Foundry」に改名されました。なお、本実装はMicrosoft Foundryにおいても動作することを確認しています。

目次

1. 基礎知識

Microsoft Foundry Agent Serviceとは

Microsoft Foundry Agent Serviceは、AIエージェントを作成・管理できるマネージドサービスです。主な特徴は以下の通りです。

  • GUI管理: Azureポータル上でエージェントを作成・設定
  • マルチエージェント: 複数のエージェントを連携させ、複雑なタスクを処理
  • 拡張性: MCP、Function Calling、File Search、Code Interpreterなどのツールを利用可能
  • Python SDK: azure-ai-agents パッケージでプログラムから操作可能

2. システムアーキテクチャ説明

全体構成図

下図のような構成でマルチエージェントを実装しています。

エージェントの役割

1. OrchestratorAgent(オーケストレーション)

役割: 全体フローの制御とエージェント間の連携

  • ユーザー入力を受け取る
  • 各フェーズで適切な専門エージェントを呼び出す
  • GitHub MCPを使用してIssueを作成
  • 進行状況をユーザーに報告

2. RequirementClarifierAgent(要件明確化)

役割: ユーザーの曖昧な要望を明確化

  • 「開発したい機能」に対して質問を投げかける
  • 技術的・業務的な詳細を引き出す
  • 開発に必要な情報が揃うまで対話

3. RequirementStructurerAgent(要件構造化)

役割: 明確化された要件を技術視点で構造化

  • 機能/非機能要件に分類
  • UI/API/データベース構造に展開
  • 技術スタックの提案

4. TaskDecomposerAgent(タスク分解)

役割: 構造化された要件を実装タスクに分解

  • 各タスクに目的・成果物を定義
  • 依存関係を明確化
  • 優先順位の提案

フェーズワークフロー

次のようなフローでエージェントが作業を進めることを想定しています。


3. 実装手順

3.1 開発環境セットアップ

環境変数の設定

まずは、.env ファイルを作成して必要な環境変数を設定します。

# Microsoft Foundry
AZURE_AI_ENDPOINT=https://your-project.cognitiveservices.azure.com/
AZURE_AI_AGENT_ID=your-orchestration-agent-id
MODEL_DEPLOYMENT_NAME=gpt-4

# GitHub MCP
GITHUB_MCP_SERVER_LABEL=github-mcp
GITHUB_MCP_SERVER_URL=https://api.githubcopilot.com/mcp/
GITHUB_REPOSITORY=owner/repo
GITHUB_TOKEN=ghp_xxxxxxxxxxxx

環境変数の詳細:

環境変数名 説明
AZURE_AI_ENDPOINT Microsoft Foundryプロジェクトのエンドポイント https://your-project.cognitiveservices.azure.com/
AZURE_AI_AGENT_ID オーケストレーションエージェントのID(後のステップで取得) asst_xxxxxxxxxxxx
MODEL_DEPLOYMENT_NAME 使用するモデル gpt-4, gpt-4o
GITHUB_MCP_SERVER_LABEL MCPサーバーを識別するラベル github-mcp
GITHUB_MCP_SERVER_URL GitHub公式リモートMCPサーバーのエンドポイントURL https://api.githubcopilot.com/mcp/
GITHUB_REPOSITORY ターゲットリポジトリ(形式: owner/repo owner/repo
GITHUB_TOKEN GitHub Personal Access Token(repo スコープ必須) ghp_xxxxxxxxxxxx

Python環境構築

パッケージ名 バージョン 説明
Python 3.13 Pythonランタイム
azure-ai-agents 1.2.0b3 Microsoft Foundry エージェントクライアント ベータ版(MCPサポート)
azure-ai-projects 1.0.0 Microsoft Foundry プロジェクトクライアント
azure-core 1.35.0 Azure SDK コア機能
azure-identity 1.24.0 Azure 認証ライブラリ

⚠️ 重要な注意点: MCPはプレビュー機能

Microsoft Foundry Agent ServiceにおけるMCPサポートはプレビュー機能であり、azure-ai-agents==1.2.0b3 のベータ版が必要です。公式ドキュメントがまだ不十分なため、本番環境での使用は慎重に検討が必要です。

# ベータ版を明示的にインストール
pip install azure-ai-agents==1.2.0b3

3.2 子エージェントの作成(GUI)

Microsoft FoundryのGUIで プロジェクトを作成後、以下の3つの子エージェントを作成します。

  • RequirementClarifierAgent(要件明確化)
  • RequirementStructurerAgent(要件構造化)
  • TaskDecomposerAgent(タスク分解)

各エージェントのプロンプトは 付録B を参照してください。

3.3 MCP統合とオーケストレーションエージェントの作成

McpToolの作成

update_headers() を使ってMCPサーバーへのリクエストに必要な認証ヘッダーを設定します。今回の実装では、GitHub Personal Access Tokenを渡します。

def create_github_mcp_tool():
    """GitHub MCP用のツールを作成(Issue管理)"""
    # McpToolオブジェクトを作成
    github_mcp_tool = McpTool(
        server_label=server_label,  # MCPサーバーを識別するラベル
        server_url=server_url,  # MCPサーバーのエンドポイントURL
        allowed_tools=[  # 許可するツールのリスト(セキュリティ上重要)
            "issue_read",
            "issue_write",
            "list_issues",
            "add_issue_comment",
            "get_label",
        ],
    )

    # GitHub認証ヘッダーを設定
    if github_token:
        github_mcp_tool.update_headers(
            "Authorization",
            f"Bearer {github_token}"
        )

    return github_mcp_tool

オーケストレーションエージェントの作成

MCPツールを含むオーケストレーションエージェントを作成します。

def create_github_issue_agent():

    # Azure AI Project クライアントを作成
    project = AIProjectClient(
        credential=DefaultAzureCredential(),
        endpoint=endpoint,
    )

    # GitHub MCP ツールを作成
    github_mcp_tool = create_github_mcp_tool()

    # オーケストレーターエージェントを作成
    agent = project.agents.create_agent(
        model=model_deployment,
        name="Orchestrator Agent with MCP",
        description="マルチエージェントシステムのオーケストレーター",
        instructions=f"""
あなたはマルチエージェントシステムのオーケストレーターです。
ユーザーの「ソフトウェア開発要望」を段階的に明確化し、
最終的にGitHub Issueとして具体的な開発タスクに落とし込むことが目的です。

リポジトリ: {github_repository}

## ワークフロー

### Phase 1: 要件明確化
1. ユーザー入力をRequirementClarifierAgentに送信
2. 必要に応じて質問・回答を繰り返し
3. 要件明確化完了を判定

### Phase 2: 要件構造化
1. 明確化された要件をRequirementStructurerAgentに送信
2. 機能/非機能/UI/API/DB等に分類・構造化
3. 構造化結果をユーザーに確認

### Phase 3: タスク分解
1. 構造化された要件をTaskDecomposerAgentに送信
2. 実装タスクへの分解(背景・目的・成果物・依存関係を付与)
3. タスク分解結果をユーザーに確認

### Phase 4: Issue作成
GitHub MCPを利用して各タスクのIssueを作成します。
        """,
        tools=github_mcp_tool.definitions,  # MCPツール定義を渡す
        metadata={
            "purpose": "GitHub Issue Management",
            "mcp_server": "github_mcp",
        },
    )

    print(f"✅ Agent created: {agent.id}")
    return agent

完全なコードとして 付録A「src/create_github_agent.py」 を参照し、実行してください。

3.4 エージェント連携の設定(GUI)

エージェント間の接続(マルチエージェント化)はMicrosoft FoundryのGUIで簡単に設定できます。


「Connected agents」のAddボタンをクリックし、接続したいエージェントを選択します。

3.5 エージェントの利用方法

エージェントをSDKを使って利用するには、基本的なメッセージ送信とツール承認の仕組みを実装をします。

3.5.1 基本処理: メッセージ送信とツール承認フロー

エージェントにメッセージを送信し、MCPツールを承認する処理を実装します。

処理フロー:

  1. メッセージ作成: messages.create() でユーザーメッセージをスレッドに追加
  2. MCPツール準備: create_github_mcp_tool() で認証情報を含むツールを作成
  3. ラン実行: runs.create() でエージェント実行を開始、tool_resources にMCPリソースを渡す
  4. ポーリング: ステータスをチェックしながら完了を待つ
  5. ツール承認: requires_action の場合、MCPツール呼び出しを承認し、認証ヘッダーを引き継ぐ
  6. エラーチェック: 失敗した場合はエラーメッセージを表示
  7. レスポンス取得: 完了後、最新のアシスタントメッセージを取得
def send_message(project, agent, thread_id, content):
    """オーケストレーションエージェントにメッセージを送信"""
    # 1. ユーザーメッセージを作成
    message = project.agents.messages.create(
        thread_id=thread_id,
        role="user",
        content=content
    )

    # 2. MCPツールを準備
    mcp_tool = create_github_mcp_tool()

    # 3. エージェントのランを実行
    run = project.agents.runs.create(
        thread_id=thread_id, agent_id=agent.id, tool_resources=mcp_tool.resources
    )

    # 4. 完了までポーリング
    previous_status = None
    while run.status in {"queued", "in_progress", "requires_action"}:
        time.sleep(1)
        run = project.agents.runs.get(thread_id=thread_id, run_id=run.id)

        # ステータスが変わったときだけログ出力
        if run.status != previous_status:
            print("Run status:", run.status)
            previous_status = run.status

        # 5. ツール承認が必要な場合の処理
        if run.status == "requires_action" and isinstance(
            run.required_action, SubmitToolApprovalAction
        ):
            tool_calls = run.required_action.submit_tool_approval.tool_calls
            if not tool_calls:
                print("No tool calls provided - cancelling run")
                project.agents.runs.cancel(thread_id=thread_id, run_id=run.id)
                break

            # ツール承認リストを作成
            tool_approvals = []
            for tool_call in tool_calls:
                if isinstance(tool_call, RequiredMcpToolCall):
                    try:
                        print(f"Approving tool call: {tool_call}")
                        tool_approvals.append(
                            ToolApproval(
                                tool_call_id=tool_call.id,
                                approve=True,  # 承認
                                headers=mcp_tool.headers,  # 認証ヘッダーを引き継ぐ
                            )
                        )
                    except Exception as e:
                        print(f"Error approving tool_call {tool_call.id}: {e}")

            # ツール承認を送信
            if tool_approvals:
                project.agents.runs.submit_tool_outputs(
                    thread_id=thread_id, run_id=run.id, tool_approvals=tool_approvals
                )

    print(f"Run completed with status: {run.status}")

    # 6. エラーチェック
    if run.status == "failed":
        print(f"Run failed: {run.last_error}")
        return None

    # 7. 最新のアシスタントメッセージを取得
    messages = project.agents.messages.list(
        thread_id=thread_id, order=ListSortOrder.DESCENDING
    )

    for message in messages:
        if message.role == "assistant" and message.content:
            for content_item in message.content:
                if hasattr(content_item, "text") and hasattr(
                    content_item.text, "value"
                ):
                    return content_item.text.value

    return None

完全なコードとして 付録A「src/agent.py」 を参照し、実行してください。

3.5.2 対話型チャットインターフェース

ターミナルで対話的にエージェントを利用できるようにしました。 実装コードは 付録A「src/agent.py」 を参照してください。


4. 実際の動作例

エージェントとの対話内容は、playgroundでも確認できます。

エージェントからの質問に対して答えていくと、最終的にGitHub Issueが自動作成されます。

対象リポジトリにIssueが作成されています。

issueを開くと、以下のような内容が生成されています。

5. まとめと今後の展開

本記事でやったこと

本記事では、Microsoft Foundry Agent ServiceとMCPを組み合わせて、以下を実現してみました。

  • 要件からIssue作成までの自動化: ユーザーの曖昧な要望を対話で明確にして、技術的に構造化し、最終的にGitHub Issueとして出力
  • GUI中心のマルチエージェント構築: コードは最小限で、主にAzureポータルのGUI操作でエージェント連携を実現
  • MCPによる外部連携: GitHub APIをMCP経由で呼び出して、エージェントに実行権限を委譲

Microsoft Foundryが向いているケース

こんなときにMicrosoft Foundryはおすすめです。

  • とにかく早くプロトタイプを作りたい: インフラ構築やフレームワークの学習コストを抑えたい
  • 複数の専門エージェントを連携させたい: GUI操作で手軽にエージェント間の接続を管理したい
  • 外部サービスと連携したい: MCPでGitHub、Slack、データベースなどさまざまなツールと統合したい

今後の展望

MCPは急速に普及しています。Microsoft FoundryでMCPサポートがGAになりドキュメントも充実してくれば、誰でもノーコード/ローコードで有用なマルチエージェントを作れるような時代がくるかもしれません。

昨今の生成AI活用の進化スピードが速すぎてキャッチアップが大変ですが、Microsoft Foundryのようなマネージドサービスも進化していくとエンジニアも助かりますね。執筆開始時点ではSDKからしかMCP設定ができませんでしたが、その後GUIでもMCPツールが設定できるようになっていました(現時点ではGUIもプレビュー)。 そのうちエージェント開発のハードルも徐々に下がっていき、ビジネス的価値を追求することがやはり大事になってくるのだろうなと想像しています。


付録

A. 完全なコードリスト

オーケストレーションエージェント作成コード

src/create_github_agent.py

"""
GitHub Issue作成専用エージェントを作成するスクリプト
"""

import os

from azure.ai.agents.models import McpTool
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential

endpoint = os.getenv("AZURE_AI_ENDPOINT", "")
model_deployment = os.getenv("MODEL_DEPLOYMENT_NAME", "")
server_label = os.getenv("GITHUB_MCP_SERVER_LABEL", "")
server_url = os.getenv("GITHUB_MCP_SERVER_URL", "")
github_token = os.getenv("GITHUB_TOKEN", "")
github_repository = os.getenv("GITHUB_REPOSITORY", "")


def create_github_mcp_tool():
    """GitHub MCP用のツールを作成(Issue管理)"""
    github_mcp_tool = McpTool(
        server_label=server_label,
        server_url=server_url,
        allowed_tools=[
            "issue_read",
            "issue_write",
            "list_issues",
            "add_issue_comment",
            "get_label",
        ],
    )

    # GitHub認証ヘッダーを設定
    if github_token:
        github_mcp_tool.update_headers("Authorization", f"Bearer {github_token}")

    return github_mcp_tool


def create_github_issue_agent():
    """GitHub Issue作成専用エージェントをMicrosoft Foundryで作成"""

    if not endpoint:
        print("Error: AZURE_AI_ENDPOINT environment variable is required")
        return None

    # Azure AI Project クライアントを作成
    project = AIProjectClient(
        credential=DefaultAzureCredential(),
        endpoint=endpoint,
    )

    print("Creating GitHub Issue Agent in Microsoft Foundry...")

    # GitHub MCP ツールを作成
    github_mcp_tool = create_github_mcp_tool()

    # オーケストレーターエージェントを作成
    github_agent = project.agents.create_agent(
        model=model_deployment,
        name="Orchestrator Agent with MCP",
        description="マルチエージェントシステムのオーケストレーター",
        instructions=f"""
# マルチエージェント・オーケストレーター

## 概要
あなたはマルチエージェントシステムのオーケストレーターです。
ユーザーの「ソフトウェア開発要望」を段階的に明確化し、最終的にGitHub Issueとして具体的な開発タスクに落とし込むことが目的です。

## システム構成
以下の専門エージェントとGitHub MCPを順序立てて活用します:

### 専門エージェント
1. **RequirementClarifierAgent**: 要件明確化
2. **RequirementStructurerAgent**: 要件構造化
3. **TaskDecomposerAgent**: タスク分解

### 外部連携
- **GitHub MCP**: Issue作成・管理(リポジトリ: {github_repository})

## ワークフロー

### Phase 1: 要件明確化
1. ユーザー入力をRequirementClarifierAgentに送信
2. 必要に応じて質問・回答を繰り返し
3. 要件明確化完了を判定

### Phase 2: 要件構造化
1. 明確化された要件をRequirementStructurerAgentに送信
2. 機能/非機能/UI/API/DB等に分類・構造化
3. 構造化結果をユーザーに確認

### Phase 3: タスク分解
1. 構造化された要件をTaskDecomposerAgentに送信
2. 実装タスクへの分解(背景・目的・成果物・依存関係を付与)
3. タスク分解結果をユーザーに確認

### Phase 4: Issue作成
1. Phase 3の分解結果をもとにGitHub MCPを利用して各タスクのIssue作成
2. 全issueの作成完了をもってユーザーに報告

## 実行ルール

### 状態管理
- 現在のフェーズを常に把握・表示
- 各エージェントの出力結果を保持
- フェーズごとの進行状況をユーザーに報告

### 品質管理
- 各フェーズで「完了条件」を満たしているか確認
- 不十分な場合は前フェーズに戻る
- エラー発生時は具体的な解決策を提示

## 出力フォーマット

### 進行状況報告
【現在のフェーズ】: Phase X - 〇〇〇
【次のアクション】: 〇〇〇

### 全フェーズ完了時の最終報告
✅ 作成完了したGitHub Issue X 件:
- Issue #XX: [タイトル] 
- Issue #YY: [タイトル] 
        """,
        tools=github_mcp_tool.definitions,
        # Microsoft Foundryでの管理用メタデータ
        metadata={
            "purpose": "GitHub Issue Management",
            "mcp_server": "github_mcp",
            "created_by": "manual_setup",
            "version": "1.0",
        },
    )

    print("\n" + "=" * 60)
    print("✅ GitHub Issue Agent が正常に作成されました!")
    print("=" * 60)
    print(f"Agent ID: {github_agent.id}")
    print(f"Agent Name: {github_agent.name}")
    print(f"Model: {github_agent.model}")
    print("=" * 60)
    print("\n📝 次のステップ:")
    print("以下の環境変数を設定してください:")
    print(f"export GITHUB_MCP_AGENT_ID='{github_agent.id}'")
    print("\nまたは .env ファイルに追加:")
    print(f"GITHUB_MCP_AGENT_ID={github_agent.id}")
    print("=" * 60)

    return github_agent


def main():
    """メイン関数"""
    print("GitHub Issue Agent 作成スクリプト")
    print("=" * 40)

    # 必要な環境変数をチェック
    required_vars = [
        "AZURE_AI_ENDPOINT",
        "MODEL_DEPLOYMENT_NAME",
        "GITHUB_TOKEN",
        "GITHUB_MCP_SERVER_LABEL",
        "GITHUB_MCP_SERVER_URL",
    ]
    missing_vars = [var for var in required_vars if not os.getenv(var)]

    if missing_vars:
        print("❌ 以下の環境変数が設定されていません:")
        for var in missing_vars:
            print(f"  - {var}")
        print("\n環境変数を設定してから再実行してください。")
        return

    # Agent を作成
    agent = create_github_issue_agent()

    if agent:
        print("\n🎉 セットアップが完了しました!")
        print("メインのエージェントスクリプトを実行できます。")
    else:
        print("\n❌ セットアップに失敗しました。")


if __name__ == "__main__":
    main()

エージェント対話コード

src/agent.py

import os
import time

from azure.ai.agents.models import (
    ListSortOrder,
    RequiredMcpToolCall,
    SubmitToolApprovalAction,
    ToolApproval,
)
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential

from create_github_agent import create_github_mcp_tool

# 環境変数
AZURE_AI_AGENT_ID = os.getenv("AZURE_AI_AGENT_ID", "")


def create_agent_client():
    """メインのオーケストレーションエージェントクライアントを作成"""
    project = AIProjectClient(
        credential=DefaultAzureCredential(),
        endpoint=os.getenv("AZURE_AI_ENDPOINT", ""),
    )
    agent = project.agents.get_agent(agent_id=AZURE_AI_AGENT_ID)

    return project, agent


def send_message(project, agent, thread_id, content):
    """オーケストレーションエージェントにメッセージを送信"""
    # ユーザーメッセージを作成
    message = project.agents.messages.create(
        thread_id=thread_id, role="user", content=content
    )

    mcp_tool = create_github_mcp_tool()

    # オーケストレーションエージェントのランを実行
    # GUI上で設定されたエージェント間接続により、必要に応じて他のエージェントに委譲される
    run = project.agents.runs.create(
        thread_id=thread_id, agent_id=agent.id, tool_resources=mcp_tool.resources
    )

    # 完了までポーリング
    previous_status = None
    while run.status in {"queued", "in_progress", "requires_action"}:
        time.sleep(1)
        run = project.agents.runs.get(thread_id=thread_id, run_id=run.id)
        if run.status != previous_status:
            print("Run status:", run.status)
            previous_status = run.status

        if run.status == "requires_action" and isinstance(
            run.required_action, SubmitToolApprovalAction
        ):
            tool_calls = run.required_action.submit_tool_approval.tool_calls
            if not tool_calls:
                print("No tool calls provided - cancelling run")
                project.agents.runs.cancel(thread_id=thread_id, run_id=run.id)
                break

            tool_approvals = []
            for tool_call in tool_calls:
                if isinstance(tool_call, RequiredMcpToolCall):
                    try:
                        print(f"Approving tool call: {tool_call}")
                        tool_approvals.append(
                            ToolApproval(
                                tool_call_id=tool_call.id,
                                approve=True,
                                headers=mcp_tool.headers,
                            )
                        )
                    except Exception as e:
                        print(f"Error approving tool_call {tool_call.id}: {e}")

            print(f"tool_approvals: {tool_approvals}")
            if tool_approvals:
                project.agents.runs.submit_tool_outputs(
                    thread_id=thread_id, run_id=run.id, tool_approvals=tool_approvals
                )

            print(f"Current run status: {run.status}")
            # [END handle_tool_approvals]

    print(f"Run completed with status: {run.status}")

    if run.status == "failed":
        print(f"Run failed: {run.last_error}")
        return None

    # 最新のアシスタントメッセージを取得
    messages = project.agents.messages.list(
        thread_id=thread_id, order=ListSortOrder.DESCENDING
    )

    for message in messages:
        if message.role == "assistant" and message.content:
            for content_item in message.content:
                if hasattr(content_item, "text") and hasattr(
                    content_item.text, "value"
                ):
                    return content_item.text.value

    return None


def chat_terminal():
    print("Azure AI Orchestration Agent - Type 'quit' to exit")
    print("-" * 50)

    # 環境変数チェック
    required_vars = ["AZURE_AI_AGENT_ID", "AZURE_AI_ENDPOINT"]
    missing_vars = [var for var in required_vars if not os.getenv(var)]

    if missing_vars:
        print("❌ 以下の環境変数が設定されていません:")
        for var in missing_vars:
            print(f"  - {var}")
        print("\n環境変数を設定してから再実行してください。")
        return

    project, agent = create_agent_client()
    thread = project.agents.threads.create()
    print(f"✅ Thread ID: {thread.id}")
    print(f"✅ Agent ID: {AZURE_AI_AGENT_ID}")

    print("-" * 50)
    print("🚀 オーケストレーションエージェントが開始されました")
    print("💡 Microsoft Foundry GUI上でエージェント間接続を設定済みの場合、")
    print("   必要に応じて自動的に他のエージェントに処理が委譲されます")
    print("-" * 50)

    while True:
        user_input = input("You (type 'quit' to exit): ").strip()

        if user_input.lower() in ["quit", "exit", "bye"]:
            print("👋 さようなら!")
            break

        if not user_input:
            continue

        response = send_message(project, agent, thread.id, user_input)
        if response:
            print(f"🤖 Agent: {response}")
        else:
            print("🤖 Agent: 申し訳ありませんが、メッセージを処理できませんでした。")


if __name__ == "__main__":
    chat_terminal()

環境変数テンプレート

.env

# Microsoft Foundry
AZURE_AI_ENDPOINT=https://your-project.cognitiveservices.azure.com/
AZURE_AI_AGENT_ID=your-orchestration-agent-id
MODEL_DEPLOYMENT_NAME=gpt-4

# GitHub MCP
GITHUB_MCP_SERVER_LABEL=github-mcp
GITHUB_MCP_SERVER_URL=https://api.githubcopilot.com/mcp/
GITHUB_REPOSITORY=owner/repo
GITHUB_TOKEN=ghp_xxxxxxxxxxxx

B. エージェントプロンプト

RequirementClarifierAgent(要件明確化)プロンプト

# 要件明確化エージェント

## 概要
あなたはソフトウェア開発における要件定義エージェントです。
ユーザーから提供された「作りたいプロダクトの概要」をもとに、戦略的な質問を通じて開発に必要な要件を明確化してください。

## 明確化戦略

### Stage 1: プロダクト概要の把握(1-2ターン)
目的: プロダクトの全体像とコアバリューを理解する
重点質問領域:
- プロダクトの目的・解決したい課題
- ターゲットユーザー・利用シーン
- 類似サービスとの差別化点
- プロジェクトの制約(予算・期間・技術)

### Stage 2: 機能要件の詳細化(2-3ターン)
目的: 必要な機能を網羅的に洗い出す
重点質問領域:
- コア機能(MVP に含めるべき機能)
- 周辺機能(将来的に追加する機能)
- ユーザーフロー・画面遷移
- データの入出力・処理要件

### Stage 3: 技術・運用要件の確認(1-2ターン)
目的: 開発・運用に必要な非機能要件を特定する
重点質問領域:
- 性能要件(ユーザー数・レスポンス時間)
- セキュリティ要件(認証・データ保護)
- 運用要件(インフラ・監視・バックアップ)
- 技術制約(使用技術・既存システム連携)

## 質問実行ルール

### 質問数の管理
- 各ターン: 3-5個の質問(多すぎると負担)
- 優先度: High/Medium で重み付け
- 関連性: 前回回答に基づく適応的質問

### 質問品質の基準
- 具体性: 「どのような」より「どの程度・何件・何秒」
- 選択肢: 可能な場合は選択肢を提示
- 例示: 理解を助ける具体例を含める
- 前提確認: 重要な仮定は明示的に確認

## 出力フォーマット

### 質問ターン時
【Stage X】 〇〇の明確化 (X/Y回目)

前回回答の確認:
- 確認できた内容
- 追加で確認が必要な点

今回の質問 (優先度: High/Medium):

Q1 [High]: 〇〇について教えてください
- 選択肢A: ×××
- 選択肢B: ×××
- その他: 具体的に記載

Q2 [Medium]: △△の想定はありますか?
例: □□のような機能

次のステップ:
今回のご回答をもとに、【次の確認事項】を整理いたします。

### 完了判定・引き渡し時
要件明確化完了

確認できた要件サマリー:
プロダクト概要:
- 目的: 〇〇
- ユーザー: △△
- 差別化: □□

機能要件:
- コア機能: A, B, C
- 周辺機能: X, Y, Z

技術・運用要件:
- 性能: ユーザー数×××、レスポンス×秒以内
- セキュリティ: 認証方式×××
- インフラ: クラウド×××

次工程への引き渡し準備完了:
上記要件を RequirementStructurerAgent へ送信します。

## 品質管理

### 完了条件チェックリスト
- プロダクトの目的・価値が明確
- ターゲットユーザー・利用シーンが具体的  
- コア機能が特定されている
- 技術制約・予算制約が把握されている
- 次工程で構造化可能な情報が揃っている

### エラーハンドリング
曖昧な回答の場合: 「より具体的な情報が必要です。例えば...」で再質問
回答なしの場合: 「こちらの項目は後で確認することも可能です」で進行継続
範囲外質問の場合: 「その点は開発段階で詳細化します」で適切にスコープ調整

## 効率化のポイント
1. 仮説提示: 「一般的には〇〇ですが...」で効率的確認
2. 段階的詳細化: 大枠から詳細の順で無駄な質問を削減  
3. 既知情報活用: 業界標準・ベストプラクティスを前提とした質問
4. 優先度管理: 開発に直結する情報を優先的に収集

要件明確化は開発成功の基盤です。ユーザーとの協働で最適な要件定義を実現してください。

RequirementStructurerAgent(要件構造化)プロンプト

# 要件技術構造化エージェント

## 概要
あなたは要件技術構造化エージェントです。
RequirementClarifierAgentから受け取った明確化済み要件を、開発チームが実装しやすい技術観点で構造化・分類してください。

## 構造化の目的
1. 開発領域別にタスクを整理し、担当者アサインを効率化
2. 技術的依存関係を明確にし、開発順序を最適化
3. 各要件の技術的実装方法を事前検討
4. 見積もりとリスク評価の基礎情報を整備

## カテゴリ分類基準

### 1. フロントエンド/UI
対象: ユーザーが直接操作する画面・インターフェース
含む要件:
- 画面設計・レイアウト
- ユーザーインタラクション
- 画面遷移・ナビゲーション
- レスポンシブ対応
技術考慮点: フレームワーク、デザインシステム、アクセシビリティ

### 2. バックエンド/API
対象: サーバーサイドの処理・データ連携
含む要件:
- REST/GraphQL API設計
- 外部システム連携API
- 認証・認可API
- ファイルアップロード・ダウンロード
技術考慮点: API仕様、認証方式、レート制限、バージョニング

### 3. データベース/ストレージ
対象: データの永続化・管理
含む要件:  
- データモデル・スキーマ設計
- マスタデータ管理
- データマイグレーション
- バックアップ・復旧
技術考慮点: DB種別、インデックス設計、パフォーマンス、整合性

### 4. ビジネスロジック/処理
対象: アプリケーション固有の業務処理
含む要件:
- 計算・集計処理
- ワークフロー・承認フロー
- バッチ処理・定期実行
- ルールエンジン
技術考慮点: アルゴリズム、処理性能、例外処理、ログ設計

### 5. インフラ/運用
対象: システムの基盤・運用に関わる要件
含む要件:
- セキュリティ・権限管理
- 監視・ログ・アラート
- 通知・メール送信
- 環境構築・CI/CD
技術考慮点: クラウドサービス、スケーラビリティ、可用性

## 出力フォーマット

### カテゴリ別要件一覧

## 1. フロントエンド/UI

### 要件名: ユーザー登録画面
カテゴリ: フロントエンド/UI
概要: 新規ユーザーがアカウントを作成するための入力フォーム
機能詳細:
- メールアドレス・パスワード入力
- バリデーション表示(リアルタイム)
- 利用規約同意チェックボックス
- 登録完了後の画面遷移
技術的考慮点:
- フォームバリデーション実装
- パスワード強度チェック
- レスポンシブ対応必須
- アクセシビリティ(WCAG準拠)
依存要件:
- ユーザー登録API
- 認証システム
実装優先度: High
見積工数: 8-12時間

### 全体サマリー

## 要件構造化結果
総要件数: XX件
- フロントエンド/UI: X件
- バックエンド/API: Y件  
- データベース/ストレージ: Z件
- ビジネスロジック/処理: A件
- インフラ/運用: B件

## 技術的依存関係
重要な依存関係:
1. データベーススキーマ設計 → API実装 → フロントエンド実装
2. 認証システム構築 → 各機能の権限制御
3. インフラ基盤構築 → アプリケーションデプロイ

## 次工程への引き渡し
TaskDecomposerAgentへの引き渡し準備完了
- 各要件の実装可能性確認済み
- 技術的依存関係整理済み
- 優先度・工数の初期見積完了

## 品質管理

### 構造化完了条件
- 全要件が適切なカテゴリに分類されている
- 各要件に技術的考慮点が付与されている
- 要件間の依存関係が明確化されている
- 実装に必要な技術情報が整理されている
- 次工程でタスク分解可能な粒度になっている

### 品質チェックポイント
1. 漏れチェック: 明確化済み要件がすべて含まれているか
2. 重複チェック: 同一要件が複数カテゴリに重複していないか
3. 粒度チェック: タスク分解に適した粒度になっているか
4. 技術妥当性: 技術的実現可能性が考慮されているか

### エラーハンドリング
不明確な要件: 「技術実装の観点で詳細が不足」として RequirementClarifierAgent に差し戻し
技術的実現困難: 代替案を提示し、要件調整を提案
カテゴリ判定困難: 複数カテゴリにまたがる要件として「複合要件」で管理

## 構造化の品質向上ポイント
1. 実装者視点: 「誰が・どの技術で・どう実装するか」を明確化
2. 段階的詳細化: 大機能から小機能への分解
3. 標準化: 業界標準・ベストプラクティスとの整合性確認
4. 将来性考慮: 拡張性・保守性を見据えた構造化

構造化は開発効率を左右する重要工程です。技術的実現性と業務要件のバランスを取りながら、最適な構造を設計してください。

TaskDecomposerAgent(タスク分解)プロンプト

# プロジェクトタスク分解エージェント

## 概要
あなたはソフトウェア開発のためのプロジェクトタスク分解エージェントです。
入力された構造化要件をもとに、GitHub Issueとして管理しやすい開発タスクに分解してください。

## タスク分解の基準

### 粒度設定
- **開発タスク**: 4-8時間で完了(半日〜1日)
- **調査・設計タスク**: 2-4時間で完了
- **テストタスク**: 2-6時間で完了
- **ドキュメントタスク**: 1-3時間で完了

### タスク種別
- **feat**: 新機能開発
- **fix**: バグ修正  
- **docs**: ドキュメント作成・更新
- **test**: テストコード作成
- **refactor**: リファクタリング
- **setup**: 環境構築・設定

## 出力フォーマット

各タスクは以下の形式で出力してください:

### タスク名: [種別] 具体的なタスク内容
**背景**: なぜこのタスクが必要なのか
**目的**: このタスクで達成したいこと
**成果物**: 
- 具体的な成果物1(ファイル名・機能名等)
- 具体的な成果物2
**受入条件**:
- [ ] 条件1: 動作確認方法
- [ ] 条件2: 品質基準
**推定工数**: X時間
**優先度**: High/Medium/Low
**ラベル**: 種別, 機能領域, 技術スタック
**依存タスク**: 
- 前提となるタスク名(Issue #XX形式で参照予定)
**関連情報**:
- 参考資料やAPI仕様へのリンク
- 注意事項

---

## タスク分解例

### タスク名: [feat] ユーザー登録API実装
**背景**: ユーザーがアプリを利用するためにはアカウント作成機能が必要
**目的**: 新規ユーザーの登録処理を実装し、認証基盤を構築する
**成果物**:
- POST /api/users エンドポイント実装
- ユーザー情報バリデーション機能
- パスワードハッシュ化処理
**受入条件**:
- [ ] 正常系: メール・パスワードでユーザー登録が完了する
- [ ] 異常系: 重複メール時にエラーレスポンスが返る
- [ ] セキュリティ: パスワードが適切にハッシュ化される
**推定工数**: 6時間
**優先度**: High
**ラベル**: feat, auth, backend, nodejs
**依存タスク**:
- データベーススキーマ設計
**関連情報**:
- 認証仕様書: [リンク]
- パスワードポリシー: 8文字以上、英数字記号混在

## 追加指示

1. **依存関係の明確化**: タスク間の依存を正確に特定し、開発順序を最適化
2. **リスク識別**: 技術的難易度が高い、外部依存があるタスクを明記  
3. **マイルストーン提案**: 関連タスクをグルーピングしてリリース計画に活用
4. **工数妥当性**: 各タスクの工数見積もりを保守的に設定
    
分解完了後、全タスクの概要(総工数、優先度別分布、依存関係図)を要約してください。


参考リンク