はじめに
2026年4月2日、Microsoft Agent Framework v1.0.0がGA(一般提供)されました。これはバージョンを重ねる毎に強化されたSemantic Kernelからエージェント機能を特化させた生まれた新しいエージェントフレームワークです。
本記事では、Agent Frameworkの概要を押さえつつ、気になっていた注目機能の一つであるHosted Agents(Foundry Agent Service上にエージェントをデプロイするマネージドサービス)を実際に試してみて、その特徴を理解したいと思います。さらに応用としてFoundry IQ(ナレッジベース)をエージェントのツールとして利用する方法も紹介します。
Agent Frameworkについては以下の記事もとてもわかりやすく参考になります。
また、チュートリアルもエージェントの構築から各機能の利用方法まで順序だって確認することが可能です。
本記事のコードは C# で記載します。Pythonでの実装が必要な場合は随時補足します。
1. なぜ Agent Framework が生まれたのか
Microsoft には元々2つのAIエージェントフレームワークがありました。両者の長所を統合し、一つのSDKで全てのエージェントパターンを構築できるようにしたのがMicrosoft Agent Frameworkの特徴と言えます。特にSemantic Kernelは様々なエンハンスの中で実用レベルの仕組みが組み込また優れたフレームワークです。半面複雑化している面もありエージェント機能に特化した切り出されたと言えるかもしれないです。
| フレームワーク | 特徴 |
|---|---|
| Semantic Kernel | LLM(大規模言語モデル)をアプリケーションに組み込むためのSDKです。 プロンプトや関数(スキル)を統合的に管理し、AIによる推論と既存コードを組み合わせてタスクを実行可能。 |
| AutoGen | 複数のAIエージェント同士が会話・協調しながらタスクを解決するためのフレームワーク。 開発者はエージェントの役割やツールを定義することで、複雑な処理(コード生成・実行や意思決定など)を自動化できる。 |
2. コアコンセプト
Agent Frameworkは大きく2つのカテゴリからこうせいされており、それぞれで様々なエージェントを活用が可能な機能が盛り込まれています。
Agent(エージェント)
LLMとツールを持つ自律的な処理単位です。入力に対してLLMで処理を行い、必要に応じてMCPサーバやToolsを活用して目的の動作を行うエージェントを構築する仕組みです。
Agent Frameworkで開発する際にはAIAgentという基底クラスをベースに共通化された様々はエージェントの構築が可能です。
エージェントの核となるLLMについてはモデル接続としてFoundry / OpenAI / Ollama 等様々なものを活用可能です。
Tools
エージェント機能を拡張するさまざまな種類のツールがサポートされています。例えば、関数呼び出し、ユーザ承認、コードインタプリター、MCPサーバど様々なものを活用できます。
メモリ
エージェントを活用するにあたっては単発の応答では不十分な場合が多いです。実際に活用する際には様々な指示ややりとりを通して必要なタスクを実現します。Agent Frameworkでは会話をセッション単位で継続したり永続化することでこれを実現することが可能です。
ミドルウェア
Claude Code等で言ういわゆるHookに相当する機能ですね。エージェントの会話をインターセプトしてログ出力や、通知といったエージェントとのやり取りからすると関係ない部分での機能を実装するのに最適です。
Workflow(ワークフロー)
ワークフローは文字通りですが、エージェントを含めた一連の処理の流れを定義することができる仕組みです。単純にエージェントを処理でつなぐというだけでななく、ユーザの確認や、チェックポイントによる動作状況の確認等、一連のタスクに対する様々な処理フローを構築することが可能になります。
特にマルチエージェントというキーワードでは以下のようなオーケストレーションパターンの活用も考慮に入っています。
| パターン | 説明 | ユースケース |
|---|---|---|
| Sequential | エージェントを順番に実行 | パイプライン処理 |
| Concurrent | エージェントを並行実行 | 独立サブタスクの並列処理 |
| Handoff | 条件でエージェント間引き渡し | カスタマーサポート |
| GroupChat | 対話形式で協調 | ブレインストーミング |
ここではまずは、環境を整えて、簡単なエージェントやワークフローを動かしてみます。加えてプレビュー版で提供されているHosted Agent、Foundry IQの実験もやってみたいと思います。
3. 開発環境
前提条件
- .NET 8.0+
- Azure CLIが利用可能であること
- Microsoft Foundry プロジェクト(Hosted Agents / Foundry IQを使う場合)
- Docker Desktop(コンテナ化する場合。azdのリモートビルドを使えば不要)
今回は、Hosted Agentも試したかったのでMicrosoft Foundryの環境を構築しています。その関係でFoundryにデプロイしたLLMを使用しています。エージェントやワークフロー試す場合は、他のProviderを活用することも可能です。要件によってはFoundry Local等もかつできるので特にFoundryが必要な機能を試すのではない場合は不要です。
パッケージインストール
# プロジェクト作成
dotnet new console -o MyAgent
cd MyAgent
# Agent Framework本体(Foundry接続含む)
dotnet add package Microsoft.Agents.AI.Foundry
# Foundryプロジェクト接続(AIProjectClient)
dotnet add package Azure.AI.Projects
# 認証
dotnet add package Azure.Identity
# Hosted Agents用(サーバーラッパー)※プレビュー
dotnet add package Azure.AI.AgentServer.AgentFramework --prerelease
Pythonの場合: pip install agent-framework azure-ai-projects azure-identity でインストールします。
4. Getting Started
まずは Agent Frameworkで簡単にエージェントやワークフローを構築できるところを確認してみましょう。環境さえ整えれば簡単に構築することが可能です。またVisual Studio Codeで開発する時はAI Toolkitを使用すると様々な補助機能を活用して開発を進めることが可能なのでおすすめです。
Hello Agent
まずはシンプルなチャットエージェントを構築してみましょう。このサンプルではFoundry上にデプロイしたgpt-5-miniにプロンプトを与えて応答するだけのエージェントの実装です。
ポイントはAIAgentクラスです。Agent Frameworkではこのクラスがベースとなり、様々なエージェントを構築可能です。今回は、Foundry上にデプロイしたモデルを利用する為、AIProjectClientクラスからエージェントを構築しています。これがFoundryにデプロイ済みのエージェントである場合はFoundryAgentクラスを利用します。
using Azure.AI.Projects; // AIProjectClient
using Azure.Identity; // DefaultAzureCredential
using Microsoft.Agents.AI; // AIAgent
//Microsoft Foundryを使う前提のエンドポイント
var endpoint = "https://<your-resource>.services.ai.azure.com/api/projects/<project>";
// Foundryプロジェクトへの接続
AIAgent agent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(
model: "gpt-5-mini",
instructions: "あなたはMicrosoft Agent Frameworkの技術解説アシスタントです。Agent Frameworkの機能や使い方について日本語で簡潔に回答してください。",
name: "AgentFrameworkHelper"
);
// 実行
Console.WriteLine(await agent.RunAsync("Agent Frameworkのワークフローパターンにはどんな種類がありますか?"));
ストリーミングで応答を受け取りたい場合:
await foreach (var chunk in agent.RunStreamingAsync("Hosted Agentsの仕組みを簡単に教えて"))
{
Console.Write(chunk);
}
ツールを追加する
ツールは関数、コードインタプリタ、MCP等様々なものが扱えます。ここでは単純な関数を呼び出す例を紹介します。これはC#のメソッドを AIFunctionFactory.Create() でラップするだけでエージェントのツールになります。[Description] 属性でLLMへのヒントを記述できます。
using System.ComponentModel;
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
[Description("指定された場所の天気を取得します。")]
static string GetWeather(
[Description("天気を取得する場所")] string location)
=> $"{location}の天気: 晴れ、気温20℃";
[Description("現在の日時を取得します。")]
static string GetCurrentTime()
=> DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
var endpoint = "https://<your-resource>.services.ai.azure.com/api/projects/<project>";
AIAgent agent = new AIProjectClient(new Uri(endpoint), new DefaultAzureCredential())
.AsAIAgent(
model: "gpt-5-mini",
instructions: "天気と時間について質問されたらツールを使って回答してください。",
name: "WeatherAgent",
tools: [
AIFunctionFactory.Create(GetWeather),
AIFunctionFactory.Create(GetCurrentTime)
]
);
Console.WriteLine(await agent.RunAsync("東京の天気と今の時間を教えて"));
Pythonの場合: @tool デコレータで関数をツールとして定義します。
@tool
def get_weather(location: str) -> str:
"""指定された場所の天気を取得します。"""
return f"{location}の天気: 晴れ、気温20℃"
マルチエージェントワークフロー
複数のエージェントを連携させるワークフローを構築できます。ここでは「技術ブログの下書きを作成し、レビューで改善する」という具体的なシナリオで試してみます。
この例では、Writer が下書きを作成し、その出力が自動的に Reviewer に渡されます。レビュアーが改善した完成版が最終出力になります。Sequentialパターンなので、ライター→レビュアーの順序が保証されます。
Workflowは作成したエージェント同時をさまざまな形でフローとして登録することが可能です。
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Agents.AI.Workflows;
var client = new AIProjectClient(
new Uri("https://<your-resource>.services.ai.azure.com/api/projects/<project>"),
new DefaultAzureCredential());
// ライターエージェント: 技術ブログの下書きを作成
var writer = client.AsAIAgent(
model: "gpt-5-mini",
name: "TechWriter",
instructions: """
あなたはブログのライターです。
与えられたトピックについて、以下の構成で800字程度の技術ブログ記事の下書きを作成してください。
- 導入(なぜこの技術が重要か)
- 主要な特徴(3つ程度)
- まとめ
対象読者はエンジニア初心者〜中級者です。
""");
// レビュアーエージェント: 下書きをレビューして改善版を出力
var reviewer = client.AsAIAgent(
model: "gpt-5-mini",
name: "TechReviewer",
instructions: """
あなたはブログの編集者です。
前のエージェントが作成した下書きをレビューし、以下の観点で改善してください。
- 技術的な正確性
- 読みやすさ(段落の長さ、接続詞の使い方)
- 具体例等理解度を深めるための追加提案
改善後の完成版を出力してください。
""");
// Sequential: writer → reviewer の順に実行
var workflow = new WorkflowBuilder(writer)
.AddEdge(writer, reviewer)
.Build();
// ワークフロー実行
var result = await InProcessExecution.RunAsync(
workflow,
"Microsoft Agent Frameworkについて");
Console.WriteLine(result);
5. Hosted Agents(プレビュー)
Agent Frameworkでエージェントを構築し、実際に活用する場合、エージェントをどう管理するかがポイントに鳴ります。Agent Frameworkであればプログラムという形で提供することは可能ですが、企業活用の場面では想定しない利用をされたり、アプリのバグに対応する際の配布など様々な問題が発生します。その解決策の1つになりえるのがHosted Agentと言えるかもしれません。
現時点ではまだプレビュー版の段階のため、機能変更が入る可能性があります。本番環境ではまだ活用できないと思います。
Hosted Agents とは
Hosted Agentsは、Agent Frameworkで開発したエージェントをMicrosoft Foundry Agent Service上にコンテナとしてデプロイできるマネージドサービスです(現在プレビュー)。
Agent Frameworkで構築したエージェントをコンテナ化し、Foundry上のエージェントとして動作させる仕組みです。
なぜ Hosted Agents にするのか
Agent Frameworkで開発したエージェントは、ローカルやVM上でも動かせます。しかしHosted Agents(Foundry Agent Service上にデプロイ)にすることで、Foundryの管理下に入ることで様々な効果を得ることが可能です。
| カテゴリ | 自前ホスティング | Hosted Agents(Foundry管理下) |
|---|---|---|
| インフラ管理 | 自分で資産を運用 | マネージドインフラ、オートスケーリング |
| 認証・セキュリティ | 自前実装 | Entra ID / Managed Identity統合 |
| 可観測性 | 独自にログ・メトリクス構築 | Application Insights統合、エンドツーエンドトレーシング |
| バージョン管理 | 独自運用 | Foundryがバージョン管理、ロールバック対応 |
| 評価・品質管理 | 独自実装 | Foundry Evaluationsによる品質評価、継続監視 |
| Control Plane | なし | セキュリティポリシー、コンプライアンス、Fleet Operations |
つまり、Hosted Agentsにすることでエージェントの開発に集中でき、運用・セキュリティ・監視はFoundryに任せられます。特にエンタープライズ環境では、Control Planeによるガバナンス統合が大きな価値を持ちます。
Hosting Adapter
Hosted Agentはエージェントをコンテナ化します。これを実現するためにコンテナ上ではエージェントとの通信手段を用意しなければなりません。Hosting Adapterは、エージェントフレームワークのコードをHTTPサービスとして公開する抽象化レイヤーです。
using Azure.AI.AgentServer.AgentFramework;
// エージェントをHTTPサーバーとしてラップ
var app = AgentServerBuilder.FromAgentFramework(agent).Build();
app.Run(); // localhost:8088 で起動
これだけで、エージェントがOpenAI Responses API互換のREST APIとして動作します。以下は実際にデプロイする手順になります。
Hosted Agentを利用すためにはMicrosoft Foundryに加えてコンテナ管理のためのContainer Registory等いくつかのAzureサービスを用意する必要があります。また、それらを連携するために設定も必要になります。
ですが、既存のFoundryの環境にHosted Agentを使えるようにするのは難しいようです(デプロイ後にうまく動作しないなど予期しない問題が発生しやすかったです)。プレビュー版の機能でもあるので既存の運用環境には影響が出さないためにも、実際にデプロイして試したい場合は新規にFoundryの環境を構築することをお勧めします。
なお、デバッグ用にローカルで検証することも可能です。
6. Hosted Agents — ハンズオン
Step 1: Azure Developer CLI でプロジェクト初期化・プロビジョニング
まず azd でHosted Agentのプロジェクトを作成し、Azureリソースをプロビジョニングします。
# Azure Developer CLI拡張をインストール
azd ext install azure.ai.agents
# プロジェクトフォルダを作成
mkdir MyHostedAgent && cd MyHostedAgent
# Hosted Agentプロジェクトの初期化(対話形式)
azd ai agent init
対話画面でテンプレート(Agent with Hosted MCP等)、サブスクリプション、リージョンを選択します。C#のテンプレートが生成され、以下の構成ができます。
MyHostedAgent/
├── azure.yaml # azd設定(コンテナサイズ、モデルデプロイ等)
├── agent.yaml # エージェント定義
├── infra/ # Bicepテンプレート(Foundryリソース一式)
└── src/
└── AgentWithHostedMCP/
├── Program.cs # ← ここにエージェントコードを実装
├── Dockerfile
└── *.csproj
続いてAzureリソースをプロビジョニングします。Foundryプロジェクト、ACR、Application Insights、Capability Hostが一括作成されます。
# Azureリソースのプロビジョニング(数分かかります)
azd provision
Step 2: エージェントコードの実装
テンプレートの src/AgentWithHostedMCP/Program.cs を、前のセクションで紹介したエージェントコードに書き換えます。
Hosted Agent化のポイントは、最後の行を await agent.RunAIAgentAsync() にすることです。これがHosting Adapterとして機能し、エージェントをHTTPサーバー(localhost:8088)として起動します。
// Program.cs
using System.ComponentModel;
using Azure.AI.AgentServer.AgentFramework.Extensions;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT")
?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set.");
var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini";
[Description("指定された場所の天気を取得します。")]
static string GetWeather(
[Description("天気を取得する場所")] string location)
=> $"{location}の天気: 晴れ、気温20℃";
[Description("指定されたタイムゾーンの現在日時を取得します。")]
static string GetLocalDateTime(
[Description("IANAタイムゾーン名")] string ianaTimezone)
=> TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.UtcNow, ianaTimezone)
.ToString("yyyy-MM-dd HH:mm:ss");
// エージェント作成
AIAgent agent = new AzureOpenAIClient(
new Uri(endpoint),
new DefaultAzureCredential())
.GetResponsesClient(deploymentName)
.AsAIAgent(
name: "WeatherTimeAgent",
instructions: "天気と時間について日本語で回答するアシスタントです。ツールを活用してください。",
tools: [
AIFunctionFactory.Create(GetWeather),
AIFunctionFactory.Create(GetLocalDateTime)
]);
// Hosted Agentとして起動(Hosting Adapter)
await agent.RunAIAgentAsync();
RunAIAgentAsync() について
この1行がHosting Adapterの役割を果たし、エージェントをOpenAI Responses API互換のHTTPサーバーとして公開します。ローカル実行時は localhost:8088 で起動し、Foundryにデプロイ後はFoundry Agent Serviceがこのエンドポイントにルーティングします。
Step 3: ローカルテスト
デプロイ前にローカルで動作確認します。
# ローカル起動
azd ai agent run
サーバーが http://localhost:8088 で起動します。別のターミナルからcurlでテスト:
curl -X POST http://localhost:8088/responses \
-H "Content-Type: application/json" \
-d '{
"input": "What time is it in Tokyo?",
"model": "gpt-4o-mini"
}'
Step 4: Foundryへデプロイ
Hosted Agentの呼び出しについて
Foundry上にデプロイされたHosted Agentは、Foundry Responses API(/openai/v1/responses)経由で呼び出します。agent_reference でエージェント名を指定することで、Foundry Agent Serviceが適切なコンテナにルーティングします。
現時点(プレビュー)では、Foundryポータルのplaygroundからの実行に互換性の問題がある場合があります。その場合は上記のようにcurlやHTTPクライアントからResponses APIを直接呼び出してください。
ローカルテストで問題なければ、Foundryにデプロイします。コンテナのリモートビルドが行われるため、Docker Desktopは不要です。
# 本番デプロイ
azd deploy
Step 5: Foundry上のHosted Agentを呼び出す
デプロイ完了後、Hosted AgentはFoundry Responses API経由で呼び出します。
# Foundryのアクセストークンを取得
TOKEN=$(az account get-access-token --scope "https://ai.azure.com/.default" --query accessToken -o tsv)
# Hosted Agentにクエリ送信
curl -s -X POST \
"https://<your-resource>.services.ai.azure.com/api/projects/<project>/openai/v1/responses" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"input": "What is Microsoft Agent Framework?",
"model": "gpt-4o-mini",
"agent_reference": {
"name": "<agent-name>",
"type": "agent_reference"
}
}'
7. 応用: Foundry IQでナレッジベースを活用する
Foundry IQは、Azure AI Searchをベースとしたエージェント型ナレッジリトリーバルです。Knowledge Sourceを定義するだけでインデックスが自動生成され、エージェントが「計画→検索→統合」のプロセスで高品質な回答を生成できます。
Foundry IQのセットアップ(Knowledge Source作成、Knowledge Base構築、パラメータ設定等)の詳細は筆者の別記事をご参照ください。
Foundry IQのKnowledge BaseでObsidianの個人ナレッジをAI検索する
ここでは、Agent FrameworkのエージェントからFoundry IQのナレッジベースをMCPツールとして利用する方法を紹介します。
MCPツール接続のSDK対応状況
Foundry IQの公式ドキュメントのUsage Supportテーブルでは、Foundry IQ専用のMCPツールクラスについて以下の対応状況が示されています:
| Python SDK | C# SDK | JavaScript SDK | REST API |
|---|---|---|---|
| ✔️ | - | - | ✔️ |
C#にはMCPToolのような専用クラスは提供されていません。しかし、MCP C# SDK(ModelContextProtocolパッケージ)を使えば、C#からでもFoundry IQのMCPエンドポイントに直接接続できます。 Foundry IQはMCP標準プロトコルに準拠しているため、汎用MCPクライアントでそのまま利用可能です。
なお、Python版のAgent FrameworkではMCPStdioTool / MCPStreamableHTTPTool等のMCPクライアントクラスが組み込みで提供されています。C#版でも将来的にAgent Frameworkに同様の組み込みMCPクライアントが統合される可能性は高いと考えられます。
今回はあえてC#で実験をしています。
前提条件
# 追加パッケージ(MCP C# SDK)
dotnet add package ModelContextProtocol --prerelease
また、Azure AI SearchのAPIキーが必要です。詳細なセットアップは公式ドキュメントを参照してください。
Foundry IQ × MCP C# SDK × Agent Framework
using Azure.AI.Projects;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using ModelContextProtocol.Client;
var endpoint = Environment.GetEnvironmentVariable("PROJECT_ENDPOINT")
?? throw new InvalidOperationException("PROJECT_ENDPOINT is required");
var searchEndpoint = Environment.GetEnvironmentVariable("SEARCH_ENDPOINT"); // AI SearchのURL
var kbName = Environment.GetEnvironmentVariable("KB_NAME"); // ナレッジベース名
var searchApiKey = Environment.GetEnvironmentVariable("SEARCH_API_KEY"); // AI Search APIキー
var credential = new DefaultAzureCredential();
// 認証ヘッダー付きHttpClientを作成
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("api-key", searchApiKey);
// MCP C# SDK で Foundry IQ の MCP エンドポイントに直接接続
var mcpEndpoint = $"{searchEndpoint}/knowledgebases/{kbName}/mcp?api-version=2025-11-01-preview";
await using var mcpClient = await McpClient.CreateAsync(
new HttpClientTransport(
new HttpClientTransportOptions
{
Endpoint = new Uri(mcpEndpoint),
Name = "foundry-iq-kb"
},
httpClient
)
);
// MCPツール一覧を取得(knowledge_base_retrieve)
var mcpTools = await mcpClient.ListToolsAsync();
// Agent Framework のエージェントに MCP ツールを渡す
var projectClient = new AIProjectClient(new Uri(endpoint), credential);
var agent = projectClient.AsAIAgent(
model: "gpt-4o-mini",
name: "KnowledgeAgent",
instructions: """
あなたはナレッジベースを活用して質問に回答するアシスタントです。
ツールを使って検索してから回答してください。
回答には引用元を含めてください。日本語で回答してください。
""",
tools: [.. mcpTools.Cast<AITool>()]
);
// 実行
await foreach (var chunk in agent.RunStreamingAsync("Microsoft Foundryの主要な機能は何ですか?"))
{
Console.Write(chunk);
}
ポイントは以下です:
-
MCP C# SDK(
ModelContextProtocolパッケージ)のMcpClient.CreateAsync()でFoundry IQのMCPエンドポイントに直接接続 -
HttpClientTransportにAPIキー認証付きHttpClientを渡して認証 - 取得したMCPツールを**
.Cast<AITool>()でAgent Frameworkのツールに変換**してエージェントに渡す - エージェントは
knowledge_base_retrieveをFunction Callingとして自動的に呼び出し、ナレッジベースから回答を生成
まとめ
本記事では、Microsoft Agent Framework v1.0.0の概要からHosted Agents、Foundry IQ連携まで紹介しました。
| 機能 | 状態 | 備考 |
|---|---|---|
| Agent Framework (C#) | GA | 1.0.0、本番利用可能 |
| Agent Framework (Python) | GA | 1.0.0、本番利用可能 |
| Hosted Agents | プレビュー | 24リージョン対応(Japan East含む) |
| Foundry IQ | プレビュー | Python SDK専用クラスあり。C#はMCP C# SDKで接続可能 |
ポイント
今回の解説記事ではAgent Framework V1がGAについての紹介といくつかの実装開発をおこないました。より高度なエージェント開発が必要な時に力を発揮する仕組みだと思います。また、Microsoft Foundryとの連携を通して実運用におけるカスタムエージェントの管理が容易にできるHosted Agentも有用な機能だと思います。
- Semantic Kernel + AutoGen の統合SDKとして、単一エージェントからマルチエージェントワークフローまでカバー
- Hosted Agentsで、コンテナ化したエージェントの管理をFoundryに任せられる
- Foundry IQでエンタープライズ知識をエージェントに活用できる
