Azure AI Foundry Agent ServiceでMCP toolを利用するエージェントを作成する

先日、Azure AI Foundry Agent ServiceでModel Context Protocol (MCP)をtoolとしての利用がサポートされたので、試してみました。

今回は、Python SDKを使い、MCP toolを利用するエージェントの実装方法を記載します。

環境変数の設定

次の環境変数を設定します。

※ 値は適切なものに書き換えてください。

PROJECT_ENDPOINT="https://<resource_name>/api/projects/<project_name>"
MODEL_DEPLOYMENT_NAME="<model_deployment_name>" 
MCP_SERVER_URL="<mcp_url>"
MCP_SERVER_LABEL="<mcp_server_label>"

実装

次のコードでMCP toolを利用するエージェントを作成し、実行することができます。

※ MCP serverはMicrosoft Learn Docs MCP Server(GitHub - MicrosoftDocs/mcp)を利用します。

コード

import os, time, json
from dotenv import load_dotenv
from azure.identity import DefaultAzureCredential
from azure.ai.projects import AIProjectClient
from azure.ai.agents.models import McpTool, MessageTextContent, ListSortOrder, RequiredMcpToolCall, SubmitToolApprovalAction, ToolApproval

# ─── 環境変数読み込み ───────────────────────────────
#load_dotenv() #.envなどに環境変数を設定している場合に利用
PROJECT_ENDPOINT   = os.environ["PROJECT_ENDPOINT"].rstrip("/")
MODEL_DEPLOYMENT   = os.getenv("MODEL_DEPLOYMENT_NAME", "gpt-4o-mini")
MCP_SERVER_URL     = os.environ["MCP_SERVER_URL", "https://learn.microsoft.com/api/mcp"]
MCP_SERVER_LABEL   = os.getenv("MCP_SERVER_LABEL", "Microsoft_Docs_MCP_Server")  # 英数+ _ のみ  (^[a-zA-Z0-9_]+$)
#MCP_API_KEY        = os.getenv("MCP_API_KEY") # keyなどを利用する場合

# ─── クライアント生成 ───────────────────────────────
credential = DefaultAzureCredential()
project_client = AIProjectClient(
    endpoint=PROJECT_ENDPOINT, 
    credential=credential, 
    )

mcp_tool = McpTool(
    server_label=MCP_SERVER_LABEL,
    server_url=MCP_SERVER_URL,
    allowed_tools=[],  # Optional: specify allowed tools
)


with project_client:
    # エージェント作成 (MCP ツール付き) ------------------------------
    agents_client = project_client.agents
    
    #agent = project_client.agents.create_agent
    agent = agents_client.create_agent(
        model=MODEL_DEPLOYMENT,
        name="ms-docs-mcp-agent",
        instructions=(
            "You are a helpful assistant. Always use the tools provided to answer the user's questions. Be sure to cite your sources."
        ),
        tools=mcp_tool.definitions,
        #tool_resources=None,
    )
    print("Created agent →", agent.id)

    # スレッド生成 ---------------------------------------------------
    thread = project_client.agents.threads.create()
    print(f"Created thread, ID: {thread.id}")

    # ユーザーメッセージ追加 ---------------------------------------
    question = "Azure AI Foundryの最新のアップデート情報を教えてください。"
    message = agents_client.messages.create(
        thread_id=thread.id,
        role="user",
        content=question,
    )
    print(f"Created message, ID: {message.id}")


    # Handle tool approvals
    #mcp_tool.update_headers("SuperSecret", "123456")
    mcp_tool.set_approval_mode("never")  # Uncomment to disable approval requirements
    run = agents_client.runs.create(thread_id=thread.id, agent_id=agent.id, tool_resources=mcp_tool.resources)
    print(f"Created run, ID: {run.id}")


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

    if run.status == "failed":
        raise RuntimeError(f"Run failed: {run.last_error}")

    # メッセージ取得 -------------------------------------------------
    msgs = project_client.agents.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
    for m in msgs:
        last = m.content[-1]
        if isinstance(last, MessageTextContent):
            print(f"{m.role}: {last.text.value}")


    # クリーンアップ (任意) ----------------------------------------
    project_client.agents.delete_agent(agent.id)
    print("Deleted agent →", agent.id)

実行結果

Created agent → asst_QzDGzrejbw4Tc9ZBQNn9MjMd
Created thread, ID: thread_clfCFNSdKKmxWaqmZ3ffrEzT
Created message, ID: msg_bg0nR3GqqZWsDZO83A4oouGx
Created run, ID: run_Q2FuvQye4ctkfQaLpvZ3oLGj
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.IN_PROGRESS
Run status: RunStatus.COMPLETED
MessageRole.USER: Azure AI Foundryの最新のアップデート情報を教えてください。
MessageRole.AGENT: Azure AI Foundryの最新のアップデート情報をまとめると、以下のようになります。

### 2025年6月の主なアップデート
- **Azure OpenAIモデルの新リリース**として、「codex-mini」や「o3-pro」が追加されました。詳細は[こちら](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/how-to/reasoning)。
- **Sora動画生成モデルのプレビューリリース**があり、テキスト指示からリアルな動画シーンを生成可能です。詳しくは[クイックスタート](https://learn.microsoft.com/en-us/azure/ai-services/openai/video-generation-quickstart)へ。
- **Prompt shieldsのスポットライティング**による誘導保護強化が行われています。
- **モデルルーター(プレビュー)**により、最適なチャットモデルを自動選択する機能が追加されました。詳細は[こちら](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/concepts/model-router)。

### 2024年8月のアップデート
- **GPT-4oモデルの新バージョン(2024-08-06)**が公開され、多彩な構造化出力サポートや最大トークン数が引き上げられました。
- **Azure AI Foundry Agent Service**が一般公開され、多機能なエージェント開発・管理ツールが整備されました。
- **モデル評価ガイド**や**Azureリソースの診断・監視**のサポートが充実しています。

### 2025年4月のリリース
- **リアルタイムAPIのWebRTC対応**により、音声ストリーミングや低遅延のインタラクションが可能に。
- **GPT-image-1(画像生成モデル)**がプレビューリリース。
- **新規リリースの reasoning models(o4-mini, o3)**と、**GPT-4.1シリーズ**、および音声モデル群も登場しています。

### 2022年12月のアップデート
- 最新のOpenAIモデルへのアクセスと、APIのバージョンアップ。
- 高速デプロイやトレーニング制限の引き上げ、顧客管理キー(CMK)によるデータ暗号化など、多くの新機能と改善が含まれています。

これらの情報の詳細は各リンクから確認できます。特に最新のモデルやツールに関する詳細な情報は、次の公式ページがお勧めです:
[Azure AI Foundryの最新情報ページ](https://learn.microsoft.com/en-us/azure/ai-foundry/openai/whats-new)

ご質問があればどうぞ!
Deleted agent → asst_QzDGzrejbw4Tc9ZBQNn9MjMd

Azure AI Foundryで実行したスレッドを確認すると、回答までの流れを確認可能です。ToolでMCPが利用されていることが確認できます。

Azure AI Foundry

既存のエージェントを利用するコード

次のコードでは、上記で作成したエージェントを既存のエージェントして呼び出し実行します。

※ 既存のエージェントを利用する場合でも、McpTool を使用し tool_resources を project_client.agents.runs.create に渡すことでツール呼び出しを行います。

import os
import time
from dotenv import load_dotenv

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

# ─── 環境変数読み込み ─────────────────────────────────────────
load_dotenv()
PROJECT_ENDPOINT = os.environ["PROJECT_ENDPOINT"].rstrip("/")
MODEL_DEPLOYMENT = os.getenv("MODEL_DEPLOYMENT_NAME", "gpt-4o-mini")
MCP_SERVER_LABEL = os.getenv("MCP_SERVER_LABEL", "Microsoft_Docs_MCP_Server")  # 英数+_ のみ

# ─── クライアント生成 ───────────────────────────────────────
credential = DefaultAzureCredential()
project_client = AIProjectClient(endpoint=PROJECT_ENDPOINT, credential=credential)

# ─── MCP ツール定義 ─────────────────────────────────────────
mcp_tool = McpTool(
    server_label=MCP_SERVER_LABEL,
    server_url="https://learn.microsoft.com/api/mcp",  # 変更する場合は .env 側で指定
    allowed_tools=[],  # 必要に応じて制限
)

# -----------------------------------------------------------------------------
# メイン処理
# -----------------------------------------------------------------------------
with project_client:
    # 既存エージェントの取得 (無ければ新規作成) --------------------------
    EXISTING_AGENT_ID = os.getenv("AGENT_ID")
    try:
        agent = project_client.agents.get_agent(agent_id=EXISTING_AGENT_ID)
        print("Use existing agent →", agent.id)
    except Exception:
        agent = project_client.agents.create_agent(
            model=MODEL_DEPLOYMENT,
            name="ms-docs-mcp-agent",
            instructions=(
                "You are a helpful assistant. Always use the tools provided to answer the user's "
                "questions. Be sure to cite your sources."
            ),
            tools=mcp_tool.definitions,
        )
        print("Created agent →", agent.id)

    # スレッド取得 (無ければ新規作成) --------------------------------------
    EXISTING_THREAD_ID = os.getenv("THREAD_ID")
    thread = None
    if EXISTING_THREAD_ID:
        try:
            thread = project_client.agents.threads.get(thread_id=EXISTING_THREAD_ID)
            print("Use existing thread →", thread.id)
        except Exception as e:
            print("Cannot get thread:", e)

    if not thread:
        thread = project_client.agents.threads.create()
        print("Created thread →", thread.id)

    # ユーザーメッセージ追加 ---------------------------------------------
    question = "Azure AI Foundryの最新のアップデート情報を教えてください。"
    message = project_client.agents.messages.create(
        thread_id=thread.id,
        role="user",
        content=question,
    )
    print("Created message →", message.id)

    # Run 作成 ----------------------------------------------------------
    mcp_tool.set_approval_mode("never")  # 承認フローを無効化 (必要なら変更)
    run = project_client.agents.runs.create(
        thread_id=thread.id,
        agent_id=agent.id,
        tool_resources=mcp_tool.resources,
    )
    print("Created run →", run.id)

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

    if run.status == "failed":
        raise RuntimeError(f"Run failed: {run.last_error}")

    # 出力を表示 ---------------------------------------------------------
    msgs = project_client.agents.messages.list(thread_id=thread.id, order=ListSortOrder.ASCENDING)
    for m in msgs:
        last = m.content[-1]
        if isinstance(last, MessageTextContent):
            print(f"{m.role}: {last.text.value}")

    # (任意) クリーンアップ ---------------------------------------------
    # project_client.agents.delete_agent(agent.id)
    # print("Deleted agent →", agent.id)

終わりに

今回は、Azure AI Foundry Agent ServiceでMCP toolを利用する方法を記載しました。

MCPのツールを利用できるようになったので、エージェントの機能拡張を容易に行うことができるようになりました。

7月の一週目にもMCP toolを試したのですが、それからもアップデートにより短期間で内容が変わっているようでした。実際に試す際には、最新情報も併せてご確認いただければと思います。

執筆担当者プロフィール
寺澤 駿

寺澤 駿(日本ビジネスシステムズ株式会社)

IoTやAzure Cognitive ServicesのAIを活用したデモ環境・ソリューション作成を担当。

担当記事一覧