From 2b4ff5f076daa54496f828be82cc8dafa8dca56e Mon Sep 17 00:00:00 2001 From: Mark Wallace <127216156+markwallace-microsoft@users.noreply.github.com> Date: Wed, 1 Oct 2025 08:37:12 +0100 Subject: [PATCH] .NET: Sample for the MCP and Foundry Agents documentation (#972) * Foundry Agent MCP * Foundry Agent MCP * Use Foundry SDK directly * Use raw representation factory * Fix typo --------- Co-authored-by: Mark Wallace --- dotnet/agent-framework-dotnet.slnx | 1 + .../FoundryAgent_Hosted_MCP.csproj | 20 +++++++ .../FoundryAgent_Hosted_MCP/Program.cs | 56 +++++++++++++++++++ .../FoundryAgent_Hosted_MCP/README.md | 16 ++++++ 4 files changed, 93 insertions(+) create mode 100644 dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/FoundryAgent_Hosted_MCP.csproj create mode 100644 dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/Program.cs create mode 100644 dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/README.md diff --git a/dotnet/agent-framework-dotnet.slnx b/dotnet/agent-framework-dotnet.slnx index 4d44098cd0..b2817cbf12 100644 --- a/dotnet/agent-framework-dotnet.slnx +++ b/dotnet/agent-framework-dotnet.slnx @@ -59,6 +59,7 @@ + diff --git a/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/FoundryAgent_Hosted_MCP.csproj b/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/FoundryAgent_Hosted_MCP.csproj new file mode 100644 index 0000000000..5a4979eb5b --- /dev/null +++ b/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/FoundryAgent_Hosted_MCP.csproj @@ -0,0 +1,20 @@ + + + + Exe + net9.0 + + enable + disable + + + + + + + + + + + + diff --git a/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/Program.cs b/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/Program.cs new file mode 100644 index 0000000000..0e44f07b52 --- /dev/null +++ b/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/Program.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft. All rights reserved. + +// This sample shows how to create and use a simple AI agent with Azure Foundry Agents as the backend. + +using System; +using Azure.AI.Agents.Persistent; +using Azure.Identity; +using Microsoft.Agents.AI; + +var endpoint = Environment.GetEnvironmentVariable("AZURE_FOUNDRY_PROJECT_ENDPOINT") ?? throw new InvalidOperationException("AZURE_FOUNDRY_PROJECT_ENDPOINT is not set."); +var model = Environment.GetEnvironmentVariable("AZURE_FOUNDRY_PROJECT_MODEL_ID") ?? "gpt-4.1-mini"; + +const string AgentName = "MicrosoftLearnAgent"; +const string AgentInstructions = "You answer questions by searching the Microsoft Learn content only."; + +// Get a client to create/retrieve server side agents with. +var persistentAgentsClient = new PersistentAgentsClient(endpoint, new AzureCliCredential()); + +// Create an MCP tool definition that the agent can use. +var mcpTool = new MCPToolDefinition( + serverLabel: "microsoft_learn", + serverUrl: "https://learn.microsoft.com/api/mcp"); +mcpTool.AllowedTools.Add("microsoft_docs_search"); + +// Create a server side persistent agent with the Azure.AI.Agents.Persistent SDK. +var agentMetadata = await persistentAgentsClient.Administration.CreateAgentAsync( + model: model, + name: AgentName, + instructions: AgentInstructions, + tools: [mcpTool]); + +// Retrieve an already created server side persistent agent as an AIAgent. +AIAgent agent = await persistentAgentsClient.GetAIAgentAsync(agentMetadata.Value.Id); + +// Create run options to configure the agent invocation. +var runOptions = new ChatClientAgentRunOptions() +{ + ChatOptions = new() + { + RawRepresentationFactory = (_) => new ThreadAndRunOptions() + { + ToolResources = new MCPToolResource(serverLabel: "microsoft_learn") + { + RequireApproval = new MCPApproval("never"), + }.ToToolResources() + } + } +}; + +// You can then invoke the agent like any other AIAgent. +AgentThread thread = agent.GetNewThread(); +var response = await agent.RunAsync("Please summarize the Azure AI Agent documentation related to MCP Tool calling?", thread, runOptions); +Console.WriteLine(response); + +// Cleanup for sample purposes. +await persistentAgentsClient.Administration.DeleteAgentAsync(agent.Id); diff --git a/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/README.md b/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/README.md new file mode 100644 index 0000000000..df0854ba2f --- /dev/null +++ b/dotnet/samples/GettingStarted/ModelContextProtocol/FoundryAgent_Hosted_MCP/README.md @@ -0,0 +1,16 @@ +# Prerequisites + +Before you begin, ensure you have the following prerequisites: + +- .NET 8.0 SDK or later +- Azure Foundry service endpoint and deployment configured +- Azure CLI installed and authenticated (for Azure credential authentication) + +**Note**: This demo uses Azure CLI credentials for authentication. Make sure you're logged in with `az login` and have access to the Azure Foundry resource. For more information, see the [Azure CLI documentation](https://learn.microsoft.com/cli/azure/authenticate-azure-cli-interactively). + +Set the following environment variables: + +```powershell +$env:AZURE_FOUNDRY_PROJECT_ENDPOINT="https://your-foundry-service.services.ai.azure.com/api/projects/your-foundry-project" # Replace with your Azure Foundry resource endpoint +$env:AZURE_FOUNDRY_PROJECT_DEPLOYMENT_NAME="gpt-4o-mini" # Optional, defaults to gpt-4o-mini +```