use anyhow::Result;
use rust_mcp_sdk::{
McpServer,
mcp_server::server_runtime::create_server,
schema::{
Implementation, InitializeResult, LATEST_PROTOCOL_VERSION, ServerCapabilities,
ServerCapabilitiesResources, ServerCapabilitiesTools,
},
};
use rust_mcp_transport::{StdioTransport, TransportOptions};
use crate::mcp::{error::FoundryMcpError, handlers::FoundryServerHandler};
pub struct FoundryMcpServer;
impl FoundryMcpServer {
pub async fn start() -> Result<(), FoundryMcpError> {
tracing::info!("Starting Foundry MCP server");
let server_details = InitializeResult {
server_info: Implementation {
name: "Foundry MCP Server".to_string(),
version: env!("CARGO_PKG_VERSION").to_string(),
title: Some("Foundry Project Management MCP Server".to_string()),
},
capabilities: ServerCapabilities {
tools: Some(ServerCapabilitiesTools { list_changed: None }),
resources: Some(ServerCapabilitiesResources {
subscribe: None,
list_changed: None,
}),
..Default::default()
},
meta: None,
instructions: Some(
"Foundry MCP Server provides project management tools for LLM-driven development. \
Use create_project to start new projects, load_project to resume work, \
create_spec for feature planning, and get_foundry_help for guidance."
.to_string(),
),
protocol_version: LATEST_PROTOCOL_VERSION.to_string(),
};
let handler = FoundryServerHandler::new();
let transport_options = TransportOptions::default();
let transport = StdioTransport::new(transport_options).map_err(|e| {
FoundryMcpError::transport_error(format!("Failed to create stdio transport: {}", e))
})?;
tracing::info!("Foundry MCP server started, listening on stdio");
let server = create_server(server_details, transport, handler);
server.start().await.map_err(|e| {
FoundryMcpError::internal_error(format!("MCP server runtime error: {}", e))
})?;
Ok(())
}
}