Skip to main content

gproxy_protocol/wire/openai/realtime/
mcp.rs

1//! Native Realtime wire DTOs. Source definitions are cited on each object.
2//! Verified with Realtime.md and openai-python snapshot
3//! e12b81d3bbf644ec7045e152d69bc4b68d69cd48 (2026-09-13).
4//! https://github.com/openai/openai-python/tree/e12b81d3bbf644ec7045e152d69bc4b68d69cd48/src/openai/types/realtime
5use super::wire::present_nullable;
6use super::{RealtimeFunctionTool, RealtimeMcphttpError};
7use crate::Rest;
8use serde::{Deserialize, Serialize};
9
10/// Source: `openai/types/realtime/realtime_tools_config.py`, `RealtimeToolsConfig`.
11pub type RealtimeToolsConfig = Vec<RealtimeToolsConfigUnion>;
12
13/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `RealtimeToolsConfigUnion`.
14#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
15#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
16#[serde(untagged)]
17#[allow(clippy::large_enum_variant)]
18#[derive(gproxy_protocol_macros::DeclaredFields)]
19pub enum RealtimeToolsConfigUnion {
20    RealtimeFunctionTool(RealtimeFunctionTool),
21    RealtimeToolsConfigUnionMcp(RealtimeToolsConfigUnionMcp),
22}
23
24/// Source: `openai/types/realtime/realtime_mcp_approval_response.py`, `RealtimeMcpApprovalResponse`.
25#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
26#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
27#[derive(gproxy_protocol_macros::DeclaredFields)]
28pub struct RealtimeMcpApprovalResponse {
29    pub id: String,
30    pub approval_request_id: String,
31    pub approve: bool,
32    #[serde(rename = "type")]
33    pub type_: RealtimeMcpApprovalResponseType,
34    #[serde(
35        default,
36        deserialize_with = "present_nullable",
37        skip_serializing_if = "Option::is_none"
38    )]
39    pub reason: Option<Option<String>>,
40    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
41    pub rest: Rest,
42}
43
44/// Source: `openai/types/realtime/realtime_mcp_list_tools.py`, `RealtimeMcpListTools`.
45#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
46#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
47#[derive(gproxy_protocol_macros::DeclaredFields)]
48pub struct RealtimeMcpListTools {
49    pub server_label: String,
50    pub tools: Vec<RealtimeMcpListToolsTool>,
51    #[serde(rename = "type")]
52    pub type_: RealtimeMcpListToolsType,
53    #[serde(
54        default,
55        deserialize_with = "present_nullable",
56        skip_serializing_if = "Option::is_none"
57    )]
58    pub id: Option<Option<String>>,
59    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
60    pub rest: Rest,
61}
62
63/// Source: `openai/types/realtime/realtime_mcp_tool_call.py`, `RealtimeMcpToolCall`.
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
65#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
66#[derive(gproxy_protocol_macros::DeclaredFields)]
67pub struct RealtimeMcpToolCall {
68    pub id: String,
69    pub arguments: String,
70    pub name: String,
71    pub server_label: String,
72    #[serde(rename = "type")]
73    pub type_: RealtimeMcpToolCallType,
74    #[serde(
75        default,
76        deserialize_with = "present_nullable",
77        skip_serializing_if = "Option::is_none"
78    )]
79    pub approval_request_id: Option<Option<String>>,
80    #[serde(
81        default,
82        deserialize_with = "present_nullable",
83        skip_serializing_if = "Option::is_none"
84    )]
85    pub error: Option<Option<RealtimeMcpToolCallError>>,
86    #[serde(
87        default,
88        deserialize_with = "present_nullable",
89        skip_serializing_if = "Option::is_none"
90    )]
91    pub output: Option<Option<String>>,
92    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
93    pub rest: Rest,
94}
95
96/// Source: `openai/types/realtime/realtime_mcp_approval_request.py`, `RealtimeMcpApprovalRequest`.
97#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
98#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
99#[derive(gproxy_protocol_macros::DeclaredFields)]
100pub struct RealtimeMcpApprovalRequest {
101    pub id: String,
102    pub arguments: String,
103    pub name: String,
104    pub server_label: String,
105    #[serde(rename = "type")]
106    pub type_: RealtimeMcpApprovalRequestType,
107    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
108    pub rest: Rest,
109}
110
111/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `Mcp`.
112#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
113#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
114#[derive(gproxy_protocol_macros::DeclaredFields)]
115pub struct RealtimeToolsConfigUnionMcp {
116    pub server_label: String,
117    #[serde(rename = "type")]
118    pub type_: RealtimeToolsConfigUnionMcpType,
119    #[serde(
120        default,
121        deserialize_with = "present_nullable",
122        skip_serializing_if = "Option::is_none"
123    )]
124    pub allowed_callers: Option<Option<Vec<RealtimeToolsConfigUnionMcpAllowedCallersItem>>>,
125    #[serde(
126        default,
127        deserialize_with = "present_nullable",
128        skip_serializing_if = "Option::is_none"
129    )]
130    pub allowed_tools: Option<Option<RealtimeToolsConfigUnionMcpAllowedTools>>,
131    #[serde(
132        default,
133        deserialize_with = "present_nullable",
134        skip_serializing_if = "Option::is_none"
135    )]
136    pub authorization: Option<Option<String>>,
137    #[serde(
138        default,
139        deserialize_with = "present_nullable",
140        skip_serializing_if = "Option::is_none"
141    )]
142    pub connector_id: Option<Option<RealtimeToolsConfigUnionMcpConnectorId>>,
143    #[serde(
144        default,
145        deserialize_with = "present_nullable",
146        skip_serializing_if = "Option::is_none"
147    )]
148    pub defer_loading: Option<Option<bool>>,
149    #[serde(
150        default,
151        deserialize_with = "present_nullable",
152        skip_serializing_if = "Option::is_none"
153    )]
154    pub headers: Option<Option<std::collections::BTreeMap<String, String>>>,
155    #[serde(
156        default,
157        deserialize_with = "present_nullable",
158        skip_serializing_if = "Option::is_none"
159    )]
160    pub require_approval: Option<Option<RealtimeToolsConfigUnionMcpRequireApproval>>,
161    #[serde(
162        default,
163        deserialize_with = "present_nullable",
164        skip_serializing_if = "Option::is_none"
165    )]
166    pub server_description: Option<Option<String>>,
167    #[serde(
168        default,
169        deserialize_with = "present_nullable",
170        skip_serializing_if = "Option::is_none"
171    )]
172    pub server_url: Option<Option<String>>,
173    #[serde(
174        default,
175        deserialize_with = "present_nullable",
176        skip_serializing_if = "Option::is_none"
177    )]
178    pub tunnel_id: Option<Option<String>>,
179    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
180    pub rest: Rest,
181}
182
183/// Source: `openai/types/realtime/realtime_mcp_list_tools.py`, `Tool`.
184#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
185#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
186#[derive(gproxy_protocol_macros::DeclaredFields)]
187pub struct RealtimeMcpListToolsTool {
188    pub input_schema: serde_json::Value,
189    pub name: String,
190    #[serde(
191        default,
192        deserialize_with = "present_nullable",
193        skip_serializing_if = "Option::is_none"
194    )]
195    pub annotations: Option<Option<serde_json::Value>>,
196    #[serde(
197        default,
198        deserialize_with = "present_nullable",
199        skip_serializing_if = "Option::is_none"
200    )]
201    pub description: Option<Option<String>>,
202    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
203    pub rest: Rest,
204}
205
206/// Source: `openai/types/realtime/realtime_mcp_tool_call.py`, `Error`.
207#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
208#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
209#[serde(untagged)]
210#[derive(gproxy_protocol_macros::DeclaredFields)]
211pub enum RealtimeMcpToolCallError {
212    RealtimeMcpProtocolError(RealtimeMcpProtocolError),
213    RealtimeMcpToolExecutionError(RealtimeMcpToolExecutionError),
214    RealtimeMcphttpError(RealtimeMcphttpError),
215    Variant4(()),
216}
217
218/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `McpAllowedTools`.
219#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
220#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
221#[serde(untagged)]
222#[derive(gproxy_protocol_macros::DeclaredFields)]
223pub enum RealtimeToolsConfigUnionMcpAllowedTools {
224    Items(Vec<String>),
225    RealtimeToolsConfigUnionMcpAllowedToolsMcpToolFilter(
226        RealtimeToolsConfigUnionMcpAllowedToolsMcpToolFilter,
227    ),
228    Variant3(()),
229}
230
231/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `McpRequireApproval`.
232#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
233#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
234#[serde(untagged)]
235#[derive(gproxy_protocol_macros::DeclaredFields)]
236pub enum RealtimeToolsConfigUnionMcpRequireApproval {
237    RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilter(
238        RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilter,
239    ),
240    Literal(RealtimeToolsConfigUnionMcpRequireApprovalVariant2),
241    Variant3(()),
242}
243
244/// Source: `openai/types/realtime/realtime_mcp_protocol_error.py`, `RealtimeMcpProtocolError`.
245#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
246#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
247#[derive(gproxy_protocol_macros::DeclaredFields)]
248pub struct RealtimeMcpProtocolError {
249    pub code: i64,
250    pub message: String,
251    #[serde(rename = "type")]
252    pub type_: RealtimeMcpProtocolErrorType,
253    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
254    pub rest: Rest,
255}
256
257/// Source: `openai/types/realtime/realtime_mcp_tool_execution_error.py`, `RealtimeMcpToolExecutionError`.
258#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
259#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
260#[derive(gproxy_protocol_macros::DeclaredFields)]
261pub struct RealtimeMcpToolExecutionError {
262    pub message: String,
263    #[serde(rename = "type")]
264    pub type_: RealtimeMcpToolExecutionErrorType,
265    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
266    pub rest: Rest,
267}
268
269/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `McpAllowedToolsMcpToolFilter`.
270#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
271#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
272#[derive(gproxy_protocol_macros::DeclaredFields)]
273pub struct RealtimeToolsConfigUnionMcpAllowedToolsMcpToolFilter {
274    #[serde(
275        default,
276        deserialize_with = "present_nullable",
277        skip_serializing_if = "Option::is_none"
278    )]
279    pub read_only: Option<Option<bool>>,
280    #[serde(
281        default,
282        deserialize_with = "present_nullable",
283        skip_serializing_if = "Option::is_none"
284    )]
285    pub tool_names: Option<Option<Vec<String>>>,
286    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
287    pub rest: Rest,
288}
289
290/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `McpRequireApprovalMcpToolApprovalFilter`.
291#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
292#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
293#[derive(gproxy_protocol_macros::DeclaredFields)]
294pub struct RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilter {
295    #[serde(
296        default,
297        deserialize_with = "present_nullable",
298        skip_serializing_if = "Option::is_none"
299    )]
300    pub always:
301        Option<Option<RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilterAlways>>,
302    #[serde(
303        default,
304        deserialize_with = "present_nullable",
305        skip_serializing_if = "Option::is_none"
306    )]
307    pub never: Option<Option<RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilterNever>>,
308    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
309    pub rest: Rest,
310}
311
312/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `McpRequireApprovalMcpToolApprovalFilterAlways`.
313#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
314#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
315#[derive(gproxy_protocol_macros::DeclaredFields)]
316pub struct RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilterAlways {
317    #[serde(
318        default,
319        deserialize_with = "present_nullable",
320        skip_serializing_if = "Option::is_none"
321    )]
322    pub read_only: Option<Option<bool>>,
323    #[serde(
324        default,
325        deserialize_with = "present_nullable",
326        skip_serializing_if = "Option::is_none"
327    )]
328    pub tool_names: Option<Option<Vec<String>>>,
329    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
330    pub rest: Rest,
331}
332
333/// Source: `openai/types/realtime/realtime_tools_config_union.py`, `McpRequireApprovalMcpToolApprovalFilterNever`.
334#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, gproxy_protocol_macros::WireBuilder)]
335#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
336#[derive(gproxy_protocol_macros::DeclaredFields)]
337pub struct RealtimeToolsConfigUnionMcpRequireApprovalMcpToolApprovalFilterNever {
338    #[serde(
339        default,
340        deserialize_with = "present_nullable",
341        skip_serializing_if = "Option::is_none"
342    )]
343    pub read_only: Option<Option<bool>>,
344    #[serde(
345        default,
346        deserialize_with = "present_nullable",
347        skip_serializing_if = "Option::is_none"
348    )]
349    pub tool_names: Option<Option<Vec<String>>>,
350    #[serde(default, flatten, skip_serializing_if = "serde_json::Map::is_empty")]
351    pub rest: Rest,
352}
353
354#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
355#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
356#[derive(gproxy_protocol_macros::DeclaredFields)]
357pub enum RealtimeMcpApprovalResponseType {
358    #[serde(rename = "mcp_approval_response")]
359    McpApprovalResponse,
360}
361
362#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
363#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
364#[derive(gproxy_protocol_macros::DeclaredFields)]
365pub enum RealtimeMcpListToolsType {
366    #[serde(rename = "mcp_list_tools")]
367    McpListTools,
368}
369
370#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
371#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
372#[derive(gproxy_protocol_macros::DeclaredFields)]
373pub enum RealtimeMcpToolCallType {
374    #[serde(rename = "mcp_call")]
375    McpCall,
376}
377
378#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
379#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
380#[derive(gproxy_protocol_macros::DeclaredFields)]
381pub enum RealtimeMcpApprovalRequestType {
382    #[serde(rename = "mcp_approval_request")]
383    McpApprovalRequest,
384}
385
386#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
387#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
388#[derive(gproxy_protocol_macros::DeclaredFields)]
389pub enum RealtimeToolsConfigUnionMcpType {
390    #[serde(rename = "mcp")]
391    Mcp,
392}
393
394#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
395#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
396#[derive(gproxy_protocol_macros::DeclaredFields)]
397pub enum RealtimeToolsConfigUnionMcpAllowedCallersItem {
398    #[serde(rename = "direct")]
399    Direct,
400    #[serde(rename = "programmatic")]
401    Programmatic,
402}
403
404#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
405#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
406#[derive(gproxy_protocol_macros::DeclaredFields)]
407pub enum RealtimeToolsConfigUnionMcpConnectorId {
408    #[serde(rename = "connector_dropbox")]
409    ConnectorDropbox,
410    #[serde(rename = "connector_gmail")]
411    ConnectorGmail,
412    #[serde(rename = "connector_googlecalendar")]
413    ConnectorGooglecalendar,
414    #[serde(rename = "connector_googledrive")]
415    ConnectorGoogledrive,
416    #[serde(rename = "connector_microsoftteams")]
417    ConnectorMicrosoftteams,
418    #[serde(rename = "connector_outlookcalendar")]
419    ConnectorOutlookcalendar,
420    #[serde(rename = "connector_outlookemail")]
421    ConnectorOutlookemail,
422    #[serde(rename = "connector_sharepoint")]
423    ConnectorSharepoint,
424}
425
426#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
427#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
428#[derive(gproxy_protocol_macros::DeclaredFields)]
429pub enum RealtimeToolsConfigUnionMcpRequireApprovalVariant2 {
430    #[serde(rename = "always")]
431    Always,
432    #[serde(rename = "never")]
433    Never,
434}
435
436#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
437#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
438#[derive(gproxy_protocol_macros::DeclaredFields)]
439pub enum RealtimeMcpProtocolErrorType {
440    #[serde(rename = "protocol_error")]
441    ProtocolError,
442}
443
444#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
445#[cfg_attr(not(feature = "exhaustive"), non_exhaustive)]
446#[derive(gproxy_protocol_macros::DeclaredFields)]
447pub enum RealtimeMcpToolExecutionErrorType {
448    #[serde(rename = "tool_execution_error")]
449    ToolExecutionError,
450}