Skip to main content

defect_cli/
mcp_servers.rs

1//! Translates the typed configuration from the `[mcp]` section into a list of ACP
2//! `McpServer` values.
3//!
4//! Only assembles servers explicitly listed in `enabled_servers`; server section configs
5//! not in the allowlist are invisible to the client even if present.
6
7use std::path::PathBuf;
8
9use agent_client_protocol_schema::{
10    EnvVariable, HttpHeader, McpServer, McpServerHttp, McpServerSse, McpServerStdio,
11};
12use defect_config::{LoadedConfig, McpServerConfig as ConfigMcpServerConfig};
13
14/// Default MCP server list — the client uses this array during session startup to build
15/// the session-level MCP factory.
16pub fn build_default_mcp_servers(config: &LoadedConfig) -> Vec<McpServer> {
17    config
18        .effective
19        .mcp
20        .enabled_servers
21        .iter()
22        .filter_map(|name| {
23            let server = config.effective.mcp.servers.get(name)?;
24            Some(match server {
25                ConfigMcpServerConfig::Stdio(server) => McpServer::Stdio(
26                    McpServerStdio::new(name, PathBuf::from(&server.command))
27                        .args(server.args.clone())
28                        .env(
29                            server
30                                .env
31                                .iter()
32                                .map(|(name, value)| EnvVariable::new(name, value))
33                                .collect(),
34                        ),
35                ),
36                ConfigMcpServerConfig::Http(server) => McpServer::Http(
37                    McpServerHttp::new(name, &server.url).headers(
38                        server
39                            .headers
40                            .iter()
41                            .map(|(name, value)| HttpHeader::new(name, value))
42                            .collect(),
43                    ),
44                ),
45                ConfigMcpServerConfig::Sse(server) => McpServer::Sse(
46                    McpServerSse::new(name, &server.url).headers(
47                        server
48                            .headers
49                            .iter()
50                            .map(|(name, value)| HttpHeader::new(name, value))
51                            .collect(),
52                    ),
53                ),
54            })
55        })
56        .collect()
57}