Skip to main content

ferridriver_mcp/
config.rs

1//! `McpServerConfig` impl for the unified config's `McpConfig` section.
2//!
3//! Type definitions live in `ferridriver-config`. This module wires those
4//! types into the runtime `McpServerConfig` trait so the MCP server can be
5//! driven directly from a `ferridriver.toml` file with no custom Rust code.
6
7pub use ferridriver_config::mcp::{
8  BrowserConfig, DEFAULT_CACHE_TTL, DEFAULT_SERVER_NAME, DISCOVER_TCP_TIMEOUT, InstanceConfig, McpConfig, ServerConfig,
9  ViewportDef,
10};
11
12/// Backwards-compatible alias. Prefer `McpConfig`.
13pub type FileConfig = McpConfig;
14
15use crate::server::{DEFAULT_INSTRUCTIONS, McpServerConfig};
16use ferridriver::state::ConnectMode;
17
18impl McpServerConfig for McpConfig {
19  fn chrome_args(&self) -> Vec<String> {
20    McpConfig::chrome_args(self)
21  }
22
23  fn chrome_args_for_instance(&self, instance: &str) -> Vec<String> {
24    McpConfig::chrome_args_for_instance(self, instance)
25  }
26
27  fn resolve_instance(&self, instance: &str) -> Option<ConnectMode> {
28    McpConfig::resolve_instance(self, instance)
29  }
30
31  fn server_name(&self) -> &str {
32    McpConfig::server_name(self)
33  }
34
35  fn server_instructions(&self) -> &str {
36    McpConfig::server_instructions(self, DEFAULT_INSTRUCTIONS)
37  }
38}
39
40#[cfg(test)]
41mod tests {
42  use super::*;
43  use crate::server::DEFAULT_INSTRUCTIONS;
44  use ferridriver::backend::BackendKind;
45  use std::sync::Arc;
46
47  #[test]
48  fn trait_delegates_to_inherent_methods() {
49    let mut config = McpConfig::default();
50    config.browser.chrome_args = vec!["--base-flag".into()];
51    config.browser.instances.insert(
52      "staging".into(),
53      InstanceConfig {
54        chrome_args: vec!["--staging-flag".into()],
55        connect_url: Some("ws://staging-host:9222".into()),
56        ..Default::default()
57      },
58    );
59
60    let trait_obj: Arc<dyn McpServerConfig> = Arc::new(config);
61    assert_eq!(trait_obj.chrome_args(), vec!["--base-flag"]);
62    assert_eq!(trait_obj.chrome_args_for_instance("staging"), vec!["--staging-flag"]);
63    assert!(matches!(
64      trait_obj.resolve_instance("staging"),
65      Some(ConnectMode::ConnectUrl(url)) if url.contains("staging-host")
66    ));
67    assert_eq!(trait_obj.server_name(), DEFAULT_SERVER_NAME);
68    assert_eq!(trait_obj.server_instructions(), DEFAULT_INSTRUCTIONS);
69  }
70
71  #[test]
72  fn backend_parsing_via_helper() {
73    let mut config = McpConfig::default();
74    assert_eq!(config.backend_kind(), BackendKind::CdpPipe);
75    config.browser.backend = Some("cdp-raw".into());
76    assert_eq!(config.backend_kind(), BackendKind::CdpRaw);
77  }
78}