Skip to main content

sqlserver_mcp_catalog/core/
config_schema.rs

1// SQL Server 2025 - master/msdb/sandbox combined catalog MCP server — generated by mcpify. Do not hand-edit.
2
3use serde::{Deserialize, Serialize};
4
5/// One variant per TDS authentication mode the merged spec's
6/// `components.securitySchemes` documents (`sqlAuth`/`windowsAuth`/
7/// `azureADAuth` — see docs/sqlserver-eda-openapi-pipeline/README.md's
8/// "OpenAPI mapping convention"). mcpify's OpenAPI-auth-scheme classifier
9/// only recognizes `sqlAuth` (`http`/`basic` -> mapped here as
10/// `SqlServer`) and `azureADAuth` (`oauth2` -> `AzureAd`) — `windowsAuth`
11/// (`http`/`negotiate`) isn't a scheme shape mcpify's classifier knows, so
12/// `Windows` was added by hand rather than generated.
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
14pub enum AuthMethod {
15    #[serde(rename = "sql_server")]
16    SqlServer,
17    #[serde(rename = "windows")]
18    Windows,
19    #[serde(rename = "azure_ad")]
20    AzureAd,
21}
22
23#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
24#[serde(rename_all = "lowercase")]
25pub enum Transport {
26    Stdio,
27    Http,
28}
29
30fn default_log_level() -> String {
31    "info".to_string()
32}
33fn default_rate_limit() -> u32 {
34    100
35}
36fn default_timeout_ms() -> u64 {
37    30_000
38}
39fn default_cache_size() -> u32 {
40    500
41}
42fn default_retry_attempts() -> u32 {
43    3
44}
45fn default_transport() -> Transport {
46    Transport::Stdio
47}
48fn default_host() -> String {
49    "127.0.0.1".to_string()
50}
51fn default_port() -> u16 {
52    3000
53}
54fn default_sql_port() -> u16 {
55    1433
56}
57fn default_pool_max_size() -> u32 {
58    10
59}
60fn default_trust_server_cert() -> bool {
61    true
62}
63
64// mcpify:versions:begin
65fn default_api_version() -> String {
66    "2025".to_string()
67}
68// mcpify:versions:end
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct Config {
72    /// The SQL Server instance to connect to: `host` or `host:port` (TDS,
73    /// not HTTP — mcpify's originally-generated field name/semantics for
74    /// "where the target API lives" carried over unchanged, only what it
75    /// means changed). Falls back to `sql_port`/the TDS default (1433) when
76    /// no `:port` suffix is present — see `Config::host_and_port`.
77    pub url: String,
78    pub auth_method: AuthMethod,
79    #[serde(default = "default_sql_port")]
80    pub sql_port: u16,
81    /// Maximum size of the pooled SQL Server connections
82    /// (`services::sql_pool`) kept open at once.
83    #[serde(default = "default_pool_max_size")]
84    pub pool_max_size: u32,
85    /// Whether to trust the server's TLS certificate without verifying it
86    /// against a CA — on by default since this project's primary use case
87    /// is a local Docker/dev instance with a self-signed cert (see
88    /// docs/sqlserver-eda-openapi-pipeline/docker-compose.yml); set to
89    /// `false` for a production instance with a real CA-signed cert.
90    #[serde(default = "default_trust_server_cert")]
91    pub trust_server_cert: bool,
92    /// v8 multi-version support: an opaque label (not a compile-time enum
93    /// like `AuthMethod` — version labels are arbitrary operator-supplied
94    /// strings such as `"10.2.14"`, which can't cleanly become Rust
95    /// identifiers), validated at runtime against the known version list
96    /// in `data::store::resolve_store_path`/`validation::validator`.
97    #[serde(default = "default_api_version")]
98    pub api_version: String,
99    #[serde(default = "default_log_level")]
100    pub log_level: String,
101    #[serde(default = "default_rate_limit")]
102    pub rate_limit: u32,
103    #[serde(default = "default_timeout_ms")]
104    pub timeout_ms: u64,
105    #[serde(default = "default_cache_size")]
106    pub cache_size: u32,
107    #[serde(default = "default_retry_attempts")]
108    pub retry_attempts: u32,
109    #[serde(default = "default_transport")]
110    pub transport: Transport,
111    #[serde(default = "default_host")]
112    pub host: String,
113    #[serde(default = "default_port")]
114    pub port: u16,
115    #[serde(default)]
116    pub cors_allow: Option<String>,
117}
118
119impl Config {
120    /// Splits `url` into `(host, port)`, using `sql_port` (default 1433,
121    /// TDS's standard port) when `url` carries no explicit `:port` suffix.
122    pub fn host_and_port(&self) -> (&str, u16) {
123        if let Some((host, port)) = self.url.rsplit_once(':')
124            && let Ok(port) = port.parse()
125        {
126            return (host, port);
127        }
128        (self.url.as_str(), self.sql_port)
129    }
130}