From acf8fa47c12adab4dfe1ce7ff65805f5dd622854 Mon Sep 17 00:00:00 2001
From: Roger Barreto <19890735+rogerbarreto@users.noreply.github.com>
Date: Fri, 17 Apr 2026 23:34:51 +0100
Subject: [PATCH] Bump Azure.AI.Projects to 2.1.0-alpha; add
ToolboxRecord/ToolboxVersion factory overloads + tests
---
dotnet/Directory.Packages.props | 2 +-
dotnet/nuget.config | 6 ++
.../FoundryAITool.cs | 42 +++++++++---
.../HostedMcpToolboxAIToolTests.cs | 67 +++++++++++++++++++
4 files changed, 108 insertions(+), 9 deletions(-)
diff --git a/dotnet/Directory.Packages.props b/dotnet/Directory.Packages.props
index ce1bbffa0a..8b7ef32ccf 100644
--- a/dotnet/Directory.Packages.props
+++ b/dotnet/Directory.Packages.props
@@ -22,7 +22,7 @@
-
+
diff --git a/dotnet/nuget.config b/dotnet/nuget.config
index 76d943ce16..2316305f8e 100644
--- a/dotnet/nuget.config
+++ b/dotnet/nuget.config
@@ -3,10 +3,16 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs b/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs
index a16b205e4f..d9ecb851e3 100644
--- a/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs
+++ b/dotnet/src/Microsoft.Agents.AI.Foundry/FoundryAITool.cs
@@ -119,17 +119,43 @@ public static class FoundryAITool
/// The Foundry toolbox name.
/// Optional pinned toolbox version. When , the project's default version is used.
/// An marker backed by .
- ///
- ///
- /// Consumers who already hold a ToolboxRecord or ToolboxVersion from
- /// Azure.AI.Projects.Agents can pass record.Name together with
- /// record.DefaultVersion (or version.Name/version.Version) to this
- /// factory.
- ///
- ///
public static AITool CreateHostedMcpToolbox(string toolboxName, string? version = null)
=> new HostedMcpToolboxAITool(toolboxName, version);
+ ///
+ /// Creates an marker from a retrieved
+ /// from AIProjectClient. Uses and
+ /// .
+ ///
+ /// The toolbox record.
+ /// An marker backed by .
+ public static AITool CreateHostedMcpToolbox(ToolboxRecord toolbox)
+ {
+ if (toolbox is null)
+ {
+ throw new ArgumentNullException(nameof(toolbox));
+ }
+
+ return new HostedMcpToolboxAITool(toolbox.Name, toolbox.DefaultVersion);
+ }
+
+ ///
+ /// Creates an marker from a specific
+ /// retrieved from AIProjectClient. Uses and
+ /// .
+ ///
+ /// The toolbox version.
+ /// An marker backed by .
+ public static AITool CreateHostedMcpToolbox(ToolboxVersion toolboxVersion)
+ {
+ if (toolboxVersion is null)
+ {
+ throw new ArgumentNullException(nameof(toolboxVersion));
+ }
+
+ return new HostedMcpToolboxAITool(toolboxVersion.Name, toolboxVersion.Version);
+ }
+
// --- OpenAI SDK ResponseTool factories ---
///
diff --git a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs
index d6fbd53df5..640ef69008 100644
--- a/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs
+++ b/dotnet/tests/Microsoft.Agents.AI.Foundry.UnitTests/HostedMcpToolboxAIToolTests.cs
@@ -93,4 +93,71 @@ public class HostedMcpToolboxAIToolTests
Assert.Equal("my-toolbox", marker.ToolboxName);
Assert.Equal("v1", marker.Version);
}
+
+ [Fact]
+ public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxRecord_UsesNameAndDefaultVersion()
+ {
+ var record = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxRecord(
+ id: "tbx-123",
+ name: "calendar-tools",
+ defaultVersion: "v2");
+
+ var tool = FoundryAITool.CreateHostedMcpToolbox(record);
+
+ var marker = Assert.IsType(tool);
+ Assert.Equal("calendar-tools", marker.ToolboxName);
+ Assert.Equal("v2", marker.Version);
+ Assert.Equal("foundry-toolbox://calendar-tools?version=v2", marker.ServerAddress);
+ }
+
+ [Fact]
+ public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxRecord_NullDefaultVersionOmitsQuery()
+ {
+ var record = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxRecord(
+ id: "tbx-abc",
+ name: "finance-tools",
+ defaultVersion: null);
+
+ var tool = FoundryAITool.CreateHostedMcpToolbox(record);
+
+ var marker = Assert.IsType(tool);
+ Assert.Equal("finance-tools", marker.ToolboxName);
+ Assert.Null(marker.Version);
+ Assert.Equal("foundry-toolbox://finance-tools", marker.ServerAddress);
+ }
+
+ [Fact]
+ public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxRecord_Null_Throws()
+ {
+ Assert.Throws(
+ () => FoundryAITool.CreateHostedMcpToolbox((Azure.AI.Projects.Agents.ToolboxRecord)null!));
+ }
+
+ [Fact]
+ public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxVersion_UsesNameAndVersion()
+ {
+ var version = Azure.AI.Projects.Agents.ProjectsAgentsModelFactory.ToolboxVersion(
+ metadata: null,
+ id: "ver-1",
+ name: "hr-tools",
+ version: "2025-09-01",
+ description: "HR toolbox",
+ createdAt: DateTimeOffset.UtcNow,
+ tools: null,
+ policies: null);
+
+ var tool = FoundryAITool.CreateHostedMcpToolbox(version);
+
+ var marker = Assert.IsType(tool);
+ Assert.Equal("hr-tools", marker.ToolboxName);
+ Assert.Equal("2025-09-01", marker.Version);
+ Assert.Equal("foundry-toolbox://hr-tools?version=2025-09-01", marker.ServerAddress);
+ }
+
+ [Fact]
+ public void FoundryAITool_CreateHostedMcpToolbox_FromToolboxVersion_Null_Throws()
+ {
+ Assert.Throws(
+ () => FoundryAITool.CreateHostedMcpToolbox((Azure.AI.Projects.Agents.ToolboxVersion)null!));
+ }
}