From de011d7e1b4cc9f78c141bc100e7b3436da2f645 Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Thu, 18 Sep 2025 15:44:29 +0900 Subject: [PATCH 1/4] Add MCP tools --- .../approvals-always-require-approval.cs | 44 +++++++++++++++++++ .../approvals-never-require-approval.cs | 28 ++++++++++++ .../responses/filtering-tools.cs | 28 ++++++++++++ .../responses/quickstart-remote-mcp.cs | 27 ++++++++++++ 4 files changed, 127 insertions(+) create mode 100644 docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs create mode 100644 docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs create mode 100644 docs/guides/tools-connectors-mcp/responses/filtering-tools.cs create mode 100644 docs/guides/tools-connectors-mcp/responses/quickstart-remote-mcp.cs diff --git a/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs b/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs new file mode 100644 index 000000000..c7ab05024 --- /dev/null +++ b/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs @@ -0,0 +1,44 @@ +// SAMPLE: Generate response from remote MCP through Responses API +// PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#approvals +// GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start +#pragma warning disable OPENAI001 + +#:package OpenAI@2.* +#:property PublishAot=false + +using OpenAI.Responses; + +string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!; +OpenAIResponseClient client = new(model: "gpt-5", apiKey: key); + +ResponseCreationOptions options1 = new(); +options1.Tools.Add(ResponseTool.CreateMcpTool( + serverLabel: "dmcp", + serverUri: new Uri("https://dmcp-server.deno.dev/sse") +)); + +McpToolCallApprovalRequestItem request1 = ResponseItem.CreateMcpApprovalRequestItem( + serverLabel: "dmcp", + name: "roll", + arguments: BinaryData.FromObjectAsJson(new { diceRollExpression = "2d4+1" }) +); + +OpenAIResponse response1 = (OpenAIResponse)client.CreateResponse([ + request1 +], options1); + +ResponseCreationOptions options2 = new(); +options2.Tools.Add(ResponseTool.CreateMcpTool( + serverLabel: "dmcp", + serverUri: new Uri("https://dmcp-server.deno.dev/sse"), + toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval) +)); + +options2.PreviousResponseId = response1.Id; + +OpenAIResponse response2 = (OpenAIResponse)client.CreateResponse([ + request1, + ResponseItem.CreateMcpApprovalResponseItem(request1.Id, approved: true), +], options2); + +Console.WriteLine(response2.GetOutputText()); \ No newline at end of file diff --git a/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs b/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs new file mode 100644 index 000000000..9ef0f4a31 --- /dev/null +++ b/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs @@ -0,0 +1,28 @@ +// SAMPLE: Generate response from remote MCP through Responses API +// PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#approvals +// GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start +#pragma warning disable OPENAI001 + +#:package OpenAI@2.* +#:property PublishAot=false + +using OpenAI.Responses; + +string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!; +OpenAIResponseClient client = new(model: "gpt-5", apiKey: key); + +ResponseCreationOptions options = new(); +options.Tools.Add(ResponseTool.CreateMcpTool( + serverLabel: "deepwiki", + serverUri: new Uri("https://mcp.deepwiki.com/mcp"), + allowedTools: new McpToolFilter() { ToolNames = { "ask_question", "read_wiki_structure" } }, + toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.NeverRequireApproval) +)); + +OpenAIResponse response = (OpenAIResponse)client.CreateResponse([ + ResponseItem.CreateUserMessageItem([ + ResponseContentPart.CreateInputTextPart("What transport protocols does the 2025-03-26 version of the MCP spec (modelcontextprotocol/modelcontextprotocol) support?") + ]) +], options); + +Console.WriteLine(response.GetOutputText()); \ No newline at end of file diff --git a/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs b/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs new file mode 100644 index 000000000..a243c8367 --- /dev/null +++ b/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs @@ -0,0 +1,28 @@ +// SAMPLE: Generate response from remote MCP through Responses API +// PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#filtering-tools +// GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start +#pragma warning disable OPENAI001 + +#:package OpenAI@2.* +#:property PublishAot=false + +using OpenAI.Responses; + +string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!; +OpenAIResponseClient client = new(model: "gpt-5", apiKey: key); + +ResponseCreationOptions options = new(); +options.Tools.Add(ResponseTool.CreateMcpTool( + serverLabel: "dmcp", + serverUri: new Uri("https://dmcp-server.deno.dev/sse"), + allowedTools: new McpToolFilter() { ToolNames = { "roll" } }, + toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.NeverRequireApproval) +)); + +OpenAIResponse response = (OpenAIResponse)client.CreateResponse([ + ResponseItem.CreateUserMessageItem([ + ResponseContentPart.CreateInputTextPart("Roll 2d4+1") + ]) +], options); + +Console.WriteLine(response.GetOutputText()); \ No newline at end of file diff --git a/docs/guides/tools-connectors-mcp/responses/quickstart-remote-mcp.cs b/docs/guides/tools-connectors-mcp/responses/quickstart-remote-mcp.cs new file mode 100644 index 000000000..fe45027a0 --- /dev/null +++ b/docs/guides/tools-connectors-mcp/responses/quickstart-remote-mcp.cs @@ -0,0 +1,27 @@ +// SAMPLE: Generate response from remote MCP through Responses API +// PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp?quickstart-panels=remote-mcp#quickstart +// GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start +#pragma warning disable OPENAI001 + +#:package OpenAI@2.* +#:property PublishAot=false + +using OpenAI.Responses; + +string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!; +OpenAIResponseClient client = new(model: "gpt-5", apiKey: key); + +ResponseCreationOptions options = new(); +options.Tools.Add(ResponseTool.CreateMcpTool( + serverLabel: "dmcp", + serverUri: new Uri("https://dmcp-server.deno.dev/sse"), + toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.NeverRequireApproval) +)); + +OpenAIResponse response = (OpenAIResponse)client.CreateResponse([ + ResponseItem.CreateUserMessageItem([ + ResponseContentPart.CreateInputTextPart("Roll 2d4+1") + ]) +], options); + +Console.WriteLine(response.GetOutputText()); \ No newline at end of file From 5e835d11575964f4c96b547dd54007ddc7d4f8ae Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Thu, 18 Sep 2025 18:04:46 +0900 Subject: [PATCH 2/4] Update summary of code samples --- .../responses/approvals-always-require-approval.cs | 2 +- .../responses/approvals-never-require-approval.cs | 2 +- docs/guides/tools-connectors-mcp/responses/filtering-tools.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs b/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs index c7ab05024..dabc342c7 100644 --- a/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs +++ b/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs @@ -1,4 +1,4 @@ -// SAMPLE: Generate response from remote MCP through Responses API +// SAMPLE: Generate response from remote MCP with approval through Responses API // PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#approvals // GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start #pragma warning disable OPENAI001 diff --git a/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs b/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs index 9ef0f4a31..dd1a1b0bf 100644 --- a/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs +++ b/docs/guides/tools-connectors-mcp/responses/approvals-never-require-approval.cs @@ -1,4 +1,4 @@ -// SAMPLE: Generate response from remote MCP through Responses API +// SAMPLE: Generate response from remote MCP with no approval through Responses API // PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#approvals // GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start #pragma warning disable OPENAI001 diff --git a/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs b/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs index a243c8367..c87593f72 100644 --- a/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs +++ b/docs/guides/tools-connectors-mcp/responses/filtering-tools.cs @@ -1,4 +1,4 @@ -// SAMPLE: Generate response from remote MCP through Responses API +// SAMPLE: Generate response from a specific tool of a remote MCP through Responses API // PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#filtering-tools // GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start #pragma warning disable OPENAI001 From 386ed2817eaa616cf7052e00e6411d4a22883c62 Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Fri, 19 Sep 2025 14:06:00 +0900 Subject: [PATCH 3/4] Update code sample for always require approval --- .../approvals-always-require-approval.cs | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) diff --git a/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs b/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs index dabc342c7..841132206 100644 --- a/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs +++ b/docs/guides/tools-connectors-mcp/responses/approvals-always-require-approval.cs @@ -11,34 +11,26 @@ string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!; OpenAIResponseClient client = new(model: "gpt-5", apiKey: key); -ResponseCreationOptions options1 = new(); -options1.Tools.Add(ResponseTool.CreateMcpTool( - serverLabel: "dmcp", - serverUri: new Uri("https://dmcp-server.deno.dev/sse") -)); - -McpToolCallApprovalRequestItem request1 = ResponseItem.CreateMcpApprovalRequestItem( - serverLabel: "dmcp", - name: "roll", - arguments: BinaryData.FromObjectAsJson(new { diceRollExpression = "2d4+1" }) -); - -OpenAIResponse response1 = (OpenAIResponse)client.CreateResponse([ - request1 -], options1); - -ResponseCreationOptions options2 = new(); -options2.Tools.Add(ResponseTool.CreateMcpTool( +ResponseCreationOptions options = new(); +options.Tools.Add(ResponseTool.CreateMcpTool( serverLabel: "dmcp", serverUri: new Uri("https://dmcp-server.deno.dev/sse"), toolCallApprovalPolicy: new McpToolCallApprovalPolicy(GlobalMcpToolCallApprovalPolicy.AlwaysRequireApproval) )); -options2.PreviousResponseId = response1.Id; +// STEP 1: Create response that requests tool call approval +OpenAIResponse response1 = (OpenAIResponse)client.CreateResponse([ + ResponseItem.CreateUserMessageItem([ + ResponseContentPart.CreateInputTextPart("Roll 2d4+1") + ]) +], options); + +McpToolCallApprovalRequestItem? approvalRequestItem = response1.OutputItems.Last() as McpToolCallApprovalRequestItem; +// STEP 2: Approve the tool call request and get final response +options.PreviousResponseId = response1.Id; OpenAIResponse response2 = (OpenAIResponse)client.CreateResponse([ - request1, - ResponseItem.CreateMcpApprovalResponseItem(request1.Id, approved: true), -], options2); + ResponseItem.CreateMcpApprovalResponseItem(approvalRequestItem!.Id, approved: true), +], options); Console.WriteLine(response2.GetOutputText()); \ No newline at end of file From 5cad7826623d7b3748d1e28cce2d9b97140b4b82 Mon Sep 17 00:00:00 2001 From: Justin Yoo Date: Wed, 1 Oct 2025 17:23:16 +0900 Subject: [PATCH 4/4] Add the MCP auth scenario --- .../responses/authentication.cs | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 docs/guides/tools-connectors-mcp/responses/authentication.cs diff --git a/docs/guides/tools-connectors-mcp/responses/authentication.cs b/docs/guides/tools-connectors-mcp/responses/authentication.cs new file mode 100644 index 000000000..4b05af96e --- /dev/null +++ b/docs/guides/tools-connectors-mcp/responses/authentication.cs @@ -0,0 +1,28 @@ +// SAMPLE: Generate response from remote MCP through Responses API +// PAGE: https://platform.openai.com/docs/guides/tools-connectors-mcp#authentication +// GUIDANCE: Instructions to run this code: https://aka.ms/oai/net/start +#pragma warning disable OPENAI001 + +#:package OpenAI@2.* +#:property PublishAot=false + +using OpenAI.Responses; + +string authToken = Environment.GetEnvironmentVariable("STRIPE_OAUTH_ACCESS_TOKEN")!; +string key = Environment.GetEnvironmentVariable("OPENAI_API_KEY")!; +OpenAIResponseClient client = new(model: "gpt-5", apiKey: key); + +ResponseCreationOptions options = new(); +options.Tools.Add(ResponseTool.CreateMcpTool( + serverLabel: "stripe", + serverUri: new Uri("https://mcp.stripe.com"), + authorizationToken: authToken +)); + +OpenAIResponse response = (OpenAIResponse)client.CreateResponse([ + ResponseItem.CreateUserMessageItem([ + ResponseContentPart.CreateInputTextPart("Create a payment link for $20") + ]) +], options); + +Console.WriteLine(response.GetOutputText()); \ No newline at end of file