use std::sync::Arc;
use std::time::Duration;
use crate::config::Config;
use crate::ctx::Ctx;
use crate::registry::Registry;
pub mod args;
pub mod handler;
pub mod transport;
#[cfg(test)]
mod mcp_test;
pub const PROTOCOL_V2024_11_05: &str = "2024-11-05";
pub const PROTOCOL_V2025_03_26: &str = "2025-03-26";
pub const PROTOCOL_V2025_06_18: &str = "2025-06-18";
pub const PROTOCOL_V2025_11_25: &str = "2025-11-25";
pub const PROTOCOL_V2026_07_28: &str = "2026-07-28";
pub const DEFAULT_VERSIONS: &[&str] = &[
PROTOCOL_V2026_07_28,
PROTOCOL_V2025_11_25,
PROTOCOL_V2025_06_18,
PROTOCOL_V2025_03_26,
PROTOCOL_V2024_11_05,
];
#[derive(Debug, Clone, Default)]
pub struct Options {
pub name: String,
pub version: String,
pub versions: Vec<String>,
pub instructions: String,
pub addr: String,
pub json_response: bool,
pub stateless: bool,
pub bearer_tokens: Vec<String>,
pub session_timeout: Duration,
pub cors_origins: Vec<String>,
#[doc(hidden)]
pub default_ctx: Option<Arc<Ctx>>,
pub defaults: std::collections::HashMap<String, String>,
pub response_headers: Vec<(String, String)>,
pub no_server_meta: bool,
}
pub fn server(
reg: &Registry,
opts: Options,
ctx: Arc<Ctx>,
) -> crate::errors::Result<handler::XyzServer> {
handler::build(reg, &opts, ctx)
}
pub fn run_with_config(ctx: &Ctx, reg: &Registry, args: &[String], cfg: Config) -> i32 {
let base = Options {
name: cfg.resolved_name(),
version: cfg.resolved_version(),
addr: cfg.addr.clone(),
bearer_tokens: cfg.bearer_tokens.clone(),
response_headers: cfg.response_headers.clone(),
no_server_meta: cfg.no_server_headers,
..Default::default()
};
transport::run(ctx, reg, args, base)
}
pub fn run_context(ctx: &Ctx, reg: &Registry, args: &[String]) -> i32 {
transport::run(ctx, reg, args, Options::default())
}
pub fn mountable(reg: &Registry, opts: &Options) -> Option<axum::routing::Router> {
transport::mountable_router(reg, opts).ok()
}
pub(crate) fn protocol_version(s: &str) -> Option<rmcp::model::ProtocolVersion> {
match s {
PROTOCOL_V2024_11_05 => Some(rmcp::model::ProtocolVersion::V_2024_11_05),
PROTOCOL_V2025_03_26 => Some(rmcp::model::ProtocolVersion::V_2025_03_26),
PROTOCOL_V2025_06_18 => Some(rmcp::model::ProtocolVersion::V_2025_06_18),
PROTOCOL_V2025_11_25 => Some(rmcp::model::ProtocolVersion::V_2025_11_25),
PROTOCOL_V2026_07_28 => Some(rmcp::model::ProtocolVersion::V_2026_07_28),
_ => None,
}
}