//! IdeA **MCP server** — a driving adapter that exposes the orchestration of IdeA //! as Model-Context-Protocol tools (cadrage `orchestration-v3`, lot **M2**). //! //! This adapter is the **pair of the filesystem watcher** //! ([`super::FsOrchestratorWatcher`]): a second, substitutable entry door onto the //! exact same [`application::OrchestratorService::dispatch`]. An MCP-capable CLI //! (Claude, Codex, Gemini…) calls a typed `idea_*` tool instead of dropping a JSON //! file under `.ideai/requests`; the resulting [`domain::OrchestratorCommand`] and //! its [`application::OrchestratorOutcome`] are identical. The server **invents no //! semantics** and **never re-routes** a reply (Décision 2 + principe directeur). //! //! ## Spike S-MCP — what is confined here //! //! Everything MCP/JSON-RPC/transport lives in this module and **nowhere else**; //! the domain and application layers never see it: //! - [`jsonrpc`] — a hand-rolled JSON-RPC 2.0 message model + a [`jsonrpc::Transport`] //! seam (no MCP crate; chosen for zero-network testability — see its docs), //! - [`transport`] — the `stdio` default transport + an in-memory scriptable //! transport for tests (a `socket` transport is a documented TODO), //! - [`tools`] — the tool catalogue and the tool → `OrchestratorCommand` mapping //! (reusing [`domain::OrchestratorRequest::validate`] as the one validator), //! - [`server`] — [`McpServer`], the request loop over the transport. //! //! ## Testability //! //! [`McpServer::handle_raw`] turns one raw JSON-RPC message into its response with //! no I/O, and [`transport::MemoryTransport`] scripts a whole session in memory, so //! the agent of Test can cover the adapter **entirely off-network** (no socket, no //! child process). pub mod jsonrpc; pub mod server; pub mod tools; pub mod transport; pub use jsonrpc::{ JsonRpcError, JsonRpcRequest, JsonRpcResponse, Transport, TransportError, JSONRPC_VERSION, }; pub use server::McpServer; pub use tools::{catalogue, map_tool_call, tool_returns_reply, ToolDef, ToolMapError}; pub use transport::{MemoryTransport, StdioTransport};