use crate::auth::McpCredential;
use async_trait::async_trait;
use everruns_core::{McpProtocolMode, McpServerAuthMode, McpToolCallResult, McpToolDefinition};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub enum McpEndpoint {
Http {
url: String,
headers: HashMap<String, String>,
},
#[cfg(feature = "stdio")]
Stdio {
command: String,
args: Vec<String>,
env: HashMap<String, String>,
},
}
#[derive(Debug, Clone)]
pub struct McpConnection {
pub name: String,
pub endpoint: McpEndpoint,
pub auth_mode: McpServerAuthMode,
pub protocol_mode: McpProtocolMode,
pub oauth_provider_id: Option<String>,
pub pending_oauth_provider: Option<String>,
}
impl McpConnection {
pub fn http(name: impl Into<String>, url: impl Into<String>) -> Self {
Self {
name: name.into(),
endpoint: McpEndpoint::Http {
url: url.into(),
headers: HashMap::new(),
},
auth_mode: McpServerAuthMode::None,
protocol_mode: McpProtocolMode::Auto,
oauth_provider_id: None,
pending_oauth_provider: None,
}
}
pub fn with_protocol_mode(mut self, mode: McpProtocolMode) -> Self {
self.protocol_mode = mode;
self
}
}
#[async_trait]
pub trait McpTransport: Send + Sync {
async fn list_tools(
&self,
connection: &McpConnection,
credential: Option<&McpCredential>,
) -> anyhow::Result<Vec<McpToolDefinition>>;
async fn call_tool(
&self,
connection: &McpConnection,
tool_name: &str,
arguments: Value,
credential: Option<&McpCredential>,
) -> anyhow::Result<McpToolCallResult>;
}