1#![deny(missing_docs)]
56
57pub mod auth;
58pub mod capability;
59pub mod debug;
60pub mod error;
61pub mod extension;
62pub mod protocol;
63pub mod protocol_version;
64pub mod schema;
65pub mod state;
66pub mod types;
67
68pub use capability::{
70 ClientCapabilities, ClientInfo, InitializeRequest, InitializeResult, PROTOCOL_VERSION,
71 SUPPORTED_PROTOCOL_VERSIONS, ServerCapabilities, ServerInfo, VersionNegotiationResult,
72 is_version_supported, negotiate_version, negotiate_version_detailed,
73};
74pub use error::{JsonRpcError, McpError, McpResultExt};
75pub use protocol::{Message, Notification, ProgressToken, Request, RequestId, Response};
76pub use protocol_version::ProtocolVersion;
77pub use state::{Closing, Connected, Connection, Disconnected, Initializing, Ready};
78
79pub mod prelude {
87 pub use serde::{Deserialize, Serialize};
89 pub use serde_json::json;
90
91 pub use crate::capability::{
92 ClientCapabilities, ClientInfo, InitializeRequest, InitializeResult, PROTOCOL_VERSION,
93 SUPPORTED_PROTOCOL_VERSIONS, ServerCapabilities, ServerInfo, VersionNegotiationResult,
94 is_version_supported, negotiate_version, negotiate_version_detailed,
95 };
96 pub use crate::error::{McpError, McpResultExt};
97 pub use crate::protocol::{Message, Notification, ProgressToken, Request, RequestId, Response};
98 pub use crate::protocol_version::ProtocolVersion;
99 pub use crate::schema::{Schema, SchemaBuilder, SchemaType};
100 pub use crate::state::{Closing, Connected, Connection, Disconnected, Initializing, Ready};
101 pub use crate::types::{
102 CallToolResult,
104 Content,
106 ContentAnnotations,
107 CreateMessageRequest,
109 CreateMessageResult,
110 ElicitAction,
112 ElicitRequest,
113 ElicitResult,
114 ElicitationSchema,
115 GetPromptResult,
117 ModelPreferences,
118 Prompt,
119 PromptArgument,
120 PromptMessage,
121 PromptOutput,
122 PropertySchema,
123 Resource,
125 ResourceContents,
126 ResourceTemplate,
127 Role,
128 SamplingMessage,
129 StopReason,
130 Task,
132 TaskError,
133 TaskId,
134 TaskProgress,
135 TaskStatus,
136 TaskSummary,
137 Tool,
138 ToolAnnotations,
139 ToolOutput,
140 };
141}
142
143#[cfg(test)]
144mod tests {
145 use super::*;
146
147 #[test]
148 fn test_prelude_imports() {
149 use crate::prelude::*;
150
151 let _tool = Tool::new("test");
153 let _caps = ServerCapabilities::new().with_tools();
154 let _conn: Connection<Disconnected> = Connection::new();
155 }
156
157 #[test]
158 fn test_protocol_version() {
159 assert_eq!(PROTOCOL_VERSION, "2025-11-25");
160 }
161
162 #[test]
163 fn test_error_context() {
164 use crate::error::McpResultExt;
165
166 fn might_fail() -> Result<(), McpError> {
167 Err(McpError::InternalMessage {
168 message: "something went wrong".to_string(),
169 })
170 }
171
172 let result = might_fail().context("while doing something important");
173 assert!(result.is_err());
174
175 let err = result.unwrap_err();
176 assert!(err.to_string().contains("while doing something important"));
177 }
178}