solidmcp 0.4.0

A high-level Rust toolkit for building Model Context Protocol (MCP) servers with type safety and minimal boilerplate. Supports tools, resources, and prompts with automatic JSON schema generation.
Documentation
//! Basic handler tests for MCP HTTP

#[cfg(test)]
mod tests {
    use crate::http::HttpMcpHandler;
    use crate::logging::{McpConnectionId, McpDebugLogger};
    use crate::shared::McpProtocolEngine;
    use serde_json::json;
    use std::sync::Arc;
    use warp::test::request;

    #[tokio::test]
    async fn test_http_endpoint_exists() {
        let connection_id = McpConnectionId::new();
        let _logger = McpDebugLogger::new(connection_id);
        let shared_handler = Arc::new(McpProtocolEngine::new());
        let http_handler = HttpMcpHandler::new(shared_handler);
        let routes = http_handler.route();

        let resp = request()
            .method("POST")
            .path("/mcp")
            .json(&json!({
                "jsonrpc": "2.0",
                "id": 1,
                "method": "initialize",
                "params": {
                    "protocolVersion": "2025-06-18",
                    "capabilities": {},
                    "clientInfo": {
                        "name": "test-client",
                        "version": "1.0.0"
                    }
                }
            }))
            .reply(&routes)
            .await;

        assert_eq!(resp.status(), 200);
    }

    #[tokio::test]
    async fn test_invalid_json_returns_error() {
        let connection_id = McpConnectionId::new();
        let _logger = McpDebugLogger::new(connection_id);
        let shared_handler = Arc::new(McpProtocolEngine::new());
        let http_handler = HttpMcpHandler::new(shared_handler);
        let routes = http_handler.route();

        let resp = request()
            .method("POST")
            .path("/mcp")
            .body("invalid json")
            .header("content-type", "application/json")
            .reply(&routes)
            .await;

        // Warp will reject invalid JSON before it reaches our handler
        assert_ne!(resp.status(), 200);
    }

    #[tokio::test]
    async fn test_get_transport_discovery() {
        let connection_id = McpConnectionId::new();
        let _logger = McpDebugLogger::new(connection_id);
        let shared_handler = Arc::new(McpProtocolEngine::new());
        let http_handler = HttpMcpHandler::new(shared_handler);
        let routes = http_handler.route();

        let resp = request().method("GET").path("/mcp").reply(&routes).await;

        assert_eq!(resp.status(), 200); // Now supports transport discovery

        // Check that the response contains transport information
        let body: serde_json::Value = serde_json::from_slice(resp.body()).unwrap();
        assert!(body["mcp_server"].is_object());
        assert!(body["mcp_server"]["available_transports"].is_object());
        assert!(body["mcp_server"]["available_transports"]["websocket"].is_object());
        assert!(body["mcp_server"]["available_transports"]["http"].is_object());
    }
}