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