1#![warn(
17 missing_docs,
18 missing_debug_implementations,
19 rust_2018_idioms,
20 unreachable_pub,
21 clippy::all
22)]
23#![deny(unsafe_code)]
24#![allow(
25 clippy::module_name_repetitions,
26 clippy::missing_errors_doc, clippy::wildcard_imports, clippy::must_use_candidate, clippy::return_self_not_must_use, clippy::struct_excessive_bools, clippy::missing_panics_doc, clippy::default_trait_access )]
34#![cfg_attr(docsrs, feature(doc_cfg))]
35
36pub use turbomcp_core::{Error, Result};
38
39pub mod capabilities;
41pub mod jsonrpc;
42pub mod types;
43pub mod validation;
44pub mod versioning;
45
46pub use types::{
48 CallToolRequest,
49 CallToolResult,
50 ClientCapabilities,
52 ClientNotification,
53 ClientRequest,
55 Content,
57 CreateMessageRequest,
59 CreateMessageResult,
60 EmbeddedResource,
61
62 GetPromptRequest,
63 GetPromptResult,
64 ImageContent,
65 Implementation,
66
67 InitializeRequest,
68 InitializeResult,
69 InitializedNotification,
70
71 ListPromptsRequest,
72 ListPromptsResult,
73
74 ListResourcesRequest,
75 ListResourcesResult,
76 ListRootsRequest,
77 ListRootsResult,
78 ListToolsRequest,
79 ListToolsResult,
80
81 LogLevel,
83 LoggingNotification,
84 ProgressNotification,
85 ProgressToken,
86 Prompt,
88 PromptInput,
89 ProtocolVersion,
90 ReadResourceRequest,
91 ReadResourceResult,
92 RequestId,
93 Resource,
95 ResourceContents,
96 ResourceUpdatedNotification,
97
98 Root,
100 RootsListChangedNotification,
101 SamplingMessage,
102
103 ServerCapabilities,
104 ServerNotification,
105 ServerRequest,
106 SetLevelRequest,
107 SetLevelResult,
108
109 SubscribeRequest,
110 TextContent,
111 Tool,
113 ToolInputSchema,
114 ToolOutputSchema,
115 UnsubscribeRequest,
116};
117
118pub use jsonrpc::{
119 JsonRpcBatch, JsonRpcError, JsonRpcErrorCode, JsonRpcNotification, JsonRpcRequest,
120 JsonRpcResponse, JsonRpcVersion,
121};
122
123pub use capabilities::{CapabilityMatcher, CapabilityNegotiator, CapabilitySet};
124
125pub use versioning::{VersionCompatibility, VersionManager, VersionRequirement};
126
127pub const PROTOCOL_VERSION: &str = "2025-06-18";
129
130pub const SUPPORTED_VERSIONS: &[&str] = &["2025-06-18", "2024-11-05"];
132
133pub mod features {
135 pub const TOOLS: &str = "tools";
137
138 pub const PROMPTS: &str = "prompts";
140
141 pub const RESOURCES: &str = "resources";
143
144 pub const LOGGING: &str = "logging";
146
147 pub const PROGRESS: &str = "progress";
149
150 pub const SAMPLING: &str = "sampling";
152
153 pub const ROOTS: &str = "roots";
155}
156
157pub mod methods {
159 pub const INITIALIZE: &str = "initialize";
162 pub const INITIALIZED: &str = "notifications/initialized";
164
165 pub const LIST_TOOLS: &str = "tools/list";
168 pub const CALL_TOOL: &str = "tools/call";
170
171 pub const LIST_PROMPTS: &str = "prompts/list";
174 pub const GET_PROMPT: &str = "prompts/get";
176
177 pub const LIST_RESOURCES: &str = "resources/list";
180 pub const READ_RESOURCE: &str = "resources/read";
182 pub const SUBSCRIBE: &str = "resources/subscribe";
184 pub const UNSUBSCRIBE: &str = "resources/unsubscribe";
186 pub const RESOURCE_UPDATED: &str = "notifications/resources/updated";
188 pub const RESOURCE_LIST_CHANGED: &str = "notifications/resources/list_changed";
190
191 pub const SET_LEVEL: &str = "logging/setLevel";
194 pub const LOG_MESSAGE: &str = "notifications/message";
196
197 pub const PROGRESS: &str = "notifications/progress";
200
201 pub const CREATE_MESSAGE: &str = "sampling/createMessage";
204
205 pub const LIST_ROOTS: &str = "roots/list";
208 pub const ROOTS_LIST_CHANGED: &str = "notifications/roots/list_changed";
210}
211
212pub mod error_codes {
214 pub const PARSE_ERROR: i32 = -32700;
217 pub const INVALID_REQUEST: i32 = -32600;
219 pub const METHOD_NOT_FOUND: i32 = -32601;
221 pub const INVALID_PARAMS: i32 = -32602;
223 pub const INTERNAL_ERROR: i32 = -32603;
225
226 pub const TOOL_NOT_FOUND: i32 = -32001;
229 pub const TOOL_EXECUTION_ERROR: i32 = -32002;
231 pub const PROMPT_NOT_FOUND: i32 = -32003;
233 pub const RESOURCE_NOT_FOUND: i32 = -32004;
235 pub const RESOURCE_ACCESS_DENIED: i32 = -32005;
237 pub const CAPABILITY_NOT_SUPPORTED: i32 = -32006;
239 pub const PROTOCOL_VERSION_MISMATCH: i32 = -32007;
241 pub const AUTHENTICATION_REQUIRED: i32 = -32008;
243 pub const RATE_LIMITED: i32 = -32009;
245 pub const SERVER_OVERLOADED: i32 = -32010;
247}
248
249#[cfg(test)]
250mod tests {
251 use super::*;
252
253 #[test]
254 fn test_protocol_constants() {
255 assert_eq!(PROTOCOL_VERSION, "2025-06-18");
256 assert!(SUPPORTED_VERSIONS.contains(&PROTOCOL_VERSION));
257 #[allow(clippy::const_is_empty)]
258 {
259 assert!(!SUPPORTED_VERSIONS.is_empty());
260 }
261 }
262
263 #[test]
264 fn test_method_names() {
265 assert_eq!(methods::INITIALIZE, "initialize");
266 assert_eq!(methods::LIST_TOOLS, "tools/list");
267 assert_eq!(methods::CALL_TOOL, "tools/call");
268 }
269
270 #[test]
271 fn test_error_codes() {
272 assert_eq!(error_codes::PARSE_ERROR, -32700);
273 assert_eq!(error_codes::TOOL_NOT_FOUND, -32001);
274 }
275}