-
Notifications
You must be signed in to change notification settings - Fork 681
.NET: Response & foundry agent hosted MCP sample #1568
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
westey-m
merged 12 commits into
microsoft:main
from
westey-m:response-agent-hostedmcp-sample
Nov 4, 2025
Merged
Changes from 2 commits
Commits
Show all changes
12 commits
Select commit
Hold shift + click to select a range
0b8870c
Adding sample demonstrating hosted MCP with Responses
westey-m b6902a7
Add mcp readme.md to slnx
westey-m 34ff19a
Update FoundryAgent sample to use MCP types from abstraction and to s…
westey-m 797d685
Merge branch 'main' into response-agent-hostedmcp-sample
westey-m 4a5d451
Merge branch 'main' into response-agent-hostedmcp-sample
crickman 242e220
Merge branch 'main' into response-agent-hostedmcp-sample
westey-m 0dea9d6
Merge branch 'main' into response-agent-hostedmcp-sample
westey-m c8f0c32
Fix param name after package update.
westey-m 271951b
Merge branch 'response-agent-hostedmcp-sample' of https://github.com/…
westey-m e832e3b
Merge branch 'main' into response-agent-hostedmcp-sample
westey-m b79470a
Fix environment variable name for consistency
westey-m e0bf1db
Apply suggestion from @Copilot
westey-m File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
95 changes: 95 additions & 0 deletions
95
dotnet/samples/GettingStarted/ModelContextProtocol/ResponseAgent_Hosted_MCP/Program.cs
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,95 @@ | ||
| // Copyright (c) Microsoft. All rights reserved. | ||
|
|
||
| // This sample shows how to create and use a simple AI agent with OpenAI Responses as the backend, that uses a Hosted MCP Tool. | ||
| // In this case the OpenAI responses service will invoke any MCP tools as required. MCP tools are not invoked by the Agent Framework. | ||
| // The sample first shows how to use MCP tools with auto approval, and then how to set up a tool that requires approval before it can be invoked and how to approve such a tool. | ||
|
|
||
| using Azure.AI.OpenAI; | ||
| using Azure.Identity; | ||
| using Microsoft.Agents.AI; | ||
| using Microsoft.Extensions.AI; | ||
| using OpenAI; | ||
|
|
||
| var endpoint = Environment.GetEnvironmentVariable("AZURE_OPENAI_ENDPOINT") ?? throw new InvalidOperationException("AZURE_OPENAI_ENDPOINT is not set."); | ||
| var deploymentName = Environment.GetEnvironmentVariable("AZURE_OPENAI_DEPLOYMENT_NAME") ?? "gpt-4o-mini"; | ||
|
|
||
| // **** MCP Tool with Auto Approval **** | ||
| // ************************************* | ||
|
|
||
| // Create an MCP tool definition that the agent can use. | ||
| // In this case we allow the tool to always be called without approval. | ||
| var mcpTool = new HostedMcpServerTool( | ||
| serverName: "microsoft_learn", | ||
| url: "https://learn.microsoft.com/api/mcp") | ||
| { | ||
| AllowedTools = ["microsoft_docs_search"], | ||
| ApprovalMode = HostedMcpServerToolApprovalMode.NeverRequire | ||
| }; | ||
|
|
||
| // Create an agent based on Azure OpenAI Responses as the backend. | ||
| AIAgent agent = new AzureOpenAIClient( | ||
| new Uri(endpoint), | ||
| new AzureCliCredential()) | ||
| .GetOpenAIResponseClient(deploymentName) | ||
| .CreateAIAgent( | ||
| instructions: "You answer questions by searching the Microsoft Learn content only.", | ||
| name: "MicrosoftLearnAgent", | ||
| tools: [mcpTool]); | ||
|
|
||
| // You can then invoke the agent like any other AIAgent. | ||
| AgentThread thread = agent.GetNewThread(); | ||
| Console.WriteLine(await agent.RunAsync("Please summarize the Azure AI Agent documentation related to MCP Tool calling?", thread)); | ||
|
|
||
| // **** MCP Tool with Approval Required **** | ||
| // ***************************************** | ||
|
|
||
| // Create an MCP tool definition that the agent can use. | ||
| // In this case we require approval before the tool can be called. | ||
| var mcpToolWithApproval = new HostedMcpServerTool( | ||
| serverName: "microsoft_learn", | ||
| url: "https://learn.microsoft.com/api/mcp") | ||
| { | ||
| AllowedTools = ["microsoft_docs_search"], | ||
| ApprovalMode = HostedMcpServerToolApprovalMode.AlwaysRequire | ||
| }; | ||
|
|
||
| // Create an agent based on Azure OpenAI Responses as the backend. | ||
| AIAgent agentWithRequiredApproval = new AzureOpenAIClient( | ||
| new Uri(endpoint), | ||
| new AzureCliCredential()) | ||
| .GetOpenAIResponseClient(deploymentName) | ||
| .CreateAIAgent( | ||
| instructions: "You answer questions by searching the Microsoft Learn content only.", | ||
| name: "MicrosoftLearnAgentWithApproval", | ||
| tools: [mcpToolWithApproval]); | ||
|
|
||
| // You can then invoke the agent like any other AIAgent. | ||
| var threadWithRequiredApproval = agentWithRequiredApproval.GetNewThread(); | ||
| var response = await agentWithRequiredApproval.RunAsync("Please summarize the Azure AI Agent documentation related to MCP Tool calling?", threadWithRequiredApproval); | ||
| var userInputRequests = response.UserInputRequests.ToList(); | ||
|
|
||
| while (userInputRequests.Count > 0) | ||
| { | ||
| // Ask the user to approve each MCP call request. | ||
| // For simplicity, we are assuming here that only MCP approval requests are being made. | ||
| var userInputResponses = userInputRequests | ||
| .OfType<McpServerToolApprovalRequestContent>() | ||
| .Select(approvalRequest => | ||
| { | ||
| Console.WriteLine($""" | ||
| The agent would like to invoke the following MCP Tool, please reply Y to approve. | ||
| ServerName: {approvalRequest.ToolCall.ServerName} | ||
| Name: {approvalRequest.ToolCall.ToolName} | ||
| Arguments: {string.Join(", ", approvalRequest.ToolCall.Arguments?.Select(x => $"{x.Key}: {x.Value}") ?? [])} | ||
| """); | ||
| return new ChatMessage(ChatRole.User, [approvalRequest.CreateResponse(Console.ReadLine()?.Equals("Y", StringComparison.OrdinalIgnoreCase) ?? false)]); | ||
| }) | ||
| .ToList(); | ||
|
|
||
| // Pass the user input responses back to the agent for further processing. | ||
| response = await agentWithRequiredApproval.RunAsync(userInputResponses, threadWithRequiredApproval); | ||
|
|
||
| userInputRequests = response.UserInputRequests.ToList(); | ||
| } | ||
|
|
||
| Console.WriteLine($"\nAgent: {response}"); |
17 changes: 17 additions & 0 deletions
17
.../samples/GettingStarted/ModelContextProtocol/ResponseAgent_Hosted_MCP/README.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| # Prerequisites | ||
|
|
||
| Before you begin, ensure you have the following prerequisites: | ||
|
|
||
| - .NET 8.0 SDK or later | ||
| - Azure OpenAI service endpoint and deployment configured | ||
| - Azure CLI installed and authenticated (for Azure credential authentication) | ||
| - User has the `Cognitive Services OpenAI Contributor` role for the Azure OpenAI resource. | ||
|
|
||
| **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). | ||
westey-m marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
|
|
||
| Set the following environment variables: | ||
|
|
||
| ```powershell | ||
| $env:AZURE_OPENAI_ENDPOINT="https://your-resource.openai.azure.com/" # Replace with your Azure OpenAI resource endpoint | ||
| $env:AZURE_OPENAI_DEPLOYMENT_NAME="gpt-4.1-mini" # Optional, defaults to gpt-4.1-mini | ||
| ``` | ||
20 changes: 20 additions & 0 deletions
20
...tingStarted/ModelContextProtocol/ResponseAgent_Hosted_MCP/ResponseAgent_Hosted_MCP.csproj
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,20 @@ | ||
| <Project Sdk="Microsoft.NET.Sdk"> | ||
|
|
||
| <PropertyGroup> | ||
| <OutputType>Exe</OutputType> | ||
| <TargetFramework>net9.0</TargetFramework> | ||
|
|
||
| <Nullable>enable</Nullable> | ||
| <ImplicitUsings>enable</ImplicitUsings> | ||
| </PropertyGroup> | ||
|
|
||
| <ItemGroup> | ||
| <PackageReference Include="Azure.AI.OpenAI" /> | ||
| <PackageReference Include="Azure.Identity" /> | ||
| </ItemGroup> | ||
|
|
||
| <ItemGroup> | ||
| <ProjectReference Include="..\..\..\..\src\Microsoft.Agents.AI.OpenAI\Microsoft.Agents.AI.OpenAI.csproj" /> | ||
| </ItemGroup> | ||
|
|
||
| </Project> |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.