<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Ai | The .NET Blog</title><link>https://thedotnetblog.com/ja/tags/ai/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ja</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Wed, 03 Jun 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ja/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>NL2SQLはエージェント時代のSQLインジェクションだ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</link><pubDate>Wed, 03 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/nl2sql-agentic-sql-injection-mcp-server/</guid><description>エージェントに自然言語でデータベースをクエリさせる前に、これを読んでください。NL2SQLはスキーマの完全性、不確定性、SQL MCP Serverが実際に何を解決するかを考えるまで、シンプルに見えます。</description><content:encoded>&lt;p&gt;NL2SQLのピッチには完璧に聞こえるバージョンがあります：ユーザーが自然言語で質問し、エージェントがSQLを生成し、データが返ってくる。画面が少なく、クエリが少なく、コードが少ない。シンプル。&lt;/p&gt;
&lt;p&gt;そして5分後にもっと考えます。&lt;/p&gt;
&lt;h2 id="デモで誰も話さない問題"&gt;デモで誰も話さない問題&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;スキーマは物事を説明するように設計されていません。&lt;/strong&gt; 不可解なテーブル名、一貫性のないカラム名、追加の述語なしでは意味的に無効な技術的に有効な関係 — これらはエンタープライズデータベースでは普通のことです。バグではなく、ビジネス変更の蓄積された歴史です。しかし、意図を伝えるように設計されていないスキーマから意図を推論するようにモデルに求めると、モデルは何があっても試みます。諦めません。最善のクエリを生成し、自信を持って結果を返します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;モデルは決定論的ではありません。&lt;/strong&gt; 同じデータベースに同じ質問を2回して、異なるSQLを得るかもしれません。モデルは確率を計算しており、コンテキストのわずかな変化が異なる出力を生み出します。エージェントが常に正しいクエリを生成するという保証をテストで達成することはできません。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ユーザーレビューはスケールしません。&lt;/strong&gt; 「実行前にすべてのクエリを確認するだけ」は安全に聞こえます。しかし、ユーザーがデータモデルとSQLの両方の専門家であることを前提としています — 自然言語インターフェースを必要としなかった人々まさにその人たちです。また、認知的過負荷と確認バイアスの新しいクラスをもたらし、クエリの複雑さに圧倒されたユーザーが無効なクエリを調査するのではなく承認します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;そしてインジェクションがあります。&lt;/strong&gt; 従来のSQL開発では、パラメータ化がインジェクションを解決しました。ユーザー入力はSQLの構造ではなく、パラメータを埋めていたからです。NL2SQLでは、モデルがSQL自体を生成します。プロンプト、スキーマコンテキスト、会話履歴、取得されたデータすべてが実行されるものに影響します。誰かがモデルが生成するものを変えるプロンプトを作成した場合、それはインジェクションです — パラメータレベルではなく、クエリ生成レベルで。そしてテーブルの削除（明らか、回復可能）とは異なり、NL2SQLインジェクションは目に見えるエラーなしに誤った結果を返すクエリを生成します。ビジネス上の意思決定が間違ったデータに基づいてなされます。&lt;/p&gt;
&lt;h2 id="sql-mcp-serverが実際に解決すること"&gt;SQL MCP Serverが実際に解決すること&lt;/h2&gt;
&lt;p&gt;ここで記事は最も実践的に有用な点を述べます。エージェントに任意のスキーマアクセスを与えて最善を望むのではなく、SQL MCP Serverは&lt;a href="https://learn.microsoft.com/en-us/azure/data-api-builder/overview"&gt;Data API builder&lt;/a&gt;の上に構築された&lt;strong&gt;厳選されたAPIサーフェス&lt;/strong&gt;を公開します。&lt;/p&gt;
&lt;p&gt;違いは重要です：エージェントはSQLを生成しません。事前定義された結果形式を返す名前付きエンドポイントを呼び出します。SQLは開発者によって一度書かれ、決定論的です。エージェントの非決定論は任意のクエリを構築することではなく、&lt;em&gt;どの&lt;/em&gt;エンドポイントを呼び出すかを選択することに制限されます。&lt;/p&gt;
&lt;p&gt;これは従来のアプリモデルでのSQLインジェクションに対してパラメータ化が行ったこと — 信頼できない入力から任意のクエリを構築する能力を削除すること — に類似しています。&lt;/p&gt;
&lt;h2 id="正しい質問"&gt;正しい質問&lt;/h2&gt;
&lt;p&gt;記事は「NL2SQLを決して使うな」とは言っていません。それは言います：&lt;em&gt;どこで&lt;/em&gt;適用し、&lt;em&gt;何を&lt;/em&gt;公開するかについて慎重に考えてください。スコープされたスキーマと読み取り専用アクセスを持つ制御された環境での探索的分析には、NL2SQLで問題ないかもしれません。ビジネス上の意思決定が結果に依存する本番システムには、厳選されたAPIレイヤーが大幅に安全です。&lt;/p&gt;
&lt;p&gt;正直に言うと：いくつかの問題は、自然言語からSQLよりも名前付きエンドポイントの背後にある構造化されたクエリで解決する方が本当に優れています。SQL MCP Serverはエージェントインターフェースを完全に放棄することなく、そのオプションを提供します。&lt;/p&gt;
&lt;p&gt;元の投稿: &lt;a href="https://devblogs.microsoft.com/azure-sql/sql-mcp-server-nl2sql/"&gt;Considering NL2SQL? Should your database really be the prompt? How can SQL MCP Server help?&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry 2026年4月: Foundry Local GA、GPT-5.5、HyperlightによるCodeAct</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/microsoft-foundry-april-2026-whats-new/</link><pubDate>Tue, 02 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/microsoft-foundry-april-2026-whats-new/</guid><description>4月のFoundryまとめは盛りだくさん：Foundry LocalがGAに、GPT-5.5が登場、Agent FrameworkがOpenTelemetryトレーシングを取得、CodeActがHyperlight マイクロVMでPythonを実行、エージェント監視ダッシュボードが登場。</description><content:encoded>&lt;p&gt;Microsoft Foundryにとって忙しい月でした。最も重要なアナウンスをご紹介します。&lt;/p&gt;
&lt;h2 id="foundry-localが一般提供開始"&gt;Foundry Localが一般提供開始&lt;/h2&gt;
&lt;p&gt;Foundry Local — MicrosoftのクロスプラットフォームのローカルAIランタイム — がWindows、macOS（Apple Silicon）、Linux x64でプレビューからGAになりました。開発者向けSDKを備えた、本番環境対応のローカルモデル推論です。バージョン1.1では文字起こし、embeddings、Responses APIのサポートが追加されています。&lt;/p&gt;
&lt;h2 id="gpt-55"&gt;GPT-5.5&lt;/h2&gt;
&lt;p&gt;GPT-5ファミリーの最新モデルがFoundryで利用可能になりました。Tier 5およびTier 6サブスクリプションのデフォルトクォータ。以前のGPT-5バリアントで作業していた場合、ユースケースに合わせて評価する価値があります。&lt;/p&gt;
&lt;h2 id="foundryでのagent-frameworkトレーシング"&gt;FoundryでのAgent Frameworkトレーシング&lt;/h2&gt;
&lt;p&gt;今月、2つのトレーシング機能がプレビューとして提供されます：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Agent Frameworkトレーシング&lt;/strong&gt; — MAFエージェントがFoundryにOpenTelemetryトレースを送信できるようになりました。エージェントの動作をデバッグし、多段階実行をトレースし、ツール呼び出し全体の遅延とエラーを表面化させます。これは実際のギャップを埋めます：何を返したかだけでなく、&lt;em&gt;エージェントが本番で実際に何をしたか&lt;/em&gt;を知ること。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ホステッドエージェントトレーシング&lt;/strong&gt; — ホステッドエージェントのセッション、ツール呼び出し、実行ステップもFoundryトレースに表示されます。同じオブザーバビリティストーリーがホステッドティアにも拡張されます。&lt;/p&gt;
&lt;h2 id="hyperlightによるcodeactalpha"&gt;HyperlightによるCodeAct（Alpha）&lt;/h2&gt;
&lt;p&gt;これは技術的に最も興味深い追加機能です：Agent Frameworkが&lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;マイクロ仮想マシン内でPythonコードを実行できるようになりました。&lt;/p&gt;
&lt;p&gt;CodeActはエージェントがツールとしてPythonコードを生成して実行するパターンです。明らかな懸念はセキュリティ — モデルが生成したコードを実行しています。HyperlightのマイクロVMはネイティブに近い起動時間でプロセスレベルの隔離を提供し、フルコンテナやVMのオーバーヘッドなしでサンドボックスコード実行を実用的にします。&lt;/p&gt;
&lt;p&gt;コード実行が必要なエージェントワークフローにとって、これはホストプロセスでコードを実行するよりも大幅なセキュリティ改善です。&lt;/p&gt;
&lt;h2 id="エージェント監視ダッシュボードプレビュー"&gt;エージェント監視ダッシュボード（プレビュー）&lt;/h2&gt;
&lt;p&gt;トークン使用量、遅延、実行成功率、エバリュエータースコアを1つのビューに組み合わせた統合オペレーションダッシュボード。通常のオブザーバビリティダッシュボードとの違い：オペレーションメトリクスとともに評価結果が含まれているため、「エージェントが遅くなっている」と「エバリュエータースコアが下がった」を相関させたり、関係ないことを確認したりできます。&lt;/p&gt;
&lt;h2 id="継続的評価カスタムエバリュエータープレビュー"&gt;継続的評価カスタムエバリュエーター（プレビュー）&lt;/h2&gt;
&lt;p&gt;独自のコードベースまたはプロンプトベースのエバリュエーターを継続的評価パイプラインに持ち込めるようになりました。以前は、継続的評価は組み込みエバリュエーターに限定されていました。カスタムエバリュエーターを使用すると、本番監視ループでチーム固有の品質基準を適用できます。&lt;/p&gt;
&lt;h2 id="コントロールプレーンのエージェントインベントリ"&gt;コントロールプレーンのエージェントインベントリ&lt;/h2&gt;
&lt;p&gt;FoundryコントロールプレーンのOperate ビューで、サブスクリプション全体のすべてのサポートされているエージェントが表示されるようになりました：Foundryエージェント、Azure SRE Agent、Logic Appsエージェントループ、および登録済みカスタムエージェント。何がどこにデプロイされているかを把握するための1つのビュー。&lt;/p&gt;
&lt;p&gt;元の投稿：&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-apr-2026/"&gt;What&amp;rsquo;s new in Microsoft Foundry | April 2026&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>ハンドオフパターン：1つのエージェントでは不十分な時</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</link><pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-handoff-orchestration-pattern-tour/</guid><description>Microsoft Agent FrameworkのHandoffオーケストレーションパターンにより、エージェントは会話コンテキストを失ったりトポロジルールを破ったりすることなく、次のターンを誰が処理するかを決定できます。</description><content:encoded>&lt;p&gt;どのマルチエージェントシステムも、いつかはシンプルなルーターを超えます。最初のサインは、専門エージェントがフォローアップの質問をする必要があるとき、またはターンの途中で別のエージェントが続けるべきだと気付くときです。固定パイプラインはそこで失敗します。ワンショットルーターもそこで失敗します。&lt;/p&gt;
&lt;p&gt;それこそがMicrosoft Agent FrameworkのHandoffオーケストレーションパターンが対処するために設計された問題です。&lt;/p&gt;
&lt;h2 id="handoffの仕組み"&gt;Handoffの仕組み&lt;/h2&gt;
&lt;p&gt;開発者がグラフを宣言します：エージェントはこれで、エージェント間のエッジはこれです。フレームワークが残りを行います — 各出力エッジにハンドオフツールを合成して各エージェントに注入します。エージェントが制御を渡すと決めたらツールを呼び出します。フレームワークがトポロジを強制します。&lt;/p&gt;
&lt;p&gt;これをエージェントが互いを呼び出すことと異なるものにする3つのこと：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;1つの共有トランスクリプト&lt;/strong&gt; — 受信エージェントは完全な会話履歴を見ます。ゼロから始まることはありません。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;トポロジの強制&lt;/strong&gt; — エージェントは宣言されたターゲットにのみハンドオフできます。ルーティングのバグは作成時に検出され、プロダクションでは検出されません。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自然な終了&lt;/strong&gt; — アクティブエージェントがハンドオフツールを呼び出さずにターンを終えると、ワークフローはユーザーに譲ります。ポーリングなし、明示的な終了条件なし。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="最小限の例"&gt;最小限の例&lt;/h2&gt;
&lt;p&gt;.NETでhandoffワークフローを構築するとこのようになります：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Workflows&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;triage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Route to the right specialist.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Triage&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;billing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Handle billing questions.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Billing&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;tech&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Handle technical support.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Tech&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffWorkflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;billing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;billing&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tech&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;targets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;billing&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Triageはどちらの専門家にも送れます。両方の専門家がtriageに戻せます。グラフは非巡回対応ですが、必要なとき(&amp;ldquo;もっと情報が必要&amp;rdquo; → 調査に戻る)にバックエッジをサポートします。&lt;/p&gt;
&lt;h2 id="handoffを使う時と使わない時"&gt;Handoffを使う時（と使わない時）&lt;/h2&gt;
&lt;p&gt;Handoffが適している場面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;所有権が会話の途中で変わりうる&lt;/strong&gt; — エージェントが自分が間違った専門家だと気付く場合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バックエッジが重要&lt;/strong&gt; — 再起動なしに前のステップを再訪する必要がある場合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ルーティング決定が曖昧&lt;/strong&gt; — ハンドオフするかどうかの決定が文脈的で、型付きの述語よりモデルが判断した方が良い場合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;適していない&lt;/em&gt;場面：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パイプラインが固定で順次的 — その場合は&lt;code&gt;Sequential&lt;/code&gt;ワークフローを使用&lt;/li&gt;
&lt;li&gt;各ステップが独立 — 1つしか必要としていないのに全員がトランスクリプトを共有するのは雑音&lt;/li&gt;
&lt;li&gt;厳格な処理保証が必要 — モデル駆動ルーティングの非決定論は望むものではない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="バックエッジとhuman-in-the-loop"&gt;バックエッジとHuman-in-the-Loop&lt;/h2&gt;
&lt;p&gt;Handoffが可能にする最も興味深い形の一つは、本物のバックエッジです。エージェントは「情報が不十分」と判断して研究ステップに戻るルーティングをすることができます — ハードコードされたループではなく、モデルがそれが正しい判断だと決めるからです。&lt;/p&gt;
&lt;p&gt;Human-in-the-loopのインタラクションも自然に構成されます。専門家がユーザー入力を必要とするとき、ワークフローはデフォルトのターンループを通じてユーザーに戻し、応答を収集し、完全なコンテキストで再開します。エージェントは会話を失いません。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Handoffは内面化すると多くを可能にするシンプルに見えるパターンの一つです：分散ルーティング、共有コンテキスト、強制されたトポロジ、自然な終了。エージェントが「実際は他の誰かがこれを処理すべきだ」と言い始めたときの次のステップです。&lt;/p&gt;
&lt;p&gt;元の投稿で完全なウォークスルーを読む: &lt;a href="https://devblogs.microsoft.com/agent-framework/a-tour-of-handoff-orchestration-pattern/"&gt;A Tour of the Handoff Orchestration Pattern&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Frameworkにおける永続的ワークフロー：In-MemoryからAzure Functionsへ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-durable-workflows-azure-functions-durable-task/</guid><description>MAFのワークフロープログラミングモデルがDurable Taskによる永続的実行をサポートするようになりました。プロセス再起動を乗り越えAzure Functions上でスケールする、組み合わせ可能なエージェントワークフローの構築方法を紹介します。</description><content:encoded>&lt;p&gt;初期のAIエージェントワークフローの問題点のひとつ：脆弱性です。単一プロセスに縛られた長時間実行のマルチステップワークフローは、プロセス再起動 = 状態喪失を意味します。シンプルなデモには問題ありませんが、本番ワークロードには向きません。&lt;/p&gt;
&lt;p&gt;Microsoft Agent FrameworkのワークフロープログラミングモデルがAzure Functionsホスティングでのdurable task フレームワークによる&lt;strong&gt;永続的実行&lt;/strong&gt;をサポートするようになりました。プログラミングモデルの仕組みと、永続性の重要性について説明します。&lt;/p&gt;
&lt;h2 id="基本的な構成要素"&gt;基本的な構成要素&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Executor&lt;/strong&gt;は作業の基本単位です。各Executorは型付きで、特定の入力を受け取り、特定の出力を生成します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Workflows&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;internal&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OrderLookup&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Executor&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;OrderCancelRequest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;OrderLookup&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="n"&gt;ValueTask&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;HandleAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;OrderCancelRequest&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IWorkflowContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CancellationToken&lt;/span&gt; &lt;span class="n"&gt;cancellationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// 注文を検索して返す&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;OrderId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Workflow&lt;/strong&gt;はFluentビルダーを使ってExecutorを有向グラフに接続します。フレームワークが実行、ステップ間のデータフロー、エラー伝播を処理します。&lt;/p&gt;
&lt;p&gt;モデル化できるもの：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;順次チェーン（ステップA → ステップB → ステップC）&lt;/li&gt;
&lt;li&gt;並列Fan-out/Fan-in（エージェントA、B、Cを並列実行して結果を集約）&lt;/li&gt;
&lt;li&gt;条件分岐&lt;/li&gt;
&lt;li&gt;ヒューマン・イン・ザ・ループ承認（ワークフローを一時停止して外部シグナルを待機）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ローカル開発用in-memoryランナー"&gt;ローカル開発用In-Memoryランナー&lt;/h2&gt;
&lt;p&gt;開始は素早くできます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workflows&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コアパッケージには軽量なインプロセスランナーが含まれています。外部依存関係なし、データベースなし、Azureリソースなし。ローカル開発とユニットテストに最適です。&lt;/p&gt;
&lt;h2 id="durable-taskで永続性を追加"&gt;Durable Taskで永続性を追加&lt;/h2&gt;
&lt;p&gt;ワークフローがプロセス再起動を乗り越える必要がある場合 — 長時間実行だから、ヒューマン・イン・ザ・ループステップがあるから、多くの並列エージェント呼び出しに分散するから — In-Memoryランナーでは不十分です。&lt;/p&gt;
&lt;p&gt;MAFのDurable Task統合はワークフロー状態をAzure Storageに保存します。プロセスが再起動しても、ワークフローは中断した場所から再開されます。プログラミングモデルは変わりません。ランナーを入れ替えるだけです。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;dotnet&lt;/span&gt; &lt;span class="k"&gt;add&lt;/span&gt; &lt;span class="n"&gt;package&lt;/span&gt; &lt;span class="n"&gt;Microsoft&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AI&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Workflows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DurableTask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同じExecutor、同じワークフローグラフ — 永続的な状態に支えられています。&lt;/p&gt;
&lt;h2 id="azure-functionsホスティング"&gt;Azure Functionsホスティング&lt;/h2&gt;
&lt;p&gt;3番目の層はAzure Functionsホスティングです。ワークフローはFunctionアプリになります：HTTPエンドポイントでワークフローをトリガーし、永続的ランタイムがスケーリング、状態、信頼性を管理します。&lt;/p&gt;
&lt;p&gt;これにより、並列呼び出し、条件分岐、ヒューマン承認を持つマルチエージェントワークフローが、カスタム状態管理なしでサーバーレスFunctions環境でスケールできます。&lt;/p&gt;
&lt;h2 id="なぜこれが重要か"&gt;なぜこれが重要か&lt;/h2&gt;
&lt;p&gt;この組み合わせは本番AIシステムにとって重要です：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;並列エージェント呼び出し&lt;/strong&gt; — ブロックなしで複数の専門エージェントに同時に分散し、全員が完了したら結果を集約&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;長時間実行プロセス&lt;/strong&gt; — ヒューマン承認や外部イベントを含むワークフローが時間や日をまたいで一時停止・再開できる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スケーリング&lt;/strong&gt; — Azure Functionsが実行を水平スケール；Durable Taskフレームワークが並列状態の調整を管理&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;シンプルなローカルデモを超えたMAFワークフローを構築するなら、これが本番品質の実行への道筋です。&lt;/p&gt;
&lt;p&gt;元の投稿：&lt;a href="https://devblogs.microsoft.com/dotnet/durable-workflows-in-microsoft-agent-framework/"&gt;Durable Workflows in the Microsoft Agent Framework&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>あなたのローカル MAF エージェントが本番環境の家を手に入れました</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-agent-local-to-production-foundry-hosted-agents/</link><pubDate>Sat, 30 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-agent-local-to-production-foundry-hosted-agents/</guid><description>Foundry Hosted Agents は Microsoft Agent Framework エージェントにアイデンティティ、スケーリング、セッション永続性、追加設定不要の可観測性を提供します。実際にどのように見えるかをご紹介します。</description><content:encoded>&lt;p&gt;エージェントをローカルで動作させることは楽しい部分です。難しい部分はその後のすべてです：正気を保ちながらデプロイし、セッションを管理し、アイデンティティを設定し、可観測性を配線する。通常、これは多くのカスタムインフラの「接着剤」を意味します。&lt;/p&gt;
&lt;p&gt;Foundry Hosted Agents は、Microsoft Agent Framework (MAF) ユーザーにとってそのような接着剤の大部分を取り除いてくれました。&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents-が実際に何をするか"&gt;Foundry Hosted Agents が実際に何をするか&lt;/h2&gt;
&lt;p&gt;MAF エージェントを Foundry Hosted Agents にデプロイすると、プラットフォームは驚くほど長いリストのことを処理してくれます。それを自分で構築する必要がなくなります：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ゼロへのスケール&lt;/strong&gt; — アイドル時にコストがかからず、自動的に起動します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セッションごとの VM 分離サンドボックス&lt;/strong&gt; — 各ユーザーセッションがスケールダウンイベントを乗り越えるファイルシステム永続性を持つ独自のサンドボックスを取得します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;組み込み Entra ID&lt;/strong&gt; — 各エージェントが Foundry モデル、Toolbox、Azure サービスをシークレットをイメージに焼き付けずに呼び出せる独自のアイデンティティを取得します&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;バージョン管理されたデプロイメント&lt;/strong&gt; — 各デプロイメントが不変のスナップショットで、blue/green とカナリアロールアウトサポートがあります&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;設定不要の可観測性&lt;/strong&gt; — &lt;code&gt;APPLICATIONINSIGHTS_CONNECTION_STRING&lt;/code&gt; が実行時に注入されるため、MAF の OpenTelemetry トレースが App Insights に自動的に流れます&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後のものは本当に便利です。追加の配線なし、追加の設定なし。トレースがただ表示されます。&lt;/p&gt;
&lt;h2 id="コードの違いは最小限"&gt;コードの違いは最小限&lt;/h2&gt;
&lt;p&gt;この統合で最も気に入っているのはこれです。エージェントを書き直す必要はありません。ただラップするだけです：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;.NET の場合：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry.Hosting&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WebApplication&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddFoundryResponses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MapFoundryResponses&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Python の場合：&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ResponsesHostServer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;server&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;それだけです。ローカルでテストしたのと同じロジックが本番環境で実行されます。プラットフォームはセッション管理、アイデンティティ、スケーリングインフラでそれをラップします。&lt;/p&gt;
&lt;h2 id="2-つのプロトコル1-つのエージェント"&gt;2 つのプロトコル、1 つのエージェント&lt;/h2&gt;
&lt;p&gt;Hosted Agents は 2 つのエンドポイントスタイルをサポートします：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Responses&lt;/strong&gt; (&lt;code&gt;/responses&lt;/code&gt;) — OpenAI 互換、会話履歴とストリーミングを管理します。チャット形式のエージェントの良いデフォルト。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Invocations&lt;/strong&gt; (&lt;code&gt;/invocations&lt;/code&gt;) — リクエスト/レスポンススキーマを定義します。非会話的なワークフローに適しています。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;会話のように見えるものを構築している場合は、Responses から始めてください。構造化された入力を受け取り、構造化された出力を返す API 形式のエージェントを構築している場合は、Invocations が柔軟性を提供します。&lt;/p&gt;
&lt;h2 id="azd-を使ったデプロイフロー"&gt;&lt;code&gt;azd&lt;/code&gt; を使ったデプロイフロー&lt;/h2&gt;
&lt;p&gt;MAF エージェントで &lt;code&gt;azd up&lt;/code&gt; を実行すると：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;オプションで Foundry プロジェクトを作成してモデルをデプロイ&lt;/li&gt;
&lt;li&gt;コードをパッケージ化して Azure Container Registry にイメージをプッシュ&lt;/li&gt;
&lt;li&gt;ACR イメージからコンピューティングをプロビジョニング&lt;/li&gt;
&lt;li&gt;エージェントに専用の Entra ID を割り当て&lt;/li&gt;
&lt;li&gt;安定したエンドポイントを公開 (&lt;code&gt;https://{project_endpoint}/agents/{agent_name}&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;それ以降はすべてを処理&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;セッションは最大 30 日間持続します。アイドル状態のコンピューティングは 15 分後にデプロビジョニングされ、次のリクエスト時に透過的に復元されます。エージェントの観点からは、何も変わっていません。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;「ローカルで動作している」から「本番で実行されている」までの距離は、AI エージェントにとって歴史的に長くて辛いものでした。Foundry Hosted Agents + MAF はそのギャップを大幅に縮めます。Agent Framework で構築されたローカルエージェントがすでにある場合は、今日試す価値があります。&lt;/p&gt;
&lt;p&gt;チームは GA が近いと言っています — これは現在プレビュー中です。始めるには &lt;a href="https://learn.microsoft.com/en-us/agent-framework/hosting/foundry-hosted-agent"&gt;MAF Hosted Agent 統合ドキュメント&lt;/a&gt; と &lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/04-hosting/FoundryHostedAgents"&gt;.NET サンプル&lt;/a&gt; を確認してください。&lt;/p&gt;
&lt;p&gt;元の記事: &lt;a href="https://devblogs.microsoft.com/agent-framework/from-local-to-production-deploy-your-microsoft-agent-framework-agent-with-foundry-hosted-agents/"&gt;From Local to Production: Deploy Your Microsoft Agent Framework Agent with Foundry Hosted Agents&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>エージェントを作るのは簡単な部分 — 安全に実行するのが難しい部分</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-agent-governance-toolkit-runtime-policy/</link><pubDate>Fri, 29 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-agent-governance-toolkit-runtime-policy/</guid><description>Microsoft Agent Framework と Agent Governance Toolkit が連携して、ランタイムポリシーを適用し、ツール呼び出しを管理し、Merkle チェーンの監査ログを提供します — エージェントのプロンプトを変更せずに。</description><content:encoded>&lt;p&gt;AI エージェント開発には「デモ後悔」と呼び始めたパターンがあります。エージェントはデモでは完璧に動作します。そして誰かが聞きます: 間違ったツールを呼び出したら何が起こる? アクセスすべきでないデータにアクセスしたら? 誰が監査した?&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework はビルドとオーケストレーションをサポートします。Agent Governance Toolkit（AGT）はその後の部分をカバーします — ガバナンス、ポリシー適用、ランタイムでの監査可能性。&lt;/p&gt;
&lt;h2 id="各プロジェクトが実際に行うこと"&gt;各プロジェクトが実際に行うこと&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Microsoft Agent Framework (MAF)&lt;/strong&gt; はプログラミングモデルを提供します: マルチエージェントワークフロー、A2A プロトコル相互運用性、ミドルウェアフック、メモリ、Foundry Agent Service によるマネージドホスティング。モデル入出力レベルでコンテンツセーフティを処理します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent Governance Toolkit (AGT)&lt;/strong&gt; は同じミドルウェアパイプラインに接続して &lt;em&gt;アクション&lt;/em&gt; を管理します。すべてのツール呼び出し、リソースアクセス、エージェント間メッセージは実行前にポリシーに対して評価されます。サブミリ秒のオーバーヘッド。サイドカーなし、プロキシなし、変更されたプロンプトなし。&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;エージェントアクション --&amp;gt; ポリシーチェック --&amp;gt; 許可 / 拒否 --&amp;gt; 監査ログ (&amp;lt; 0.1 ms)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;異なるレイヤー、完全なカバレッジ、1つのパイプライン。&lt;/p&gt;
&lt;h2 id="接続はミドルウェアを追加するだけ"&gt;接続はミドルウェアを追加するだけ&lt;/h2&gt;
&lt;p&gt;Python では、AGT はログやコンテンツフィルターに使うのと同じ &lt;code&gt;middleware&lt;/code&gt; パラメーターに追加されます:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;OpenAIChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;gpt-5.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Contoso Loan Officer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a governed loan assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;check_credit_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;get_loan_rates&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;approve_small_loan&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;middleware&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AuditTrailMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_did&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;loan-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;GovernancePolicyMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;audit_log&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;CapabilityGuardMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allowed_tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;check_credit_score&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;get_loan_rates&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;RogueDetectionMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;detector&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;loan-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;.NET では &lt;code&gt;.Use()&lt;/code&gt; を通じて同じパターン:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BuildAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;gpt-5.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;GovernancePolicyMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;CapabilityGuardMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;allowedTools&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AuditTrailMiddleware&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;auditLog&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同じエージェント、同じオーケストレーション、同じツール。AGT はエージェントのロジックを変更せずにガバナンス機能を追加します。&lt;/p&gt;
&lt;h2 id="何を得るか"&gt;何を得るか&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GovernancePolicyMiddleware&lt;/strong&gt; — 宣言的ポリシールールに対してすべてのアクションを評価&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CapabilityGuardMiddleware&lt;/strong&gt; — エージェントが呼び出しを許可されているツールのホワイトリスト（上記の &lt;code&gt;approve_small_loan&lt;/code&gt; ツールは意図的に許可リストに含まれていない）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RogueDetectionMiddleware&lt;/strong&gt; — ランタイムで異常な動作パターンを検出&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AuditTrailMiddleware&lt;/strong&gt; — すべてのアクションを暗号学的に改ざん耐性にするための Merkle チェーン監査ログ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後のものはコンプライアンスに重要です。Merkle チェーンは、誰かがログを変更すると、チェーンが壊れることを意味します。監査が証拠です。&lt;/p&gt;
&lt;h2 id="5つの業界シナリオ"&gt;5つの業界シナリオ&lt;/h2&gt;
&lt;p&gt;AGT リポジトリには5つの完全なエンドツーエンドシナリオが含まれています: 金融サービス（ローン担当者）、医療（患者データ）、法律（契約審査）、政府（市民サービス）、製造（品質管理）。それぞれが実際の MAF エージェントと実際の AGT ガバナンスミドルウェアを組み合わせています。&lt;/p&gt;
&lt;p&gt;おもちゃのデモではありません。実際に本番でガバナンスが必要なシナリオです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;実際のデータに触れる、結果を伴う決定を下す、または本番で監視なしで動作するエージェントを構築している場合 — ガバナンスは任意ではありません。MAF + AGT の組み合わせが完全なスタックを提供します: Agent Framework でビルドし、AGT で管理します。&lt;/p&gt;
&lt;p&gt;両プロジェクトはオープンソースです。元の記事には完全なコードサンプルへのリンクがあります。&lt;/p&gt;
&lt;p&gt;元の投稿: &lt;a href="https://devblogs.microsoft.com/agent-framework/governance-at-the-speed-of-agents-microsoft-agent-framework-and-agent-governance-toolkit-better-together/"&gt;Governance at the Speed of Agents: Microsoft Agent Framework and Agent Governance Toolkit, Better Together&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Foundry Local 1.1: リアルタイム文字起こし、Embeddings、Responses API</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-local-11-transcription-embeddings-responses-api/</link><pubDate>Thu, 28 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-local-11-transcription-embeddings-responses-api/</guid><description>Foundry Local 1.1 はライブマイク文字起こし、テキスト embeddings、Responses API サポートを追加 — クラウド依存なし、ネットワーク遅延なし、トークンコストなしで、すべてローカルで動作します。</description><content:encoded>&lt;p&gt;Foundry Local 1.0 はコンセプトを証明しました：開発者フレンドリーな SDK で Windows、macOS（Apple Silicon）、Linux x64 上で AI モデルをローカルで実行できること。バージョン 1.1 は多くの実際の本番ユースケースをカバーする 3 つの機能を追加しています。&lt;/p&gt;
&lt;h2 id="ライブ音声文字起こし"&gt;ライブ音声文字起こし&lt;/h2&gt;
&lt;p&gt;最も重要な新機能：マイクから直接リアルタイムで音声をテキストにストリーミング変換。字幕、音声 UI、会議の文字起こし、アクセシビリティツール — すべてクラウド依存なしでローカル実行されます。&lt;/p&gt;
&lt;p&gt;API はセッションベースで、結果が到着するとすぐに送信し、中間テキストと確定テキストを区別するための &lt;code&gt;is_final&lt;/code&gt; マーカーを使用します。JavaScript、C#、Python、Rust のすべての言語バインディングで利用可能です。&lt;/p&gt;
&lt;p&gt;カタログからストリーミング音声モデルを読み込み、音声設定（サンプルレート、チャンネル、言語）でセッションを作成し、起動し、生の PCM オーディオチャンクをプッシュして、結果の非同期ストリームを消費します。投稿には Python と C# の完全な例があります。&lt;/p&gt;
&lt;h2 id="テキスト-embeddings"&gt;テキスト Embeddings&lt;/h2&gt;
&lt;p&gt;セマンティック検索、RAG パイプライン、クラスタリング、類似性マッチング — これらすべてに embeddings が必要です。Foundry Local 1.1 は embedding モデルのサポートを追加し、クラウドエンドポイントにデータを送信せず、同じ SDK からローカルでベクターを生成できます。&lt;/p&gt;
&lt;p&gt;データの居住性が重要なアプリケーションや機密コンテンツを処理する場合、ローカルでの embedding 生成は重要な機能です。&lt;/p&gt;
&lt;h2 id="responses-api"&gt;Responses API&lt;/h2&gt;
&lt;p&gt;Foundry Local は &lt;a href="https://platform.openai.com/docs/api-reference/responses"&gt;Responses API&lt;/a&gt; — エージェント的インタラクションのために設計された構造化インターフェース — をサポートするようになりました。これにより追加されるのは：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ツール呼び出し&lt;/strong&gt; — ローカルで実行中のモデルが定義したツールを呼び出すことを可能にします&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;マルチモーダルビジョン-言語入力&lt;/strong&gt; — ビジョン対応モデルに画像 + テキストを渡します&lt;/li&gt;
&lt;li&gt;標準 API 形式と互換性があるため、OpenAI の Responses API を対象とした既存のエージェントがローカルモデルに対して動作します&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="パッケージサイズの改善"&gt;パッケージサイズの改善&lt;/h2&gt;
&lt;p&gt;2 つの変更により JavaScript パッケージサイズが削減されます：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;koffi&lt;/code&gt; FFI レイヤーがカスタム Node-API C アドオンに置き換えられました&lt;/li&gt;
&lt;li&gt;WebGPU 実行プロバイダーは別のプラグインとして配布されるため、GPU アクセラレーションを必要としないアプリケーションはサイズコストを支払う必要がありません&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C# SDK は .NET の幅広い互換性のためにより低いフレームワークバージョンをターゲットとするようになりました。&lt;/p&gt;
&lt;h2 id="なぜこれが重要か"&gt;なぜこれが重要か&lt;/h2&gt;
&lt;p&gt;3 つの機能 — 文字起こし、embeddings、ツール呼び出し — は多くの AI アプリケーションのコアビルディングブロックをカバーしています。これらをローカルで実行することは以下を意味します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;インターネット不要&lt;/li&gt;
&lt;li&gt;トークンコストなし&lt;/li&gt;
&lt;li&gt;データがマシンを離れない&lt;/li&gt;
&lt;li&gt;ネットワーク状態に関わらず一定の遅延&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Foundry Local は、エッジシナリオ、プライバシーに敏感なワークロード、オフラインアプリケーション、または開発中にクラウド依存を避けたいあらゆるものに適しています。&lt;/p&gt;
&lt;p&gt;元の投稿：&lt;a href="https://devblogs.microsoft.com/foundry/foundry-local-v1-1/"&gt;Foundry Local 1.1: Live Transcription, Embeddings, and Responses API&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Cosmos DB Shell はパブリック プレビューに — そして MCP サーバーが内蔵されている</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/cosmosdb-shell-public-preview-mcp-server-cli/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/cosmosdb-shell-public-preview-mcp-server-cli/</guid><description>Azure Cosmos DB Shell は、データベース コマンドを MCP ツールとして公開する新しいオープン ソース CLI です。AI エージェントは、あなたが使う同じインターフェイスを使ってコンテナを操作し、クエリを実行し、データを管理できます。</description><content:encoded>&lt;p&gt;1 つの Cosmos DB の質問に答えるだけのために、ポータルのタブ、SDK サンプル、そして書きかけのスクリプトを行き来した経験があるなら、このプロジェクトが解消しようとしている摩擦をすでに知っているでしょう。&lt;/p&gt;
&lt;p&gt;Azure Cosmos DB Shell がパブリック プレビューに入りました。bash ライクな構文を持つオープン ソース CLI であり、そして — これを面白くする部分 — 統合された MCP サーバーを備えています。&lt;/p&gt;
&lt;h2 id="他のデータベース-cli-との違い"&gt;他のデータベース CLI との違い&lt;/h2&gt;
&lt;p&gt;CLI 自体は有用です：使い慣れたコマンド、スクリプト サポート、CI/CD 統合。この部分は開発者向けデータベース ツールの最低限のものです。&lt;/p&gt;
&lt;p&gt;興味深い部分は MCP サーバーの統合です。CLI が公開するすべてのコマンドが、AI エージェントが呼び出せる MCP ツールとして利用可能になります。カスタム API レイヤーはなく、書くべき統合コードもありません。エージェントは次のことができます：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;cd&lt;/code&gt;、&lt;code&gt;ls&lt;/code&gt;、&lt;code&gt;pwd&lt;/code&gt; でデータベース階層を移動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;query&lt;/code&gt; で SQL クエリを実行し、構造化された結果を取得&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create item&lt;/code&gt;、&lt;code&gt;update&lt;/code&gt;、&lt;code&gt;rm&lt;/code&gt; でアイテムを作成・変更&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mkdb&lt;/code&gt;、&lt;code&gt;mkcon&lt;/code&gt;、&lt;code&gt;rmdb&lt;/code&gt;、&lt;code&gt;rmcon&lt;/code&gt; でデータベースとコンテナを管理&lt;/li&gt;
&lt;li&gt;&lt;code&gt;endpoint&lt;/code&gt;、&lt;code&gt;pwd&lt;/code&gt; で現在のコンテキストを確認&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要な変化：エージェントは Cosmos DB API と話しているのではなく、あなたが使う同じシェル インターフェイスと話しています。コマンドは決定論的で監査可能であり、正確に何が起きているかを確認できるようオープン ソースです。&lt;/p&gt;
&lt;h2 id="オープン-ソースの基盤が重要"&gt;オープン ソースの基盤が重要&lt;/h2&gt;
&lt;p&gt;これはブラック ボックスのマネージド サービスではありません。シェルはオープン ソースであり、それが意味することは：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セキュリティ チームが実装を監査できる&lt;/li&gt;
&lt;li&gt;プラットフォーム チームが特定の標準に合わせてフォークして拡張できる&lt;/li&gt;
&lt;li&gt;開発者が全員のためになる改善を貢献できる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AI ツールを採用する企業チームにとって、「正確にどう動くか見られますか」はオプションの要件でなくなりつつあります。ここでのオープン ソースは意味ある差別化要因です。&lt;/p&gt;
&lt;h2 id="簡単になる-3-つのシナリオ"&gt;簡単になる 3 つのシナリオ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;インテリジェントなデータ分析&lt;/strong&gt; — エージェントをシェルに接続し、自然言語で質問し、構造化されたクエリ結果を得る。クエリの構築はエージェントが担当し、実行はシェルが担当します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自律的なデータ管理&lt;/strong&gt; — Cosmos DB でデータを作成、更新、削除する必要があるワークフローは、カスタム統合を必要とせず MCP ツールを通じて行えます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;リアルタイム監視とアラート&lt;/strong&gt; — エージェントがコンテナを定期的にクエリし、結果を比較し、意味のある通知チャネルで異常を報告できます。&lt;/p&gt;
&lt;p&gt;MCP インターフェイスにより、これらのシナリオは MCP を話す任意の AI プラットフォームと組み合わせ可能になります — Microsoft のツールだけでなく。&lt;/p&gt;
&lt;h2 id="始め方"&gt;始め方&lt;/h2&gt;
&lt;p&gt;シェルはパブリック プレビュー中です。インストールし、Cosmos DB 接続を設定し、MCP サーバーを有効にします。そこから、MCP 互換の任意のエージェント ホストがツールを発見して使用できます。&lt;/p&gt;
&lt;p&gt;元の投稿：&lt;a href="https://devblogs.microsoft.com/cosmosdb/azure-cosmos-db-shell-public-preview-ai-mcp-cli/"&gt;Announcing the Public Preview of Azure Cosmos DB Shell: Open-Source Power Meets AI-Driven Database Automation&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Azure SQL がエンベディングを生成できるようになりました — 純粋な T-SQL で、アプリ層不要</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-sql-ai-generate-embeddings-ga-rag-tsql/</guid><description>AI_GENERATE_EMBEDDINGS と CREATE EXTERNAL MODEL が Azure SQL Database と Managed Instance で GA になりました。T-SQL だけで構築された RAG パイプライン、データ移動不要。</description><content:encoded>&lt;p&gt;RAG パイプラインを構築したことがあれば、パイプライン税を知っているでしょう: データは SQL に存在しますが、エンベディングを生成するにはデータを抽出し、エンベディング API を呼び出し、バッチ処理とレート制限を処理し、ベクトル検索が可能な場所に結果を保存する必要があります。多くの場合、まったく異なるデータベースに。&lt;/p&gt;
&lt;p&gt;Azure SQL は、現在一般提供されている 2 つの機能でその大部分を排除しました: &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; と &lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="何をするか"&gt;何をするか&lt;/h2&gt;
&lt;p&gt;これら 2 つの T-SQL 機能は統合パイプラインとして機能します:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt;&lt;/strong&gt; — 外部 AI モデルエンドポイントを名前付きデータベースオブジェクトとして登録します。場所、API フォーマット、モデルタイプ、資格情報を一度設定します。どこでも再利用できます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt;&lt;/strong&gt; — 登録されたモデルを呼び出し、ベクトル値の JSON 配列を返すスカラー T-SQL 関数です。SELECT、INSERT、UPDATE、MERGE 文で動作します。&lt;/p&gt;
&lt;p&gt;合わせて、SQL エンジンを離れることなくエンドツーエンドのエンベディングパイプラインを形成します。&lt;/p&gt;
&lt;h2 id="完全なワークフロー"&gt;完全なワークフロー&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- ステップ 1: エンベディングプロバイダーを一度登録する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;EXTERNAL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;WITH&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;LOCATION&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://your-aoai-resource.openai.azure.com/&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;API_FORMAT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Azure OpenAI&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL_TYPE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;text-embedding-ada-002&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- ステップ 2: T-SQL でインラインにエンベディングを生成する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SET&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;docs&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;-- ステップ 3: ベクトル距離で検索する
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;TOP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;documents&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;BY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;VECTOR_DISTANCE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;cosine&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;embedding&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AI_GENERATE_EMBEDDINGS&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;USE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MODEL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;MyEmbeddingModel&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これがパイプライン全体です: SQL のデータ、SQL で生成されたエンベディング、SQL での類似性検索。オーケストレーション層なし、ETL なし、別個のベクトルデータベースなし。&lt;/p&gt;
&lt;h2 id="サポートされる-api-フォーマットとオプション"&gt;サポートされる API フォーマットとオプション&lt;/h2&gt;
&lt;p&gt;GA では、&lt;code&gt;API_FORMAT&lt;/code&gt; は &lt;strong&gt;Azure OpenAI&lt;/strong&gt; と &lt;strong&gt;OpenAI&lt;/strong&gt; をサポートします。&lt;code&gt;MODEL_TYPE&lt;/code&gt; は現在 &lt;code&gt;EMBEDDINGS&lt;/code&gt; に固定されています。&lt;code&gt;PARAMETERS&lt;/code&gt; JSON では、再試行回数を含むモデルレベルのデフォルトを設定できます:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;PARAMETERS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;{&amp;#34;sql_rest_options&amp;#34;:{&amp;#34;retry_count&amp;#34;:3}}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;認証はデータベース資格情報を使用するため、シークレットはアプリケーションコードの外に保持されます。&lt;/p&gt;
&lt;h2 id="net-アプリケーションで何が可能になるか"&gt;.NET アプリケーションで何が可能になるか&lt;/h2&gt;
&lt;p&gt;既存の SQL データの上に AI 機能を構築する .NET 開発者にとって、これは重要です。以下は不要です:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エンベディング用に中間ストアにデータを抽出する&lt;/li&gt;
&lt;li&gt;外部エンベディングパイプラインを管理する&lt;/li&gt;
&lt;li&gt;別個のベクトルデータベースを設定する (フル機能のベクトルストアが必要な場合は Azure AI Search を使用できますが)&lt;/li&gt;
&lt;li&gt;アプリケーションのデータアクセス層を変更する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;既存の SQL アプリケーションに段階的にセマンティック検索を追加できます。すでにお持ちの同じ T-SQL ツールを使用して。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;SQL データに対する RAG パターンが劇的にシンプルになりました。&lt;code&gt;AI_GENERATE_EMBEDDINGS&lt;/code&gt; + &lt;code&gt;CREATE EXTERNAL MODEL&lt;/code&gt; は、既存の SQL アプリケーションが新しいインフラを追加することなくベクトル検索機能を獲得できることを意味します。&lt;/p&gt;
&lt;p&gt;両機能は本日、Azure SQL Database と Azure SQL Managed Instance で GA です。&lt;/p&gt;
&lt;p&gt;元の投稿: &lt;a href="https://devblogs.microsoft.com/azure-sql/generate-embeddings-function-and-external-model-object-support-are-now-generally-available-in-azure-sql/"&gt;Generate Embeddings Function and External Model Object Support Are Now Generally Available in Azure SQL&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>あなたの AI エージェントにはアイデンティティの問題があります（そしてこれがそれを解決するテンプレートです）</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azd-least-privilege-ai-agents-oauth-token-pattern/</guid><description>Curity と Microsoft による新しい azd テンプレートは、きめ細かいスコープを持つ短命の OAuth トークンを使用する AI エージェントを構築する方法を示します — エージェントが見てはいけないデータを決して見られないようにするために。</description><content:encoded>&lt;p&gt;すべての AI エージェントプロジェクトには、こんな瞬間があります: デモは完璧に機能し、エージェントは自然言語を解釈し、正しい API を呼び出し、正しいデータを返します。そして実際のユーザーについて考え始めます。&lt;/p&gt;
&lt;p&gt;あるユーザーのエージェントセッションが別のユーザーのデータを見るのを何が防ぐのでしょうか？エージェントがプロンプトインジェクションで騙された場合はどうなるでしょうか？予期しない方法でツールを呼び出した場合はどうなるでしょうか？&lt;/p&gt;
&lt;p&gt;これらはエッジケースではありません。これらはリリース前に行うべき設計上の決定です。&lt;/p&gt;
&lt;p&gt;Curity と Microsoft による新しい &lt;code&gt;azd&lt;/code&gt; テンプレートは、まさにこの問題に対して機能するリファレンスを提供します。&lt;/p&gt;
&lt;h2 id="核心的な問題-認証--認可"&gt;核心的な問題: 認証 ≠ 認可&lt;/h2&gt;
&lt;p&gt;ほとんどのエージェントサンプルはユーザー認証をうまく処理しています。認可の処理は不十分です。ユーザーが&lt;em&gt;誰&lt;/em&gt;であるかを知っていても、彼らが見るべき&lt;em&gt;データ&lt;/em&gt;が何かはわかりません。&lt;/p&gt;
&lt;p&gt;従来のクライアントアプリは予測可能な API 呼び出しを行います。AI エージェントは非決定論的です — 自然言語を解釈し、何を呼び出すかを決定します。創造的になれます。また間違える可能性もあります。プロンプトインジェクションによって操作される場合、AI が適切に動作することに依存しないルールが必要です。&lt;/p&gt;
&lt;p&gt;このテンプレートが示す解決策: &lt;strong&gt;各ホップに正確に正しい情報を運ぶ短命のトークン&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="トークンチェーンの仕組み"&gt;トークンチェーンの仕組み&lt;/h2&gt;
&lt;p&gt;テンプレートは OAuth 2.0 アクセストークンとトークン交換を使用して、各ステップで権限を絞り込みます。ユーザートークンは MCP サーバーに到達する前に 2 回交換されます:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;最初の交換&lt;/strong&gt; — スコープを絞り込み、不透明なトークンを JWT に変換&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2 番目の交換&lt;/strong&gt; — エージェント ID と MCP サーバーホップのための新しいオーディエンスを追加&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;MCP サーバートークンがどのように見えるか:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;scope&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;stocks/read&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sub&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;62c839b8...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aud&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://mcp.demo.example&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;customer_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;178&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;region&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;USA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;customer_id&lt;/code&gt; は認可サーバーによってトークンに組み込まれており、エージェントが制御するパラメータとして渡されません。API はエージェントの指示ではなく、トークンをチェックします。&lt;/p&gt;
&lt;p&gt;これが意味すること: エージェントが別の顧客のデータを取得しようとするよう騙されたとしても、トークンはそれを認可しません。&lt;/p&gt;
&lt;h2 id="テンプレートがデプロイするもの"&gt;テンプレートがデプロイするもの&lt;/h2&gt;
&lt;p&gt;いくつかの &lt;code&gt;azd&lt;/code&gt; コマンドで次のものが得られます:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Microsoft Foundry 上のバックエンドエージェント（C#、Microsoft A2A および MCP SDK）&lt;/li&gt;
&lt;li&gt;サンプルポートフォリオ API を公開する MCP サーバー&lt;/li&gt;
&lt;li&gt;認可サーバーとして Curity Identity Server、認証のために Entra ID と並行して&lt;/li&gt;
&lt;li&gt;トークン交換と監査ログを処理する外部および内部 API ゲートウェイ&lt;/li&gt;
&lt;li&gt;Azure インフラストラクチャ全体の Bicep: Container Apps、VNet、ACR、Azure AI Foundry、Key Vault、Azure SQL Database、ストレージ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;パターン全体は検査可能でカスタマイズ可能です。&lt;/p&gt;
&lt;h2 id="借りる価値のある設計原則"&gt;借りる価値のある設計原則&lt;/h2&gt;
&lt;p&gt;Curity を使用しない場合でも、パターンは転用可能です: &lt;strong&gt;エージェントは永続的な API アクセスを決して持つべきではありません&lt;/strong&gt;。すべてのアクションは、その特定の呼び出しに必要な最小スコープを持つ短命のトークンを使用し、特定のエージェント ID に対して発行され、API が認可の決定を行うために必要なクレームを運ぶべきです。&lt;/p&gt;
&lt;p&gt;これは創造的なエージェント、ミス、プロンプトインジェクションに対して「エージェントが悪いことをしないようにするだけ」では決して耐えられない方法で耐えます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;AI エージェントのセキュリティパターンは、業界全体でまだ整理されています。このテンプレートは私が見た中で最も完全なリファレンス実装の 1 つです — 認証だけでなく、実際の認可フローをカバーしています。&lt;/p&gt;
&lt;p&gt;元の投稿: &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-curity-least-privilege-ai-agents/"&gt;Least privilege AI agents: A new azd template from Curity and Microsoft&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.3: Kubernetes サポート、ブラウザログ、Aspireify スキル</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</link><pubDate>Mon, 18 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-133-kubernetes-browser-logs-aspireify/</guid><description>13.2 から5週間後、Aspire 13.3 は45の新機能を携えてリリース。ファーストクラスの AKS デプロイ、AI 支援のオンボーディングスキル、ブラウザログのキャプチャ、構造化されたコマンド結果が含まれます。</description><content:encoded>&lt;p&gt;5週間はリリースとしては短い期間ですが、Aspire 13.3 はそのようには感じません。主要な項目は重要なものです: Helm による Kubernetes および AKS のファーストクラスデプロイ、Aspireify というエージェント支援のオンボーディングスキル、ダッシュボードへのブラウザログキャプチャ直接統合、構造化されたコマンド結果。さらに、45の新機能、134の改善、93のバグ修正も含まれています。&lt;/p&gt;
&lt;p&gt;ハイライトを見ていきましょう。&lt;/p&gt;
&lt;h2 id="aspireify-エージェント支援のオンボーディング"&gt;Aspireify: エージェント支援のオンボーディング&lt;/h2&gt;
&lt;p&gt;Aspire を既存のプロジェクトに追加するのは簡単に聞こえます — AppHost を追加すれば完了。しかし実際には多くの調査が必要です: どのポートが重要か、どの環境変数が実際の依存関係か、どの Docker Compose サービスが Aspire のインテグレーションにマッピングされるべきか。&lt;/p&gt;
&lt;p&gt;新しい &lt;strong&gt;Aspireify スキル&lt;/strong&gt; は、コーディングエージェントにまさにそのためのガイド付きワークフローを提供します。&lt;code&gt;aspire init&lt;/code&gt; がスケルトン AppHost を作成するとき、Aspireify スキルはエージェントがリポジトリを調査し、どのように動作しているかを理解し、アプリに合わせて AppHost を接続するのを助けます — その逆ではありません。&lt;/p&gt;
&lt;p&gt;デフォルトのスタンスは「コードへの変更を最小化する」です。アプリがすでに &lt;code&gt;DATABASE_URL&lt;/code&gt; を読み取っている場合、エージェントは設定を書き直すように求めるのではなく、&lt;code&gt;WithEnvironment()&lt;/code&gt; でそれをマップします。ポートがハードコードされている場合、スキルはエージェントにそれを保持するタイミングを伝えます。&lt;/p&gt;
&lt;p&gt;これは、レビューのための作業を増やすのではなく、実際に時間を節約する AI ツールの一例です。&lt;/p&gt;
&lt;h2 id="ファーストクラスの-kubernetes-と-aks-デプロイ"&gt;ファーストクラスの Kubernetes と AKS デプロイ&lt;/h2&gt;
&lt;p&gt;これはウィッシュリストにしばらくありました。Aspire 13.3 では &lt;strong&gt;Helm を使用した Kubernetes と AKS のファーストクラスデプロイサポート&lt;/strong&gt; が提供されます。Aspire ツールから直接 AKS をデプロイターゲットとして指定できるようになりました。&lt;/p&gt;
&lt;p&gt;AKS で本番ワークロードをすでに実行しているチームにとって、これは重要なギャップを埋めます。Aspire のアプリモデルは、手動で Helm チャートを書く必要なく、ローカル開発から Kubernetes へのクリーンなパスを持つようになりました。&lt;/p&gt;
&lt;h2 id="ダッシュボードのブラウザログ"&gt;ダッシュボードのブラウザログ&lt;/h2&gt;
&lt;p&gt;これはフロントエンドの問題をデバッグするまでは小さく見える機能の一つです。&lt;/p&gt;
&lt;p&gt;新しい &lt;code&gt;WithBrowserLogs()&lt;/code&gt; API は、エンドポイント対応のリソースに追跡されたブラウザリソースを添付します。Aspire はプライベート CDP パイプを使用して Chromium を起動し、コンソールログ、ネットワークリクエスト、エラーをリソースのログストリームに直接ストリーミングします:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;frontend&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;../frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithBrowserLogs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;TypeScript AppHost も同様にサポートしています:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;frontend&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;../frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;port&lt;/span&gt;: &lt;span class="kt"&gt;3000&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withBrowserLogs&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;コンソールエラー、失敗したネットワークリクエスト、クライアントサイドの例外 — すべて、すでにトレースとメトリクスを監視しているのと同じダッシュボードで可視化できます。基本的なことのためにブラウザ DevTools にタブを切り替える必要はもうありません。&lt;/p&gt;
&lt;h2 id="構造化されたコマンド結果"&gt;構造化されたコマンド結果&lt;/h2&gt;
&lt;p&gt;リソースコマンドが大幅にアップグレードされました。これまで、コマンドは成功/失敗を返していました。今では構造化された結果を返します: モデル、ダッシュボード UI、CLI、MCP ツールを流れるテキスト、JSON、または Markdown です。&lt;/p&gt;
&lt;p&gt;ダッシュボードはこれをヘッダーの新しい通知センターでまとめています。コマンド結果は Markdown レンダリングと「応答を表示」アクションを持つタイムスタンプ付き通知として表示されます。&lt;/p&gt;
&lt;p&gt;これにより、リソースコマンドが真に組み合わせ可能になります。インテグレーションは、単にどこかの状態を変更するのではなく、トンネル URL などの意味のある出力を返すコマンドを公開できるようになりました。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Aspire 13.3 は Kubernetes サポートだけでもアップデートする価値があります。ブラウザログと構造化されたコマンド結果は、日常の開発ワークフローで素早く積み重なる生活の質向上の改善の一種です。&lt;/p&gt;
&lt;p&gt;完全なリリースノート: &lt;a href="https://devblogs.microsoft.com/aspire/whats-new-aspire-13-3/"&gt;What&amp;rsquo;s New in Aspire 13.3&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title>SDD Conference 2026</title><link>https://thedotnetblog.com/ja/events/sdd-conference-2026/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/ja/events/sdd-conference-2026/</guid><description>ロンドンのBarbican Centreで開催される5日間のソフトウェア開発カンファレンス — 78セッションと14ワークショップ。アーキテクチャ、.NET、AI、Azure、DevOpsなどをカバー。</description><content:encoded>&lt;p&gt;&lt;strong&gt;SDD 2026&lt;/strong&gt; は &lt;strong&gt;2026年5月11日〜15日&lt;/strong&gt; に &lt;strong&gt;ロンドンの Barbican Centre&lt;/strong&gt; で開催されます。3日間のメインカンファレンスは火曜日から木曜日で、月曜日と金曜日にはオプションの終日ワークショップがあります。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;78セッション&lt;/strong&gt; と &lt;strong&gt;14ワークショップ&lt;/strong&gt; を擁し、ヨーロッパで最も充実した開発者カンファレンスの一つです。&lt;/p&gt;
&lt;h2 id="トピック"&gt;トピック&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;アーキテクチャ的思考&lt;/li&gt;
&lt;li&gt;C# 13 における関数型コード&lt;/li&gt;
&lt;li&gt;サーバーレスデザイン&lt;/li&gt;
&lt;li&gt;セマンティック AI&lt;/li&gt;
&lt;li&gt;Azure Kubernetes Services&lt;/li&gt;
&lt;li&gt;リーン DevOps 戦略&lt;/li&gt;
&lt;li&gt;The Model Context Protocol (MCP)&lt;/li&gt;
&lt;li&gt;.NET におけるエージェント AI&lt;/li&gt;
&lt;li&gt;モノリスのリファクタリング&lt;/li&gt;
&lt;li&gt;LLM でより速くコーディング&lt;/li&gt;
&lt;li&gt;ポスト量子世界における暗号技術&lt;/li&gt;
&lt;li&gt;ローカルファースト開発&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="スピーカー"&gt;スピーカー&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Kevlin Henney&lt;/strong&gt;、&lt;strong&gt;Neal Ford&lt;/strong&gt;、&lt;strong&gt;Sander Hoogendoorn&lt;/strong&gt;、&lt;strong&gt;Andrew Clymer&lt;/strong&gt;、&lt;strong&gt;Jacqui Read&lt;/strong&gt;、&lt;strong&gt;Christian Weyer&lt;/strong&gt;、&lt;strong&gt;Jeff Prosise&lt;/strong&gt;、&lt;strong&gt;Jules May&lt;/strong&gt;、&lt;strong&gt;Oliver Sturm&lt;/strong&gt;、&lt;strong&gt;Raju Gandhi&lt;/strong&gt; を含むワールドクラスのラインナップ。&lt;/p&gt;
&lt;h2 id="チケットと情報"&gt;チケットと情報&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/"&gt;イベントサイト&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddvault.s3.amazonaws.com/assets/SDD_2026_schedule.pdf"&gt;完全アジェンダ PDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/register"&gt;登録オプション&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;SDD 2025 参加者の98%が全体的な体験を「良い」、「とても良い」、「素晴らしい」と評価しました。&lt;/p&gt;</content:encoded></item><item><title>.NETのComposable StackでAI搭載カンファレンスアプリを構築する</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/ai-conference-app-dotnet-composable-stack/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/ai-conference-app-dotnet-composable-stack/</guid><description>MicrosoftはConferencePulseを構築しました — Microsoft.Extensions.AI、DataIngestion、VectorData、MCP、Agent Frameworkを組み合わせたライブカンファレンスBlazorアプリ。パーツがどう組み合わさるかを説明します。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元のバージョンは&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/ai-conference-app-dotnet-composable-stack/"&gt;こちら&lt;/a&gt;。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/dotnet/building-ai-conference-app-dotnet-composable-stack/"&gt;.NETのComposable StackでAI搭載カンファレンスアプリを構築する&lt;/a&gt; — Microsoftは、5つの.NET拡張ライブラリを組み合わせることで、ライブカンファレンスセッション向けのBlazor ServerアプリであるConferencePulseを構築しました。MVP Summitで使用されました。&lt;/p&gt;
&lt;h2 id="conferencepulseの機能"&gt;ConferencePulseの機能&lt;/h2&gt;
&lt;p&gt;ConferencePulseはライブセッション中に動作し、以下を提供します：セッションコンテンツからAIが生成するポール、ライブナレッジベースからRAGパイプラインで引き出す聴衆Q&amp;amp;A、自動生成されたインサイト、複数の同時AIエージェントが生成するセッションサマリー。スタックは.NET 10、Blazor Server、Aspireで、5つのプロジェクトに分割されています：Web、Core、Ingestion、Agents、Mcp、AppHost。&lt;/p&gt;
&lt;h2 id="microsoftextensionsaiすべてのための1つの抽象化"&gt;Microsoft.Extensions.AI：すべてのための1つの抽象化&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;IChatClient&lt;/code&gt;は統合抽象化です — 一度セットアップすれば、同じインターフェイスがAzure OpenAI、OpenAI、Anthropic、または他のプロバイダーで動作します。関数呼び出し、OpenTelemetryトレーシング、ロギングミドルウェアを備えた完全設定クライアントを6行で取得できます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;services&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(...).&lt;/span&gt;&lt;span class="n"&gt;GetChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-4o&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFunctionInvocation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseOpenTelemetry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseLogging&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同じ&lt;code&gt;IChatClient&lt;/code&gt;は後でデータ取り込みのエンリッチメントステップに再利用されます — そのための別クライアントは不要です。&lt;/p&gt;
&lt;h2 id="dataingestionパイプライン"&gt;DataIngestionパイプライン&lt;/h2&gt;
&lt;p&gt;セッションコンテンツはパイプラインを流れます：&lt;code&gt;MarkdownReader&lt;/code&gt; → &lt;code&gt;HeaderChunker&lt;/code&gt;（500トークン、50トークンオーバーラップ）→ &lt;code&gt;SummaryEnricher&lt;/code&gt; + &lt;code&gt;KeywordEnricher&lt;/code&gt; → &lt;code&gt;VectorStoreWriter&lt;/code&gt;（Qdrant）。エンリッチャーはインデックス作成前にサマリーを生成してキーワードを抽出するために同じ&lt;code&gt;IChatClient&lt;/code&gt;を使用します。聴衆の質問、Q&amp;amp;Aペア、ポール結果はセッションが進むにつれてリアルタイムで取り込まれます — ナレッジベースはトーク中に成長します。&lt;/p&gt;
&lt;h2 id="vectordataプロバイダーに依存しない検索"&gt;VectorData：プロバイダーに依存しない検索&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;VectorStoreCollection.SearchAsync()&lt;/code&gt;は、バッキングストアがQdrantであるかAzure AI Searchであるかに関係なく同じように動作します。ハイブリッド検索（ベクトル + 全文）がサポートされています。聴衆Q&amp;amp;AのRAGパイプラインはこのコレクションをクエリし、チャットクライアントにコンテキストとして渡す関連チャンクを取得します。&lt;/p&gt;
&lt;h2 id="mcpツールとしてのセッションコンテンツ"&gt;MCP：ツールとしてのセッションコンテンツ&lt;/h2&gt;
&lt;p&gt;セッションコンテンツはMCPを通じて公開されるため、MCPと互換性のあるクライアントからアクセスできます。サーバーとクライアントの両方が実装されています — サーバーはセッションの知識をMCPツールとして公開し、クライアントはエージェントパイプライン内からそれらのツールを呼び出すことを可能にします。&lt;/p&gt;
&lt;h2 id="agent-framework並列マルチエージェントサマリー"&gt;Agent Framework：並列マルチエージェントサマリー&lt;/h2&gt;
&lt;p&gt;セッションサマリーは3つのエージェントが並行して実行されることで生成されます — &lt;code&gt;PollSummaryAgent&lt;/code&gt;、&lt;code&gt;QuestionSummaryAgent&lt;/code&gt;、&lt;code&gt;InsightSummaryAgent&lt;/code&gt; — その後マージされます。これはMicrosoft Agent Frameworkのグループチャットまたは並列実行パターンを使用します。各エージェントが1つの関心事を担当し、オーケストレーターが出力をマージします。&lt;/p&gt;
&lt;h2 id="設計原則"&gt;設計原則&lt;/h2&gt;
&lt;p&gt;この投稿では覚えておく価値のある点が述べられています：最もシンプルなツールを使用する。シンプルな生成タスクには直接の&lt;code&gt;IChatClient&lt;/code&gt;呼び出し。構造化データ抽出にはツール/関数呼び出し。自律的なマルチステップ推論が必要な場合のみフルエージェントを使用。ライブラリのレイヤリングがこれを強制します — フルAgent Frameworkを引き込まずに&lt;code&gt;Microsoft.Extensions.AI&lt;/code&gt;を使用できます。&lt;/p&gt;
&lt;p&gt;完全なプロジェクト構造とソースリンクについては、&lt;a href="https://devblogs.microsoft.com/dotnet/building-ai-conference-app-dotnet-composable-stack/"&gt;フルポスト&lt;/a&gt;を参照してください。&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework パート3：ツールからワークフローへ — ビルディングブロックがカチッとはまる</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</link><pubDate>Tue, 05 May 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/</guid><description>.NET AIビルディングブロックシリーズのパート3では、Microsoft Agent Frameworkを取り上げます — ツールを持つ単一エージェントからメモリを持つマルチエージェントワークフローまで。本当に重要なことを解説します。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元の記事は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/maf-building-blocks-part-3-agents-tools-workflows/"&gt;こちら&lt;/a&gt;からご覧いただけます。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;.NETのBuilding Blocks for AIシリーズを追っているなら、パート1が&lt;code&gt;IChatClient&lt;/code&gt;（ユニバーサルモデルインターフェース）を、パート2が&lt;code&gt;Microsoft.Extensions.VectorData&lt;/code&gt;（セマンティック検索とRAG）を提供したことはご存知でしょう。どちらも基礎的で、単体でも有用です。しかし、ここからすべてがつながり始めます。&lt;/p&gt;
&lt;p&gt;パート3は&lt;a href="https://github.com/microsoft/agent-framework"&gt;Microsoft Agent Framework&lt;/a&gt;についてです — 正直に言うと、.NETで実現されるのを待ち望んでいたピースです。1.0は4月にリリースされました。APIは安定しています。本物のエージェントを構築する時が来ました。&lt;/p&gt;
&lt;h2 id="エージェントとは何かチャットボットとの違い"&gt;エージェントとは何か（チャットボットとの違い）&lt;/h2&gt;
&lt;p&gt;コードに入る前に、この区別を明確にしておきましょう。チャットボットはインプットを受け取り、モデルを呼び出し、アウトプットを返します。シンプルなループです。&lt;/p&gt;
&lt;p&gt;エージェントには&lt;em&gt;自律性&lt;/em&gt;があります。タスクについて推論し、どのツールを使うかを決定し、それを呼び出し、結果を評価し、次に何をすべきか決定できます — すべてのシナリオに対してステップバイステップのロジックを書く必要はありません。ツールと指示を与えれば、オーケストレーションを自分で処理します。&lt;/p&gt;
&lt;p&gt;こう考えてみてください：&lt;code&gt;IChatClient&lt;/code&gt;は会話を持つことのようなものです。エージェントはタスクリストを誰かに委任するようなものです。&lt;/p&gt;
&lt;h2 id="10行で書く最初のエージェント"&gt;10行で書く最初のエージェント&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Agents.AI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetChatClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are good at telling jokes.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Joker&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;.AsAIAgent()&lt;/code&gt;拡張メソッドがブリッジです。MEAIの&lt;code&gt;.AsIChatClient()&lt;/code&gt;と同じパターン — プロバイダーのSDKを安定した抽象化でラップします。Azure OpenAI、OpenAI、GitHub Models、Microsoft Foundry、またはローカルモデルで動作します。&lt;/p&gt;
&lt;p&gt;ストリーミングも機能します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="エージェントにツールを与える"&gt;エージェントにツールを与える&lt;/h2&gt;
&lt;p&gt;ここでエージェントが高度なチャットボットから脱却します。ツールはユーザーの要求に基づいてモデルが呼び出しを決定できる関数です。ルーティングロジックは不要 — モデルが自分で判断します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Description(&amp;#34;Get the weather for a given location.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;GetWeather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;The location to get the weather for.&amp;#34;)]&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;location&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;$&amp;#34;The weather in {location} is cloudy with a high of 15°C.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chatClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are a helpful assistant&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;AIFunctionFactory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;GetWeather&lt;/span&gt;&lt;span class="p"&gt;)]);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;2つのことに注目してください。まず、&lt;code&gt;AIFunctionFactory&lt;/code&gt;はMEAIから来ています — 通常の&lt;code&gt;IChatClient&lt;/code&gt;で使うのと同じツールファクトリーです。チャットシナリオ用にすでにツールを定義している場合、ここでも機能します。&lt;/p&gt;
&lt;p&gt;次に、&lt;code&gt;Description&lt;/code&gt;属性は非常に重要です。これがモデルがツールの機能と使用タイミングを理解する方法です。人間ではなくAIへのドキュメントとして扱ってください。&lt;/p&gt;
&lt;h2 id="セッション本当に記憶する会話"&gt;セッション：本当に記憶する会話&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Tell me a joke about a pirate.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Now add some emojis and tell it in the voice of a pirate&amp;#39;s parrot.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;セッションなしでは、各&lt;code&gt;RunAsync&lt;/code&gt;呼び出しはステートレスです。セッションありでは、エージェントはどのジョークを指しているかを知っています。&lt;code&gt;AgentSession&lt;/code&gt;はターン間で会話履歴を保持します。&lt;/p&gt;
&lt;p&gt;本番ステートレスサービスでは、セッションはクリーンにシリアライズできます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;JsonElement&lt;/span&gt; &lt;span class="n"&gt;sessionState&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SerializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// ... どこかに保存する ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;restoredSession&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DeserializeSessionAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sessionState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;What were we just talking about?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;restoredSession&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントがサーバーレスまたは水平スケール環境で動作する場合、これは非常に重要です。&lt;/p&gt;
&lt;h2 id="aicontextproviderセッションをまたいだ永続的メモリ"&gt;AIContextProvider：セッションをまたいだ永続的メモリ&lt;/h2&gt;
&lt;p&gt;セッションはセッション&lt;em&gt;内&lt;/em&gt;の会話履歴を保持します。しかし、セッション間でユーザーのことを知ることは？&lt;code&gt;AIContextProvider&lt;/code&gt;がそれを処理します。&lt;/p&gt;
&lt;p&gt;2つのフックがあります：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ProvideAIContextAsync&lt;/code&gt;&lt;/strong&gt; — 各インタラクションの&lt;em&gt;前&lt;/em&gt;に実行され、エージェントにコンテキストを注入する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;StoreAIContextAsync&lt;/code&gt;&lt;/strong&gt; — 各インタラクションの&lt;em&gt;後&lt;/em&gt;に実行され、学習と永続化を可能にする&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;パターンはエレガントです：複数のプロバイダーを積み重ねることができます — ユーザー設定用、最近のインタラクション用、関連ドキュメントのVectorDataストアを照会するものなど。最後のものは、パート2のRAGパターンそのもので、今やすべてのエージェント呼び出しで自動的に実行されます。&lt;/p&gt;
&lt;h2 id="マルチエージェントワークフロー"&gt;マルチエージェントワークフロー&lt;/h2&gt;
&lt;p&gt;ここでフレームワークがその名前を証明します。エグゼキューター（エージェント、関数、何でも）がエッジを介して接続するグラフベースのワークフローシステムを含みます。&lt;/p&gt;
&lt;p&gt;ネイティブでサポートされているパターン：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;シーケンシャル&lt;/strong&gt;：エージェントAの出力がエージェントBに流れる&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンカレント（ファンアウト/ファンイン）&lt;/strong&gt;：複数のエージェントに並列ディスパッチ、結果を収集&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;条件付きルーティング&lt;/strong&gt;：出力に基づいて異なるエージェントに作業をルーティング&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ライター-クリティックループ&lt;/strong&gt;：一方のエージェントが書き、もう一方が評価し、承認までループ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;サブワークフロー&lt;/strong&gt;：ワークフローを階層的に構成&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ライター-クリティックの例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;WorkflowBuilder&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddEdge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writerAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithOutputFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;criticAgent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IsApproved&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;workflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クリーンで読みやすく、条件ベースのルーティングによりループロジックを自分で書く必要がありません。&lt;/p&gt;
&lt;h2 id="ヒューマンインザループ"&gt;ヒューマン・イン・ザ・ループ&lt;/h2&gt;
&lt;p&gt;すべてが完全に自律的に実行されるべきではありません。センシティブな操作 — データベースへの書き込み、金融トランザクション、通信の送信 — には、エージェントが実行する前に人間の承認が必要です。&lt;/p&gt;
&lt;p&gt;フレームワークには&lt;code&gt;FunctionApprovalRequestContent&lt;/code&gt;と&lt;code&gt;FunctionApprovalResponseContent&lt;/code&gt;を介したサポートが組み込まれています。エージェントがツール呼び出しを提案し、アプリケーションコードがユーザーに提示し、レスポンスが実行を続けるかどうかを決定します。&lt;/p&gt;
&lt;p&gt;これがエンタープライズ環境でエージェントについて考える正しい方法です：完全な自律ではなく、&lt;em&gt;ガードレール付きの自律性&lt;/em&gt;。&lt;/p&gt;
&lt;h2 id="全体像"&gt;全体像&lt;/h2&gt;
&lt;p&gt;少し引いて見ると：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MEAI&lt;/strong&gt;はどのモデルへの普遍的インターフェースを提供&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;VectorData&lt;/strong&gt;はセマンティック検索を通じて組織の知識へのアクセスをエージェントに提供&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Framework&lt;/strong&gt;はすべてをオーケストレート — 内部で&lt;code&gt;IChatClient&lt;/code&gt;を使用し、コンテキストプロバイダーと組み合わせ、ワークフローを通じて調整&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各ピースは他のものと組み合わせられるように設計されています。&lt;a href="https://devblogs.microsoft.com/dotnet/microsoft-agent-framework-building-blocks-for-ai-part-3/"&gt;Jeremy Likness の元の投稿&lt;/a&gt;と&lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet"&gt;Agent Framework GitHubリポジトリ&lt;/a&gt;で完全なサンプルをご確認ください。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Microsoft Agent Framework パート3の投稿は、ビルディングブロックシリーズのループを閉じます。ツールを使い、物事を記憶し、調整する本物のエージェントを構築したい.NET開発者にとって、これが前進への道です。&lt;/p&gt;
&lt;p&gt;安定版1.0リリースは、これを本番環境で構築できることを意味します。.NETでのエージェント開発に飛び込むのを待っていたなら、今がその時です。&lt;/p&gt;</content:encoded></item><item><title>Agent FrameworkのCodeAct：エージェントのレイテンシを半分にする方法</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/</guid><description>CodeActは複数ステップのツールチェーンを単一のサンドボックス化されたコードブロックに圧縮します。レイテンシ52%削減、トークン使用量64%削減を実現します。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元の記事は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/codeact-agent-framework-hyperlight-50-percent-faster/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;エージェントプロジェクトの開発中、トレースを見て「なぜこんなに時間がかかるんだろう？」と思う瞬間があります。モデルは問題ない。ツールも動いている。でも、1回で計算できる結果を得るのに7回のラウンドトリップが発生している。&lt;/p&gt;
&lt;p&gt;これがまさにCodeActが解決する問題です。&lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;Agent FrameworkチームはHyperlightパッケージでのアルファサポートをリリース&lt;/a&gt;しました。&lt;/p&gt;
&lt;h2 id="codeactとは"&gt;CodeActとは？&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2402.01030"&gt;CodeActパターン&lt;/a&gt;はエレガントにシンプルです。モデルにツールリストを渡して1つずつ呼び出させる代わりに、単一の&lt;code&gt;execute_code&lt;/code&gt;ツールを与え、&lt;em&gt;計画全体&lt;/em&gt;を短いPythonプログラムとして表現させます。エージェントはコードを1回書き、サンドボックスがそれを実行し、1つの統合された結果を得ます。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方式&lt;/th&gt;
&lt;th&gt;時間&lt;/th&gt;
&lt;th&gt;トークン&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;従来型&lt;/td&gt;
&lt;td&gt;27.81秒&lt;/td&gt;
&lt;td&gt;6,890&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CodeAct&lt;/td&gt;
&lt;td&gt;13.23秒&lt;/td&gt;
&lt;td&gt;2,489&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;改善&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;52.4%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;63.9%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="セキュリティhyperlightマイクロ-vm"&gt;セキュリティ：Hyperlightマイクロ-VM&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;agent-framework-hyperlight&lt;/code&gt;パッケージは&lt;a href="https://github.com/hyperlight-dev/hyperlight"&gt;Hyperlight&lt;/a&gt;のマイクロ-VMを使用します。各&lt;code&gt;execute_code&lt;/code&gt;呼び出しは独自の新しいマイクロ-VMを取得します。起動はミリ秒単位で計測されます。分離はほぼコストゼロです。&lt;/p&gt;
&lt;p&gt;ツールはホストで実行し続けます。モデルが生成した&lt;em&gt;グルーコード&lt;/em&gt;はサンドボックスで実行されます。これが正しい分離です。&lt;/p&gt;
&lt;h2 id="最小セットアップ"&gt;最小セットアップ&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework_hyperlight&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;HyperlightCodeActProvider&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nd"&gt;@tool&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;Return the current weather for a city.&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;city&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;temperature_c&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;21.5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;conditions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;partly cloudy&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;codeact&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HyperlightCodeActProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;approval_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;never_require&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;CodeActAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;context_providers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;codeact&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="いつcodeactを使うか使わないか"&gt;いつCodeActを使うか（使わないか）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;CodeActを使う場合：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;タスクが多くの小さなツール呼び出しを連鎖させる（ルックアップ、結合、計算）&lt;/li&gt;
&lt;li&gt;レイテンシとトークンコストが重要&lt;/li&gt;
&lt;li&gt;モデル生成コードに強力な分離が必要&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;従来のtool-callingを使う場合：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;エージェントがターンごとに1〜2回しかツールを呼び出さない&lt;/li&gt;
&lt;li&gt;各呼び出しに個別の承認が必要な副作用がある&lt;/li&gt;
&lt;li&gt;ツールの説明が乏しいか曖昧&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="今すぐ試す"&gt;今すぐ試す&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;pip install agent-framework-hyperlight --pre
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/agent-framework/codeact-with-hyperlight/"&gt;Agent Frameworkブログの完全な投稿&lt;/a&gt;でより詳しい解説をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server が .mcpb になった — ランタイムなしでインストール</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/</guid><description>Azure MCP Server が MCP Bundle (.mcpb) として利用可能になりました — ダウンロードして Claude Desktop にドラッグするだけ。Node.js、Python、.NET 不要。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元の記事は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-mcp-server-mcpb-no-runtime-install/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;MCP サーバーのセットアップで面倒だったこと、ご存知ですか？ランタイムが必要でした。npm 版には Node.js、pip/uvx には Python、dotnet 版には .NET SDK。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;Azure MCP Server がその問題を解決しました&lt;/a&gt;。&lt;code&gt;.mcpb&lt;/code&gt; — MCP Bundle — として利用可能になり、セットアップはドラッグ＆ドロップです。&lt;/p&gt;
&lt;h2 id="mcp-bundle-とは"&gt;MCP Bundle とは？&lt;/h2&gt;
&lt;p&gt;VS Code 拡張機能（&lt;code&gt;.vsix&lt;/code&gt;）やブラウザ拡張機能（&lt;code&gt;.crx&lt;/code&gt;）のようなものですが、MCP サーバー用です。&lt;code&gt;.mcpb&lt;/code&gt; ファイルはサーバーバイナリとすべての依存関係を含む自己完結型の ZIP アーカイブです。&lt;/p&gt;
&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. プラットフォーム用バンドルをダウンロード&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server"&gt;GitHub Releases ページ&lt;/a&gt; で、OS とアーキテクチャに合った &lt;code&gt;.mcpb&lt;/code&gt; ファイルをダウンロードします。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Claude Desktop にインストール&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最も簡単な方法：拡張機能の設定ページ（&lt;code&gt;☰ → ファイル → 設定 → 拡張機能&lt;/code&gt;）を開きながら、&lt;code&gt;.mcpb&lt;/code&gt; ファイルを Claude Desktop ウィンドウにドラッグ＆ドロップします。サーバーの詳細を確認し、インストールをクリックして確認します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Azure で認証&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;az login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上です。Azure MCP Server は既存の Azure 認証情報を使用します。&lt;/p&gt;
&lt;h2 id="できること"&gt;できること&lt;/h2&gt;
&lt;p&gt;AI クライアントから直接 100 以上の Azure サービスツールにアクセス：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cosmos DB、Storage、Key Vault、App Service、Foundry のクエリと管理&lt;/li&gt;
&lt;li&gt;任意のタスクの &lt;code&gt;az&lt;/code&gt; CLI コマンド生成&lt;/li&gt;
&lt;li&gt;Bicep・Terraform テンプレートの作成&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="はじめるには"&gt;はじめるには&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ダウンロード&lt;/strong&gt;: &lt;a href="https://github.com/microsoft/mcp/releases?q=Azure.Mcp.Server-"&gt;GitHub Releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リポジトリ&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp"&gt;aka.ms/azmcp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ドキュメント&lt;/strong&gt;: &lt;a href="https://aka.ms/azmcp/docs"&gt;aka.ms/azmcp/docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-mcp-server-mcpb-support/"&gt;完全な記事&lt;/a&gt;もご確認ください。&lt;/p&gt;</content:encoded></item><item><title>GPT-5.5 が Azure Foundry に登場 — .NET 開発者が知っておくべきこと</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/</guid><description>GPT-5.5 が Microsoft Foundry で一般提供開始。GPT-5 から 5.5 への進化、実際に何が改善されたか、そして今日エージェントで使い始める方法。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元の記事は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/gpt-55-foundry-ga-what-dotnet-developers-need-to-know/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Microsoftは&lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;GPT-5.5がMicrosoft Foundryで一般提供開始&lt;/a&gt;したと発表しました。Azureでエージェントを構築してきた方にとって、これが待ち望んでいたアップデートです。&lt;/p&gt;
&lt;h2 id="gpt-5-の進化"&gt;GPT-5 の進化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-5&lt;/strong&gt;: 推論と速度を1つのシステムに統合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.4&lt;/strong&gt;: より強力なマルチステップ推論、企業向けエージェント機能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-5.5&lt;/strong&gt;: より深い長コンテキスト推論、信頼性の高いエージェント実行、トークン効率の向上&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="実際に何が変わったか"&gt;実際に何が変わったか&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;エージェントコーディングの向上&lt;/strong&gt;: GPT-5.5は大規模なコードベース全体でコンテキストを保持し、アーキテクチャ上の障害を診断し、テスト要件を予測します。修正が&lt;em&gt;他に何に影響するか&lt;/em&gt;を行動前に推論します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;トークン効率&lt;/strong&gt;: 少ないトークンと少ない再試行でより高品質な出力。本番デプロイメントでコストとレイテンシが直接削減されます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;長コンテキスト分析&lt;/strong&gt;: 膨大なドキュメントやマルチセッション履歴をスレッドを失わずに処理。&lt;/p&gt;
&lt;h2 id="価格"&gt;価格&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モデル&lt;/th&gt;
&lt;th&gt;入力 ($/M tokens)&lt;/th&gt;
&lt;th&gt;キャッシュ入力&lt;/th&gt;
&lt;th&gt;出力 ($/M tokens)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;$0.50&lt;/td&gt;
&lt;td&gt;$30.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
&lt;td&gt;$30.00&lt;/td&gt;
&lt;td&gt;$3.00&lt;/td&gt;
&lt;td&gt;$180.00&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="foundry-が重要な理由"&gt;Foundry が重要な理由&lt;/h2&gt;
&lt;p&gt;Foundry Agent Serviceでは、YAMLでエージェントを定義するか、Microsoft Agent Framework、GitHub Copilot SDK、LangGraph、またはOpenAI Agents SDKで接続できます。永続的なファイルシステム、独自のMicrosoft Entraアイデンティティ、ゼロスケール価格を持つ孤立したホステッドエージェントとして実行します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;aiProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.5&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;あなたは役立つアシスタントです。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;完全な詳細は&lt;a href="https://azure.microsoft.com/en-us/blog/openais-gpt-5-5-in-microsoft-foundry-frontier-intelligence-on-an-enterprise-ready-platform/"&gt;完全発表&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>あなたのエージェントはどこで物事を覚えているか？チャット履歴ストレージの実践ガイド</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</link><pubDate>Sat, 25 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/</guid><description>サービス管理かクライアント管理か？線形か分岐型か？AIエージェントが実際に何ができるかを決める重要なアーキテクチャ上の決定。C#とPythonのコード例付き。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元の記事は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/chat-history-storage-patterns-agent-framework/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;AIエージェントを構築する際、ほとんどのエネルギーをモデル、ツール、プロンプトに費やします。&lt;em&gt;会話履歴がどこに保存されるか&lt;/em&gt;という問題は実装の詳細に見えますが、実は最も重要なアーキテクチャ上の決定の一つです。&lt;/p&gt;
&lt;p&gt;これにより、ユーザーが会話を分岐させたり、回答を元に戻したり、再起動後にセッションを再開したりできるかどうか、そしてデータがインフラから出るかどうかが決まります。&lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;Agent FrameworkチームはLデープな分析を公開しました&lt;/a&gt;。&lt;/p&gt;
&lt;h2 id="2つの基本パターン"&gt;2つの基本パターン&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;サービス管理型&lt;/strong&gt;: AIサービスが会話状態を保存します。アプリは参照（スレッドID、レスポンスID）を保持し、サービスは各リクエストに関連する履歴を自動的に含めます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;クライアント管理型&lt;/strong&gt;: アプリが完全な履歴を管理し、各リクエストに関連メッセージを送信します。サービスはステートレスです。すべてを制御できます。&lt;/p&gt;
&lt;h2 id="agent-frameworkによる抽象化"&gt;Agent Frameworkによる抽象化&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;私の名前はAliceです。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;私の名前は何ですか？&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_session&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;私の名前はAliceです。&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;second&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;私の名前は何ですか？&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;セッションが基礎的な違いを処理します。プロバイダーを切り替えてもアプリケーションコードは変わりません。&lt;/p&gt;
&lt;h2 id="プロバイダー早見表"&gt;プロバイダー早見表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロバイダー&lt;/th&gt;
&lt;th&gt;ストレージ&lt;/th&gt;
&lt;th&gt;モデル&lt;/th&gt;
&lt;th&gt;圧縮&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;OpenAI/Azure Chat Completions&lt;/td&gt;
&lt;td&gt;クライアント&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;開発者&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Foundry Agent Service&lt;/td&gt;
&lt;td&gt;サービス&lt;/td&gt;
&lt;td&gt;線形&lt;/td&gt;
&lt;td&gt;サービス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Responses API（デフォルト）&lt;/td&gt;
&lt;td&gt;サービス&lt;/td&gt;
&lt;td&gt;分岐型&lt;/td&gt;
&lt;td&gt;サービス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anthropic Claude, Ollama&lt;/td&gt;
&lt;td&gt;クライアント&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;td&gt;開発者&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="選び方"&gt;選び方&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;会話の分岐や「やり直し」が必要？&lt;/strong&gt; → サービス管理型のResponses API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;データ主権が必要？&lt;/strong&gt; → データベースバックドプロバイダーのクライアント管理型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;シンプルなチャットボット？&lt;/strong&gt; → サービス管理型の線形で十分&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/agent-framework/chat-history-storage-patterns-in-microsoft-agent-framework/"&gt;完全な記事&lt;/a&gt;で意思決定ツリー全体を確認してください。&lt;/p&gt;</content:encoded></item><item><title>Foundry Toolboxes: AIエージェントツールのための統一エンドポイント</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/</guid><description>Microsoft FoundryがToolboxesをパブリックプレビューで公開した。AIエージェントツールを単一のMCP互換エンドポイントで管理・公開するための仕組みだ。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元のバージョンは&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-toolboxes-curate-manage-tools-ai-agents/"&gt;こちら&lt;/a&gt;をクリックしてください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;退屈に聞こえるが実際に直面すると深刻な問題がある：組織が複数のAIエージェントを構築し、それぞれがツールを必要とし、各チームがゼロから設定している。同じWeb検索統合、同じAzure AI Searchの設定、同じGitHub MCPサーバーの接続 — でも別のリポジトリに、別のチームが、別の認証情報で、ガバナンスの共有なしに。&lt;/p&gt;
&lt;p&gt;Microsoft FoundryがPublic Previewで&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;Toolboxes&lt;/a&gt;を公開した。これはその問題への直接的な答えだ。&lt;/p&gt;
&lt;h2 id="toolboxとは"&gt;Toolboxとは&lt;/h2&gt;
&lt;p&gt;ToolboxはFoundryで一度定義し、単一のMCP互換エンドポイントを通じて公開する、名前付きの再利用可能なツールバンドルだ。MCPを話す任意のエージェントランタイムが消費できる — Foundry Agentsへのロックインはない。&lt;/p&gt;
&lt;p&gt;提案はシンプルだ：&lt;strong&gt;build once, consume anywhere&lt;/strong&gt;。ツールを定義し、認証を一元設定（OAuthパススルー、Entraマネージドアイデンティティ）し、エンドポイントを公開する。そのツールが必要な各エージェントはエンドポイントに接続して全てを取得する。&lt;/p&gt;
&lt;h2 id="4つの柱今日は2つが利用可能"&gt;4つの柱（今日は2つが利用可能）&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;柱&lt;/th&gt;
&lt;th&gt;ステータス&lt;/th&gt;
&lt;th&gt;何をするか&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Discover&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;近日公開&lt;/td&gt;
&lt;td&gt;手動検索なしで承認済みツールを発見&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Build&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;利用可能&lt;/td&gt;
&lt;td&gt;ツールを再利用可能なバンドルにまとめる&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Consume&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;利用可能&lt;/td&gt;
&lt;td&gt;単一MCPエンドポイントが全ツールを公開&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Govern&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;近日公開&lt;/td&gt;
&lt;td&gt;全ツール呼び出しの一元認証+可観測性&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="実践的な例"&gt;実践的な例&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.identity&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;FOUNDRY_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;toolbox_version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;beta&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toolboxes&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_toolbox_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;toolbox_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;customer-feedback-triaging-toolbox&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ドキュメントを検索し、GitHubのissueに対応する&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;web_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;description&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;公開ドキュメントを検索&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_search&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;index_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;internal-docs&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;mcp_server&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;server_url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://your-github-mcp-server.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;公開後、Foundryは統一エンドポイントを提供する。1回の接続で全ツールが使える。&lt;/p&gt;
&lt;h2 id="foundry-agentsへのロックインはない"&gt;Foundry Agentsへのロックインはない&lt;/h2&gt;
&lt;p&gt;ToolboxはFoundryで&lt;strong&gt;作成・管理&lt;/strong&gt;されるが、消費面はオープンなMCPプロトコルだ。Microsoft Agent FrameworkやLangGraphのカスタムエージェント、GitHub Copilotやその他のMCP対応IDE、あらゆるMCPランタイムから使用できる。&lt;/p&gt;
&lt;h2 id="今なぜ重要か"&gt;今なぜ重要か&lt;/h2&gt;
&lt;p&gt;マルチエージェントの波が本番環境に到達している。新しいエージェントが増えるたびに、重複した設定、古い認証情報、一貫性のない動作の新たな表面が生まれる。Build + Consumeの基盤は集中化を始めるには十分だ。Governの柱が来た時、エージェント全体に完全に可観測で一元管理されたツール層が得られる。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;まだ早い段階だ — パブリックプレビュー、Python SDK優先。しかし、モデルは確かで、MCPネイティブな設計は既に構築しているツールで機能することを意味する。&lt;a href="https://devblogs.microsoft.com/foundry/introducing-toolboxes-in-foundry/"&gt;公式発表&lt;/a&gt;で詳細を確認しよう。&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: ターミナルからF5デバッグとエージェント向けUIオートメーション</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3では、ターミナルからデバッグ起動できるwinapp run、UIオートメーション機能のwinapp ui、そしてパッケージアプリでdotnet runを使えるNuGetパッケージが追加されました。</description><content:encoded>&lt;p&gt;&lt;em&gt;この投稿は自動翻訳されました。元の記事は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;こちら&lt;/a&gt;をクリックしてください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Visual StudioのF5体験は素晴らしいです。しかし、パッケージ化されたWindowsアプリを起動してデバッグするためだけにVSを開くのは、CIパイプライン、自動化ワークフロー、またはAIエージェントがテストを実行しているときには過剰です。&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3が&lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;リリースされ&lt;/a&gt;、2つの主要機能でこれに直接対応します：&lt;code&gt;winapp run&lt;/code&gt;と&lt;code&gt;winapp ui&lt;/code&gt;です。&lt;/p&gt;
&lt;h2 id="winapp-run-どこからでもf5"&gt;winapp run: どこからでもF5&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt;はアンパッケージのアプリフォルダーとマニフェストを受け取り、VSがデバッグ起動時に行うすべてを実行します：ルーズパッケージを登録し、アプリを起動し、再デプロイ間で&lt;code&gt;LocalState&lt;/code&gt;を保持します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# アプリをビルドし、パッケージアプリとして実行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;WinUI、WPF、WinForms、コンソール、Avaloniaなどで動作します。各モードは開発者と自動化ワークフローの両方を想定しています：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: 起動後すぐにターミナルに制御を返します。CI/自動化に最適です。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: アプリ終了時に登録済みパッケージを削除します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: &lt;code&gt;OutputDebugString&lt;/code&gt;メッセージと例外をリアルタイムでキャプチャします。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="新しいnugetパッケージ-パッケージアプリ向けdotnet-run"&gt;新しいNuGetパッケージ: パッケージアプリ向けdotnet run&lt;/h2&gt;
&lt;p&gt;.NET開発者向けに新しいNuGetパッケージが登場しました：&lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;。インストール後は、&lt;code&gt;dotnet run&lt;/code&gt;がインナーループ全体を処理します：ビルド、ルーズレイアウトパッケージの準備、Windowsへの登録、起動 — すべて1ステップで。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# または&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui-コマンドラインからuiオートメーション"&gt;winapp ui: コマンドラインからUIオートメーション&lt;/h2&gt;
&lt;p&gt;エージェント型シナリオを切り開くのがこの機能です。&lt;code&gt;winapp ui&lt;/code&gt;はターミナルから、実行中のあらゆるWindowsアプリ（WPF、WinForms、Win32、Electron、WinUI3）への完全なUIオートメーションアクセスを提供します。&lt;/p&gt;
&lt;p&gt;できること：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべてのトップレベルウィンドウを一覧表示&lt;/li&gt;
&lt;li&gt;ウィンドウの完全なUIオートメーションツリーをナビゲート&lt;/li&gt;
&lt;li&gt;名前、タイプ、オートメーションIDで要素を検索&lt;/li&gt;
&lt;li&gt;クリック、呼び出し、値の設定&lt;/li&gt;
&lt;li&gt;スクリーンショットの取得&lt;/li&gt;
&lt;li&gt;要素の表示を待機 — テスト同期に最適&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;winapp ui&lt;/code&gt;と&lt;code&gt;winapp run&lt;/code&gt;を組み合わせると、ターミナルから完全なビルド→起動→検証ワークフローが実現します。エージェントがアプリを実行し、UIの状態を検査し、プログラムで操作して結果を検証できます。&lt;/p&gt;
&lt;h2 id="その他の新機能"&gt;その他の新機能&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: テスト終了後にサイドロードされたパッケージを削除します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: ターミナルからアプリ名で起動できるエイリアスを追加します。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;タブ補完&lt;/strong&gt;: 1つのコマンドでPowerShell補完を設定します。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="インストール方法"&gt;インストール方法&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# または&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;CLIはパブリックプレビュー中です。完全なドキュメントは&lt;a href="https://github.com/microsoft/WinAppCli"&gt;GitHubリポジトリ&lt;/a&gt;を、すべての詳細は&lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;元のアナウンス&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.117：エージェントが専用のGitブランチを持つようになった、これは最高だ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/</guid><description>VS Code 1.117はエージェントセッションのworktree分離、永続的なAutopilotモード、サブエージェントサポートを搭載。エージェント型コーディングワークフローがさらに本格的になった。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-117-agents-autopilot-worktrees/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;「AIアシスタント」と「AIチームメイト」の境界線はどんどん薄くなっている。VS Code 1.117がリリースされ、&lt;a href="https://code.visualstudio.com/updates/v1_117"&gt;完全なリリースノート&lt;/a&gt;は盛りだくさんだが、ストーリーは明確だ：エージェントが開発ワークフローのファーストクラスの市民になりつつある。&lt;/p&gt;
&lt;p&gt;本当に重要なことはこれだ。&lt;/p&gt;
&lt;h2 id="autopilotモードがついに設定を記憶するように"&gt;Autopilotモードがついに設定を記憶するように&lt;/h2&gt;
&lt;p&gt;以前は、新しいセッションを開始するたびにAutopilotを再度有効にする必要があった。面倒だった。今では権限モードがセッション間で保持され、デフォルトも設定できる。&lt;/p&gt;
&lt;p&gt;Agent Hostは3つのセッション設定をサポートしている：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Default&lt;/strong&gt; — ツールは実行前に確認を求める&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass&lt;/strong&gt; — すべてを自動承認する&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilot&lt;/strong&gt; — 完全自律型、自分の質問に答えて作業を続ける&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;.NETプロジェクトをマイグレーション、Docker、CIと一緒にスキャフォールディングするなら、Autopilotに一度設定すればあとは忘れていい。その設定はそのまま維持される。&lt;/p&gt;
&lt;h2 id="エージェントセッションのworktreeとgit分離"&gt;エージェントセッションのworktreeとgit分離&lt;/h2&gt;
&lt;p&gt;これが本命だ。エージェントセッションが完全なworktreeとgit分離をサポートするようになった。つまり、エージェントがタスクに取り組むとき、専用のブランチと作業ディレクトリが割り当てられる。メインブランチは一切影響を受けない。&lt;/p&gt;
&lt;p&gt;さらに良いことに、Copilot CLIがこれらのworktreeセッションに意味のあるブランチ名を生成してくれる。もう&lt;code&gt;agent-session-abc123&lt;/code&gt;は終わりだ。エージェントが何をしているかを実際に説明する名前が付けられる。&lt;/p&gt;
&lt;p&gt;複数のフィーチャーブランチを管理したり、長いスキャフォールディングタスクの実行中にバグを修正している.NET開発者にとって、これはゲームチェンジャーだ。あるworktreeでエージェントにAPIコントローラーを構築させながら、別のworktreeでサービスレイヤーの問題をデバッグできる。コンフリクトなし。スタッシュなし。混乱なし。&lt;/p&gt;
&lt;h2 id="サブエージェントとエージェントチーム"&gt;サブエージェントとエージェントチーム&lt;/h2&gt;
&lt;p&gt;Agent Host Protocolがサブエージェントをサポートするようになった。エージェントがタスクの一部を処理するために他のエージェントを起動できる。委任と考えればいい — メインエージェントが調整し、専門エージェントが各部分を担当する。&lt;/p&gt;
&lt;p&gt;まだ初期段階だが、.NETワークフローへの可能性は明らかだ。あるエージェントがEF Coreのマイグレーションを処理し、別のエージェントが統合テストをセットアップする姿を想像してみてほしい。まだ完全には到達していないが、プロトコルサポートが今入ったということは、ツールもすぐに続くということだ。&lt;/p&gt;
&lt;h2 id="エージェントが入力を送信するとターミナル出力が自動的に含まれるように"&gt;エージェントが入力を送信するとターミナル出力が自動的に含まれるように&lt;/h2&gt;
&lt;p&gt;小さいが意味がある。エージェントがターミナルに入力を送信すると、ターミナル出力が自動的にコンテキストに含まれるようになった。以前は、エージェントが何が起きたかを読むために余分なターンが必要だった。&lt;/p&gt;
&lt;p&gt;エージェントが&lt;code&gt;dotnet build&lt;/code&gt;を実行し、失敗し、エラーを確認するためだけにもう一回往復するのを見たことがあるなら — そのフリクションはなくなった。出力を即座に確認して反応する。&lt;/p&gt;
&lt;h2 id="macosのagentsアプリが自動更新に"&gt;macOSのAgentsアプリが自動更新に&lt;/h2&gt;
&lt;p&gt;macOSのスタンドアロンAgentsアプリが自動更新されるようになった。新しいバージョンを手動でダウンロードする必要はもうない。常に最新の状態が保たれる。&lt;/p&gt;
&lt;h2 id="知っておく価値のある小さなこと"&gt;知っておく価値のある小さなこと&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;package.jsonのホバー&lt;/strong&gt;がインストール済みバージョンと最新の利用可能なバージョンの両方を表示するようになった。.NETプロジェクトと一緒にnpmツールを管理している場合に便利。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JSDocコメント内の画像&lt;/strong&gt;がホバーや補完で正しくレンダリングされるようになった。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLIセッション&lt;/strong&gt;がVS Codeで作成されたか外部で作成されたかを表示するようになった — ターミナル間を行き来するときに便利。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Copilot CLI、Claude Code、Gemini CLI&lt;/strong&gt;がシェルタイプとして認識されるようになった。エディタが何を実行しているか把握している。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;VS Code 1.117は派手な機能のダンプではない。インフラだ。worktree分離、永続的な権限、サブエージェントプロトコル — これらは、エージェントがコードを踏むことなく実際の並列タスクを処理するワークフローのための基盤だ。&lt;/p&gt;
&lt;p&gt;.NETで開発していてエージェント型ワークフローにまだ踏み込んでいないなら、正直、今が始めるときだ。&lt;/p&gt;</content:encoded></item><item><title>AzureでのAI実験がお金を燃やしている — その解決方法はこちら</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/</guid><description>AzureでのAIワークロードはすぐに高額になりがちです。開発スピードを落とさずにコストをコントロールするために、実際に効果がある方法についてお話しします。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/cloud-cost-optimization-ai-workloads-azure/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今AzureでAI搭載アプリを構築しているなら、おそらく気づいていることがあるでしょう：クラウドの請求書が以前と違って見えるということです。単に高くなっただけではなく、不思議な感じです。スパイクがあり、予測が難しい。&lt;/p&gt;
&lt;p&gt;Microsoftが&lt;a href="https://azure.microsoft.com/en-us/blog/cloud-cost-optimization-principles-that-still-matter/"&gt;今でも重要なクラウドコスト最適化の原則&lt;/a&gt;に関する素晴らしい記事を公開しました。正直なところ、これ以上ないタイミングです。なぜなら、AIワークロードがコストに関するゲームのルールを変えてしまったからです。&lt;/p&gt;
&lt;h2 id="aiワークロードが違う理由"&gt;AIワークロードが違う理由&lt;/h2&gt;
&lt;p&gt;ポイントはこうです。従来の.NETワークロードは比較的予測可能です。App Serviceのティアを把握し、SQLのDTUを把握し、月々の支出をかなり正確に見積もることができます。AIワークロードは？そうはいきません。&lt;/p&gt;
&lt;p&gt;どのモデルが合うか、複数のモデルをテストしています。ファインチューニングのためにGPUバックのインフラを立ち上げています。Azure OpenAIへのAPI呼び出しでは、プロンプトの長さやユーザーの行動によってトークン消費量が大きく変動します。すべての実験に実際のコストがかかり、正しいアプローチにたどり着くまでに何十回も実行することになるかもしれません。&lt;/p&gt;
&lt;p&gt;この予測不可能性こそが、コスト最適化を重要にする理由です — 後から考えるのではなく、初日から。&lt;/p&gt;
&lt;h2 id="管理と最適化--違いを知る"&gt;管理と最適化 — 違いを知る&lt;/h2&gt;
&lt;p&gt;記事の中で開発者が見落としがちだと思う区別があります：コスト&lt;em&gt;管理&lt;/em&gt;とコスト&lt;em&gt;最適化&lt;/em&gt;には違いがあるということです。&lt;/p&gt;
&lt;p&gt;管理はトラッキングとレポーティングです。Azure Cost Managementで予算を設定し、アラートを受け取り、ダッシュボードを見ます。これは基本中の基本です。&lt;/p&gt;
&lt;p&gt;最適化は実際に意思決定を行うところです。本当にそのS3ティアが必要ですか、それともS1で負荷に対応できますか？常時稼働のコンピューティングインスタンスが週末に何もしていませんか？トレーニングジョブにスポットインスタンスを使えませんか？&lt;/p&gt;
&lt;p&gt;.NET開発者として、私たちはコードに集中し、インフラの決定を「運用チーム」に任せがちです。しかし、Azureにデプロイしているなら、それらの決定はあなたの決定でもあるのです。&lt;/p&gt;
&lt;h2 id="実際に効果があること"&gt;実際に効果があること&lt;/h2&gt;
&lt;p&gt;記事と自分自身の経験に基づいて、これが実際に効果を生むことです：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;何にいくら使っているか把握する。&lt;/strong&gt; リソースにタグを付けてください。本当に。どのプロジェクトや実験が予算を食っているかわからなければ、何も最適化できません。適切なタグ付けを行ったAzure Cost Managementが最強の味方です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;実験する前にガードレールを設置する。&lt;/strong&gt; Azure Policyを使って、dev/test環境で高価なSKUを制限しましょう。Azure OpenAIデプロイメントに支出上限を設定しましょう。誰かが週末にGPUクラスターを動かしっぱなしにしていたことに請求書が届いてから気づく、なんてことは避けましょう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;継続的にライトサイジングする。&lt;/strong&gt; プロトタイピング中に選んだVM？本番環境にはおそらく合っていません。Azure Advisorが推奨事項を提示してくれます — 実際に確認してください。年に一度ではなく、月に一度レビューしましょう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ライフサイクルを考える。&lt;/strong&gt; 開発リソースはシャットダウンすべきです。テスト環境は24時間365日稼働する必要はありません。自動シャットダウンポリシーを使いましょう。AIワークロードについては特に、コンピューティングを常時稼働させる代わりに実行ごとに課金されるサーバーレスオプションを検討しましょう。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;コストだけでなく価値を測定する。&lt;/strong&gt; これは忘れがちです。コストは高いけれど大幅に優れた結果を出すモデルが正しい選択かもしれません。目標は最小限の支出ではなく、賢い支出です。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;クラウドコスト最適化は一度きりのクリーンアップではありません。習慣です。AIワークロードによって支出がかつてないほど予測しにくくなっている今、この習慣を早くから身につけることで、後の痛い驚きを避けることができます。&lt;/p&gt;
&lt;p&gt;Azureで構築している.NET開発者なら、クラウドの請求書をコードと同じように扱い始めましょう — 定期的にレビューし、散らかってきたらリファクタリングし、コストを理解せずにデプロイしないようにしましょう。&lt;/p&gt;</content:encoded></item><item><title>FoundryのRFTがより安く、よりスマートに — 変更点まとめ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/</guid><description>Microsoft Foundryが今月3つのRFTアップデートをリリース：o4-miniのグローバルトレーニング、新しいGPT-4.1モデルグレーダー、そしてデバッグ時間を大幅に節約できるベストプラクティスガイド。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-fine-tuning-april-2026-rft-graders/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ファインチューニングされたモデルに依存する.NETアプリを開発しているなら、今月のFoundryアップデートは注目に値します。Reinforcement Fine-Tuningがより利用しやすく、大幅に安くなりました。&lt;/p&gt;
&lt;p&gt;詳細は&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-foundry-finetune-april-2026/"&gt;公式発表&lt;/a&gt;にありますが、ここでは実用的なポイントをまとめます。&lt;/p&gt;
&lt;h2 id="o4-miniのグローバルトレーニング"&gt;o4-miniのグローバルトレーニング&lt;/h2&gt;
&lt;p&gt;o4-miniは推論重視のワークロードやエージェント型ワークロードに最適なモデルです。大きなニュース：13以上のAzureリージョンからファインチューニングジョブを起動でき、Standardトレーニングと比較してトークンあたりのトレーニングコストが低くなりました。同じインフラ、同じ品質、より広い対応範囲。&lt;/p&gt;
&lt;p&gt;チームが複数の地域に分散している場合、これは重要です。トレーニングのために少数のリージョンに縛られることはもうありません。&lt;/p&gt;
&lt;p&gt;グローバルトレーニングジョブを開始するREST APIコールはこちらです：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST &lt;span class="s2"&gt;&amp;#34;https://&amp;lt;your-resource&amp;gt;.openai.azure.com/openai/fine_tuning/jobs?api-version=2025-04-01-preview&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -H &lt;span class="s2"&gt;&amp;#34;api-key: &lt;/span&gt;&lt;span class="nv"&gt;$AZURE_OPENAI_API_KEY&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -d &lt;span class="s1"&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;model&amp;#34;: &amp;#34;o4-mini&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;training_file&amp;#34;: &amp;#34;&amp;lt;your-training-file-id&amp;gt;&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;method&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;type&amp;#34;: &amp;#34;reinforcement&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;reinforcement&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;grader&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;type&amp;#34;: &amp;#34;string_check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;name&amp;#34;: &amp;#34;answer-check&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;input&amp;#34;: &amp;#34;{{sample.output_text}}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;reference&amp;#34;: &amp;#34;{{item.reference_answer}}&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;operation&amp;#34;: &amp;#34;eq&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;hyperparameters&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;n_epochs&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;compute_multiplier&amp;#34;: 1.0
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; &amp;#34;trainingType&amp;#34;: &amp;#34;globalstandard&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s1"&gt; }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この&lt;code&gt;trainingType: globalstandard&lt;/code&gt;フラグが重要な違いです。&lt;/p&gt;
&lt;h2 id="新しいモデルグレーダーgpt-41ファミリー"&gt;新しいモデルグレーダー：GPT-4.1ファミリー&lt;/h2&gt;
&lt;p&gt;グレーダーはモデルが最適化する報酬シグナルを定義します。これまで、モデルベースのグレーダーは限られたモデルセットに制約されていました。今回、GPT-4.1、GPT-4.1-mini、GPT-4.1-nanoの3つの新しいオプションが追加されました。&lt;/p&gt;
&lt;p&gt;決定的グレーダーの代わりにモデルグレーダーを使うべきなのはどんな時でしょうか？タスクの出力がオープンエンドの場合、複数の次元で部分的なスコアリングが必要な場合、またはツール呼び出しの正確さがセマンティックコンテキストに依存するエージェント型ワークフローを構築している場合です。&lt;/p&gt;
&lt;p&gt;ポイントは、ティアリング戦略が実用的であること：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-nano&lt;/strong&gt; 初期のイテレーション用。低コスト、高速なフィードバックループ。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1-mini&lt;/strong&gt; 評価ルーブリックが安定し、より高い精度が必要になったら。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GPT-4.1&lt;/strong&gt; 本番環境の評価や、すべてのスコアリング判断が重要な複雑なルーブリック用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;単一のRFTジョブでグレーダータイプを混在させることもできます。「正解」の次元にはstring-matchを使い、推論品質の評価にはモデルグレーダーを使う。この柔軟性が、実際のワークロードで本当に役立つ理由です。&lt;/p&gt;
&lt;h2 id="rftデータフォーマットの落とし穴"&gt;RFTデータフォーマットの落とし穴&lt;/h2&gt;
&lt;p&gt;ここでつまずく人が多いです。RFTのデータフォーマットはSFTとは異なります。各行の最後のメッセージはUserまたはDeveloperロールでなければなりません — Assistantではありません。期待される回答は、グレーダーが直接参照する&lt;code&gt;reference_answer&lt;/code&gt;のようなトップレベルのキーに入れます。&lt;/p&gt;
&lt;p&gt;これまでSupervised Fine-Tuningを行っていてRFTに切り替えたい場合は、トレーニングデータを再構築する必要があります。このステップを飛ばすと、ジョブがサイレントに失敗します。&lt;/p&gt;
&lt;h2 id="net開発者にとってなぜ重要か"&gt;.NET開発者にとってなぜ重要か&lt;/h2&gt;
&lt;p&gt;Azure OpenAI SDKを通じて.NETアプリからファインチューニングされたモデルを呼び出している場合、トレーニングコストの低下はより積極的にイテレーションできることを意味します。モデルグレーダーのオプションにより、完全一致シナリオだけでなく、ニュアンスのあるタスクに対してファインチューニングが可能になります。そして&lt;a href="https://github.com/microsoft-foundry/fine-tuning/blob/main/Demos/Agentic_RFT_PrivatePreview/RFT_Best_Practice.md"&gt;GitHub&lt;/a&gt;のベストプラクティスガイドは、実際のデバッグ時間を節約してくれます。&lt;/p&gt;
&lt;p&gt;小さく始めましょう。10から100サンプル。シンプルなグレーダー。ループを検証。そしてスケール。&lt;/p&gt;</content:encoded></item><item><title>Global Azure Spain 2026</title><link>https://thedotnetblog.com/ja/events/global-azure-spain-2026/</link><pubDate>Sat, 18 Apr 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/ja/events/global-azure-spain-2026/</guid><description>スペイン最大のAzureコミュニティイベント — Azure、AI、データ、セキュリティ、クラウドネイティブ開発に関する1日セッション、38名のスピーカー、3トラック。</description><content:encoded>&lt;p&gt;Global Azure Spain 2026 は &lt;strong&gt;2026年4月18日&lt;/strong&gt; にマドリード、Alcobendas の &lt;strong&gt;Kinépolis Diversia&lt;/strong&gt; で開催されます。スペイン最大のコミュニティ主導のAzureイベントで、AIエージェント、Azureネットワーク、Cosmos DB、Fabric、IoT、セキュリティなどをカバーする3つの並行トラックに38名のスピーカーが登壇します。&lt;/p&gt;
&lt;p&gt;イベントは &lt;strong&gt;08:30 から 18:30&lt;/strong&gt; まで開催され、キーノート、コーヒーブレイク、ランチ、クロージングQ&amp;amp;Aセッションを含みます。&lt;/p&gt;
&lt;h2 id="アジェンダのハイライト"&gt;アジェンダのハイライト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Domando Agentes de IA&lt;/strong&gt;: Azure AI FoundryとAzure API Managementによるガバナンス、ツール、API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Construyendo agentes con LibreChat en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How Can I Steal Your Data with Azure Private Endpoints&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stop Building APIs. Forge Agents with Azure&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agentic DevOps Meets IoT: Real-Time Systems with Fabric and GitHub Copilot&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;El regreso de los tamagotchis!&lt;/strong&gt;: マルチエージェントシステムの実践&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Control Plane como plataforma de Agentes global&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Rompiendo el perímetro: Zero Trust aplicado en Azure&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="チケット"&gt;チケット&lt;/h2&gt;
&lt;p&gt;登録は象徴的な寄付です — チケット代金は全額 &lt;strong&gt;Plan International&lt;/strong&gt; に寄付され、世界中の子どもの権利と平等を支援します。定員に限りがありますので、お早めにお申し込みください。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.eventbrite.es/e/entradas-global-azure-spain-2026-en-madrid-1981594189564"&gt;Eventbriteでチケットを取得&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://globalazure.es/"&gt;イベントサイト&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="azure-tour-2026"&gt;Azure Tour 2026&lt;/h2&gt;
&lt;p&gt;マドリード以外にも、Global Azure Tour 2026 は &lt;strong&gt;サラゴサ&lt;/strong&gt;、&lt;strong&gt;テネリフェ&lt;/strong&gt;、&lt;strong&gt;セビリア&lt;/strong&gt; でも開催されます。&lt;/p&gt;</content:encoded></item><item><title>Docker Sandboxで、Copilotエージェントがマシンをリスクにさらさずにコードをリファクタリングできるようになった</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/</guid><description>Docker SandboxはGitHub Copilotエージェントにセキュアなマイクロ VMを提供し、許可プロンプトなし、ホストへのリスクなしで自由にリファクタリングできる環境を実現します。大規模な.NETモダナイゼーションにとって、これがなぜゲームチェンジャーなのかを解説します。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/copilot-docker-sandbox-agentic-refactoring/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Copilotのエージェントモードを小さな編集以上のことに使ったことがあるなら、あの煩わしさは知っているはずです。ファイルへの書き込みのたびに、ターミナルコマンドのたびに、また許可プロンプト。これを50プロジェクトで想像してみてください。楽しくないですよね。&lt;/p&gt;
&lt;p&gt;Azureチームが&lt;a href="https://devblogs.microsoft.com/all-things-azure/best-of-both-worlds-for-agentic-refactoring-github-copilot-microvms-via-docker-sandbox/"&gt;GitHub CopilotエージェントのためのDocker Sandbox&lt;/a&gt;に関する記事を公開しました。正直に言って、これはエージェンティックツーリングで見た中で最も実用的な改善の一つです。マイクロVMを使ってCopilotに完全に隔離された環境を提供し、パッケージのインストール、ビルドの実行、テストの実行まで、ホストシステムに一切触れずに自由に作業できます。&lt;/p&gt;
&lt;h2 id="docker-sandboxが実際に提供するもの"&gt;Docker Sandboxが実際に提供するもの&lt;/h2&gt;
&lt;p&gt;コアのアイデアはシンプルです：完全なLinux環境を持つ軽量なマイクロVMを起動し、ワークスペースをその中に同期させ、Copilotエージェントを内部で自由に動かす。完了したら変更が同期されて戻ってくる。&lt;/p&gt;
&lt;p&gt;単なる「コンテナ内で実行する」以上のものにしているポイントはこちらです：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双方向ワークスペース同期&lt;/strong&gt;で絶対パスが保持されます。プロジェクト構造はサンドボックス内でも同一に見えます。パス関連のビルドエラーはありません。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;プライベートDockerデーモン&lt;/strong&gt;がマイクロVM内で稼働。エージェントはホストのDockerソケットをマウントすることなくコンテナのビルドと実行が可能です。セキュリティ面で大きな進歩です。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/HTTPSフィルタリングプロキシ&lt;/strong&gt;がエージェントのネットワークアクセスを制御。どのレジストリとエンドポイントを許可するかはあなたが決められます。サンドボックス内の悪意ある&lt;code&gt;npm install&lt;/code&gt;によるサプライチェーン攻撃？ブロックされます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;YOLOモード&lt;/strong&gt; — はい、本当にそう呼ばれています。エージェントは許可プロンプトなしで実行されます。なぜなら、文字通りホストを壊すことができないからです。すべての破壊的アクションが封じ込められています。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="net開発者が注目すべき理由"&gt;.NET開発者が注目すべき理由&lt;/h2&gt;
&lt;p&gt;今まさに多くのチームが直面しているモダナイゼーション作業を考えてみてください。30プロジェクトを含む.NET Frameworkソリューションがあり、.NET 9に移行する必要がある。数百のファイル変更が必要です — プロジェクトファイル、名前空間の更新、APIの置き換え、NuGetの移行。&lt;/p&gt;
&lt;p&gt;Docker Sandboxを使えば、CopilotエージェントをプロジェクトにポイントしてマイクロVM内で自由にリファクタリングさせ、&lt;code&gt;dotnet build&lt;/code&gt;と&lt;code&gt;dotnet test&lt;/code&gt;で検証し、実際に動作する変更だけを受け入れることができます。実験中にローカル開発環境を誤って壊してしまうリスクはありません。&lt;/p&gt;
&lt;p&gt;記事では&lt;strong&gt;並列エージェントのフリート&lt;/strong&gt;の運用も説明されています — それぞれが独自のサンドボックスで、異なるプロジェクトに同時に取り組みます。大規模な.NETソリューションやマイクロサービスアーキテクチャにとって、これは膨大な時間の節約になります。サービスごとに1エージェント、すべて隔離して実行、すべて独立して検証。&lt;/p&gt;
&lt;h2 id="セキュリティの観点が重要"&gt;セキュリティの観点が重要&lt;/h2&gt;
&lt;p&gt;多くの人が見落としているポイントがあります：AIエージェントに任意のコマンドの実行を許可するということは、マシン全体を信頼して預けるということです。Docker Sandboxはそのモデルを逆転させます。エージェントは使い捨て環境内で完全な自律性を得ます。ネットワークプロキシが承認されたソースからのみダウンロードできることを保証します。ホストのファイルシステム、Dockerデーモン、認証情報は手つかずのままです。&lt;/p&gt;
&lt;p&gt;コンプライアンス要件を持つチーム — そしてそれはほとんどのエンタープライズ.NET企業に当てはまります — にとって、これは「エージェンティックAIは使えない」と「安全に導入できる」の違いです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Docker Sandboxはエージェンティックコーディングの根本的なジレンマを解決します：エージェントは有用であるために自由が必要ですが、ホストマシンでの自由は危険です。マイクロVMは両方を実現します。大規模な.NETリファクタリングやモダナイゼーションを計画しているなら、今すぐセットアップする価値があります。Copilotのコードインテリジェンスとセキュアな実行環境の組み合わせは、まさにプロダクションチームが待ち望んでいたものです。&lt;/p&gt;</content:encoded></item><item><title>AzureでAIエージェントをどこにホストすべき？実践的な判断ガイド</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/</guid><description>Azureには生のコンテナからフルマネージドのFoundry Hosted Agentsまで、AIエージェントをホストする6つの方法があります。.NETワークロードに最適なものを選ぶ方法を解説します。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。オリジナル版は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-ai-agent-hosting-options-guide/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今.NETでAIエージェントを構築しているなら、おそらく気づいていることがあるでしょう：Azureでホストする方法が&lt;em&gt;たくさん&lt;/em&gt;あるということです。Container Apps、AKS、Functions、App Service、Foundry Agents、Foundry Hosted Agents — どれも合理的に聞こえますが、実際に選ぶ段階になると困ります。Microsoftが&lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;AzureでのAIエージェントホスティングに関する包括的なガイド&lt;/a&gt;を公開しました。これを.NET開発者の実践的な視点から整理します。&lt;/p&gt;
&lt;h2 id="6つのオプション早見表"&gt;6つのオプション早見表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;オプション&lt;/th&gt;
&lt;th&gt;最適な用途&lt;/th&gt;
&lt;th&gt;管理するもの&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Container Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;K8sの複雑さなしにコンテナを完全制御&lt;/td&gt;
&lt;td&gt;オブザーバビリティ、状態、ライフサイクル&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AKS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;エンタープライズコンプライアンス、マルチクラスター、カスタムネットワーキング&lt;/td&gt;
&lt;td&gt;すべて（それがポイント）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Azure Functions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;イベント駆動の短時間エージェントタスク&lt;/td&gt;
&lt;td&gt;ほぼなし — 真のサーバーレス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App Service&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;シンプルなHTTPエージェント、予測可能なトラフィック&lt;/td&gt;
&lt;td&gt;デプロイ、スケーリング設定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;ポータル/SDKによるコード不要エージェント&lt;/td&gt;
&lt;td&gt;ほぼなし&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Foundry Hosted Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;マネージドインフラでカスタムフレームワークエージェント&lt;/td&gt;
&lt;td&gt;エージェントコードのみ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;最初の4つは汎用コンピュートです — エージェントを動かす&lt;em&gt;ことはできます&lt;/em&gt;が、そのために設計されたものではありません。最後の2つはエージェントネイティブで、会話、ツール呼び出し、エージェントのライフサイクルをファーストクラスの概念として理解しています。&lt;/p&gt;
&lt;h2 id="foundry-hosted-agents--netエージェント開発者にとってのスイートスポット"&gt;Foundry Hosted Agents — .NETエージェント開発者にとってのスイートスポット&lt;/h2&gt;
&lt;p&gt;注目すべきはこれです。Foundry Hosted Agentsはちょうど中間に位置しています：自分のコード（Semantic Kernel、Agent Framework、LangGraph — 何でも）を実行する柔軟性がありながら、プラットフォームがインフラ、オブザーバビリティ、会話管理を処理します。&lt;/p&gt;
&lt;p&gt;キーピースは&lt;strong&gt;Hosting Adapter&lt;/strong&gt;です — エージェントフレームワークをFoundryプラットフォームに接続する薄い抽象化レイヤーです。Microsoft Agent Frameworkの場合：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.agentserver.agentframework&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;from_agent_framework&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ChatAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;chat_client&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;AzureAIAgentClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;get_local_time&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;from_agent_framework&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これがホスティングの全体像です。アダプターがプロトコル変換、server-sent eventsによるストリーミング、会話履歴、OpenTelemetryトレーシングを自動的に処理します。カスタムミドルウェアも手動の配管作業も不要です。&lt;/p&gt;
&lt;h2 id="デプロイは本当にシンプル"&gt;デプロイは本当にシンプル&lt;/h2&gt;
&lt;p&gt;以前Container Appsにエージェントをデプロイしたことがありますが、状態管理やオブザーバビリティのためのグルーコードをたくさん書くことになります。Hosted Agentsと&lt;code&gt;azd&lt;/code&gt;なら：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# AIエージェント拡張機能をインストール&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ext install azure.ai.agents
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# テンプレートから初期化&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# ビルド、プッシュ、デプロイ — 完了&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;この1つの&lt;code&gt;azd up&lt;/code&gt;がコンテナをビルドし、ACRにプッシュし、Foundryプロジェクトをプロビジョニングし、モデルエンドポイントをデプロイし、エージェントを起動します。5つのステップが1つのコマンドに凝縮されています。&lt;/p&gt;
&lt;h2 id="組み込みの会話管理"&gt;組み込みの会話管理&lt;/h2&gt;
&lt;p&gt;本番で最も時間を節約するのはここです。独自の会話ステートストアを構築する代わりに、Hosted Agentsがネイティブに処理します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 永続的な会話を作成&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 最初のターン&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Remember: my favorite number is 42.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2回目のターン — コンテキストが保持される&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;response2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;MyAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Multiply my favorite number by 10.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Redisなし。Cosmos DBセッションストアなし。メッセージシリアライゼーション用のカスタムミドルウェアなし。プラットフォームがすべて処理します。&lt;/p&gt;
&lt;h2 id="私の判断フレームワーク"&gt;私の判断フレームワーク&lt;/h2&gt;
&lt;p&gt;6つすべてのオプションを検討した結果、私のクイックメンタルモデルはこうです：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;インフラゼロが必要？&lt;/strong&gt; → Foundry Agents（ポータル/SDK、コンテナなし）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;カスタムエージェントコードがあるがマネージドホスティングが欲しい？&lt;/strong&gt; → Foundry Hosted Agents&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;イベント駆動の短期エージェントタスクが必要？&lt;/strong&gt; → Azure Functions&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8sなしで最大限のコンテナ制御が必要？&lt;/strong&gt; → Container Apps&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;厳格なコンプライアンスとマルチクラスターが必要？&lt;/strong&gt; → AKS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;予測可能なトラフィックのシンプルなHTTPエージェント？&lt;/strong&gt; → App Service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Semantic KernelやMicrosoft Agent Frameworkで構築しているほとんどの.NET開発者にとって、Hosted Agentsが適切なスタート地点でしょう。scale-to-zero、組み込みOpenTelemetry、会話管理、フレームワークの柔軟性が得られます — Kubernetesの管理やオブザーバビリティスタックの構築なしに。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;AzureのエージェントホスティングランドスケープはFastに成熟しています。今日新しいAIエージェントプロジェクトを始めるなら、習慣でContainer AppsやAKSに手を伸ばす前に、Foundry Hosted Agentsを真剣に検討することをお勧めします。マネージドインフラは実際の時間を節約し、hosting adapterパターンでフレームワークの選択を維持できます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/all-things-azure/hostedagent/"&gt;Microsoftの完全ガイド&lt;/a&gt;と&lt;a href="https://github.com/microsoft-foundry/foundry-samples/tree/main/samples/python/hosted-agents"&gt;Foundry Samplesリポジトリ&lt;/a&gt;で動作するサンプルを確認してください。&lt;/p&gt;</content:encoded></item><item><title>.NETのAgent Skillsが本気で柔軟になった</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</link><pubDate>Tue, 14 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/</guid><description>Microsoft Agent Frameworkがスキルの作成方法を3つサポート — ファイル、クラス、インラインコード — すべて単一のプロバイダーで構成可能に。なぜこれが重要なのか、それぞれの使い方を解説します。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agent-skills-dotnet-three-authoring-patterns/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Microsoft Agent Frameworkでエージェントを構築しているなら、流れは分かっているはずです：スキルを定義し、プロバイダーに接続し、エージェントにどれを呼び出すか判断させる。新しいのはスキルの&lt;em&gt;作り方&lt;/em&gt;であり、柔軟性の向上は大きなものです。&lt;/p&gt;
&lt;p&gt;最新のアップデートでは、エージェントスキルの3つのオーサリングパターンが導入されました：&lt;strong&gt;ファイルベース&lt;/strong&gt;、&lt;strong&gt;クラスベース&lt;/strong&gt;、&lt;strong&gt;インラインコード定義&lt;/strong&gt;。3つすべてが単一の &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt; に接続されるため、ルーティングロジックや特別なグルーコードなしで自由に組み合わせることができます。それぞれのパターンと、いつ使うべきかを説明します。&lt;/p&gt;
&lt;h2 id="ファイルベースのスキル出発点"&gt;ファイルベースのスキル：出発点&lt;/h2&gt;
&lt;p&gt;ファイルベースのスキルはそのままの意味です — &lt;code&gt;SKILL.md&lt;/code&gt;ファイル、オプションのスクリプト、参照ドキュメントを含むディスク上のディレクトリです。エージェントに新しい能力を与える最もシンプルな方法です：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;skills/
└── onboarding-guide/
├── SKILL.md
├── scripts/
│ └── check-provisioning.py
└── references/
└── onboarding-checklist.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt;のフロントマターでスキル名と説明を宣言し、指示セクションでスクリプトと参照の使い方をエージェントに伝えます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;name: onboarding-guide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;description: &amp;gt;-
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Walk new hires through their first-week setup checklist.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="gu"&gt;## Instructions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;1.&lt;/span&gt; Ask for the employee&amp;#39;s name and start date.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;2.&lt;/span&gt; Run &lt;span class="sb"&gt;`scripts/check-provisioning.py`&lt;/span&gt; to verify accounts.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;3.&lt;/span&gt; Walk through &lt;span class="sb"&gt;`references/onboarding-checklist.md`&lt;/span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;4.&lt;/span&gt; Follow up on incomplete items.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そして &lt;code&gt;SubprocessScriptRunner.RunAsync&lt;/code&gt; でスクリプト実行を接続します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;ChatClientAgentOptions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HRAgent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ChatOptions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are a helpful HR assistant.&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AIContextProviders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;skillsProvider&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;deploymentName&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントは自動的にスキルを発見し、アカウントステータスを確認する必要があるときにプロビジョニングスクリプトを呼び出します。クリーンでシンプルです。&lt;/p&gt;
&lt;h2 id="クラスベースのスキルnugetで配布"&gt;クラスベースのスキル：NuGetで配布&lt;/h2&gt;
&lt;p&gt;ここからがチームにとって面白いところです。クラスベースのスキルは &lt;code&gt;AgentClassSkill&amp;lt;T&amp;gt;&lt;/code&gt; から派生し、&lt;code&gt;[AgentSkillResource]&lt;/code&gt; や &lt;code&gt;[AgentSkillScript]&lt;/code&gt; などの属性を使用して、フレームワークがリフレクションですべてを発見します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BenefitsEnrollmentSkill&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentClassSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="n"&gt;AgentSkillFrontmatter&lt;/span&gt; &lt;span class="n"&gt;Frontmatter&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;benefits-enrollment&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Enroll an employee in health, dental, or vision plans.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;protected&lt;/span&gt; &lt;span class="kd"&gt;override&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Instructions&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Read&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;plans&lt;/span&gt; &lt;span class="n"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Confirm&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;plan&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;wants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;enroll&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;complete&lt;/span&gt; &lt;span class="n"&gt;enrollment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [AgentSkillResource(&amp;#34;available-plans&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;Plan options with monthly pricing.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;AvailablePlans&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="err"&gt;##&lt;/span&gt; &lt;span class="n"&gt;Available&lt;/span&gt; &lt;span class="n"&gt;Plans&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Health&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="n"&gt;HMO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Premium&lt;/span&gt; &lt;span class="n"&gt;PPO&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;45&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Dental&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Standard&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;12&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;Enhanced&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;25&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;Vision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="m"&gt;8&lt;/span&gt;&lt;span class="p"&gt;/&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [AgentSkillScript(&amp;#34;enroll&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [Description(&amp;#34;Enrolls employee in the specified benefit plan.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Enroll&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;planCode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EnrollInPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;planCode&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;素晴らしいのは、チームがこれをNuGetパッケージとしてパッケージ化できることです。プロジェクトに追加し、ビルダーに入れるだけで、ファイルベースのスキルと一緒に調整なしで動作します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;両方のスキルがエージェントのシステムプロンプトに表示されます。エージェントは会話に基づいてどちらを使うか判断します — ルーティングコードは不要です。&lt;/p&gt;
&lt;h2 id="インラインスキル素早いブリッジ"&gt;インラインスキル：素早いブリッジ&lt;/h2&gt;
&lt;p&gt;別のチームがまさに必要なスキルを構築しているけど、次のスプリントまで完成しない、あの瞬間を知っていますか？&lt;code&gt;AgentInlineSkill&lt;/code&gt; があなたのブリッジです：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;timeOffSkill&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentInlineSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;time-off-balance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Calculate remaining vacation and sick days.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;1.&lt;/span&gt; &lt;span class="n"&gt;Ask&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;employee&lt;/span&gt; &lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="n"&gt;provided&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;2.&lt;/span&gt; &lt;span class="n"&gt;Use&lt;/span&gt; &lt;span class="n"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;3.&lt;/span&gt; &lt;span class="n"&gt;Present&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="n"&gt;days&lt;/span&gt; &lt;span class="n"&gt;clearly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;&amp;#34;&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddScript&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;calculate-balance&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetAnnualAllowance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HrDatabase&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetDaysUsed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;JsonSerializer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Serialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;employeeId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;leaveType&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;totalDays&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;daysUsed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remaining&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;他のスキルと同じようにビルダーに追加します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;NuGetパッケージが最終的にリリースされたら、インラインスキルをクラスベースのバージョンに交換するだけです。エージェントは違いに気づきません。&lt;/p&gt;
&lt;p&gt;ただし、インラインスキルはブリッジだけのものではありません。ランタイムで動的にスキルを生成する必要がある場合 — 設定からロードされるビジネスユニットごとのスキルを考えてみてください — やスクリプトがDIコンテナに属さないローカルステートをキャプチャする必要がある場合にも適切な選択です。&lt;/p&gt;
&lt;h2 id="スクリプト承認ヒューマンインザループ"&gt;スクリプト承認：ヒューマンインザループ&lt;/h2&gt;
&lt;p&gt;本番エージェントを構築する.NET開発者にとって、これがデプロイメントの議論を本当に前進させる部分です。一部のスクリプトには実際の影響があります — 誰かを福利厚生に登録する、本番インフラを照会する。&lt;code&gt;UseScriptApproval&lt;/code&gt; を有効にすると、エージェントはスクリプト実行前に一時停止します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;skillsProvider&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AgentSkillsProviderBuilder&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;AppContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BaseDirectory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;skills&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;BenefitsEnrollmentSkill&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseSkill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;timeOffSkill&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseFileScriptRunner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubprocessScriptRunner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UseScriptApproval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントがスクリプトを実行したいとき、代わりに承認リクエストを返します。アプリが判断を収集し — 承認または拒否 — エージェントはそれに応じて続行します。規制環境では、これが「デプロイできる」と「法務がノーと言っている」の違いです。&lt;/p&gt;
&lt;h2 id="なぜこの組み合わせが重要なのか"&gt;なぜこの組み合わせが重要なのか&lt;/h2&gt;
&lt;p&gt;本当の力は個々のパターンにあるのではなく、構成にあります。以下が可能になります：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ファイルベースのスキルで&lt;strong&gt;小さく始めて&lt;/strong&gt;、指示を反復し、C#を書かずに公開する&lt;/li&gt;
&lt;li&gt;他のチームが1行で追加できるNuGetパッケージとして&lt;strong&gt;再利用可能なスキルを配布&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;何か&lt;em&gt;今すぐ&lt;/em&gt;必要なときにインラインスキルで&lt;strong&gt;ギャップを埋める&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;エージェントが必要なものだけをロードするようにプレディケートで&lt;strong&gt;共有ディレクトリをフィルタリング&lt;/strong&gt;する&lt;/li&gt;
&lt;li&gt;本番システムに触れるスクリプトに&lt;strong&gt;人間の監視を追加&lt;/strong&gt;する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これらすべてが &lt;code&gt;AgentSkillsProviderBuilder&lt;/code&gt; を通じて構成されます。特別なルーティングなし、条件ロジックなし、スキルタイプチェックなし。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;.NETのエージェントスキルは、真に柔軟なオーサリングモデルを手に入れました。ファイルベースのスキルでプロトタイピングするソロ開発者であろうと、NuGet経由でパッケージ化された機能を配布するエンタープライズチームであろうと、パターンは適合します。そしてスクリプト承認メカニズムにより、人間のチェックポイントが必要な環境でも本番対応できます。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/agent-framework/agent-skills-in-net-three-ways-to-author-one-provider-to-run-them/"&gt;オリジナルの発表&lt;/a&gt;、Microsoft Learnの&lt;a href="https://learn.microsoft.com/en-us/agent-framework/agents/skills"&gt;Agent Skillsドキュメント&lt;/a&gt;、GitHubの&lt;a href="https://github.com/microsoft/agent-framework/tree/main/dotnet/samples/02-agents/AgentSkills"&gt;.NETサンプル&lt;/a&gt;をチェックして始めましょう。&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 がリリース — セルフホスト型エージェンティック クラウド オートメーションがここに</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 は、セルフホスト型のリモート展開、57 の Azure サービス全体で 276 のツール、エンタープライズグレードのセキュリティを備え、安定版となりました。エージェンティック ワークフローを構築する .NET 開発者にとって重要な点をここに紹介します。</description><content:encoded>&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。オリジナル版は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;最近 MCP と Azure で何かを構築している人なら、ローカル環境での体験がうまく機能していることはご存じでしょう。MCP サーバーを接続して、AI エージェントが Azure リソースと通信できるようにして、先へ進む。しかし、その設定をチーム全体で共有する必要が出た瞬間？そこが複雑になっていました。&lt;/p&gt;
&lt;p&gt;もうそんなことはありません。Azure MCP Server が &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;2.0 安定版をリリース&lt;/a&gt;し、見出し機能はまさにエンタープライズ チームが要望していたものです：&lt;strong&gt;セルフホスト型リモート MCP サーバー サポート&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="azure-mcp-server-とは"&gt;Azure MCP Server とは？&lt;/h2&gt;
&lt;p&gt;簡単なおさらいです。Azure MCP Server は &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; 仕様を実装し、Azure 機能を構造化された検出可能なツールとして公開します。AI エージェントがこれらを呼び出せます。これをエージェントと Azure 間の標準化された橋と考えてください — プロビジョニング、デプロイメント、監視、診断、すべて 1 つの一貫したインターフェース経由で。&lt;/p&gt;
&lt;p&gt;数字を見ればわかります：&lt;strong&gt;57 の Azure サービス全体で 276 の MCP ツール&lt;/strong&gt;。これは本格的なカバレッジです。&lt;/p&gt;
&lt;h2 id="大きな変化セルフホスト型リモート展開"&gt;大きな変化：セルフホスト型リモート展開&lt;/h2&gt;
&lt;p&gt;ここが重要な点です。ローカルでマシン上で MCP を実行することは開発と実験には問題ありませんが、実際のチーム シナリオでは以下が必要です：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;開発者と内部エージェント システム向けの共有アクセス&lt;/li&gt;
&lt;li&gt;集中管理構成（テナント コンテキスト、サブスクリプション デフォルト、テレメトリ）&lt;/li&gt;
&lt;li&gt;エンタープライズ ネットワークとポリシー境界&lt;/li&gt;
&lt;li&gt;CI/CD パイプラインへの統合&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 はこれらすべてに対応しています。HTTP ベースのトランスポート、適切な認証、一貫した統治を備えた集中管理内部サービスとしてデプロイできます。&lt;/p&gt;
&lt;p&gt;認証には 2 つの確実なオプションがあります：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;マネージド ID&lt;/strong&gt; — &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt; と並行して実行している場合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Behalf-Of（OBO）フロー&lt;/strong&gt; — サインインしたユーザーのコンテキストを使用して Azure API を呼び出す OpenID Connect 委譲&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;この OBO フロー は .NET 開発者にとって特に興味深いものです。これは、エージェンティック ワークフローが過度な特権を持つサービス アカウントではなく、ユーザーの実際のアクセス許可で動作できることを意味します。最小権限の原則が組み込まれています。&lt;/p&gt;
&lt;h2 id="セキュリティの強化"&gt;セキュリティの強化&lt;/h2&gt;
&lt;p&gt;これは単なる機能リリースではなく、セキュリティ リリースでもあります。2.0 リリースは以下を追加します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;より強いエンドポイント検証&lt;/li&gt;
&lt;li&gt;クエリ指向ツールのインジェクション パターンに対する保護&lt;/li&gt;
&lt;li&gt;開発環境用のより厳密な分離制御&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MCP を共有サービスとして公開する場合、これらのセーフガードは重要です。本当に重要です。&lt;/p&gt;
&lt;h2 id="どこで使用できますか"&gt;どこで使用できますか？&lt;/h2&gt;
&lt;p&gt;クライアント互換性の状況は幅広いです。Azure MCP Server 2.0 は以下で動作します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDE&lt;/strong&gt;：VS Code、Visual Studio、IntelliJ、Eclipse、Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLI エージェント&lt;/strong&gt;：GitHub Copilot CLI、Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;スタンドアロン&lt;/strong&gt;：シンプルなセットアップ用のローカル サーバー&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セルフホスト型リモート&lt;/strong&gt;：2.0 の新しいスター&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;さらに、Azure US Government と 21Vianet が運用する Azure のソブリン クラウド サポートもあります。これは規制対象のデプロイメントに重要です。&lt;/p&gt;
&lt;h2 id="net-開発者にとってこれが重要な理由"&gt;.NET 開発者にとってこれが重要な理由&lt;/h2&gt;
&lt;p&gt;.NET でエージェンティック アプリケーションを構築している場合 — Semantic Kernel、Microsoft Agent Framework、または独自のオーケストレーションのいずれであっても — Azure MCP Server 2.0 は、エージェントが Azure インフラストラクチャと対話するための本番環境対応の方法を提供します。カスタム REST ラッパーは不要です。サービス固有の統合パターンは不要です。MCP があるだけです。&lt;/p&gt;
&lt;p&gt;数日前にドロップされた &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;MCP Apps 向けの Fluent API&lt;/a&gt; と組み合わせると、.NET MCP エコシステムは急速に成熟しています。&lt;/p&gt;
&lt;h2 id="はじめに"&gt;はじめに&lt;/h2&gt;
&lt;p&gt;パスを選択してください：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp"&gt;GitHub リポジトリ&lt;/a&gt;&lt;/strong&gt; — ソース コード、ドキュメント、すべて&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Docker イメージ&lt;/a&gt;&lt;/strong&gt; — コンテナ化されたデプロイメント&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;VS Code 拡張機能&lt;/a&gt;&lt;/strong&gt; — IDE 統合&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;セルフホスティング ガイド&lt;/a&gt;&lt;/strong&gt; — 2.0 の旗艦機能&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 は、デモでは派手に見えないけれど、実際には万能を変えるようなインフラストラクチャ アップグレードです。適切な認証、セキュリティ強化、ソブリン クラウド サポートを備えたセルフホスト型リモート MCP は、Azure でエージェンティック ワークフローを構築している実際のチームに MCP が対応していることを示しています。「エンタープライズ対応」シグナルを待っていたなら — これです。&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2はあなたのAIエージェントの親友になりたがっている</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2がエージェンティック開発に全力投球 — 構造化されたCLI出力、分離実行、自動修復環境、そして完全なOpenTelemetryデータにより、AIエージェントがアプリを実際にビルド、実行、観察できるようになります。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;AIコーディングエージェントがしっかりしたコードを書いて興奮した後、実際にそれを&lt;em&gt;実行&lt;/em&gt;しようとした途端に全てが崩壊する瞬間、知っていますか？ポート競合、ゴーストプロセス、間違った環境変数 — 突然エージェントが機能を構築する代わりに起動トラブルシューティングにトークンを消費し始めます。&lt;/p&gt;
&lt;p&gt;Aspireチームがまさにこの問題について&lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;非常によく考えられた記事&lt;/a&gt;を公開しました。彼らの答えは説得力があります：Aspire 13.2は人間だけでなく、AIエージェントのためにも設計されています。&lt;/p&gt;
&lt;h2 id="問題は現実のもの"&gt;問題は現実のもの&lt;/h2&gt;
&lt;p&gt;AIエージェントはコードを書くのに驚異的です。しかし、動作するフルスタックアプリを出荷するには、ファイルを生成する以上のことが必要です。正しい順序でサービスを起動し、ポートを管理し、環境変数を設定し、データベースを接続し、何かが壊れた時にフィードバックを得る必要があります。現在、ほとんどのエージェントはこれらすべてを試行錯誤で処理しています — コマンドを実行し、エラー出力を読み、再試行します。&lt;/p&gt;
&lt;p&gt;Markdownの指示、カスタムスキル、プロンプトを重ねてガイドしようとしますが、それらは予測不可能で、コンパイルできず、パースするだけでトークンがかかります。Aspireチームは本質的な洞察を突きました：エージェントには&lt;strong&gt;コンパイラと構造化されたAPI&lt;/strong&gt;が必要であり、もっとMarkdownではありません。&lt;/p&gt;
&lt;h2 id="エージェントインフラとしてのaspire"&gt;エージェントインフラとしてのAspire&lt;/h2&gt;
&lt;p&gt;Aspire 13.2がエージェンティック開発にもたらすもの：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;スタック全体を型付きコードで。&lt;/strong&gt; AppHostがアプリの完全なトポロジー — API、フロントエンド、データベース、キャッシュ — をコンパイル可能なTypeScriptまたはC#で定義します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントはこれを読んでアプリのトポロジーを理解し、リソースを追加し、接続を配線し、&lt;em&gt;検証のためにビルド&lt;/em&gt;できます。コンパイラが何か間違っていればすぐに教えてくれます。推測不要、設定ファイルでの試行錯誤不要です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;すべてを支配する一つのコマンド。&lt;/strong&gt; エージェントが&lt;code&gt;docker compose up&lt;/code&gt;、&lt;code&gt;npm run dev&lt;/code&gt;、データベース起動スクリプトをジャグリングする代わりに、すべてが&lt;code&gt;aspire start&lt;/code&gt;だけ。すべてのリソースが正しい順序で、正しいポートで、正しい設定で起動します。長時間実行プロセスもエージェントをハングさせません — Aspireが管理します。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;並列エージェント用の分離モード。&lt;/strong&gt; &lt;code&gt;--isolated&lt;/code&gt;を使えば、各Aspire実行が独自のランダムポートと分離されたユーザーシークレットを取得します。複数のエージェントがgit worktreeで作業している？衝突しません。これはVS Codeのバックグラウンドエージェントのような並列環境を立ち上げるツールにとって非常に重要です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;テレメトリによるエージェントの目。&lt;/strong&gt; ここが本当に強力になるところです。Aspire CLIは開発中に完全なOpenTelemetryデータを公開します — トレース、メトリクス、構造化ログ。エージェントはコンソール出力を読んで最善を祈るだけではありません。サービス間で失敗したリクエストをトレースし、遅いエンドポイントをプロファイリングし、問題の正確な箇所を特定できます。開発ループにプロダクショングレードの可観測性があるのです。&lt;/p&gt;
&lt;h2 id="ボウリングのバンパーの例え"&gt;ボウリングのバンパーの例え&lt;/h2&gt;
&lt;p&gt;Aspireチームは素晴らしい例えを使っています：AspireをAIエージェントのためのボウリングレーンのバンパーだと思ってください。エージェントが完璧でない場合（そして完璧にはなりません）、バンパーがガーターに落ちるのを防ぎます。スタック定義が誤設定を防ぎ、コンパイラがエラーをキャッチし、CLIがプロセス管理を行い、テレメトリがフィードバックループを提供します。&lt;/p&gt;
&lt;p&gt;これをPlaywright CLIのようなものと組み合わせれば、エージェントは実際にアプリを&lt;em&gt;使う&lt;/em&gt;ことができます — フローをクリックし、DOMをチェックし、テレメトリで壊れた箇所を見つけ、コードを修正し、再起動してテストし直す。ビルド、実行、観察、修正。これが私たちが追い求めてきた自律的な開発ループです。&lt;/p&gt;
&lt;h2 id="始め方"&gt;始め方&lt;/h2&gt;
&lt;p&gt;Aspire初心者？&lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt;からCLIをインストールし、&lt;a href="https://aspire.dev/get-started/first-app"&gt;入門ガイド&lt;/a&gt;に従ってください。&lt;/p&gt;
&lt;p&gt;すでにAspireを使っている？&lt;code&gt;aspire update --self&lt;/code&gt;で13.2を取得し、お気に入りのコーディングエージェントをリポジトリに向けてください。Aspireのガードレールがあることで、エージェントがどれだけ先まで進めるか驚くかもしれません。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Aspire 13.2はもはや単なる分散アプリフレームワークではありません — 不可欠なエージェントインフラになりつつあります。構造化されたスタック定義、ワンコマンド起動、分離された並列実行、リアルタイムテレメトリが、AIエージェントにコードを書くことからアプリを出荷することへ移行するために必要なものを提供します。&lt;/p&gt;
&lt;p&gt;Aspireチームの&lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;完全な記事&lt;/a&gt;ですべての詳細とデモ動画をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>Azure FunctionsのMCPサーバーをFoundryエージェントに接続する方法</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>MCPサーバーを一度構築し、Azure Functionsにデプロイして、適切な認証付きでMicrosoft Foundryエージェントに接続。ツールはどこでも動作します — VS Code、Cursor、そして今やエンタープライズAIエージェントでも。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MCPエコシステムで私が大好きなことがあります：サーバーを一度構築すれば、どこでも動作するということです。VS Code、Visual Studio、Cursor、ChatGPT — すべてのMCPクライアントがあなたのツールを発見して使用できます。そして今、Microsoftはそのリストにもう一つの消費者を追加しています：Foundryエージェントです。&lt;/p&gt;
&lt;p&gt;Azure SDKチームのLily Maが、Azure FunctionsにデプロイされたMCPサーバーをMicrosoft Foundryエージェントに接続する&lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;実践ガイドを公開&lt;/a&gt;しました。すでにMCPサーバーをお持ちなら、これは純粋な付加価値です — 再構築は不要です。&lt;/p&gt;
&lt;h2 id="この組み合わせが理にかなう理由"&gt;この組み合わせが理にかなう理由&lt;/h2&gt;
&lt;p&gt;Azure Functionsは、MCPサーバーのホスティングにスケーラブルなインフラ、組み込みの認証、サーバーレス課金を提供します。Microsoft Foundryは、推論、計画、行動ができるAIエージェントを提供します。この2つを接続すると、カスタムツール — データベースのクエリ、ビジネスAPIの呼び出し、バリデーションロジックの実行 — がエンタープライズAIエージェントが自律的に発見して使用できる機能になります。&lt;/p&gt;
&lt;p&gt;重要なポイント：MCPサーバーはそのままです。Foundryをもう一つの消費者として追加するだけです。VS Codeのセットアップで動作している同じツールが、チームや顧客が対話するAIエージェントを動かすようになります。&lt;/p&gt;
&lt;h2 id="認証オプション"&gt;認証オプション&lt;/h2&gt;
&lt;p&gt;ここが記事の真価が発揮されるところです。シナリオに応じた4つの認証方法：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;方法&lt;/th&gt;
&lt;th&gt;ユースケース&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;キーベース&lt;/strong&gt;（デフォルト）&lt;/td&gt;
&lt;td&gt;開発またはEntra認証なしのサーバー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;マネージドIDによる本番環境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OAuthアイデンティティパススルー&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;各ユーザーが個別に認証する本番環境&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;認証なし&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;開発/テストまたは公開データのみ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;本番環境では、エージェントIDを使用したMicrosoft Entraが推奨パスです。OAuthアイデンティティパススルーは、ユーザーコンテキストが重要な場合に使用します — エージェントがユーザーにサインインを求め、各リクエストがユーザー自身のトークンを運びます。&lt;/p&gt;
&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;
&lt;p&gt;大まかな流れ：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;MCPサーバーをAzure Functionsにデプロイ&lt;/strong&gt; — &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;、Python、TypeScript、Javaのサンプルが利用可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Function Appで組み込みMCP認証を有効化&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;エンドポイントURLを取得&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FoundryにMCPサーバーをツールとして追加&lt;/strong&gt; — ポータルでエージェントに移動し、新しいMCPツールを追加、エンドポイントとクレデンシャルを提供&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;その後、Agent Builderのプレイグラウンドでツールをトリガーするプロンプトを送信してテストします。&lt;/p&gt;
&lt;h2 id="私の見解"&gt;私の見解&lt;/h2&gt;
&lt;p&gt;ここでのコンポーザビリティの話は本当に強力になっています。MCPサーバーを.NET（またはPython、TypeScript、Java）で一度構築し、Azure Functionsにデプロイすれば、すべてのMCP互換クライアントが使用できます — コーディングツール、チャットアプリ、そして今やエンタープライズAIエージェント。実際に機能する「一度書いて、どこでも使う」パターンです。&lt;/p&gt;
&lt;p&gt;特に.NET開発者にとって、&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;Azure Functions MCP拡張機能&lt;/a&gt;がこれを簡単にしてくれます。ツールをAzure Functionsとして定義し、デプロイすれば、Azure Functionsが提供するすべてのセキュリティとスケーリングを備えた本番グレードのMCPサーバーが手に入ります。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Azure FunctionsでMCPツールを実行している場合、Foundryエージェントへの接続はクイックウィンです — カスタムツールが適切な認証付きでエンタープライズAI機能になり、サーバー自体のコード変更は不要です。&lt;/p&gt;
&lt;p&gt;各認証方法のステップバイステップの手順は&lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;完全ガイド&lt;/a&gt;を、本番セットアップについては&lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;詳細ドキュメント&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>MCP AppsにFluent APIが登場 — .NETでリッチなAIツールUIを3ステップで構築</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>Azure Functions上のMCP Apps向け新しいFluent設定APIにより、あらゆる.NET MCPツールをビュー、パーミッション、CSPポリシーを備えた完全なアプリに、わずか数行のコードで変換できます。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;MCPツールはAIエージェントに機能を与えるのに最適です。でも、ツールがユーザーに何かを表示する必要がある場合はどうでしょう？ ダッシュボード、フォーム、インタラクティブなビジュアライゼーション。そこで登場するのがMCP Appsで、構築がずっと簡単になりました。&lt;/p&gt;
&lt;p&gt;Azure SDKチームのLilian Kasemが、.NET Azure Functions上のMCP Apps向け&lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;新しいFluent設定APIを発表&lt;/a&gt;しました。なぜ最初からこんなにシンプルじゃなかったのかと思うような、開発者体験の改善です。&lt;/p&gt;
&lt;h2 id="mcp-appsとは"&gt;MCP Appsとは？&lt;/h2&gt;
&lt;p&gt;MCP AppsはModel Context Protocolを拡張し、ツールが独自のUIビュー、静的アセット、セキュリティコントロールを持てるようにします。テキストを返すだけでなく、MCPツールは完全なHTMLエクスペリエンスをレンダリングできます — インタラクティブなダッシュボード、データビジュアライゼーション、設定フォーム — すべてAIエージェントから呼び出し可能で、MCPクライアントを通じてユーザーに表示されます。&lt;/p&gt;
&lt;p&gt;問題は、これらを手動で配線するにはMCP仕様を深く理解する必要があったことです：&lt;code&gt;ui://&lt;/code&gt; URI、特殊なMIMEタイプ、ツールとリソース間のメタデータ調整。難しくはないけど、面倒でした。&lt;/p&gt;
&lt;h2 id="fluent-apiの3ステップ"&gt;Fluent APIの3ステップ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ステップ1：関数を定義する。&lt;/strong&gt; 標準的なAzure Functions MCPツール：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Function(nameof(HelloApp))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [McpToolTrigger(&amp;#34;HelloApp&amp;#34;, &amp;#34;A simple MCP App that says hello.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ToolInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello from app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ステップ2：MCP Appに昇格させる。&lt;/strong&gt; プログラムのスタートアップで：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureMcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HelloApp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsMcpApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/hello-app.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardWrite&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardRead&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowBaseUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;ステップ3：HTMLビューを追加する。&lt;/strong&gt; 必要なUIで&lt;code&gt;assets/hello-app.html&lt;/code&gt;を作成します。&lt;/p&gt;
&lt;p&gt;以上です。Fluent APIがMCPプロトコルの配管をすべて処理します — 合成リソース関数の生成、正しいMIMEタイプの設定、ツールとビューを接続するメタデータの注入。&lt;/p&gt;
&lt;h2 id="apiの設計が秀逸"&gt;APIの設計が秀逸&lt;/h2&gt;
&lt;p&gt;特に気に入っている点がいくつかあります：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ビューソースが柔軟。&lt;/strong&gt; ディスク上のファイルからHTMLを提供したり、自己完結型デプロイのためにリソースをアセンブリに直接埋め込んだりできます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/my-view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEmbeddedResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MyApp.Resources.view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;CSPがコンポーザブル。&lt;/strong&gt; 最小権限の原則に従い、アプリが必要とするオリジンを明示的に許可します。&lt;code&gt;WithCsp&lt;/code&gt;を複数回呼び出すとオリジンが蓄積されます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://api.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadResourcesFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://cdn.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://youtube.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;可視性制御。&lt;/strong&gt; ツールをLLMのみ、ホストUIのみ、または両方に表示できます。UIのみをレンダリングし、モデルから呼び出されるべきでないツールが欲しい場合は簡単：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpVisibility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// UI-only, hidden from the model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="始め方"&gt;始め方&lt;/h2&gt;
&lt;p&gt;プレビューパッケージを追加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;すでにAzure FunctionsでMCPツールを構築している場合、これはパッケージの更新だけです。コンセプトが初めての方は&lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;MCP Appsクイックスタート&lt;/a&gt;が最適な出発点です。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;MCP AppsはAIツーリング分野で最もエキサイティングな開発の一つです — 物事を&lt;em&gt;行う&lt;/em&gt;だけでなく、ユーザーに物事を&lt;em&gt;見せる&lt;/em&gt;ことができるツール。Fluent APIはプロトコルの複雑さを取り除き、重要なことに集中させてくれます：ツールのロジックとそのUI。&lt;/p&gt;
&lt;p&gt;完全なAPIリファレンスと例については&lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;完全な記事&lt;/a&gt;をお読みください。&lt;/p&gt;</content:encoded></item><item><title>Microsoft Foundry 2026年3月 — GPT-5.4、Agent Service GA、そしてすべてを変えるSDKリフレッシュ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/</guid><description>Microsoft Foundryの2026年3月アップデートは大規模：Agent ServiceがGAに到達、GPT-5.4が信頼性の高い推論を実現、azure-ai-projects SDKが全言語で安定版に、そしてFireworks AIがオープンモデルをAzureに提供。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/microsoft-foundry-march-2026-whats-new/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;毎月の「Microsoft Foundryの新着情報」記事は、通常インクリメンタルな改善と時折のヘッドライン機能の組み合わせです。&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;2026年3月版&lt;/a&gt;はどうでしょう？基本的にすべてがヘッドライン機能です。Foundry Agent ServiceがGAに、GPT-5.4が本番環境向けにリリース、SDKがメジャーな安定版リリースを受け、Fireworks AIがオープンモデル推論をAzureに提供します。.NET開発者にとって何が重要かを詳しく見ていきましょう。&lt;/p&gt;
&lt;h2 id="foundry-agent-serviceが本番環境対応に"&gt;Foundry Agent Serviceが本番環境対応に&lt;/h2&gt;
&lt;p&gt;これが最大のニュースです。次世代エージェントランタイムが一般提供開始されました — OpenAI Responses APIの上に構築され、OpenAIエージェントとワイヤー互換性があり、複数のプロバイダーのモデルに対応しています。今日Responses APIで構築している方は、Foundryに移行することでエンタープライズセキュリティ、プライベートネットワーキング、Entra RBAC、完全なトレーシング、そして既存のエージェントロジック上での評価が追加されます。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;project_client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;主な追加機能：エンドツーエンドのプライベートネットワーキング、MCP認証の拡張（OAuthパススルーを含む）、音声対音声エージェント向けVoice Liveプレビュー、6つの新リージョンでのホスティングエージェント。&lt;/p&gt;
&lt;h2 id="gpt-54--純粋な知性より信頼性"&gt;GPT-5.4 — 純粋な知性より信頼性&lt;/h2&gt;
&lt;p&gt;GPT-5.4はより賢くなることが目的ではありません。より信頼性が高くなることが目的です。長い対話での強力な推論、より良い指示への忠実度、ワークフロー中の障害の減少、そして統合されたコンピュータ使用機能。本番環境のエージェントにとって、その信頼性はベンチマークスコアよりもはるかに重要です。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;モデル&lt;/th&gt;
&lt;th&gt;価格（100万トークンあたり）&lt;/th&gt;
&lt;th&gt;最適な用途&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 (≤272K)&lt;/td&gt;
&lt;td&gt;$2.50 / $15 出力&lt;/td&gt;
&lt;td&gt;本番エージェント、コーディング、ドキュメントワークフロー&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Pro&lt;/td&gt;
&lt;td&gt;$30 / $180 出力&lt;/td&gt;
&lt;td&gt;深い分析、科学的推論&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 Mini&lt;/td&gt;
&lt;td&gt;コスト効率的&lt;/td&gt;
&lt;td&gt;分類、抽出、軽量なツール呼び出し&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;賢い戦略はルーティングです：GPT-5.4 Miniが高ボリューム・低レイテンシーの作業を処理し、GPT-5.4が推論の重いリクエストを担当します。&lt;/p&gt;
&lt;h2 id="sdkがついに安定版に"&gt;SDKがついに安定版に&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azure-ai-projects&lt;/code&gt; SDKが全言語で安定版をリリースしました — Python 2.0.0、JS/TS 2.0.0、Java 2.0.0、そして.NET 2.0.0（4月1日）。&lt;code&gt;azure-ai-agents&lt;/code&gt;の依存関係はなくなり、すべてが&lt;code&gt;AIProjectClient&lt;/code&gt;の下に統合されました。&lt;code&gt;pip install azure-ai-projects&lt;/code&gt;でインストールでき、パッケージは&lt;code&gt;openai&lt;/code&gt;と&lt;code&gt;azure-identity&lt;/code&gt;を直接の依存関係としてバンドルしています。&lt;/p&gt;
&lt;p&gt;.NET開発者にとって、これはFoundry全体の機能に対する単一のNuGetパッケージを意味します。別々のエージェントSDKを使い分ける必要はもうありません。&lt;/p&gt;
&lt;h2 id="fireworks-aiがオープンモデルをazureに提供"&gt;Fireworks AIがオープンモデルをAzureに提供&lt;/h2&gt;
&lt;p&gt;おそらくアーキテクチャ的に最も興味深い追加：Fireworks AIが毎日13兆以上のトークンを~180Kリクエスト/秒で処理し、Foundryを通じて利用可能になりました。DeepSeek V3.2、gpt-oss-120b、Kimi K2.5、MiniMax M2.5がローンチ時に利用可能です。&lt;/p&gt;
&lt;p&gt;本当の注目点は&lt;strong&gt;bring-your-own-weights&lt;/strong&gt; — サービングスタックを変更せずに、どこからでも量子化またはファインチューニングされた重みをアップロードできます。サーバーレスのペイパートークンまたはプロビジョニングされたスループットでデプロイ可能です。&lt;/p&gt;
&lt;h2 id="その他のハイライト"&gt;その他のハイライト&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Phi-4 Reasoning Vision 15B&lt;/strong&gt; — チャート、ダイアグラム、ドキュメントレイアウト向けのマルチモーダル推論&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Evaluations GA&lt;/strong&gt; — Azure Monitorに連携した継続的な本番モニタリング付きのすぐに使えるエバリュエーター&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Priority Processing&lt;/strong&gt;（プレビュー）— レイテンシーに敏感なワークロード向けの専用コンピュートレーン&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voice Live&lt;/strong&gt; — Foundryエージェントに直接接続する音声対音声ランタイム&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracing GA&lt;/strong&gt; — ソートとフィルター付きのエンドツーエンドエージェントトレース検査&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PromptFlowの非推奨化&lt;/strong&gt; — 2027年1月までにMicrosoft Framework Workflowsへの移行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;2026年3月はFoundryにとって転換点です。Agent Service GA、全言語での安定SDK、信頼性の高い本番エージェント向けGPT-5.4、そしてFireworks AIによるオープンモデル推論 — プラットフォームは本格的なワークロードに対応する準備が整っています。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/foundry/whats-new-in-microsoft-foundry-mar-2026/"&gt;完全なまとめ&lt;/a&gt;を読んで、&lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;最初のエージェントを構築&lt;/a&gt;して始めましょう。&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server — AIエージェントにデータベースアクセスを与える正しい方法</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/</guid><description>Data API builderのSQL MCP Serverは、スキーマを公開したりNL2SQLに頼ることなく、AIエージェントに安全で決定的なデータベースアクセスを提供します。RBAC、キャッシュ、マルチデータベース対応 — すべて組み込み済み。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/sql-mcp-server-data-api-builder/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;正直に言いましょう：今日利用可能なほとんどのデータベースMCPサーバーは恐ろしいものです。自然言語のクエリを受け取り、その場でSQLを生成し、本番データに対して実行します。何がうまくいかないでしょうか？（全部です。全部うまくいかない可能性があります。）&lt;/p&gt;
&lt;p&gt;Azure SQLチームが&lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;SQL MCP Serverを発表&lt;/a&gt;しましたが、根本的に異なるアプローチを取っています。Data API builder（DAB）2.0の機能として構築され、AIエージェントに構造化された決定的なデータベース操作アクセスを提供します — NL2SQLなし、スキーマの公開なし、そしてすべてのステップで完全なRBAC付き。&lt;/p&gt;
&lt;h2 id="なぜnl2sqlを使わないのか"&gt;なぜNL2SQLを使わないのか？&lt;/h2&gt;
&lt;p&gt;これが最も興味深い設計判断です。モデルは決定的ではなく、複雑なクエリは微妙なエラーを生み出す可能性が最も高いです。ユーザーがAIに生成してほしいと思う正にそのクエリが、非決定的に生成された場合に最も精査が必要なものでもあります。&lt;/p&gt;
&lt;p&gt;代わりに、SQL MCP Serverは&lt;strong&gt;NL2DAB&lt;/strong&gt;アプローチを使用します。エージェントはData API builderのエンティティ抽象化レイヤーと組み込みのクエリビルダーで作業し、正確で整形されたT-SQLを決定的に生成します。ユーザーにとっては同じ結果ですが、幻覚されたJOINや偶発的なデータ漏洩のリスクがありません。&lt;/p&gt;
&lt;h2 id="7つのツール700ではなく"&gt;7つのツール、700ではなく&lt;/h2&gt;
&lt;p&gt;SQL MCP Serverは、データベースのサイズに関係なく、正確に7つのDMLツールを公開します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;describe_entities&lt;/code&gt; — 利用可能なエンティティと操作を発見&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_record&lt;/code&gt; — 行を挿入&lt;/li&gt;
&lt;li&gt;&lt;code&gt;read_records&lt;/code&gt; — テーブルとビューをクエリ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_record&lt;/code&gt; — 行を変更&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete_record&lt;/code&gt; — 行を削除&lt;/li&gt;
&lt;li&gt;&lt;code&gt;execute_entity&lt;/code&gt; — ストアドプロシージャを実行&lt;/li&gt;
&lt;li&gt;&lt;code&gt;aggregate_records&lt;/code&gt; — 集計クエリ&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;これは賢明です。コンテキストウィンドウはエージェントの思考空間だからです。何百ものツール定義で氾濫させると、推論のための空間が減ります。7つの固定ツールは、エージェントを&lt;em&gt;ナビゲーション&lt;/em&gt;ではなく&lt;em&gt;思考&lt;/em&gt;に集中させ続けます。&lt;/p&gt;
&lt;p&gt;各ツールは個別に有効化・無効化できます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;runtime&amp;#34;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;path&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/mcp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;dml-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;describe-entities&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;create-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;read-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;update-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;delete-record&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;execute-entity&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;aggregate-records&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="3つのコマンドで開始"&gt;3つのコマンドで開始&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab init &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --database-type mssql &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --connection-string &lt;span class="s2"&gt;&amp;#34;@env(&amp;#39;sql_connection_string&amp;#39;)&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab add Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --source dbo.Customers &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --permissions &lt;span class="s2"&gt;&amp;#34;anonymous:*&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dab start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでCustomersテーブルを公開するSQL MCP Serverが稼働します。エンティティ抽象化レイヤーにより、名前やカラムにエイリアスを設定し、ロールごとにフィールドを制限し、エージェントが見るものを正確に制御できます — 内部スキーマの詳細を公開することなく。&lt;/p&gt;
&lt;h2 id="セキュリティストーリーは堅実"&gt;セキュリティストーリーは堅実&lt;/h2&gt;
&lt;p&gt;ここがData API builderの成熟さが活きるところです：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;あらゆるレイヤーでRBAC&lt;/strong&gt; — 各エンティティがどのロールが読み取り、作成、更新、削除できるか、どのフィールドが表示されるかを定義&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Azure Key Vault統合&lt;/strong&gt; — 接続文字列とシークレットを安全に管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Microsoft Entra + カスタムOAuth&lt;/strong&gt; — 本番グレードの認証&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content Security Policy&lt;/strong&gt; — エージェントは生のSQLではなく、制御されたコントラクトを通じてやり取り&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;スキーマの抽象化は特に重要です。内部テーブル名やカラム名はエージェントに露出しません。AI対話に意味のあるエンティティ、エイリアス、説明を定義します — データベースのERD図ではなく。&lt;/p&gt;
&lt;h2 id="マルチデータベースとマルチプロトコル"&gt;マルチデータベースとマルチプロトコル&lt;/h2&gt;
&lt;p&gt;SQL MCP ServerはMicrosoft SQL、PostgreSQL、Azure Cosmos DB、MySQLをサポートします。そしてDABの機能であるため、同じ設定からREST、GraphQL、MCPのエンドポイントを同時に取得できます。同じエンティティ定義、同じRBACルール、同じセキュリティ — 3つのプロトコルすべてで。&lt;/p&gt;
&lt;p&gt;DAB 2.0の自動設定は、データベースを検査して設定を動的に構築することもできます。迅速なプロトタイピングのために抽象化を減らしても良い場合に便利です。&lt;/p&gt;
&lt;h2 id="私の見解"&gt;私の見解&lt;/h2&gt;
&lt;p&gt;これがAIエージェント向けのエンタープライズデータベースアクセスのあるべき姿です。「ねぇLLM、SQLを書いてプロダクションにYOLO」ではなく。代わりに：明確に定義されたエンティティレイヤー、決定的なクエリ生成、各ステップでのRBAC、キャッシュ、モニタリング、テレメトリ。最高の意味で退屈です。&lt;/p&gt;
&lt;p&gt;.NET開発者にとって、統合ストーリーはクリーンです — DABは.NETツールで、MCP Serverはコンテナとして動作し、ほとんどの人がすでに使っているAzure SQLで機能します。データアクセスが必要なAIエージェントを構築しているなら、ここから始めましょう。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;SQL MCP Serverは無料、オープンソースで、どこでも動作します。AIエージェントに安全なデータベースアクセスを提供するためのMicrosoftの規範的アプローチです。始めるには&lt;a href="https://devblogs.microsoft.com/azure-sql/introducing-sql-mcp-server/"&gt;完全な記事&lt;/a&gt;と&lt;a href="https://aka.ms/sql/mcp"&gt;ドキュメント&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>ブラックボックスに感じないリアルタイムマルチエージェントUIを構築する</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/</guid><description>AG-UIとMicrosoft Agent Frameworkが連携し、マルチエージェントワークフローにリアルタイムストリーミング、人間の承認、エージェントの動作の完全な可視化を備えた本格的なフロントエンドを提供します。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/ag-ui-real-time-multi-agent-ui-maf/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;マルチエージェントシステムの問題点はこうです：デモでは信じられないほど素晴らしく見えます。3つのエージェントが作業を受け渡し、問題を解決し、意思決定を行う。でも実際のユーザーの前に置いてみると&amp;hellip;沈黙。回転するインジケーター。どのエージェントが何をしているのか、なぜシステムが停止しているのか分からない。これはプロダクトではありません — 信頼の問題です。&lt;/p&gt;
&lt;p&gt;Microsoft Agent Frameworkチームが、MAFワークフローと&lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UI&lt;/a&gt;を組み合わせる&lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;素晴らしいウォークスルー&lt;/a&gt;を公開しました。AG-UIはServer-Sent Eventsを介してエージェント実行イベントをフロントエンドにストリーミングするオープンプロトコルです。正直に言うと、これはまさに私たちに欠けていた架け橋です。&lt;/p&gt;
&lt;h2 id="net開発者にとって重要な理由"&gt;.NET開発者にとって重要な理由&lt;/h2&gt;
&lt;p&gt;AI搭載アプリを構築しているなら、おそらくこの壁にぶつかったことがあるでしょう。バックエンドのオーケストレーションは完璧に動作します — エージェント同士がタスクを受け渡し、ツールが実行され、意思決定が行われます。しかしフロントエンドは裏で何が起きているか全く分かりません。AG-UIは、エージェントイベント（&lt;code&gt;RUN_STARTED&lt;/code&gt;、&lt;code&gt;STEP_STARTED&lt;/code&gt;、&lt;code&gt;TOOL_CALL_*&lt;/code&gt;、&lt;code&gt;TEXT_MESSAGE_*&lt;/code&gt;など）をSSE経由でUIレイヤーに直接ストリーミングする標準プロトコルを定義することでこれを解決します。&lt;/p&gt;
&lt;p&gt;デモは3つのエージェントを使ったカスタマーサポートワークフローです：リクエストをルーティングするトリアージエージェント、金銭関連を処理する返金エージェント、そして交換を管理する注文エージェント。各エージェントは独自のツールを持ち、ハンドオフトポロジーは明示的に定義されています — 「プロンプトから推測する」ようなことはありません。&lt;/p&gt;
&lt;h2 id="ハンドオフトポロジーが真の主役"&gt;ハンドオフトポロジーが真の主役&lt;/h2&gt;
&lt;p&gt;私の目を引いたのは、&lt;code&gt;HandoffBuilder&lt;/code&gt;でエージェント間の有向ルーティンググラフを宣言できることです：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;HandoffBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;participants&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;termination_condition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;termination_condition&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Refunds, damaged-item claims...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement, exchange...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;refund&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Replacement logistics needed after refund.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_handoff&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;triage&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;After replacement/shipping tasks complete.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;各&lt;code&gt;add_handoff&lt;/code&gt;は自然言語の説明付きの有向エッジを作成します。フレームワークはこのトポロジーに基づいて各エージェントのハンドオフツールを生成します。つまり、ルーティングの決定はオーケストレーション構造に基づいており、LLMの気分次第ではありません。これは本番環境の信頼性にとって非常に大きな意味があります。&lt;/p&gt;
&lt;h2 id="本当に機能するhuman-in-the-loop"&gt;本当に機能するHuman-in-the-loop&lt;/h2&gt;
&lt;p&gt;デモでは、実際のエージェントアプリに必要な2つの割り込みパターンを紹介しています：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ツール承認割り込み&lt;/strong&gt; — エージェントが&lt;code&gt;approval_mode=&amp;quot;always_require&amp;quot;&lt;/code&gt;とマークされたツールを呼び出すと、ワークフローが一時停止してイベントを発行します。フロントエンドはツール名と引数を含む承認モーダルをレンダリングします。トークンを消費するリトライループはありません — クリーンな一時停止-承認-再開フローです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;情報リクエスト割り込み&lt;/strong&gt; — エージェントがユーザーからより多くのコンテキスト（注文IDなど）を必要とする場合、一時停止して質問します。フロントエンドが質問を表示し、ユーザーが回答し、実行は停止した箇所からそのまま再開されます。&lt;/p&gt;
&lt;p&gt;両方のパターンは標準のAG-UIイベントとしてストリーミングされるため、フロントエンドはエージェントごとのカスタムロジックを必要としません — SSE接続を通じて届くイベントをそのまま表示するだけです。&lt;/p&gt;
&lt;h2 id="接続は驚くほど簡単"&gt;接続は驚くほど簡単&lt;/h2&gt;
&lt;p&gt;MAFとAG-UIの統合は単一の関数呼び出しで完了します：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;agent_framework.ag_ui&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;add_agent_framework_fastapi_endpoint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;FastAPI&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;demo_workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;AgentFrameworkWorkflow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;workflow_factory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;_thread_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;create_handoff_workflow&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;ag_ui_handoff_workflow_demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;add_agent_framework_fastapi_endpoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;demo_workflow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;/handoff_demo&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;workflow_factory&lt;/code&gt;はスレッドごとに新しいワークフローを作成し、各会話が分離された状態を持ちます。エンドポイントはすべてのSSE配管を自動的に処理します。すでにFastAPIを使っている（または軽量レイヤーとして追加できる）なら、ほぼゼロフリクションです。&lt;/p&gt;
&lt;h2 id="私の見解"&gt;私の見解&lt;/h2&gt;
&lt;p&gt;私たち.NET開発者にとって、すぐに浮かぶ質問は「C#でできるのか？」です。Agent Frameworkは.NETとPythonの両方で利用可能で、AG-UIプロトコルは言語に依存しません（ただのSSEです）。この特定のデモはPythonとFastAPIを使用していますが、パターンは直接転用できます。同じAG-UIイベントスキーマに従ったSSEエンドポイントを持つASP.NET Core最小APIを構築できるでしょう。&lt;/p&gt;
&lt;p&gt;より大きなポイントは、マルチエージェントUIが後付けではなくファーストクラスの関心事になりつつあるということです。エージェントが人間と対話するものを構築しているなら — カスタマーサポート、承認ワークフロー、ドキュメント処理 — MAFオーケストレーションとAG-UIの透明性の組み合わせが、従うべきパターンです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;AG-UI + Microsoft Agent Frameworkは、バックエンドでの堅牢なマルチエージェントオーケストレーションとフロントエンドでのリアルタイム可視性という、両方の良いところを提供します。もうブラックボックスのエージェントインタラクションとはお別れです。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/agent-framework/ag-ui-multi-agent-workflow-demo/"&gt;完全なウォークスルー&lt;/a&gt;と&lt;a href="https://github.com/ag-ui-protocol/ag-ui"&gt;AG-UIプロトコルリポジトリ&lt;/a&gt;をチェックして、さらに深く掘り下げてください。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.115 — バックグラウンドターミナル通知、SSHエージェントモードなど</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/</link><pubDate>Mon, 06 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/</guid><description>VS Code 1.115では、エージェント向けバックグラウンドターミナル通知、SSHリモートエージェントホスティング、ターミナルへのファイル貼り付け、セッション対応の編集追跡が導入されました。.NET開発者にとって重要なポイントをまとめます。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-115-agent-improvements/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;VS Code 1.115が&lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;リリース&lt;/a&gt;されました。目玉機能という点では軽めのリリースですが、AIコーディングアシスタントを日常的に使っている方にとって、エージェント関連の改善は本当に役立つものです。&lt;/p&gt;
&lt;p&gt;実際に知っておく価値のあるポイントを紹介します。&lt;/p&gt;
&lt;h2 id="バックグラウンドターミナルがエージェントに通知するように"&gt;バックグラウンドターミナルがエージェントに通知するように&lt;/h2&gt;
&lt;p&gt;これが今回の目玉機能です。バックグラウンドターミナルが、コマンド完了時に終了コードとターミナル出力を含めて、エージェントに自動通知するようになりました。バックグラウンドターミナルでの入力プロンプトも検出されてユーザーに表示されます。&lt;/p&gt;
&lt;p&gt;なぜこれが重要なのか？Copilotのエージェントモードでビルドコマンドやテストスイートをバックグラウンドで実行したことがあるなら、「あれ、もう終わった？」という苦痛を知っているはずです。バックグラウンドターミナルは基本的に撃ちっぱなしでした。今ではエージェントが&lt;code&gt;dotnet build&lt;/code&gt;や&lt;code&gt;dotnet test&lt;/code&gt;の完了時に通知を受け取り、出力を確認して適切に対応できます。小さな変更ですが、エージェント駆動のワークフローの信頼性が大幅に向上します。&lt;/p&gt;
&lt;p&gt;また、新しい&lt;code&gt;send_to_terminal&lt;/code&gt;ツールにより、エージェントがユーザーの確認付きでバックグラウンドターミナルにコマンドを送信できるようになりました。これにより、&lt;code&gt;run_in_terminal&lt;/code&gt;でタイムアウトを設定するとターミナルがバックグラウンドに移動して読み取り専用になってしまう問題が解決されました。&lt;/p&gt;
&lt;h2 id="sshリモートエージェントホスティング"&gt;SSHリモートエージェントホスティング&lt;/h2&gt;
&lt;p&gt;VS Codeが SSH経由でリモートマシンに接続し、CLIを自動インストールしてエージェントホストモードで起動できるようになりました。これにより、AIエージェントセッションがリモート環境を直接ターゲットにできます。LinuxサーバーやクラウドVMでビルド・テストを行う.NET開発者にとって便利です。&lt;/p&gt;
&lt;h2 id="エージェントセッションでの編集追跡"&gt;エージェントセッションでの編集追跡&lt;/h2&gt;
&lt;p&gt;エージェントセッション中に行われたファイル編集が、diff、元に戻す/やり直し、状態復元とともに追跡・復元されるようになりました。エージェントがコードを変更して何か問題が起きた場合、何が変わったかを正確に確認してロールバックできます。エージェントにコードベースを変更させる際の安心感が得られます。&lt;/p&gt;
&lt;h2 id="ブラウザタブの認識とその他の改善"&gt;ブラウザタブの認識とその他の改善&lt;/h2&gt;
&lt;p&gt;その他のクオリティ・オブ・ライフの向上：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ブラウザタブの追跡&lt;/strong&gt; — チャットがセッション中に開いたブラウザタブを追跡・リンクできるようになり、エージェントが閲覧中のWebページを参照できます&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ターミナルへのファイル貼り付け&lt;/strong&gt; — Ctrl+V、ドラッグ&amp;amp;ドロップ、右クリックでターミナルにファイル（画像含む）を貼り付け可能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ミニマップでのテストカバレッジ&lt;/strong&gt; — テストカバレッジインジケーターがミニマップに表示され、視覚的な概要を素早く確認できます&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Macでのピンチズーム&lt;/strong&gt; — 統合ブラウザがピンチズームジェスチャーをサポート&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;セッションでのCopilot使用権限&lt;/strong&gt; — ステータスバーのセッションビューに使用状況が表示されます&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ファイルに移動でのファビコン&lt;/strong&gt; — 開いているWebページがクイックピックリストにファビコンを表示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;VS Code 1.115はインクリメンタルなリリースですが、エージェントの改善 — バックグラウンドターミナル通知、SSHエージェントホスティング、編集追跡 — が合わさって、AI支援開発の体験が目に見えてスムーズになりました。.NETプロジェクトでCopilotのエージェントモードを使っているなら、日々の摩擦を減らすクオリティ・オブ・ライフの改善そのものです。&lt;/p&gt;
&lt;p&gt;すべての詳細は&lt;a href="https://code.visualstudio.com/updates/v1_115"&gt;完全なリリースノート&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2にドキュメントCLIが搭載 — AIエージェントも使えます</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2にaspire docsが追加されました。ターミナルを離れずに公式ドキュメントを検索、閲覧、読むためのCLIです。AIエージェントのツールとしても動作します。なぜこれが重要なのかをお伝えします。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Aspire AppHostの奥深くでインテグレーションを接続していて、Redisインテグレーションが正確にどのパラメータを期待しているかを確認する必要がある、あの瞬間を知っていますか？ブラウザにAlt-Tabして、aspire.devを探し回り、APIドキュメントに目を細め、エディタに戻る。コンテキストが失われて、フローが途切れる。&lt;/p&gt;
&lt;p&gt;Aspire 13.2がまさに&lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;その解決策をリリースしました&lt;/a&gt;。&lt;code&gt;aspire docs&lt;/code&gt; CLIを使えば、ターミナルから直接Aspireの公式ドキュメントを検索、閲覧、そして読むことができます。そして再利用可能なサービスに支えられているため、AIエージェントやスキルも同じコマンドを使ってドキュメントを参照できます。存在しないAPIを幻覚する代わりに。&lt;/p&gt;
&lt;h2 id="これが本当に解決する問題"&gt;これが本当に解決する問題&lt;/h2&gt;
&lt;p&gt;David Pineがオリジナルの記事で的確に指摘しています：AIエージェントはAspireアプリの構築を支援する点で&lt;em&gt;ひどい&lt;/em&gt;ものでした。&lt;code&gt;aspire run&lt;/code&gt;の代わりに&lt;code&gt;dotnet run&lt;/code&gt;を推奨し、aspire.devにあるドキュメントに対してlearn.microsoft.comを参照し、古いNuGetパッケージを提案し、そして——個人的に一番のお気に入り——存在しないAPIを幻覚していました。&lt;/p&gt;
&lt;p&gt;なぜか？Aspireがポリグロットになるよりもはるかに長い間.NET専用だったからです。そしてLLMは最新機能よりも前のトレーニングデータで動作しています。AIエージェントに現在のドキュメントを実際に検索する能力を与えると、推測をやめて役に立つようになります。&lt;/p&gt;
&lt;h2 id="3つのコマンドブラウザタブはゼロ"&gt;3つのコマンド、ブラウザタブはゼロ&lt;/h2&gt;
&lt;p&gt;CLIは爽快なほどシンプルです：&lt;/p&gt;
&lt;h3 id="すべてのドキュメントを一覧表示"&gt;すべてのドキュメントを一覧表示&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;aspire.devで利用可能なすべてのドキュメントページを返します。マシンリーダブルな出力が必要ですか？&lt;code&gt;--format Json&lt;/code&gt;を追加してください。&lt;/p&gt;
&lt;h3 id="トピックを検索"&gt;トピックを検索&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;タイトルとコンテンツの両方を重み付けされた関連性スコアリングで検索します。内部的にドキュメントツールを支えているのと同じ検索エンジンです。タイトル、スラグ、関連性スコアを含むランク付けされた結果が得られます。&lt;/p&gt;
&lt;h3 id="ページ全体を読むまたはセクションだけ"&gt;ページ全体を読む（またはセクションだけ）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ページ全体をマークダウンとしてターミナルにストリーミングします。セクションだけ必要ですか？&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;外科的精度。500行をスクロールする必要はありません。必要な部分だけ。&lt;/p&gt;
&lt;h2 id="aiエージェントの視点"&gt;AIエージェントの視点&lt;/h2&gt;
&lt;p&gt;ここからがAIツールで開発している私たち開発者にとって面白くなるところです。同じ&lt;code&gt;aspire docs&lt;/code&gt;コマンドが、スキル、MCPサーバー、またはシンプルなCLIラッパーを通じて、AIエージェントのツールとして機能します。&lt;/p&gt;
&lt;p&gt;あなたのAIアシスタントが古いトレーニングデータに基づいてAspire APIを捏造する代わりに、&lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;を呼び出して、公式のインテグレーションドキュメントを見つけ、正しいページを読み、ドキュメントに記載されたアプローチを提供できます。リアルタイムで最新のドキュメント——モデルが6ヶ月前に記憶したものではありません。&lt;/p&gt;
&lt;p&gt;この背後のアーキテクチャは意図的なものです。Aspireチームは一回限りのインテグレーションではなく、再利用可能なサービス（&lt;code&gt;IDocsIndexService&lt;/code&gt;、&lt;code&gt;IDocsSearchService&lt;/code&gt;、&lt;code&gt;IDocsFetcher&lt;/code&gt;、&lt;code&gt;IDocsCache&lt;/code&gt;）を構築しました。つまり、同じ検索エンジンがターミナルの人間、エディタのAIエージェント、CIパイプラインの自動化のために機能します。&lt;/p&gt;
&lt;h2 id="実世界のシナリオ"&gt;実世界のシナリオ&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;ターミナルでの素早い検索：&lt;/strong&gt; 3ファイルの深さに入っていて、Redisの設定パラメータが必要。2つのコマンド、90秒、仕事に戻る：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;AI支援開発：&lt;/strong&gt; VS CodeスキルがCLIコマンドをラップします。「AppHostにPostgreSQLデータベースを追加して」と聞くと、エージェントが回答する前に実際のドキュメントを参照します。幻覚なし。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CI/CDバリデーション：&lt;/strong&gt; パイプラインがAppHost設定を公式ドキュメントに対してプログラム的に検証します。&lt;code&gt;--format Json&lt;/code&gt;の出力は&lt;code&gt;jq&lt;/code&gt;やその他のツールにきれいにパイプできます。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;カスタムナレッジベース：&lt;/strong&gt; 独自のAIツールを構築していますか？構造化されたJSON出力をナレッジベースに直接パイプ：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Webスクレイピングなし。APIキーなし。内部的にドキュメントツールが使用しているのと同じ構造化データ。&lt;/p&gt;
&lt;h2 id="ドキュメントは常に最新"&gt;ドキュメントは常に最新&lt;/h2&gt;
&lt;p&gt;これが私が最も評価している部分です。CLIはスナップショットをダウンロードしません——ETagベースのキャッシュでaspire.devにクエリを実行します。ドキュメントが更新された瞬間、あなたのCLIとその上に構築されたすべてのスキルがそれを反映します。古いコピーも、「でもwikiには書いてあった&amp;hellip;」という瞬間もありません。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt;は、実際の問題をきれいに解決する、そんな小さな機能の一つです。人間はターミナルネイティブなドキュメントアクセスを得ます。AIエージェントは推測をやめて実際のドキュメントを参照する方法を得ます。そしてすべてが同じ信頼の源に支えられています。&lt;/p&gt;
&lt;p&gt;.NET Aspireで構築していてまだCLIを試していないなら、&lt;code&gt;aspire docs search &amp;quot;あなたのトピック&amp;quot;&lt;/code&gt; を実行して、どう感じるか確かめてください。そして、使っているAIスキルや自動化セットアップにそれらのコマンドをラップすることを検討してください——あなたのエージェントが感謝するでしょう。&lt;/p&gt;
&lt;p&gt;ドキュメントツールがどのように構築されたかについての&lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;David Pineの詳細記事&lt;/a&gt;と、すべての詳細が記載された&lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;公式CLIリファレンス&lt;/a&gt;をチェックしてください。&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Frameworkが1.0に到達 — .NET開発者にとって本当に重要なこと</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agent-framework-1-0-production-ready/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0が安定したAPI、マルチエージェントオーケストレーション、主要AIプロバイダー向けコネクタを備えて本番環境対応になりました。.NET開発者として知っておくべきことをまとめます。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されています。原文は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Semantic KernelやAutoGenの初期からAgent Frameworkの歩みを追ってきた方にとって、今回のニュースは大きいです。Microsoft Agent Frameworkが&lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;バージョン1.0に到達&lt;/a&gt;しました — 本番環境対応、安定したAPI、長期サポートのコミットメント。.NETとPythonの両方で利用可能で、実際のワークロードに本当に対応できる状態です。&lt;/p&gt;
&lt;p&gt;発表のノイズを切り抜けて、.NETでAI搭載アプリを構築している方にとって重要なポイントに集中しましょう。&lt;/p&gt;
&lt;h2 id="短いまとめ"&gt;短いまとめ&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0は、かつてSemantic KernelとAutoGenだったものを単一のオープンソースSDKに統合します。1つのエージェント抽象化。1つのオーケストレーションエンジン。複数のAIプロバイダー。エンタープライズパターン向けのSemantic Kernelと研究グレードのマルチエージェントワークフロー向けのAutoGenを行き来していた方は、もうその必要はありません。これが唯一のSDKです。&lt;/p&gt;
&lt;h2 id="はじめるのはほぼ不公平なほど簡単"&gt;はじめるのはほぼ不公平なほど簡単&lt;/h2&gt;
&lt;p&gt;.NETで動作するエージェントはこちら：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// dotnet add package Microsoft.Agents.AI.OpenAI --prerelease&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://your-project.services.ai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HaikuBot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are an upbeat assistant that writes beautifully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Write a haiku about shipping 1.0.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これだけです。数行でAzure Foundryに対して実行されるAIエージェントが完成します。Pythonの同等コードも同様に簡潔です。関数ツール、マルチターン会話、ストリーミングは必要に応じて追加できます — APIサーフェスは奇妙になることなくスケールアップします。&lt;/p&gt;
&lt;h2 id="マルチエージェントオーケストレーション--これが本題"&gt;マルチエージェントオーケストレーション — これが本題&lt;/h2&gt;
&lt;p&gt;単一エージェントはデモには十分ですが、本番シナリオには通常、調整が必要です。Agent Framework 1.0は、Microsoft ResearchとAutoGenから直接もたらされた実戦テスト済みのオーケストレーションパターンを搭載しています：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;シーケンシャル&lt;/strong&gt; — エージェントが順番に処理（ライター → レビュアー → エディター）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンカレント&lt;/strong&gt; — 複数のエージェントに並列で展開し、結果を収束&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ハンドオフ&lt;/strong&gt; — 1つのエージェントがインテントに基づいて別のエージェントに委任&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;グループチャット&lt;/strong&gt; — 複数のエージェントが議論し、解決策に収束&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — MSRの研究グレードのマルチエージェントパターン&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべてがストリーミング、チェックポイント、ヒューマンインザループの承認、一時停止/再開をサポートしています。チェックポイントの部分は重要です — 長時間実行されるワークフローがプロセスの再起動を生き延びます。Azure Functionsで耐久性のあるワークフローを構築してきた.NET開発者にとって、これは馴染みのある感覚です。&lt;/p&gt;
&lt;h2 id="最も重要な機能"&gt;最も重要な機能&lt;/h2&gt;
&lt;p&gt;知っておく価値があるものの私のリストはこちら：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ミドルウェアフック。&lt;/strong&gt; ASP.NET Coreにミドルウェアパイプラインがあるのをご存知ですか？同じコンセプトですが、エージェント実行用です。すべてのステージをインターセプト — コンテンツセーフティ、ロギング、コンプライアンスポリシーを追加 — エージェントのプロンプトに触れることなく。これがエージェントをエンタープライズ対応にする方法です。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;プラガブルメモリ。&lt;/strong&gt; 会話履歴、永続的なキーバリューステート、ベクトルベースの検索。バックエンドを選択：Foundry Agent Service、Mem0、Redis、Neo4j、またはカスタム実装。メモリは、ステートレスなLLM呼び出しを、実際にコンテキストを覚えているエージェントに変えるものです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;宣言的YAMLエージェント。&lt;/strong&gt; エージェントの指示、ツール、メモリ、オーケストレーショントポロジーをバージョン管理されたYAMLファイルで定義します。単一のAPI呼び出しでロードして実行。これは、コードを再デプロイせずにエージェントの動作をイテレーションしたいチームにとってゲームチェンジャーです。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A2AとMCPサポート。&lt;/strong&gt; MCP（Model Context Protocol）により、エージェントは外部ツールを動的に発見して呼び出すことができます。A2A（Agent-to-Agentプロトコル）はクロスランタイムコラボレーションを実現します — .NETエージェントは他のフレームワークで実行されているエージェントと連携できます。A2A 1.0サポートは近日対応予定です。&lt;/p&gt;
&lt;h2 id="注目すべきプレビュー機能"&gt;注目すべきプレビュー機能&lt;/h2&gt;
&lt;p&gt;1.0ではいくつかの機能がプレビューとして出荷されました — 機能は動作しますがAPIは変更される可能性があります：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — エージェントの実行、メッセージフロー、ツール呼び出しをリアルタイムで可視化するブラウザベースのローカルデバッガー。Application Insightsのようなものですが、エージェントの推論用です。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDKとClaude Code SDK&lt;/strong&gt; — オーケストレーションコードから直接CopilotまたはClaudeをエージェントハーネスとして使用。同じワークフロー内の他のエージェントと一緒にコーディング対応エージェントを構成できます。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — エージェントにシェル、ファイルシステム、メッセージングループへのアクセスを提供するカスタマイズ可能なローカルランタイム。コーディングエージェントや自動化パターンを想像してください。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — エージェントに構造化された機能をすぐに提供する再利用可能なドメイン機能パッケージ。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="semantic-kernelまたはautogenからの移行"&gt;Semantic KernelまたはAutoGenからの移行&lt;/h2&gt;
&lt;p&gt;既存のSemantic KernelまたはAutoGenコードがある場合、コードを分析してステップバイステップの移行プランを生成する専用の移行アシスタントがあります。&lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;Semantic Kernel移行ガイド&lt;/a&gt;と&lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;AutoGen移行ガイド&lt;/a&gt;がすべてを案内してくれます。&lt;/p&gt;
&lt;p&gt;RCパッケージを使用していた場合、1.0へのアップグレードはバージョン番号の変更だけです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0は、エンタープライズチームが待ち望んでいた本番環境のマイルストーンです。安定したAPI、マルチプロバイダーサポート、実際に大規模に機能するオーケストレーションパターン、そしてSemantic KernelとAutoGenの両方からの移行パス。&lt;/p&gt;
&lt;p&gt;フレームワークは&lt;a href="https://github.com/microsoft/agent-framework"&gt;GitHubで完全にオープンソース&lt;/a&gt;で、&lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;で今日から始められます。&lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;クイックスタートガイド&lt;/a&gt;と&lt;a href="https://github.com/microsoft/agent-framework"&gt;サンプル&lt;/a&gt;をチェックして、実際に触ってみてください。&lt;/p&gt;
&lt;p&gt;「本番環境で安全に使える」というシグナルを待っていた方へ — これがそのシグナルです。&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2のダッシュボードにテレメトリAPIが搭載 — これで全てが変わる</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2がスマートなテレメトリエクスポート、トレースとログのプログラマブルAPI、GenAIビジュアライゼーションの改善を提供。デバッグワークフローにとってなぜ重要かを解説します。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。オリジナル版は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;.NET Aspireで分散アプリケーションを構築しているなら、ダッシュボードが体験全体の中で最高のものだと既に知っているでしょう。すべてのトレース、ログ、メトリクスが一箇所に — 外部のJaegerも不要、Seqのセットアップも不要、「別のターミナルを確認させて」という瞬間もなし。&lt;/p&gt;
&lt;p&gt;Aspire 13.2で大幅に改善されました。James Newton-Kingが&lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;アップデートを発表&lt;/a&gt;しましたが、正直なところ、テレメトリエクスポートとAPI機能だけでアップグレードの価値があります。&lt;/p&gt;
&lt;h2 id="テレメトリをまともにエクスポートする"&gt;テレメトリをまともにエクスポートする&lt;/h2&gt;
&lt;p&gt;誰もが経験したシナリオ：分散問題をデバッグしていて、20分のセットアップの後にようやく再現でき、チームに何が起きたかを共有する必要がある。以前は？スクリーンショット。トレースIDのコピペ。いつもの混乱。&lt;/p&gt;
&lt;p&gt;Aspire 13.2は&lt;strong&gt;ログとテレメトリの管理&lt;/strong&gt;ダイアログを追加しました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;すべてのテレメトリをクリア（再現前に便利）&lt;/li&gt;
&lt;li&gt;選択したテレメトリを標準OTLP/JSON形式のZIPファイルにエクスポート&lt;/li&gt;
&lt;li&gt;そのZIPを後で任意のAspireダッシュボードに再インポート&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後のポイントがキラー機能です。バグを再現し、テレメトリをエクスポートし、ワークアイテムに添付すれば、チームメイトが自分のダッシュボードにインポートして、あなたが見たものと全く同じものを見ることができます。「あなたのマシンで再現できる？」はもう不要です。&lt;/p&gt;
&lt;p&gt;個々のトレース、スパン、ログにもコンテキストメニューに「Export JSON」オプションがあります。特定のトレースを共有する必要がある？右クリック、JSONをコピー、PRの説明に貼り付け。完了。&lt;/p&gt;
&lt;h2 id="テレメトリapiが本当のゲームチェンジャー"&gt;テレメトリAPIが本当のゲームチェンジャー&lt;/h2&gt;
&lt;p&gt;最もワクワクしているのがこれです。ダッシュボードが&lt;code&gt;/api/telemetry&lt;/code&gt;配下でHTTP APIを公開し、テレメトリデータをプログラマティックにクエリできるようになりました。利用可能なエンドポイント：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — テレメトリ付きリソースの一覧&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — フィルター付きスパンのクエリ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — フィルター付きログのクエリ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — トレースの一覧&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — 特定トレースの全スパン取得&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;すべてOTLP JSON形式で返されます。これは新しいCLIコマンド&lt;code&gt;aspire agent mcp&lt;/code&gt;と&lt;code&gt;aspire otel&lt;/code&gt;を駆動しますが、本当の意味はもっと大きい：アプリのテレメトリを直接クエリするツーリング、スクリプト、AIエージェント統合を構築できるようになりました。&lt;/p&gt;
&lt;p&gt;デバッグ中に実際の分散トレースを見ることができるAIコーディングエージェントを想像してください。それはもう仮説ではありません — このAPIが可能にするものです。&lt;/p&gt;
&lt;h2 id="genaiテレメトリが実用的に"&gt;GenAIテレメトリが実用的に&lt;/h2&gt;
&lt;p&gt;Semantic KernelやMicrosoft.Extensions.AIでAI搭載アプリを構築しているなら、改善されたGenAIテレメトリビジュアライザーを評価するでしょう。Aspire 13.2の追加機能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AIツールの説明がMarkdownでレンダリング&lt;/li&gt;
&lt;li&gt;トレースページに専用のGenAIボタンで素早いアクセス&lt;/li&gt;
&lt;li&gt;切り詰められた、または非標準のGenAI JSONに対するエラー処理の改善&lt;/li&gt;
&lt;li&gt;ツール定義間のクリックでハイライトするナビゲーション&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ブログ記事では、VS Code Copilot chat、Copilot CLI、OpenCodeのすべてが&lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;の設定をサポートしていると言及されています。Aspireダッシュボードに向ければ、テレメトリを通じてAIエージェントがリアルタイムで考えている様子を文字通り見ることができます。他では見つけられないデバッグ体験です。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Aspire 13.2はダッシュボードを「便利なデバッグUI」から「プログラマブルなオブザーバビリティプラットフォーム」に変えます。エクスポート/インポートワークフローだけで分散デバッグの実際の時間を節約し、テレメトリAPIはAI支援診断への扉を開きます。&lt;/p&gt;
&lt;p&gt;既にAspireを使っているなら、アップグレードしましょう。まだなら — &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt;を試してみる良い理由です。&lt;/p&gt;</content:encoded></item><item><title>azdでAIエージェントをローカル実行・デバッグ可能に — 2026年3月の変更点まとめ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>Azure Developer CLIが2026年3月に7つのリリースを公開。ハイライト：AIエージェントのローカル実行＆デバッグループ、GitHub Copilotのプロジェクトセットアップ統合、Container App Jobsサポート。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。オリジナル版は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1ヶ月で7つのリリース。これがAzure Developer CLI（&lt;code&gt;azd&lt;/code&gt;）チームが2026年3月に出荷したもので、メイン機能は私が待っていたもの：&lt;strong&gt;AIエージェントのローカル実行＆デバッグループ&lt;/strong&gt;です。&lt;/p&gt;
&lt;p&gt;PC Chanが&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;完全なまとめを公開&lt;/a&gt;しましたが、内容が多いので、AI搭載アプリを構築する.NET開発者にとって本当に重要なことにフィルタリングしましょう。&lt;/p&gt;
&lt;h2 id="デプロイなしでaiエージェントを実行デバッグ"&gt;デプロイなしでAIエージェントを実行・デバッグ&lt;/h2&gt;
&lt;p&gt;これが一番大きいです。新しい&lt;code&gt;azure.ai.agents&lt;/code&gt;拡張機能がAIエージェントの適切なインナーループ体験を提供するコマンドを追加します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — エージェントをローカルで起動&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — メッセージを送信（ローカルまたはデプロイ済み）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — コンテナのステータスとヘルスを表示&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — コンテナログをリアルタイムでストリーミング&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;以前は、AIエージェントのテストは変更するたびにMicrosoft Foundryへのデプロイを意味しました。今ではローカルで反復し、エージェントの動作をテストし、準備ができたときだけデプロイできます。&lt;/p&gt;
&lt;h2 id="github-copilotがazdプロジェクトをセットアップ"&gt;GitHub Copilotがazdプロジェクトをセットアップ&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt;に「Set up with GitHub Copilot (Preview)」オプションが追加されました。プロジェクト構造についてのプロンプトに手動で回答する代わりに、Copilotエージェントが設定を生成します。コマンドが失敗した場合、&lt;code&gt;azd&lt;/code&gt;がAI支援のトラブルシューティングを提供します。&lt;/p&gt;
&lt;h2 id="container-app-jobsとデプロイの改善"&gt;Container App Jobsとデプロイの改善&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;：&lt;code&gt;azd&lt;/code&gt;が既存の&lt;code&gt;host: containerapp&lt;/code&gt;設定で&lt;code&gt;Microsoft.App/jobs&lt;/code&gt;をデプロイ可能に&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;設定可能なデプロイタイムアウト&lt;/strong&gt;：&lt;code&gt;azd deploy&lt;/code&gt;の新しい&lt;code&gt;--timeout&lt;/code&gt;フラグと&lt;code&gt;azure.yaml&lt;/code&gt;の&lt;code&gt;deployTimeout&lt;/code&gt;フィールド&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;リモートビルドフォールバック&lt;/strong&gt;：ACRビルドが失敗するとローカルDocker/Podmanビルドに自動フォールバック&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ローカルプリフライト検証&lt;/strong&gt;：デプロイ前にBicepパラメータをローカルで検証&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="dxの改善"&gt;DXの改善&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pnpm/yarn自動検出&lt;/strong&gt; — JS/TSプロジェクト向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pyproject.tomlサポート&lt;/strong&gt; — Pythonパッケージング向け&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ローカルテンプレートディレクトリ&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt;がファイルシステムパスを受け入れ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改善されたエラーメッセージ&lt;/strong&gt; — &lt;code&gt;--no-prompt&lt;/code&gt;モード&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ビルド環境変数&lt;/strong&gt; — すべてのフレームワークビルドサブプロセスに注入（.NET、Node.js、Java、Python）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;ローカルAIエージェントデバッグループがこのリリースの主役ですが、デプロイ改善とDXポリッシュの積み重ねにより、&lt;code&gt;azd&lt;/code&gt;はかつてないほど成熟しています。AzureにDotNetアプリをデプロイしているなら — 特にAIエージェント — このアップデートは価値があります。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;完全なリリースノート&lt;/a&gt;で全詳細をご確認ください。&lt;/p&gt;</content:encoded></item><item><title>Visual Studioの3月アップデートでカスタムCopilotエージェントが作成可能に — find_symbolが大きな進化</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>Visual Studioの2026年3月アップデートがカスタムCopilotエージェント、再利用可能なスキル、言語対応のfind_symbolツール、Test ExplorerからのCopilotプロファイリングを提供。</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。オリジナル版は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studioが最も重要なCopilotアップデートを受けました。Mark Downieが&lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;3月リリースを発表&lt;/a&gt;し、見出しはカスタムエージェントですが、正直なところ&lt;code&gt;find_symbol&lt;/code&gt;ツールがワークフローを最も変える機能かもしれません。&lt;/p&gt;
&lt;h2 id="リポジトリ内のカスタムcopilotエージェント"&gt;リポジトリ内のカスタムCopilotエージェント&lt;/h2&gt;
&lt;p&gt;Copilotにチームのコーディング標準に従わせたい？カスタムエージェントはリポジトリの&lt;code&gt;.github/agents/&lt;/code&gt;に&lt;code&gt;.agent.md&lt;/code&gt;ファイルとして定義されます。各エージェントはワークスペース認識、コード理解、ツール、優先モデル、MCP接続へのフルアクセスを持ちます。&lt;/p&gt;
&lt;h2 id="エージェントスキル再利用可能なインストラクションパック"&gt;エージェントスキル：再利用可能なインストラクションパック&lt;/h2&gt;
&lt;p&gt;スキルはリポジトリの&lt;code&gt;.github/skills/&lt;/code&gt;またはプロファイルの&lt;code&gt;~/.copilot/skills/&lt;/code&gt;から自動的にロードされます。&lt;/p&gt;
&lt;h2 id="find_symbol言語対応ナビゲーション"&gt;find_symbol：言語対応ナビゲーション&lt;/h2&gt;
&lt;p&gt;新しい&lt;code&gt;find_symbol&lt;/code&gt;ツールはCopilotのエージェントモードに言語サービスベースのシンボルナビゲーションを提供します。テキスト検索の代わりに、シンボルのすべての参照を見つけ、型情報やスコープにアクセスできます。&lt;/p&gt;
&lt;p&gt;.NET開発者にとって、これは大きな改善です — 深い型階層を持つC#コードベースが大きく恩恵を受けます。&lt;/p&gt;
&lt;h2 id="copilotでテストをプロファイル"&gt;Copilotでテストをプロファイル&lt;/h2&gt;
&lt;p&gt;Test Explorerのコンテキストメニューに&lt;strong&gt;Profile with Copilot&lt;/strong&gt;が追加されました。Profiling Agentがテストを実行し、パフォーマンスを自動分析します。&lt;/p&gt;
&lt;h2 id="ライブデバッグ中のperf-tips"&gt;ライブデバッグ中のPerf Tips&lt;/h2&gt;
&lt;p&gt;パフォーマンス最適化がデバッグ中に行われるようになりました。Visual Studioがインラインで実行時間を表示します。遅い行を見つけたら、Perf Tipをクリックして最適化の提案をCopilotに依頼できます。&lt;/p&gt;
&lt;h2 id="solution-explorerからnuget脆弱性を修正"&gt;Solution ExplorerからNuGet脆弱性を修正&lt;/h2&gt;
&lt;p&gt;NuGetパッケージの脆弱性が検出されると、Solution Explorerに直接&lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt;リンクが表示されます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;カスタムエージェントとスキルが見出しですが、&lt;code&gt;find_symbol&lt;/code&gt;が隠れた逸品です — .NETコードのリファクタリング時のCopilotの精度を根本的に変えます。&lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt;をダウンロードしてお試しください。&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026：.NET開発者が本当に知るべきこと</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>MicrosoftがKubeCon Europe 2026で大量のKubernetesアナウンスを発表しました。.NETアプリを出荷しているなら知っておくべきAKSとクラウドネイティブのアップデートだけをフィルタリングしてお届けします。</description><content:encoded>&lt;p&gt;&lt;em&gt;この記事は自動翻訳されました。オリジナル版は&lt;a href="https://thedotnetblog.com/ja/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;こちら&lt;/a&gt;をご覧ください。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;巨大なアナウンス記事が出て、スクロールしながら「クール、でも実際に自分にとって何が変わるの？」と思うあの感覚、分かりますよね？毎回KubeConシーズンになると私はそうなります。&lt;/p&gt;
&lt;p&gt;Microsoftが&lt;a href="https://opensource.microsoft.com/blog/2026/03/24/whats-new-with-microsoft-in-open-source-and-kubernetes-at-kubecon-cloudnativecon-europe-2026/"&gt;KubeCon Europe 2026の完全なまとめ&lt;/a&gt;を公開しました。Brendan Burns自身が執筆しています。正直に言うと、ここには本物の中身があります。機能のチェックリストだけでなく、本番環境での運用方法を変える運用面の改善です。&lt;/p&gt;
&lt;p&gt;.NET開発者として本当に重要なことを整理しましょう。&lt;/p&gt;
&lt;h2 id="サービスメッシュ税なしのmtls"&gt;サービスメッシュ税なしのmTLS&lt;/h2&gt;
&lt;p&gt;サービスメッシュの問題点：全員がセキュリティの保証を求めるけど、運用オーバーヘッドは誰も望まない。AKSがついにこのギャップを埋めています。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt;は、相互TLS、アプリケーション認識型の認可、トラフィックテレメトリを提供します。サイドカーの重いフルメッシュをデプロイする必要はありません。&lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Advanced Container Networking ServicesのCilium mTLS&lt;/a&gt;と組み合わせれば、X.509証明書とSPIREによるID管理を使った暗号化されたpod間通信が実現します。&lt;/p&gt;
&lt;p&gt;実際にはどういうことか：ASP.NET Core APIがバックグラウンドワーカーと通信する、gRPCサービスが相互に呼び出す — すべてがネットワークレベルで暗号化・ID検証され、アプリケーションコードの変更はゼロ。これは大きいです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ingress-nginx&lt;/code&gt;から移行しているチームには、&lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Meshless IstioによるApplication Routing&lt;/a&gt;もあり、Kubernetes Gateway APIの完全サポート付きです。サイドカーなし。標準ベース。段階的な移行のための&lt;code&gt;ingress2gateway&lt;/code&gt;ツールも提供されています。&lt;/p&gt;
&lt;h2 id="後付けではないgpuオブザーバビリティ"&gt;後付けではないGPUオブザーバビリティ&lt;/h2&gt;
&lt;p&gt;.NETサービスと並行してAI推論を実行している場合（正直、誰が始めていないでしょうか？）、GPUモニタリングの盲点に遭遇したことがあるでしょう。CPU/メモリのダッシュボードは素晴らしかったのに、GPUについては手動のエクスポーター設定なしでは何もなかった。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKSはGPUメトリクスをネイティブに&lt;/a&gt;マネージドPrometheusとGrafanaに表示するようになりました。同じスタック、同じダッシュボード、同じアラートパイプライン。カスタムエクスポーターもサードパーティエージェントも不要。&lt;/p&gt;
&lt;p&gt;ネットワーク側では、HTTP、gRPC、Kafkaトラフィックのフローごとの可視性が&lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;ワンクリックAzure Monitor体験&lt;/a&gt;で追加されました。IP、ポート、ワークロード、フロー方向、ポリシー判定 — すべてが組み込みダッシュボードに。&lt;/p&gt;
&lt;p&gt;そして二度見させられたもの：&lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;agentic container networking&lt;/a&gt;は、クラスターのネットワーク状態について自然言語で質問できるWeb UIを追加します。「ポッドXがサービスYに到達できないのはなぜ？」→ ライブテレメトリからの読み取り専用診断。午前2時に本当に役立ちます。&lt;/p&gt;
&lt;h2 id="博士号不要のクロスクラスターネットワーキング"&gt;博士号不要のクロスクラスターネットワーキング&lt;/h2&gt;
&lt;p&gt;マルチクラスターKubernetesは歴史的に「自分でネットワークの接着剤を持ってくる」体験でした。Azure Kubernetes Fleet Managerが、マネージドCiliumクラスターメッシュによる&lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;クロスクラスターネットワーキング&lt;/a&gt;を提供するようになりました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AKSクラスター間の統一された接続性&lt;/li&gt;
&lt;li&gt;クロスクラスター検出のためのグローバルサービスレジストリ&lt;/li&gt;
&lt;li&gt;クラスターごとに繰り返すのではなく中央で管理される設定&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;レジリエンスやコンプライアンスのために複数リージョンで.NETマイクロサービスを実行しているなら、多くの脆弱なカスタムの接着剤が置き換えられます。West EuropeのサービスAがメッシュを通じてEast USのサービスBを発見して呼び出せます。一貫したルーティングとセキュリティポリシーが適用されます。&lt;/p&gt;
&lt;h2 id="勇気を必要としないアップグレード"&gt;勇気を必要としないアップグレード&lt;/h2&gt;
&lt;p&gt;正直に言いましょう — 本番環境のKubernetesアップグレードはストレスフルです。「アップグレードして祈る」があまりにも多くのチームのデファクト戦略であり、クラスターがバージョンに遅れる主な理由です。&lt;/p&gt;
&lt;p&gt;2つの新機能がこれを変えます：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blue-greenエージェントプールアップグレード&lt;/strong&gt;は新しい設定でパラレルなノードプールを作成します。動作を検証し、トラフィックを段階的に移動し、クリーンなロールバックパスを維持します。本番ノードでのインプレース変更はもう不要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;エージェントプールロールバック&lt;/strong&gt;により、アップグレードがうまくいかなかった場合、クラスターを再構築することなく、ノードプールを以前のKubernetesバージョンとノードイメージに戻せます。&lt;/p&gt;
&lt;p&gt;組み合わせることで、オペレーターにアップグレードのライフサイクルに対する本当のコントロールを提供します。.NETチームにとっては、プラットフォームの速度が新しいランタイム、セキュリティパッチ、ネットワーク機能をどれだけ早く採用できるかを直接制御するため重要です。&lt;/p&gt;
&lt;h2 id="aiワークロードがkubernetesのファーストクラス市民に"&gt;AIワークロードがKubernetesのファーストクラス市民に&lt;/h2&gt;
&lt;p&gt;アップストリームのオープンソース作業も同様に重要です。Dynamic Resource Allocation (DRA)がKubernetes 1.36でGAになり、GPUスケジューリングがワークアラウンドではなく本物のファーストクラス機能になりました。&lt;/p&gt;
&lt;p&gt;注目すべきプロジェクト：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;プロジェクト&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/kaito-project/kubeairunway"&gt;AI Runway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;推論のための共通Kubernetes API — K8sを知らなくてもモデルをデプロイ、HuggingFace検出とコスト見積もり付き&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.cncf.io/blog/2026/01/07/holmesgpt-agentic-troubleshooting-built-for-the-cloud-native-era/"&gt;HolmesGPT&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;クラウドネイティブ向けのエージェント型トラブルシューティング — CNCF Sandboxプロジェクトに&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/project-dalec/dalec"&gt;Dalec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;SBOM生成付きの宣言的コンテナイメージビルド — ビルド段階でのCVE削減&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;方向性は明確：あなたの.NET API、Semantic Kernelのオーケストレーション層、推論ワークロードはすべて一貫したプラットフォームモデル上で実行されるべきです。そこに向かっています。&lt;/p&gt;
&lt;h2 id="今週から始めるなら"&gt;今週から始めるなら&lt;/h2&gt;
&lt;p&gt;チームでこれらの変更を評価しているなら、私の正直な優先順位リスト：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;まずオブザーバビリティ&lt;/strong&gt; — 非本番クラスターでGPUメトリクスとネットワークフローログを有効にする。見逃していたものを確認する。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blue-greenアップグレードを試す&lt;/strong&gt; — 次の本番クラスターアップグレード前にロールバックワークフローをテストする。プロセスへの信頼を構築する。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ID認識型ネットワーキングをパイロット&lt;/strong&gt; — 内部サービスパスを1つ選んでCiliumでmTLSを有効にする。オーバーヘッドを測定する（ネタバレ：最小限）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fleet Managerを評価&lt;/strong&gt; — 2つ以上のクラスターを運用しているなら、クロスクラスターネットワーキングはカスタムの接着剤削減だけで元が取れる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;小さな実験、素早いフィードバック。それが常に正しい手。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;KubeConのアナウンスは圧倒的になりがちですが、今回のバッチはAKS上の.NETチームにとって本当に針を動かします。メッシュオーバーヘッドなしのより良いネットワークセキュリティ、本物のGPUオブザーバビリティ、より安全なアップグレード、そしてより強力なAIインフラストラクチャの基盤。&lt;/p&gt;
&lt;p&gt;すでにAKSを使っているなら、運用ベースラインを強化する絶好のタイミングです。.NETワークロードをKubernetesに移行する予定なら — プラットフォームは大幅にプロダクションレディになりました。&lt;/p&gt;</content:encoded></item><item><title>SQL MCP Server、SSMS の Copilot、AI エージェント付き Database Hub：SQLCon 2026 で本当に重要なこと</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</link><pubDate>Sat, 28 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/agentic-ai-microsoft-databases-what-matters/</guid><description>Microsoft が SQLCon 2026 でデータベース関連の発表を大量にリリースしました。Azure SQL で AI アプリを構築しているなら、本当に重要なポイントをまとめました。</description><content:encoded>&lt;p&gt;Microsoft が&lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;アトランタの FabCon と併催で SQLCon 2026&lt;/a&gt; をキックオフしました。内容盛りだくさんです。元の発表はコスト削減プランからエンタープライズコンプライアンス機能まで全部カバーしていますが、エンタープライズ価格のスライドは飛ばして、Azure SQL と AI で開発している人にとって本当に重要な部分にフォーカスします。&lt;/p&gt;
&lt;h2 id="sql-mcp-server-がパブリックプレビューに"&gt;SQL MCP Server がパブリックプレビューに&lt;/h2&gt;
&lt;p&gt;これが僕にとってのヘッドラインです。Azure SQL Database Hyperscale に &lt;strong&gt;SQL MCP Server&lt;/strong&gt; のパブリックプレビューが追加され、&lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt; を使って SQL データを AI エージェントや Copilot にセキュアに接続できるようになりました。&lt;/p&gt;
&lt;p&gt;MCP の波を追いかけている人なら — 正直、今は見逃すほうが難しいですよね — これは大きなニュースです。データベースからのコンテキストを AI エージェントに渡すためにカスタムデータパイプラインを構築する代わりに、SQL データを直接公開するための標準化されたプロトコルが手に入ります。エージェントがライブのデータベース情報をクエリし、推論し、アクションを起こせるようになります。&lt;/p&gt;
&lt;p&gt;Semantic Kernel や Microsoft Agent Framework で AI エージェントを構築している人にとって、これはクリーンな統合パスを開きます。エージェントが在庫を確認する必要がある？顧客レコードを検索する？注文を検証する？MCP がシナリオごとにカスタムのデータ取得コードを書かなくても、構造化されたやり方を提供してくれます。&lt;/p&gt;
&lt;h2 id="ssms-22-の-github-copilot-が-ga-に"&gt;SSMS 22 の GitHub Copilot が GA に&lt;/h2&gt;
&lt;p&gt;SQL Server Management Studio を使っている人 — 正直に言うと、ほとんどの人がまだ使っていますよね — GitHub Copilot が SSMS 22 で正式に一般提供になりました。VS Code や Visual Studio で使っているのと同じ Copilot 体験が T-SQL で使えます。&lt;/p&gt;
&lt;p&gt;実用的な価値はシンプルです：クエリの作成、ストアドプロシージャのリファクタリング、パフォーマンス問題のトラブルシューティング、管理タスクのためのチャットベースのアシスタンス。コンセプトとしては革命的ではないですが、SSMS の中にあるということは、データベース作業で AI の助けを得るためだけに別のエディタにコンテキストスイッチする必要がないということです。&lt;/p&gt;
&lt;h2 id="ベクトルインデックスが本格的にアップグレード"&gt;ベクトルインデックスが本格的にアップグレード&lt;/h2&gt;
&lt;p&gt;Azure SQL Database のベクトルインデックスが高速化・高機能化し、insert、update、delete の完全サポートが追加されました。つまり、ベクトルデータがリアルタイムで最新の状態を保てます — バッチ再インデックスは不要です。&lt;/p&gt;
&lt;p&gt;新機能はこちら：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;量子化&lt;/strong&gt; でインデックスサイズを縮小（精度の大きな損失なし）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;イテレーティブフィルタリング&lt;/strong&gt; でより精密な結果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;クエリオプティマイザーとの緊密な統合&lt;/strong&gt; で予測可能なパフォーマンス&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure SQL をベクトルストアとして Retrieval-Augmented Generation (RAG) を行っている場合、これらの改善は直接的に役立ちます。リレーショナルデータと同じデータベースにベクトルを保持できるので、別のベクトルデータベースを運用するよりもアーキテクチャが大幅にシンプルになります。&lt;/p&gt;
&lt;p&gt;同じベクトルの改善は Fabric の SQL Database でも利用可能です。どちらも同じ SQL エンジンで動いているからです。&lt;/p&gt;
&lt;h2 id="fabric-の-database-hubエージェント型管理"&gt;Fabric の Database Hub：エージェント型管理&lt;/h2&gt;
&lt;p&gt;これはもう少し将来を見据えた話ですが、面白いです。Microsoft は &lt;strong&gt;Microsoft Fabric の Database Hub&lt;/strong&gt;（早期アクセス）を発表しました。Azure SQL、Cosmos DB、PostgreSQL、MySQL、SQL Server via Arc を一元的に管理できるビューを提供します。&lt;/p&gt;
&lt;p&gt;面白いのは統一ビューだけではなく、エージェント型の管理アプローチです。AI エージェントがデータベース環境を継続的に監視し、何が変わったかを示し、なぜそれが重要かを説明し、次に何をすべきかを提案します。エージェントが下調べをして、あなたが判断を下す human-in-the-loop モデルです。&lt;/p&gt;
&lt;p&gt;複数のデータベースを管理しているチームにとって、これは運用ノイズを本当に減らせる可能性があります。ポータル間を行き来してメトリクスを手動で確認する代わりに、エージェントがシグナルを届けてくれます。&lt;/p&gt;
&lt;h2 id="net-開発者にとっての意味"&gt;.NET 開発者にとっての意味&lt;/h2&gt;
&lt;p&gt;これらの発表をつなぐ共通のテーマは明確です：Microsoft はデータベーススタックのあらゆるレイヤーに AI エージェントを組み込んでいます。ギミックとしてではなく、実用的なツールレイヤーとして。&lt;/p&gt;
&lt;p&gt;Azure SQL をバックエンドにした .NET アプリを構築しているなら、僕が実際にやることはこれです：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;SQL MCP Server を試す&lt;/strong&gt; — AI エージェントを構築しているなら。カスタムの配管なしでエージェントにデータベースアクセスを与える最もクリーンな方法です。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SSMS で Copilot を有効にする&lt;/strong&gt; — まだなら。日常の SQL 作業のための無料の生産性アップです。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ベクトルインデックスを調べる&lt;/strong&gt; — RAG をやっていて現在別のベクトルストアを運用しているなら。Azure SQL に統合すれば、管理するサービスが一つ減ります。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;完全な発表にはもっとあります — コスト削減プラン、移行アシスタント、コンプライアンス機能 — でも開発者向けのストーリーは MCP Server、ベクトルの改善、エージェント型管理レイヤーにあります。これらが変えるのは、予算の立て方ではなく、構築の仕方です。&lt;/p&gt;
&lt;p&gt;完全な全体像は &lt;a href="https://www.microsoft.com/en-us/sql-server/blog/2026/03/18/advancing-agentic-ai-with-microsoft-databases-across-a-unified-data-estate/"&gt;Shireesh Thota の完全な発表&lt;/a&gt;をチェックしてください。新しい管理体験を試したい場合は &lt;a href="https://aka.ms/database-hub"&gt;Database Hub の早期アクセスにサインアップ&lt;/a&gt;してください。&lt;/p&gt;</content:encoded></item><item><title>Azure DevOps MCPサーバーがMicrosoft Foundryに登場：AIエージェントにとっての意味</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/azure-devops-mcp-server-microsoft-foundry/</guid><description>Azure DevOps MCPサーバーがMicrosoft Foundryで利用可能になりました。AIエージェントをDevOpsワークフロー（ワークアイテム、リポジトリ、パイプライン）に数クリックで直接接続できます。</description><content:encoded>&lt;p&gt;MCP（Model Context Protocol）が注目を集めています。AIエージェントのエコシステムを追っているなら、MCPサーバーがあちこちで登場しているのに気づいているでしょう — 標準化されたプロトコルを通じて、エージェントが外部ツールやサービスとやり取りする能力を提供しています。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;Azure DevOps MCPサーバーがMicrosoft Foundryで利用可能&lt;/a&gt;になり、これは実用的な可能性について考えさせられる統合の一つです。&lt;/p&gt;
&lt;h2 id="実際に何が起きているのか"&gt;実際に何が起きているのか&lt;/h2&gt;
&lt;p&gt;MicrosoftはすでにAzure DevOps MCPサーバーを&lt;a href="https://devblogs.microsoft.com/devops/azure-devops-remote-mcp-server-public-preview"&gt;パブリックプレビュー&lt;/a&gt;としてリリースしています — これがMCPサーバー本体です。新しいのはFoundryとの統合です。ツールカタログから直接、Azure DevOps MCPサーバーをFoundryエージェントに追加できるようになりました。&lt;/p&gt;
&lt;p&gt;Foundryをまだ知らない方へ：これはMicrosoftのAIアプリケーションとエージェントを大規模に構築・管理するための統合プラットフォームです。モデルアクセス、オーケストレーション、評価、デプロイ — すべてが一か所に。&lt;/p&gt;
&lt;h2 id="セットアップ"&gt;セットアップ&lt;/h2&gt;
&lt;p&gt;セットアップは驚くほどシンプルです：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Foundryエージェントで &lt;strong&gt;Add Tools&lt;/strong&gt; &amp;gt; &lt;strong&gt;Catalog&lt;/strong&gt; に移動&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Azure DevOps&amp;quot;を検索&lt;/li&gt;
&lt;li&gt;Azure DevOps MCP Server（preview）を選択して &lt;strong&gt;Create&lt;/strong&gt; をクリック&lt;/li&gt;
&lt;li&gt;組織名を入力して接続&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以上です。エージェントがAzure DevOpsツールにアクセスできるようになりました。&lt;/p&gt;
&lt;h2 id="エージェントがアクセスできるものを制御する"&gt;エージェントがアクセスできるものを制御する&lt;/h2&gt;
&lt;p&gt;ここが評価できるポイントです：オール・オア・ナッシングのアプローチに縛られません。エージェントに利用可能なツールを指定できます。ワークアイテムの読み取りだけを許可してパイプラインには触れさせたくない場合、そのように設定できます。最小権限の原則を、AIエージェントに適用するわけです。&lt;/p&gt;
&lt;p&gt;これはエンタープライズシナリオで重要です。誰かが「リリースを手伝って」と頼んだだけで、エージェントが誤ってデプロイパイプラインを起動するのは避けたいですよね。&lt;/p&gt;
&lt;h2 id="netチームにとってなぜ興味深いのか"&gt;.NETチームにとってなぜ興味深いのか&lt;/h2&gt;
&lt;p&gt;実践的に何が可能になるか考えてみてください：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;スプリント計画アシスタント&lt;/strong&gt; — ワークアイテムを取得し、ベロシティデータを分析し、スプリントキャパシティを提案できるエージェント&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コードレビューボット&lt;/strong&gt; — リポジトリやリンクされたワークアイテムを実際に読めるため、PRのコンテキストを理解するエージェント&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;インシデント対応&lt;/strong&gt; — ワークアイテムを作成し、最近のデプロイを照会し、バグと最近の変更を相関させるエージェント&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;開発者オンボーディング&lt;/strong&gt; — 「何に取り組むべき？」に対して、実際のプロジェクトデータに基づいた本物の回答が得られる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;CI/CDパイプラインやプロジェクト管理にすでにAzure DevOpsを使用している.NETチームにとって、これらのシステムと直接やり取りできるAIエージェントは、有用な自動化への大きな一歩です。&lt;/p&gt;
&lt;h2 id="mcpの全体像"&gt;MCPの全体像&lt;/h2&gt;
&lt;p&gt;これはより広いトレンドの一部です：MCPサーバーはAIエージェントが外部世界とやり取りする標準的な方法になりつつあります。GitHub、Azure DevOps、データベース、SaaS APIで見かけるようになり、Foundryはこれらすべての接続が集まるハブになりつつあります。&lt;/p&gt;
&lt;p&gt;.NETエコシステムでエージェントを構築しているなら、MCPに注目する価値があります。プロトコルは標準化され、ツールは成熟し、Foundry統合によりサーバー接続を手動で配線することなくアクセスしやすくなっています。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;FoundryのAzure DevOps MCPサーバーはプレビュー中なので、進化が期待されます。しかし、コアワークフローはしっかりしています：接続し、ツールアクセスを設定し、エージェントにDevOpsデータを操作させる。すでにFoundryエコシステムにいるなら、数クリックで始められます。試してみて、どんなワークフローが構築できるか確認してください。&lt;/p&gt;
&lt;p&gt;詳しいセットアップ手順については&lt;a href="https://devblogs.microsoft.com/devops/remote-mcp-server-preview-in-microsoft-foundry/"&gt;完全なアナウンス&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent ServiceがGA：.NETエージェント開発者にとって本当に重要なこと</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>MicrosoftのFoundry Agent ServiceがプライベートネットワーキングVoice Live、本番評価、オープンなマルチモデルランタイムでGAに到達。知っておくべきことはこちら。</description><content:encoded>&lt;p&gt;正直に言いましょう — AIエージェントのプロトタイプを作るのは簡単な部分です。難しいのはその後のすべて：適切なネットワーク分離で本番に乗せること、実際に意味のある評価を実行すること、コンプライアンス要件に対応すること、そして午前2時にものを壊さないこと。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent ServiceがGAになりました&lt;/a&gt;。そしてこのリリースは「その後のすべて」のギャップにレーザーのように集中しています。&lt;/p&gt;
&lt;h2 id="responses-apiの上に構築"&gt;Responses APIの上に構築&lt;/h2&gt;
&lt;p&gt;見出し：次世代のFoundry Agent ServiceはOpenAI Responses APIの上に構築されています。すでにそのワイヤープロトコルで開発しているなら、Foundryへの移行は最小限のコード変更で済みます。得られるもの：エンタープライズセキュリティ、プライベートネットワーキング、Entra RBAC、完全なトレーシング、評価 — 既存のエージェントロジックの上に。&lt;/p&gt;
&lt;p&gt;アーキテクチャは意図的にオープンです。一つのモデルプロバイダーや一つのオーケストレーションフレームワークに縛られません。プランニングにDeepSeek、生成にOpenAI、オーケストレーションにLangGraph — ランタイムが一貫性レイヤーを処理します。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_openai_client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;What are best practices for building AI agents?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;azure-ai-agents&lt;/code&gt;パッケージから来ている場合、エージェントは&lt;code&gt;azure-ai-projects&lt;/code&gt;の&lt;code&gt;AIProjectClient&lt;/code&gt;でファーストクラスの操作になりました。スタンドアロンの依存関係を削除し、&lt;code&gt;get_openai_client()&lt;/code&gt;でレスポンスを駆動してください。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="プライベートネットワーキングエンタープライズのブロッカー除去"&gt;プライベートネットワーキング：エンタープライズのブロッカー除去&lt;/h2&gt;
&lt;p&gt;これはエンタープライズ採用のブロックを解除する機能です。FoundryはBYO VNetで完全なエンドツーエンドのプライベートネットワーキングをサポートするようになりました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;パブリックエグレスなし&lt;/strong&gt; — エージェントのトラフィックはパブリックインターネットに触れない&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;コンテナ/サブネットインジェクション&lt;/strong&gt; — ローカル通信のためにネットワークに注入&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ツール接続性も含む&lt;/strong&gt; — MCPサーバー、Azure AI Search、Fabricデータエージェントすべてがプライベートパスで動作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最後のポイントが重要です。プライベートのままなのは推論呼び出しだけではありません — すべてのツール呼び出しと検索コールもネットワーク境界内にとどまります。外部ルーティングを禁止するデータ分類ポリシーの下で運用しているチームにとって、これが欠けていたものです。&lt;/p&gt;
&lt;h2 id="mcp認証を正しく"&gt;MCP認証を正しく&lt;/h2&gt;
&lt;p&gt;MCPサーバー接続は認証パターンの全スペクトルをサポートするようになりました：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;認証方法&lt;/th&gt;
&lt;th&gt;使用タイミング&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;キーベース&lt;/td&gt;
&lt;td&gt;組織全体の内部ツール向けシンプルな共有アクセス&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;サービス間；エージェントがそれ自体として認証&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;プロジェクト単位の分離；クレデンシャル管理不要&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;ユーザー委任アクセス；エージェントがユーザーに代わって行動&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthroughが興味深い。ユーザーがエージェントに個人データへのアクセスを許可する必要がある場合 — OneDrive、Salesforce org、ユーザースコープのSaaS API — エージェントは標準のOAuthフローでユーザーに代わって行動します。全員のふりをする共有システムIDはありません。&lt;/p&gt;
&lt;h2 id="voice-live配管なしの音声対音声"&gt;Voice Live：配管なしの音声対音声&lt;/h2&gt;
&lt;p&gt;エージェントに音声を追加するには、STT、LLM、TTSを組み合わせる必要がありました — 3つのサービス、3つのレイテンシホップ、3つの課金サーフェス、すべて手動で同期。&lt;strong&gt;Voice Live&lt;/strong&gt;はこれを単一のマネージドAPIに凝縮します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;セマンティック音声アクティビティとターンエンド検出（沈黙だけでなく意味を理解）&lt;/li&gt;
&lt;li&gt;サーバーサイドのノイズ抑制とエコーキャンセル&lt;/li&gt;
&lt;li&gt;割り込みサポート（ユーザーが応答中に割り込める）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;音声インタラクションはテキストと同じエージェントランタイムを通過します。同じ評価者、同じトレース、同じコスト可視性。カスタマーサポート、フィールドサービス、アクセシビリティシナリオで、以前はカスタムオーディオパイプラインが必要だったものを置き換えます。&lt;/p&gt;
&lt;h2 id="評価チェックボックスから継続的モニタリングへ"&gt;評価：チェックボックスから継続的モニタリングへ&lt;/h2&gt;
&lt;p&gt;ここでFoundryが本番品質について本気になります。評価システムには3つのレイヤーがあります：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;組み込み評価者&lt;/strong&gt; — 一貫性、関連性、根拠性、検索品質、安全性。データセットまたはライブトラフィックに接続してスコアを取得。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;カスタム評価者&lt;/strong&gt; — 独自のビジネスロジック、トーン標準、ドメイン固有のコンプライアンスルールをエンコード。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;継続的評価&lt;/strong&gt; — Foundryがライブ本番トラフィックをサンプリングし、評価者スイートを実行し、ダッシュボードに結果を表示。根拠性が低下したりセキュリティ閾値を超えた場合のAzure Monitorアラートを設定。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;すべてがAzure Monitor Application Insightsに公開されます。エージェント品質、インフラ健全性、コスト、アプリテレメトリ — すべて一か所に。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;eval_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Agent Quality Evaluation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data_source_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DataSourceConfigCustom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;item_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include_sample_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;testing_criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_evaluator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fluency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;evaluator_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;builtin.fluency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;initialization_parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deployment_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;data_mapping&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{item.query}}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{sample.output_text}}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ホステッドエージェント向け6つの新リージョン"&gt;ホステッドエージェント向け6つの新リージョン&lt;/h2&gt;
&lt;p&gt;ホステッドエージェントがEast US、North Central US、Sweden Central、Southeast Asia、Japan Eastなどで利用可能になりました。これはデータレジデンシー要件と、エージェントがデータソースの近くで実行される場合のレイテンシ圧縮に重要です。&lt;/p&gt;
&lt;h2 id="net開発者にとってなぜ重要か"&gt;.NET開発者にとってなぜ重要か&lt;/h2&gt;
&lt;p&gt;GAアナウンスのコードサンプルはPythonファーストですが、基盤となるインフラストラクチャは言語に依存しません — そして&lt;code&gt;azure-ai-projects&lt;/code&gt;の.NET SDKも同じパターンに従います。Responses API、評価フレームワーク、プライベートネットワーキング、MCP認証 — これらすべてが.NETから利用可能です。&lt;/p&gt;
&lt;p&gt;AIエージェントが「かっこいいデモ」から「実際に仕事で出荷できる」に変わるのを待っていたなら、このGAリリースがそのシグナルです。プライベートネットワーキング、適切な認証、継続的評価、本番モニタリングが欠けていたピースです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;Foundry Agent Serviceは今すぐ利用可能です。SDKをインストールし、&lt;a href="https://ai.azure.com"&gt;ポータル&lt;/a&gt;を開いて構築を始めましょう。&lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;クイックスタートガイド&lt;/a&gt;で数分でゼロから動くエージェントに到達できます。&lt;/p&gt;
&lt;p&gt;すべてのコードサンプルを含む完全な技術的ディープダイブは&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;GAアナウンスメント&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Frameworkのバックグラウンドレスポンス：タイムアウトの不安から解放</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Frameworkが継続トークンで長時間実行AIタスクのオフロードを可能に。バックグラウンドレスポンスの仕組みと.NETエージェントにとっての重要性を解説します。</description><content:encoded>&lt;p&gt;o3やGPT-5.2のような推論モデルで何かを構築したことがあるなら、その痛みを知っているでしょう。エージェントが複雑なタスクについて考え始め、クライアントは待ち続け、「大丈夫」と「クラッシュした？」の間のどこかで接続がタイムアウトする。あの作業は？全て消えます。&lt;/p&gt;
&lt;p&gt;Microsoft Agent Frameworkが&lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;バックグラウンドレスポンス&lt;/a&gt;をリリースしました — 正直なところ、これは初日から存在すべきだった機能の一つです。&lt;/p&gt;
&lt;h2 id="ブロッキング呼び出しの問題"&gt;ブロッキング呼び出しの問題&lt;/h2&gt;
&lt;p&gt;従来のリクエスト-レスポンスパターンでは、エージェントが終了するまでクライアントはブロックされます。簡単なタスクには問題ありません。しかし、推論モデルに深い調査、多段階分析、20ページのレポート生成を依頼する場合は？実時間で数分かかります。その間：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HTTP接続がタイムアウトする可能性がある&lt;/li&gt;
&lt;li&gt;ネットワークの途切れが操作全体を壊す&lt;/li&gt;
&lt;li&gt;ユーザーはスピナーを見つめて何かが起きているか疑問に思う&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;バックグラウンドレスポンスはこれを逆転させます。&lt;/p&gt;
&lt;h2 id="継続トークンの仕組み"&gt;継続トークンの仕組み&lt;/h2&gt;
&lt;p&gt;ブロックする代わりに、エージェントタスクを起動して&lt;strong&gt;継続トークン&lt;/strong&gt;を受け取ります。修理工場の引換券のようなものです — カウンターに立って待つ必要はなく、準備ができたら戻ってくればいいのです。&lt;/p&gt;
&lt;p&gt;フローは単純です：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;でリクエストを送信&lt;/li&gt;
&lt;li&gt;エージェントがバックグラウンド処理をサポートしていれば、継続トークンを受け取る&lt;/li&gt;
&lt;li&gt;トークンが&lt;code&gt;null&lt;/code&gt;を返すまでポーリング — 結果の準備完了を意味します&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;.NETバージョンはこちら：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://&amp;lt;myresource&amp;gt;.openai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;deployment-name&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 完了までポーリング&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントがすぐに完了する場合（簡単なタスク、バックグラウンド処理を必要としないモデル）、継続トークンは返されません。コードはそのまま動きます — 特別な処理は不要です。&lt;/p&gt;
&lt;h2 id="再開付きストリーミング本当のマジック"&gt;再開付きストリーミング：本当のマジック&lt;/h2&gt;
&lt;p&gt;ポーリングはfire-and-forgetシナリオには良いですが、リアルタイムの進捗が欲しい場合は？バックグラウンドレスポンスは再開機能付きストリーミングもサポートしています。&lt;/p&gt;
&lt;p&gt;各ストリーム更新は独自の継続トークンを持ちます。ストリーム中に接続が切れても、中断した正確な位置から再開できます：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponseUpdate&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// ネットワーク中断をシミュレート&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// 中断した正確な位置から再開&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;クライアントに何が起きてもサーバー側でエージェントは処理を続けます。リトライロジックやサーキットブレーカーを書くことなく、組み込みのフォールトトレランスが実現します。&lt;/p&gt;
&lt;h2 id="実際にいつ使うべきか"&gt;実際にいつ使うべきか&lt;/h2&gt;
&lt;p&gt;すべてのエージェント呼び出しにバックグラウンドレスポンスが必要なわけではありません。高速な完了には無駄な複雑さを追加するだけです。しかし、ここで威力を発揮します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;複雑な推論タスク&lt;/strong&gt; — 多段階分析、深い調査、推論モデルを本気で考えさせるもの&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;長文コンテンツ生成&lt;/strong&gt; — 詳細レポート、複数パートのドキュメント、広範な分析&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;信頼性の低いネットワーク&lt;/strong&gt; — モバイルクライアント、エッジデプロイメント、不安定な企業VPN&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非同期UXパターン&lt;/strong&gt; — タスクを送信し、他のことをして、結果を取りに戻る&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;エンタープライズアプリを構築する.NET開発者にとって、最後のポイントは特に興味深いです。ユーザーが複雑なレポートを要求するBlazorアプリを想像してください — エージェントタスクを起動し、プログレスインジケータを表示し、作業を続けてもらう。WebSocketの曲芸なし、カスタムキューインフラなし、トークンとポーリングループだけです。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;バックグラウンドレスポンスはMicrosoft Agent Frameworkを通じて.NETとPythonの両方で今すぐ利用可能です。単純なQ&amp;amp;A以上のことをするエージェントを構築しているなら、ツールキットに追加する価値があります。継続トークンパターンはシンプルさを保ちながら、非常に現実的な本番環境の問題を解決します。&lt;/p&gt;
&lt;p&gt;完全なAPIリファレンスとその他のより例については&lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;完全なドキュメント&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112：.NET開発者が本当に注目すべきこと</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112がリリースされ、エージェントのアップグレード、統合ブラウザデバッガー、MCPサンドボックス、モノレポサポートが満載です。.NETで開発しているなら本当に重要なポイントを紹介します。</description><content:encoded>&lt;p&gt;VS Code 1.112がリリースされました。正直に言うと、.NETの世界で日々過ごしているなら、このリリースは一味違います。&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;公式リリースノート&lt;/a&gt;には多くの内容がありますが、スクロールの手間を省いて、私たちにとって本当に重要なことに焦点を当てましょう。&lt;/p&gt;
&lt;h2 id="copilot-cliがずっと便利になった"&gt;Copilot CLIがずっと便利になった&lt;/h2&gt;
&lt;p&gt;今回のリリースの大きなテーマは&lt;strong&gt;エージェントの自律性&lt;/strong&gt; — Copilotにもっと自由にやらせて、あなたが一つ一つのステップを見守る必要をなくすことです。&lt;/p&gt;
&lt;h3 id="メッセージのステアリングとキューイング"&gt;メッセージのステアリングとキューイング&lt;/h3&gt;
&lt;p&gt;Copilot CLIがタスクの途中で、何か言い忘れたことに気づく瞬間を知っていますか？以前は待つしかありませんでした。今はリクエストがまだ実行中でもメッセージを送れます — 現在のレスポンスを方向付けるか、フォローアップの指示をキューに入れるかのどちらかです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;dotnet&lt;/code&gt;のスキャフォールディングの長いタスクで、Copilotがプロジェクトをセットアップしているのを見ながら「あ、待って、MassTransitも必要だった」と思う時に、これは最高です。&lt;/p&gt;
&lt;h3 id="パーミッションレベル"&gt;パーミッションレベル&lt;/h3&gt;
&lt;p&gt;これが一番ワクワクするものです。Copilot CLIセッションが3つのパーミッションレベルをサポートするようになりました：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;デフォルトパーミッション&lt;/strong&gt; — ツールが実行前に確認を求める通常のフロー&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;承認バイパス&lt;/strong&gt; — すべてを自動承認し、エラー時にリトライ&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;オートパイロット&lt;/strong&gt; — 完全に自律：ツールを承認し、自分の質問に答え、タスクが完了するまで続行&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ASP.NET Core APIをEntity Framework、マイグレーション、Dockerセットアップで新規作成するなら — オートパイロットモードは欲しいものを説明してコーヒーを取りに行くだけ。なんとかしてくれます。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chat.autopilot.enabled&lt;/code&gt;設定でオートパイロットを有効にできます。&lt;/p&gt;
&lt;h3 id="デリゲーション前の変更プレビュー"&gt;デリゲーション前の変更プレビュー&lt;/h3&gt;
&lt;p&gt;Copilot CLIにタスクをデリゲートすると、ワークツリーが作成されます。以前は、コミットしていない変更がある場合、ソースコントロールを確認して何が影響されるかを見る必要がありました。今はチャットビューで保留中の変更がすぐそこに表示され、コピー、移動、無視を決められます。&lt;/p&gt;
&lt;p&gt;小さなことですが、「待って、何をステージしてたっけ？」というモーメントから救ってくれます。&lt;/p&gt;
&lt;h2 id="vs-codeを離れずにwebアプリをデバッグ"&gt;VS Codeを離れずにWebアプリをデバッグ&lt;/h2&gt;
&lt;p&gt;統合ブラウザが&lt;strong&gt;フルデバッグ&lt;/strong&gt;をサポートするようになりました。ブレークポイントの設定、コードのステップスルー、変数の検査 — すべてVS Code内で。Edge DevToolsに切り替える必要はもうありません。&lt;/p&gt;
&lt;p&gt;新しい&lt;code&gt;editor-browser&lt;/code&gt;デバッグタイプがあり、既存の&lt;code&gt;msedge&lt;/code&gt;や&lt;code&gt;chrome&lt;/code&gt;のランチ設定がある場合、移行は&lt;code&gt;launch.json&lt;/code&gt;の&lt;code&gt;type&lt;/code&gt;フィールドを変更するだけです：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;editor-browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;launch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Debug Blazor App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://localhost:5001&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Blazor開発者にとって、これはゲームチェンジャーです。すでにターミナルで&lt;code&gt;dotnet watch&lt;/code&gt;を実行しています — デバッグも同じウィンドウに留まります。&lt;/p&gt;
&lt;p&gt;ブラウザには独立したズームレベル（やっと）、適切な右クリックコンテキストメニュー、Webサイトごとにズームが記憶される機能も追加されました。&lt;/p&gt;
&lt;h2 id="mcpサーバーのサンドボックス"&gt;MCPサーバーのサンドボックス&lt;/h2&gt;
&lt;p&gt;これは思っている以上に重要です。MCPサーバーを使っている場合 — Azureリソースやデータベースクエリ用にカスタムのものを設定しているかもしれません — これまでVS Codeプロセスと同じ権限で実行されていました。つまり、ファイルシステム、ネットワーク、すべてへのフルアクセスです。&lt;/p&gt;
&lt;p&gt;今はサンドボックス化できます。&lt;code&gt;mcp.json&lt;/code&gt;で：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;my-azure-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./mcp-server.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sandboxEnabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;サンドボックス化されたサーバーが持っていないものへのアクセスが必要な場合、VS Codeが権限の付与を促します。「誰も変なことをしないことを祈る」アプローチよりずっと良いです。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; サンドボックスは現在macOSとLinuxで利用可能です。Windowsサポートは準備中 — WSLのようなリモートシナリオは動作します。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="モノレポのカスタマイゼーション発見"&gt;モノレポのカスタマイゼーション発見&lt;/h2&gt;
&lt;p&gt;モノレポで作業している場合（正直に言うと、多くのエンタープライズ.NETソリューションはモノレポになります）、これは本当の痛みのポイントを解決します。&lt;/p&gt;
&lt;p&gt;以前は、リポジトリのサブフォルダを開いた場合、リポジトリルートにある&lt;code&gt;copilot-instructions.md&lt;/code&gt;、&lt;code&gt;AGENTS.md&lt;/code&gt;、カスタムスキルをVS Codeが見つけませんでした。&lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;設定により、&lt;code&gt;.git&lt;/code&gt;ルートまで遡ってすべてを発見するようになりました。&lt;/p&gt;
&lt;p&gt;これはチームがエージェントの指示、プロンプトファイル、カスタムツールをモノレポ内のすべてのプロジェクト間で共有できることを意味します。全員がルートフォルダを開く必要はありません。&lt;/p&gt;
&lt;h2 id="エージェントデバッグ用のtroubleshoot"&gt;エージェントデバッグ用の/troubleshoot&lt;/h2&gt;
&lt;p&gt;カスタム指示やスキルを設定して、なぜ検出されないか不思議に思ったことはありますか？新しい&lt;code&gt;/troubleshoot&lt;/code&gt;スキルはエージェントのデバッグログを読んで何が起きたかを教えてくれます — どのツールが使われたかスキップされたか、なぜ指示がロードされなかったか、何が遅い応答を引き起こしているか。&lt;/p&gt;
&lt;p&gt;次の設定で有効にします：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.fileLogging.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;チャットで&lt;code&gt;/troubleshoot why is my custom skill not loading?&lt;/code&gt;と入力するだけです。&lt;/p&gt;
&lt;p&gt;これらのデバッグログのエクスポートとインポートもできるようになり、何かが期待通りに動作しない場合にチームと共有するのに最適です。&lt;/p&gt;
&lt;h2 id="画像とバイナリファイルのサポート"&gt;画像とバイナリファイルのサポート&lt;/h2&gt;
&lt;p&gt;エージェントがディスクから画像ファイルとバイナリファイルをネイティブに読めるようになりました。バイナリファイルはhexdump形式で表示され、画像出力（統合ブラウザからのスクリーンショットなど）はカルーセルビューに表示されます。&lt;/p&gt;
&lt;p&gt;.NET開発者の場合：UIバグのスクリーンショットをチャットに貼り付けてエージェントに何が問題かを理解させたり、Blazorコンポーネントのレンダリング出力を分析させたりできます。&lt;/p&gt;
&lt;h2 id="自動シンボル参照"&gt;自動シンボル参照&lt;/h2&gt;
&lt;p&gt;小さなクオリティオブライフの改善：シンボル名（クラス、メソッドなど）をコピーしてチャットに貼り付けると、VS Codeが自動的に&lt;code&gt;#sym:Name&lt;/code&gt;参照に変換するようになりました。手動で追加することなく、エージェントにそのシンボルの完全なコンテキストを提供します。&lt;/p&gt;
&lt;p&gt;プレーンテキストが欲しい場合は&lt;code&gt;Ctrl+Shift+V&lt;/code&gt;を使用してください。&lt;/p&gt;
&lt;h2 id="プラグインの有効無効切り替え"&gt;プラグインの有効/無効切り替え&lt;/h2&gt;
&lt;p&gt;以前はMCPサーバーやプラグインを無効にするには、アンインストールする必要がありました。今はオン/オフを切り替えられます — グローバルにもワークスペースごとにも。拡張機能ビューまたはカスタマイゼーションビューで右クリックするだけです。&lt;/p&gt;
&lt;p&gt;npmとpypiのプラグインも自動更新できるようになりましたが、更新はマシン上で新しいコードを実行することを意味するので、まず承認を求めます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;VS Code 1.112は明らかにエージェント体験を強力に推進しています — より多くの自律性、より良いデバッグ、より厳密なセキュリティ。.NET開発者にとって、統合ブラウザデバッグとCopilot CLIの改善が際立った機能です。&lt;/p&gt;
&lt;p&gt;.NETプロジェクトでCopilot CLIのフルセッションをオートパイロットモードで試したことがないなら、このリリースが始めるのに良いタイミングです。パーミッションを設定して、あとはお任せしましょう。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;VS Code 1.112をダウンロード&lt;/a&gt;するか、VS Code内から&lt;strong&gt;ヘルプ &amp;gt; 更新の確認&lt;/strong&gt;で更新してください。&lt;/p&gt;</content:encoded></item><item><title>ラップトップから本番へ：2つのコマンドでAIエージェントをMicrosoft Foundryにデプロイ</title><link>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ja/news/emiliano-montesdeoca/deploy-ai-agents-foundry-azd-two-commands/</guid><description>Azure Developer CLIに'azd ai agent'コマンドが追加され、AIエージェントをローカル開発から数分でFoundryの本番エンドポイントへ。完全なワークフローを紹介します。</description><content:encoded>&lt;p&gt;「自分のマシンでは動く」と「デプロイされてトラフィックを処理している」の間のギャップを知っていますか？AIエージェントにとって、そのギャップは痛いほど広かった。リソースのプロビジョニング、モデルのデプロイ、IDの設定、モニタリングの構築 — これら全ては、誰かが実際にエージェントを呼び出せるようになる前の話です。&lt;/p&gt;
&lt;p&gt;Azure Developer CLIがこれを&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;2つのコマンドで済む話&lt;/a&gt;にしました。&lt;/p&gt;
&lt;h2 id="新しいazd-ai-agentワークフロー"&gt;新しい&lt;code&gt;azd ai agent&lt;/code&gt;ワークフロー&lt;/h2&gt;
&lt;p&gt;実際にどんな感じか見せましょう。AIエージェントプロジェクトがあるとします — ホテルのコンシェルジュエージェントとしましょう。ローカルで動いています。Microsoft Foundry上で実行したい。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd up
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上です。2つのコマンド。&lt;code&gt;azd ai agent init&lt;/code&gt;がリポジトリにInfrastructure as Codeを生成し、&lt;code&gt;azd up&lt;/code&gt;がAzure上で全てをプロビジョニングしてエージェントを公開します。Foundryポータルでエージェントへの直接リンクが得られます。&lt;/p&gt;
&lt;h2 id="裏側で何が起きているか"&gt;裏側で何が起きているか&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;init&lt;/code&gt;コマンドはリポジトリに実際の、検査可能なBicepテンプレートを生成します：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Foundry Resource&lt;/strong&gt;（トップレベルコンテナ）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Foundry Project&lt;/strong&gt;（エージェントが存在する場所）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;モデルデプロイメント&lt;/strong&gt;設定（GPT-4oなど）&lt;/li&gt;
&lt;li&gt;適切なRBACロール割り当てを持つ&lt;strong&gt;マネージドID&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;サービスマップ用の&lt;code&gt;azure.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;エージェントメタデータと環境変数を持つ&lt;code&gt;agent.yaml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重要なポイント：これは全てあなたのものです。リポジトリ内のバージョン管理されたBicepです。検査し、カスタマイズし、エージェントコードと一緒にコミットできます。魔法のブラックボックスはありません。&lt;/p&gt;
&lt;h2 id="開発の内部ループ"&gt;開発の内部ループ&lt;/h2&gt;
&lt;p&gt;本当に気に入っているのはローカル開発の体験です。エージェントのロジックを反復しているとき、プロンプトを変更するたびに再デプロイしたくないですよね：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent run
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;これでエージェントをローカルで起動します。&lt;code&gt;azd ai agent invoke&lt;/code&gt;と組み合わせてテストプロンプトを送信すると、タイトなフィードバックループが得られます。コード編集、再起動、呼び出し、繰り返し。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;invoke&lt;/code&gt;コマンドはルーティングも賢く — ローカルエージェントが実行中なら自動的にそちらをターゲットにします。実行中でなければリモートエンドポイントにアクセスします。&lt;/p&gt;
&lt;h2 id="リアルタイムモニタリング"&gt;リアルタイムモニタリング&lt;/h2&gt;
&lt;p&gt;これが私を納得させた機能です。エージェントがデプロイされたら：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;azd ai agent monitor --follow
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;エージェントを通過する全てのリクエストとレスポンスがリアルタイムでターミナルにストリームされます。本番環境の問題デバッグには計り知れない価値があります。Log Analyticsを掘り返す必要なし、メトリクス集計を待つ必要なし — 今何が起きているかが見えます。&lt;/p&gt;
&lt;h2 id="コマンドの完全セット"&gt;コマンドの完全セット&lt;/h2&gt;
&lt;p&gt;クイックリファレンスはこちら：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コマンド&lt;/th&gt;
&lt;th&gt;機能&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;IaCでFoundryエージェントプロジェクトをスキャフォールド&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd up&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Azureリソースをプロビジョニングしてエージェントをデプロイ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;リモートまたはローカルエージェントにプロンプトを送信&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent run&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;開発用にエージェントをローカルで実行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;公開エージェントからリアルタイムログをストリーム&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd ai agent show&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;エージェントの健全性とステータスを確認&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;azd down&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;全てのAzureリソースをクリーンアップ&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="net開発者にとってなぜ重要か"&gt;.NET開発者にとってなぜ重要か&lt;/h2&gt;
&lt;p&gt;アナウンスのサンプルはPythonベースですが、インフラストラクチャの話は言語に依存しません。あなたの.NETエージェントも同じBicepスキャフォールディング、同じマネージドID設定、同じモニタリングパイプラインを受け取ります。そして、すでに.NET Aspireアプリやazureデプロイメントに&lt;code&gt;azd&lt;/code&gt;を使っているなら、既存のワークフローにそのまま組み込めます。&lt;/p&gt;
&lt;p&gt;AIエージェントのデプロイメントギャップはエコシステムで最大の摩擦ポイントの一つでした。動くプロトタイプから適切なID、ネットワーキング、モニタリングを備えた本番エンドポイントへの移行に1週間のDevOps作業は必要ないはずです。今は2つのコマンドと数分で済みます。&lt;/p&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd ai agent&lt;/code&gt;は今すぐ利用可能です。インフラストラクチャ設定が大変そうだからとAIエージェントのデプロイを先延ばしにしていたなら、試してみてください。フロントエンドチャットアプリ統合を含む完全なステップバイステップガイドは&lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-ai-agent-end-to-end/"&gt;完全なウォークスルー&lt;/a&gt;をご覧ください。&lt;/p&gt;</content:encoded></item></channel></rss>