Skip to main content

opencode_sdk/types/
mcp.rs

1//! MCP (Model Context Protocol) types for opencode_rs.
2
3use serde::{Deserialize, Serialize};
4use std::collections::HashMap;
5
6/// MCP server status.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[serde(rename_all = "camelCase")]
9pub struct McpStatus {
10    /// List of configured MCP servers.
11    #[serde(default)]
12    pub servers: Vec<McpServer>,
13}
14
15/// An MCP server configuration.
16#[derive(Debug, Clone, Serialize, Deserialize)]
17#[serde(rename_all = "camelCase")]
18pub struct McpServer {
19    /// Server name.
20    pub name: String,
21    /// Server command.
22    #[serde(default, skip_serializing_if = "Option::is_none")]
23    pub command: Option<String>,
24    /// Server arguments.
25    #[serde(default)]
26    pub args: Vec<String>,
27    /// Environment variables.
28    #[serde(default, skip_serializing_if = "Option::is_none")]
29    pub env: Option<HashMap<String, String>>,
30    /// Connection status.
31    #[serde(default, skip_serializing_if = "Option::is_none")]
32    pub status: Option<McpConnectionStatus>,
33    /// Available tools from this server.
34    #[serde(default)]
35    pub tools: Vec<McpTool>,
36    /// Error message if connection failed.
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub error: Option<String>,
39}
40
41/// MCP connection status.
42#[derive(Debug, Clone, Serialize, Deserialize)]
43#[serde(rename_all = "kebab-case")]
44pub enum McpConnectionStatus {
45    /// Not connected.
46    Disconnected,
47    /// Connecting.
48    Connecting,
49    /// Connected.
50    Connected,
51    /// Connection failed.
52    Error,
53    /// Unknown status (forward compatibility).
54    #[serde(other)]
55    Unknown,
56}
57
58/// An MCP tool.
59#[derive(Debug, Clone, Serialize, Deserialize)]
60#[serde(rename_all = "camelCase")]
61pub struct McpTool {
62    /// Tool name.
63    pub name: String,
64    /// Tool description.
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    pub description: Option<String>,
67    /// Input schema.
68    #[serde(default, skip_serializing_if = "Option::is_none")]
69    pub input_schema: Option<serde_json::Value>,
70}
71
72/// Request to add an MCP server.
73#[derive(Debug, Clone, Serialize, Deserialize)]
74#[serde(rename_all = "camelCase")]
75pub struct McpAddRequest {
76    /// Server name.
77    pub name: String,
78    /// Server command.
79    pub command: String,
80    /// Server arguments.
81    #[serde(default)]
82    pub args: Vec<String>,
83    /// Environment variables.
84    #[serde(default, skip_serializing_if = "Option::is_none")]
85    pub env: Option<HashMap<String, String>>,
86}
87
88/// MCP auth start request.
89#[derive(Debug, Clone, Serialize, Deserialize)]
90#[serde(rename_all = "camelCase")]
91pub struct McpAuthStartRequest {
92    /// Callback URL for OAuth flow.
93    #[serde(default, skip_serializing_if = "Option::is_none")]
94    pub callback_url: Option<String>,
95}
96
97/// MCP auth start response.
98#[derive(Debug, Clone, Serialize, Deserialize)]
99#[serde(rename_all = "camelCase")]
100pub struct McpAuthStartResponse {
101    /// Authorization URL.
102    pub url: String,
103}
104
105/// MCP auth callback request.
106#[derive(Debug, Clone, Serialize, Deserialize)]
107#[serde(rename_all = "camelCase")]
108pub struct McpAuthCallbackRequest {
109    /// Authorization code.
110    pub code: String,
111    /// State parameter.
112    #[serde(default, skip_serializing_if = "Option::is_none")]
113    pub state: Option<String>,
114}
115
116/// MCP authenticate request (for API key auth).
117#[derive(Debug, Clone, Serialize, Deserialize)]
118#[serde(rename_all = "camelCase")]
119pub struct McpAuthenticateRequest {
120    /// The API key or token.
121    pub token: String,
122}