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