use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum JSONRPCMessage {
Request(JSONRPCRequest),
Notification(JSONRPCNotification),
BatchRequest(JSONRPCBatchRequest),
Response(JSONRPCResponse),
Error(JSONRPCError),
BatchResponse(JSONRPCBatchResponse),
}
pub type JSONRPCBatchRequest = Vec<JSONRPCRequestOrNotification>;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum JSONRPCRequestOrNotification {
Request(JSONRPCRequest),
Notification(JSONRPCNotification),
}
pub type JSONRPCBatchResponse = Vec<JSONRPCResponseOrError>;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum JSONRPCResponseOrError {
Response(JSONRPCResponse),
Error(JSONRPCError),
}
pub const LATEST_PROTOCOL_VERSION: &str = "2025-03-26";
pub const JSONRPC_VERSION: &str = "2.0";
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ProgressToken {
String(String),
Number(i64),
}
pub type Cursor = String;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Request {
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<RequestParams>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestParams {
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<RequestMeta>,
#[serde(flatten)]
pub other: HashMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RequestMeta {
#[serde(rename = "progressToken", skip_serializing_if = "Option::is_none")]
pub progress_token: Option<ProgressToken>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Notification {
pub method: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub params: Option<NotificationParams>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationParams {
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<HashMap<String, Value>>,
#[serde(flatten)]
pub other: HashMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Result {
#[serde(rename = "_meta", skip_serializing_if = "Option::is_none")]
pub meta: Option<HashMap<String, Value>>,
#[serde(flatten)]
pub other: HashMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)]
#[serde(untagged)]
pub enum RequestId {
String(String),
Number(i64),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JSONRPCRequest {
pub jsonrpc: String,
pub id: RequestId,
#[serde(flatten)]
pub request: Request,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JSONRPCNotification {
pub jsonrpc: String,
#[serde(flatten)]
pub notification: Notification,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JSONRPCResponse {
pub jsonrpc: String,
pub id: RequestId,
pub result: Result,
}
pub const PARSE_ERROR: i32 = -32700;
pub const INVALID_REQUEST: i32 = -32600;
pub const METHOD_NOT_FOUND: i32 = -32601;
pub const INVALID_PARAMS: i32 = -32602;
pub const INTERNAL_ERROR: i32 = -32603;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct JSONRPCError {
pub jsonrpc: String,
pub id: RequestId,
pub error: ErrorObject,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorObject {
pub code: i32,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<Value>,
}
pub type EmptyResult = Result;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelledNotification {
pub method: String,
pub params: CancelledParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelledParams {
#[serde(rename = "requestId")]
pub request_id: RequestId,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeParams {
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
pub capabilities: ClientCapabilities,
#[serde(rename = "clientInfo")]
pub client_info: Implementation,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializeResult {
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
pub capabilities: ServerCapabilities,
#[serde(rename = "serverInfo")]
pub server_info: Implementation,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InitializedNotification {
pub method: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ClientCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub roots: Option<RootsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sampling: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RootsCapability {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ServerCapabilities {
#[serde(skip_serializing_if = "Option::is_none")]
pub experimental: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logging: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completions: Option<Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompts: Option<PromptsCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resources: Option<ResourcesCapability>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<ToolsCapability>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptsCapability {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourcesCapability {
#[serde(skip_serializing_if = "Option::is_none")]
pub subscribe: Option<bool>,
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolsCapability {
#[serde(rename = "listChanged", skip_serializing_if = "Option::is_none")]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Implementation {
pub name: String,
pub version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProgressNotification {
pub method: String,
pub params: ProgressParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProgressParams {
#[serde(rename = "progressToken")]
pub progress_token: ProgressToken,
pub progress: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub total: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedRequest {
#[serde(flatten)]
pub request: Request,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub cursor: Option<Cursor>,
#[serde(flatten)]
pub other: HashMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PaginatedResult {
#[serde(rename = "nextCursor", skip_serializing_if = "Option::is_none")]
pub next_cursor: Option<Cursor>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListResourcesResult {
pub resources: Vec<Resource>,
#[serde(flatten)]
pub paginated: PaginatedResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListResourceTemplatesResult {
#[serde(rename = "resourceTemplates")]
pub resource_templates: Vec<ResourceTemplate>,
#[serde(flatten)]
pub paginated: PaginatedResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadResourceParams {
pub uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadResourceResult {
pub contents: Vec<ResourceContents>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceListChangedNotification {
pub method: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceUpdatedNotification {
pub method: String,
pub params: ResourceUpdatedParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceUpdatedParams {
pub uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Resource {
pub uri: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceTemplate {
#[serde(rename = "uriTemplate")]
pub uri_template: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ResourceContents {
Text(TextResourceContents),
Blob(BlobResourceContents),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextResourceContents {
pub uri: String,
#[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub text: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BlobResourceContents {
pub uri: String,
#[serde(rename = "mimeType", skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub blob: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListPromptsResult {
pub prompts: Vec<Prompt>,
#[serde(flatten)]
pub paginated: PaginatedResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetPromptResult {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub messages: Vec<PromptMessage>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Prompt {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<Vec<PromptArgument>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptArgument {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Role {
User,
Assistant,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptMessage {
pub role: Role,
pub content: Content,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum Content {
Text(TextContent),
Image(ImageContent),
Audio(AudioContent),
Resource(EmbeddedResource),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EmbeddedResource {
pub resource: ResourceContents,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptListChangedNotification {
pub method: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListToolsResult {
pub tools: Vec<Tool>,
#[serde(flatten)]
pub paginated: PaginatedResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallToolResult {
pub content: Vec<Content>,
#[serde(rename = "isError", skip_serializing_if = "Option::is_none")]
pub is_error: Option<bool>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolListChangedNotification {
pub method: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolAnnotations {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(rename = "readOnlyHint", skip_serializing_if = "Option::is_none")]
pub read_only_hint: Option<bool>,
#[serde(rename = "destructiveHint", skip_serializing_if = "Option::is_none")]
pub destructive_hint: Option<bool>,
#[serde(rename = "idempotentHint", skip_serializing_if = "Option::is_none")]
pub idempotent_hint: Option<bool>,
#[serde(rename = "openWorldHint", skip_serializing_if = "Option::is_none")]
pub open_world_hint: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CallToolParams {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetPromptParams {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub arguments: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tool {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "inputSchema")]
pub input_schema: ToolInputSchema,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<ToolAnnotations>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolInputSchema {
#[serde(rename = "type")]
pub schema_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub properties: Option<HashMap<String, Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoggingMessageNotification {
pub method: String,
pub params: LoggingMessageParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LoggingMessageParams {
pub level: LoggingLevel,
#[serde(skip_serializing_if = "Option::is_none")]
pub logger: Option<String>,
pub data: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum LoggingLevel {
Debug,
Info,
Notice,
Warning,
Error,
Critical,
Alert,
Emergency,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateMessageRequest {
pub method: String,
pub params: CreateMessageParams,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateMessageParams {
pub messages: Vec<SamplingMessage>,
#[serde(rename = "modelPreferences", skip_serializing_if = "Option::is_none")]
pub model_preferences: Option<ModelPreferences>,
#[serde(rename = "systemPrompt", skip_serializing_if = "Option::is_none")]
pub system_prompt: Option<String>,
#[serde(rename = "includeContext", skip_serializing_if = "Option::is_none")]
pub include_context: Option<IncludeContext>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(rename = "maxTokens")]
pub max_tokens: i64,
#[serde(rename = "stopSequences", skip_serializing_if = "Option::is_none")]
pub stop_sequences: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum IncludeContext {
None,
ThisServer,
AllServers,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateMessageResult {
pub role: Role,
pub content: SamplingContent,
pub model: String,
#[serde(rename = "stopReason", skip_serializing_if = "Option::is_none")]
pub stop_reason: Option<StopReason>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum StopReason {
EndTurn,
StopSequence,
MaxTokens,
#[serde(untagged)]
Other(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SamplingMessage {
pub role: Role,
pub content: SamplingContent,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum SamplingContent {
Text(TextContent),
Image(ImageContent),
Audio(AudioContent),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Annotations {
#[serde(skip_serializing_if = "Option::is_none")]
pub audience: Option<Vec<Role>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub priority: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TextContent {
pub text: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageContent {
pub data: String,
#[serde(rename = "mimeType")]
pub mime_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioContent {
pub data: String,
#[serde(rename = "mimeType")]
pub mime_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelPreferences {
#[serde(skip_serializing_if = "Option::is_none")]
pub hints: Option<Vec<ModelHint>>,
#[serde(rename = "costPriority", skip_serializing_if = "Option::is_none")]
pub cost_priority: Option<f64>,
#[serde(rename = "speedPriority", skip_serializing_if = "Option::is_none")]
pub speed_priority: Option<f64>,
#[serde(
rename = "intelligencePriority",
skip_serializing_if = "Option::is_none"
)]
pub intelligence_priority: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ModelHint {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArgumentInfo {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Reference {
#[serde(rename = "ref/resource")]
Resource(ResourceReference),
#[serde(rename = "ref/prompt")]
Prompt(PromptReference),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResourceReference {
pub uri: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptReference {
pub name: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompleteResult {
pub completion: CompletionInfo,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CompletionInfo {
pub values: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub total: Option<i64>,
#[serde(rename = "hasMore", skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListRootsResult {
pub roots: Vec<Root>,
#[serde(flatten)]
pub result: Result,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Root {
pub uri: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RootsListChangedNotification {
pub method: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "method")]
pub enum ClientRequest {
#[serde(rename = "ping")]
Ping,
#[serde(rename = "initialize")]
Initialize {
#[serde(rename = "protocolVersion")]
protocol_version: String,
capabilities: ClientCapabilities,
#[serde(rename = "clientInfo")]
client_info: Implementation,
},
#[serde(rename = "completion/complete")]
Complete {
#[serde(rename = "ref")]
reference: Reference,
argument: ArgumentInfo,
},
#[serde(rename = "logging/setLevel")]
SetLevel {
level: LoggingLevel,
},
#[serde(rename = "prompts/get")]
GetPrompt {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
arguments: Option<HashMap<String, String>>,
},
#[serde(rename = "prompts/list")]
ListPrompts,
#[serde(rename = "resources/list")]
ListResources,
#[serde(rename = "resources/templates/list")]
ListResourceTemplates,
#[serde(rename = "resources/read")]
ReadResource {
uri: String,
},
#[serde(rename = "resources/subscribe")]
Subscribe {
uri: String,
},
#[serde(rename = "resources/unsubscribe")]
Unsubscribe {
uri: String,
},
#[serde(rename = "tools/call")]
CallTool {
name: String,
#[serde(skip_serializing_if = "Option::is_none")]
arguments: Option<HashMap<String, Value>>,
},
#[serde(rename = "tools/list")]
ListTools,
}
impl ClientRequest {
pub fn method(&self) -> &'static str {
match self {
ClientRequest::Ping => "ping",
ClientRequest::Initialize { .. } => "initialize",
ClientRequest::Complete { .. } => "completion/complete",
ClientRequest::SetLevel { .. } => "logging/setLevel",
ClientRequest::GetPrompt { .. } => "prompts/get",
ClientRequest::ListPrompts => "prompts/list",
ClientRequest::ListResources => "resources/list",
ClientRequest::ListResourceTemplates => "resources/templates/list",
ClientRequest::ReadResource { .. } => "resources/read",
ClientRequest::Subscribe { .. } => "resources/subscribe",
ClientRequest::Unsubscribe { .. } => "resources/unsubscribe",
ClientRequest::CallTool { .. } => "tools/call",
ClientRequest::ListTools => "tools/list",
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "method")]
pub enum ClientNotification {
#[serde(rename = "notifications/cancelled")]
Cancelled {
#[serde(rename = "requestId")]
request_id: RequestId,
#[serde(skip_serializing_if = "Option::is_none")]
reason: Option<String>,
},
#[serde(rename = "notifications/progress")]
Progress {
#[serde(rename = "progressToken")]
progress_token: ProgressToken,
progress: f64,
#[serde(skip_serializing_if = "Option::is_none")]
total: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
message: Option<String>,
},
#[serde(rename = "notifications/initialized")]
Initialized,
#[serde(rename = "notifications/roots/list_changed")]
RootsListChanged,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ClientResult {
Empty(EmptyResult),
CreateMessage(CreateMessageResult),
ListRoots(ListRootsResult),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "method")]
pub enum ServerRequest {
#[serde(rename = "ping")]
Ping,
#[serde(rename = "sampling/createMessage")]
CreateMessage(Box<CreateMessageParams>),
#[serde(rename = "roots/list")]
ListRoots,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "method")]
pub enum ServerNotification {
#[serde(rename = "notifications/cancelled")]
Cancelled {
#[serde(rename = "requestId")]
request_id: RequestId,
#[serde(skip_serializing_if = "Option::is_none")]
reason: Option<String>,
},
#[serde(rename = "notifications/progress")]
Progress {
#[serde(rename = "progressToken")]
progress_token: ProgressToken,
progress: f64,
#[serde(skip_serializing_if = "Option::is_none")]
total: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
message: Option<String>,
},
#[serde(rename = "notifications/message")]
LoggingMessage {
level: LoggingLevel,
#[serde(skip_serializing_if = "Option::is_none")]
logger: Option<String>,
data: Value,
},
#[serde(rename = "notifications/resources/updated")]
ResourceUpdated {
uri: String,
},
#[serde(rename = "notifications/resources/list_changed")]
ResourceListChanged,
#[serde(rename = "notifications/tools/list_changed")]
ToolListChanged,
#[serde(rename = "notifications/prompts/list_changed")]
PromptListChanged,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum ServerResult {
Empty(EmptyResult),
Initialize(InitializeResult),
Complete(CompleteResult),
GetPrompt(GetPromptResult),
ListPrompts(ListPromptsResult),
ListResourceTemplates(ListResourceTemplatesResult),
ListResources(ListResourcesResult),
ReadResource(ReadResourceResult),
CallTool(CallToolResult),
ListTools(ListToolsResult),
}