#![allow(clippy::fallible_impl_from)]
use serde::Deserialize;
use serde::Serialize;
use serde::de::DeserializeOwned;
use std::convert::TryFrom;
use ts_rs::TS;
pub const MCP_SCHEMA_VERSION: &str = "2025-06-18";
pub const JSONRPC_VERSION: &str = "2.0";
pub trait ModelContextProtocolRequest {
const METHOD: &'static str;
type Params: DeserializeOwned + Serialize + Send + Sync + 'static;
type Result: DeserializeOwned + Serialize + Send + Sync + 'static;
}
pub trait ModelContextProtocolNotification {
const METHOD: &'static str;
type Params: DeserializeOwned + Serialize + Send + Sync + 'static;
}
fn default_jsonrpc() -> String {
JSONRPC_VERSION.to_owned()
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Annotations {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub audience: Option<Vec<Role>>,
#[serde(
rename = "lastModified",
default,
skip_serializing_if = "Option::is_none"
)]
pub last_modified: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub priority: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct AudioContent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
pub data: String,
#[serde(rename = "mimeType")]
pub mime_type: String,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct BaseMetadata {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct BlobResourceContents {
pub blob: String,
#[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct BooleanSchema {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub default: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum CallToolRequest {}
impl ModelContextProtocolRequest for CallToolRequest {
const METHOD: &'static str = "tools/call";
type Params = CallToolRequestParams;
type Result = CallToolResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CallToolRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub arguments: Option<serde_json::Value>,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CallToolResult {
pub content: Vec<ContentBlock>,
#[serde(rename = "isError", default, skip_serializing_if = "Option::is_none")]
pub is_error: Option<bool>,
#[serde(
rename = "structuredContent",
default,
skip_serializing_if = "Option::is_none"
)]
pub structured_content: Option<serde_json::Value>,
}
impl From<CallToolResult> for serde_json::Value {
fn from(value: CallToolResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum CancelledNotification {}
impl ModelContextProtocolNotification for CancelledNotification {
const METHOD: &'static str = "notifications/cancelled";
type Params = CancelledNotificationParams;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CancelledNotificationParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(rename = "requestId")]
pub request_id: RequestId,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ClientCapabilities {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub elicitation: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub experimental: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub roots: Option<ClientCapabilitiesRoots>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub sampling: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ClientCapabilitiesRoots {
#[serde(
rename = "listChanged",
default,
skip_serializing_if = "Option::is_none"
)]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum ClientNotification {
CancelledNotification(CancelledNotification),
InitializedNotification(InitializedNotification),
ProgressNotification(ProgressNotification),
RootsListChangedNotification(RootsListChangedNotification),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(tag = "method", content = "params")]
pub enum ClientRequest {
#[serde(rename = "initialize")]
InitializeRequest(<InitializeRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "ping")]
PingRequest(<PingRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "resources/list")]
ListResourcesRequest(<ListResourcesRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "resources/templates/list")]
ListResourceTemplatesRequest(
<ListResourceTemplatesRequest as ModelContextProtocolRequest>::Params,
),
#[serde(rename = "resources/read")]
ReadResourceRequest(<ReadResourceRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "resources/subscribe")]
SubscribeRequest(<SubscribeRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "resources/unsubscribe")]
UnsubscribeRequest(<UnsubscribeRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "prompts/list")]
ListPromptsRequest(<ListPromptsRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "prompts/get")]
GetPromptRequest(<GetPromptRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "tools/list")]
ListToolsRequest(<ListToolsRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "tools/call")]
CallToolRequest(<CallToolRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "logging/setLevel")]
SetLevelRequest(<SetLevelRequest as ModelContextProtocolRequest>::Params),
#[serde(rename = "completion/complete")]
CompleteRequest(<CompleteRequest as ModelContextProtocolRequest>::Params),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum ClientResult {
Result(Result),
CreateMessageResult(CreateMessageResult),
ListRootsResult(ListRootsResult),
ElicitResult(ElicitResult),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum CompleteRequest {}
impl ModelContextProtocolRequest for CompleteRequest {
const METHOD: &'static str = "completion/complete";
type Params = CompleteRequestParams;
type Result = CompleteResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CompleteRequestParams {
pub argument: CompleteRequestParamsArgument,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<CompleteRequestParamsContext>,
pub r#ref: CompleteRequestParamsRef,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CompleteRequestParamsContext {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub arguments: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CompleteRequestParamsArgument {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum CompleteRequestParamsRef {
PromptReference(PromptReference),
ResourceTemplateReference(ResourceTemplateReference),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CompleteResult {
pub completion: CompleteResultCompletion,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CompleteResultCompletion {
#[serde(rename = "hasMore", default, skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total: Option<i64>,
pub values: Vec<String>,
}
impl From<CompleteResult> for serde_json::Value {
fn from(value: CompleteResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum ContentBlock {
TextContent(TextContent),
ImageContent(ImageContent),
AudioContent(AudioContent),
ResourceLink(ResourceLink),
EmbeddedResource(EmbeddedResource),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum CreateMessageRequest {}
impl ModelContextProtocolRequest for CreateMessageRequest {
const METHOD: &'static str = "sampling/createMessage";
type Params = CreateMessageRequestParams;
type Result = CreateMessageResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CreateMessageRequestParams {
#[serde(
rename = "includeContext",
default,
skip_serializing_if = "Option::is_none"
)]
pub include_context: Option<String>,
#[serde(rename = "maxTokens")]
pub max_tokens: i64,
pub messages: Vec<SamplingMessage>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(
rename = "modelPreferences",
default,
skip_serializing_if = "Option::is_none"
)]
pub model_preferences: Option<ModelPreferences>,
#[serde(
rename = "stopSequences",
default,
skip_serializing_if = "Option::is_none"
)]
pub stop_sequences: Option<Vec<String>>,
#[serde(
rename = "systemPrompt",
default,
skip_serializing_if = "Option::is_none"
)]
pub system_prompt: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct CreateMessageResult {
pub content: CreateMessageResultContent,
pub model: String,
pub role: Role,
#[serde(
rename = "stopReason",
default,
skip_serializing_if = "Option::is_none"
)]
pub stop_reason: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum CreateMessageResultContent {
TextContent(TextContent),
ImageContent(ImageContent),
AudioContent(AudioContent),
}
impl From<CreateMessageResult> for serde_json::Value {
fn from(value: CreateMessageResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Cursor(String);
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ElicitRequest {}
impl ModelContextProtocolRequest for ElicitRequest {
const METHOD: &'static str = "elicitation/create";
type Params = ElicitRequestParams;
type Result = ElicitResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ElicitRequestParams {
pub message: String,
#[serde(rename = "requestedSchema")]
pub requested_schema: ElicitRequestParamsRequestedSchema,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ElicitRequestParamsRequestedSchema {
pub properties: serde_json::Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ElicitResult {
pub action: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content: Option<serde_json::Value>,
}
impl From<ElicitResult> for serde_json::Value {
fn from(value: ElicitResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct EmbeddedResource {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
pub resource: EmbeddedResourceResource,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum EmbeddedResourceResource {
TextResourceContents(TextResourceContents),
BlobResourceContents(BlobResourceContents),
}
pub type EmptyResult = Result;
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct EnumSchema {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub r#enum: Vec<String>,
#[serde(rename = "enumNames", default, skip_serializing_if = "Option::is_none")]
pub enum_names: Option<Vec<String>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum GetPromptRequest {}
impl ModelContextProtocolRequest for GetPromptRequest {
const METHOD: &'static str = "prompts/get";
type Params = GetPromptRequestParams;
type Result = GetPromptResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct GetPromptRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub arguments: Option<serde_json::Value>,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct GetPromptResult {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub messages: Vec<PromptMessage>,
}
impl From<GetPromptResult> for serde_json::Value {
fn from(value: GetPromptResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ImageContent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
pub data: String,
#[serde(rename = "mimeType")]
pub mime_type: String,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Implementation {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub version: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum InitializeRequest {}
impl ModelContextProtocolRequest for InitializeRequest {
const METHOD: &'static str = "initialize";
type Params = InitializeRequestParams;
type Result = InitializeResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct InitializeRequestParams {
pub capabilities: ClientCapabilities,
#[serde(rename = "clientInfo")]
pub client_info: Implementation,
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct InitializeResult {
pub capabilities: ServerCapabilities,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(rename = "protocolVersion")]
pub protocol_version: String,
#[serde(rename = "serverInfo")]
pub server_info: Implementation,
}
impl From<InitializeResult> for serde_json::Value {
fn from(value: InitializeResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum InitializedNotification {}
impl ModelContextProtocolNotification for InitializedNotification {
const METHOD: &'static str = "notifications/initialized";
type Params = Option<serde_json::Value>;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct JSONRPCError {
pub error: JSONRPCErrorError,
pub id: RequestId,
#[serde(rename = "jsonrpc", default = "default_jsonrpc")]
pub jsonrpc: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct JSONRPCErrorError {
pub code: i64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
pub message: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum JSONRPCMessage {
Request(JSONRPCRequest),
Notification(JSONRPCNotification),
Response(JSONRPCResponse),
Error(JSONRPCError),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct JSONRPCNotification {
#[serde(rename = "jsonrpc", default = "default_jsonrpc")]
pub jsonrpc: String,
pub method: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct JSONRPCRequest {
pub id: RequestId,
#[serde(rename = "jsonrpc", default = "default_jsonrpc")]
pub jsonrpc: String,
pub method: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct JSONRPCResponse {
pub id: RequestId,
#[serde(rename = "jsonrpc", default = "default_jsonrpc")]
pub jsonrpc: String,
pub result: Result,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ListPromptsRequest {}
impl ModelContextProtocolRequest for ListPromptsRequest {
const METHOD: &'static str = "prompts/list";
type Params = Option<ListPromptsRequestParams>;
type Result = ListPromptsResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListPromptsRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListPromptsResult {
#[serde(
rename = "nextCursor",
default,
skip_serializing_if = "Option::is_none"
)]
pub next_cursor: Option<String>,
pub prompts: Vec<Prompt>,
}
impl From<ListPromptsResult> for serde_json::Value {
fn from(value: ListPromptsResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ListResourceTemplatesRequest {}
impl ModelContextProtocolRequest for ListResourceTemplatesRequest {
const METHOD: &'static str = "resources/templates/list";
type Params = Option<ListResourceTemplatesRequestParams>;
type Result = ListResourceTemplatesResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListResourceTemplatesRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListResourceTemplatesResult {
#[serde(
rename = "nextCursor",
default,
skip_serializing_if = "Option::is_none"
)]
pub next_cursor: Option<String>,
#[serde(rename = "resourceTemplates")]
pub resource_templates: Vec<ResourceTemplate>,
}
impl From<ListResourceTemplatesResult> for serde_json::Value {
fn from(value: ListResourceTemplatesResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ListResourcesRequest {}
impl ModelContextProtocolRequest for ListResourcesRequest {
const METHOD: &'static str = "resources/list";
type Params = Option<ListResourcesRequestParams>;
type Result = ListResourcesResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListResourcesRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListResourcesResult {
#[serde(
rename = "nextCursor",
default,
skip_serializing_if = "Option::is_none"
)]
pub next_cursor: Option<String>,
pub resources: Vec<Resource>,
}
impl From<ListResourcesResult> for serde_json::Value {
fn from(value: ListResourcesResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ListRootsRequest {}
impl ModelContextProtocolRequest for ListRootsRequest {
const METHOD: &'static str = "roots/list";
type Params = Option<serde_json::Value>;
type Result = ListRootsResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListRootsResult {
pub roots: Vec<Root>,
}
impl From<ListRootsResult> for serde_json::Value {
fn from(value: ListRootsResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ListToolsRequest {}
impl ModelContextProtocolRequest for ListToolsRequest {
const METHOD: &'static str = "tools/list";
type Params = Option<ListToolsRequestParams>;
type Result = ListToolsResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListToolsRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ListToolsResult {
#[serde(
rename = "nextCursor",
default,
skip_serializing_if = "Option::is_none"
)]
pub next_cursor: Option<String>,
pub tools: Vec<Tool>,
}
impl From<ListToolsResult> for serde_json::Value {
fn from(value: ListToolsResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum LoggingLevel {
#[serde(rename = "alert")]
Alert,
#[serde(rename = "critical")]
Critical,
#[serde(rename = "debug")]
Debug,
#[serde(rename = "emergency")]
Emergency,
#[serde(rename = "error")]
Error,
#[serde(rename = "info")]
Info,
#[serde(rename = "notice")]
Notice,
#[serde(rename = "warning")]
Warning,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum LoggingMessageNotification {}
impl ModelContextProtocolNotification for LoggingMessageNotification {
const METHOD: &'static str = "notifications/message";
type Params = LoggingMessageNotificationParams;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct LoggingMessageNotificationParams {
pub data: serde_json::Value,
pub level: LoggingLevel,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logger: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ModelHint {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ModelPreferences {
#[serde(
rename = "costPriority",
default,
skip_serializing_if = "Option::is_none"
)]
pub cost_priority: Option<f64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub hints: Option<Vec<ModelHint>>,
#[serde(
rename = "intelligencePriority",
default,
skip_serializing_if = "Option::is_none"
)]
pub intelligence_priority: Option<f64>,
#[serde(
rename = "speedPriority",
default,
skip_serializing_if = "Option::is_none"
)]
pub speed_priority: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Notification {
pub method: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct NumberSchema {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub maximum: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub minimum: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub r#type: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct PaginatedRequest {
pub method: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<PaginatedRequestParams>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct PaginatedRequestParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub cursor: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct PaginatedResult {
#[serde(
rename = "nextCursor",
default,
skip_serializing_if = "Option::is_none"
)]
pub next_cursor: Option<String>,
}
impl From<PaginatedResult> for serde_json::Value {
fn from(value: PaginatedResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum PingRequest {}
impl ModelContextProtocolRequest for PingRequest {
const METHOD: &'static str = "ping";
type Params = Option<serde_json::Value>;
type Result = Result;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum PrimitiveSchemaDefinition {
StringSchema(StringSchema),
NumberSchema(NumberSchema),
BooleanSchema(BooleanSchema),
EnumSchema(EnumSchema),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ProgressNotification {}
impl ModelContextProtocolNotification for ProgressNotification {
const METHOD: &'static str = "notifications/progress";
type Params = ProgressNotificationParams;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ProgressNotificationParams {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
pub progress: f64,
#[serde(rename = "progressToken")]
pub progress_token: ProgressToken,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub total: Option<f64>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Hash, Eq, TS)]
#[serde(untagged)]
pub enum ProgressToken {
String(String),
Integer(i64),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Prompt {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub arguments: Option<Vec<PromptArgument>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct PromptArgument {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum PromptListChangedNotification {}
impl ModelContextProtocolNotification for PromptListChangedNotification {
const METHOD: &'static str = "notifications/prompts/list_changed";
type Params = Option<serde_json::Value>;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct PromptMessage {
pub content: ContentBlock,
pub role: Role,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct PromptReference {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ReadResourceRequest {}
impl ModelContextProtocolRequest for ReadResourceRequest {
const METHOD: &'static str = "resources/read";
type Params = ReadResourceRequestParams;
type Result = ReadResourceResult;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ReadResourceRequestParams {
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ReadResourceResult {
pub contents: Vec<ReadResourceResultContents>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum ReadResourceResultContents {
TextResourceContents(TextResourceContents),
BlobResourceContents(BlobResourceContents),
}
impl From<ReadResourceResult> for serde_json::Value {
fn from(value: ReadResourceResult) -> Self {
#[expect(clippy::unwrap_used)]
serde_json::to_value(value).unwrap()
}
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Request {
pub method: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub params: Option<serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, Hash, Eq, TS)]
#[serde(untagged)]
pub enum RequestId {
String(String),
Integer(i64),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Resource {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ResourceContents {
#[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ResourceLink {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub r#type: String, pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ResourceListChangedNotification {}
impl ModelContextProtocolNotification for ResourceListChangedNotification {
const METHOD: &'static str = "notifications/resources/list_changed";
type Params = Option<serde_json::Value>;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ResourceTemplate {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(rename = "uriTemplate")]
pub uri_template: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ResourceTemplateReference {
pub r#type: String, pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ResourceUpdatedNotification {}
impl ModelContextProtocolNotification for ResourceUpdatedNotification {
const METHOD: &'static str = "notifications/resources/updated";
type Params = ResourceUpdatedNotificationParams;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ResourceUpdatedNotificationParams {
pub uri: String,
}
pub type Result = serde_json::Value;
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum Role {
#[serde(rename = "assistant")]
Assistant,
#[serde(rename = "user")]
User,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Root {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum RootsListChangedNotification {}
impl ModelContextProtocolNotification for RootsListChangedNotification {
const METHOD: &'static str = "notifications/roots/list_changed";
type Params = Option<serde_json::Value>;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct SamplingMessage {
pub content: SamplingMessageContent,
pub role: Role,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum SamplingMessageContent {
TextContent(TextContent),
ImageContent(ImageContent),
AudioContent(AudioContent),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ServerCapabilities {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub completions: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub experimental: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub logging: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prompts: Option<ServerCapabilitiesPrompts>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub resources: Option<ServerCapabilitiesResources>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tools: Option<ServerCapabilitiesTools>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ServerCapabilitiesTools {
#[serde(
rename = "listChanged",
default,
skip_serializing_if = "Option::is_none"
)]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ServerCapabilitiesResources {
#[serde(
rename = "listChanged",
default,
skip_serializing_if = "Option::is_none"
)]
pub list_changed: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub subscribe: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ServerCapabilitiesPrompts {
#[serde(
rename = "listChanged",
default,
skip_serializing_if = "Option::is_none"
)]
pub list_changed: Option<bool>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(tag = "method", content = "params")]
pub enum ServerNotification {
#[serde(rename = "notifications/cancelled")]
CancelledNotification(<CancelledNotification as ModelContextProtocolNotification>::Params),
#[serde(rename = "notifications/progress")]
ProgressNotification(<ProgressNotification as ModelContextProtocolNotification>::Params),
#[serde(rename = "notifications/resources/list_changed")]
ResourceListChangedNotification(
<ResourceListChangedNotification as ModelContextProtocolNotification>::Params,
),
#[serde(rename = "notifications/resources/updated")]
ResourceUpdatedNotification(
<ResourceUpdatedNotification as ModelContextProtocolNotification>::Params,
),
#[serde(rename = "notifications/prompts/list_changed")]
PromptListChangedNotification(
<PromptListChangedNotification as ModelContextProtocolNotification>::Params,
),
#[serde(rename = "notifications/tools/list_changed")]
ToolListChangedNotification(
<ToolListChangedNotification as ModelContextProtocolNotification>::Params,
),
#[serde(rename = "notifications/message")]
LoggingMessageNotification(
<LoggingMessageNotification as ModelContextProtocolNotification>::Params,
),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
pub enum ServerRequest {
PingRequest(PingRequest),
CreateMessageRequest(CreateMessageRequest),
ListRootsRequest(ListRootsRequest),
ElicitRequest(ElicitRequest),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)]
pub enum ServerResult {
Result(Result),
InitializeResult(InitializeResult),
ListResourcesResult(ListResourcesResult),
ListResourceTemplatesResult(ListResourceTemplatesResult),
ReadResourceResult(ReadResourceResult),
ListPromptsResult(ListPromptsResult),
GetPromptResult(GetPromptResult),
ListToolsResult(ListToolsResult),
CallToolResult(CallToolResult),
CompleteResult(CompleteResult),
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum SetLevelRequest {}
impl ModelContextProtocolRequest for SetLevelRequest {
const METHOD: &'static str = "logging/setLevel";
type Params = SetLevelRequestParams;
type Result = Result;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct SetLevelRequestParams {
pub level: LoggingLevel,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct StringSchema {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(rename = "maxLength", default, skip_serializing_if = "Option::is_none")]
pub max_length: Option<i64>,
#[serde(rename = "minLength", default, skip_serializing_if = "Option::is_none")]
pub min_length: Option<i64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum SubscribeRequest {}
impl ModelContextProtocolRequest for SubscribeRequest {
const METHOD: &'static str = "resources/subscribe";
type Params = SubscribeRequestParams;
type Result = Result;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct SubscribeRequestParams {
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct TextContent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<Annotations>,
pub text: String,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct TextResourceContents {
#[serde(rename = "mimeType", default, skip_serializing_if = "Option::is_none")]
pub mime_type: Option<String>,
pub text: String,
pub uri: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct Tool {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub annotations: Option<ToolAnnotations>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(rename = "inputSchema")]
pub input_schema: ToolInputSchema,
pub name: String,
#[serde(
rename = "outputSchema",
default,
skip_serializing_if = "Option::is_none"
)]
pub output_schema: Option<ToolOutputSchema>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ToolOutputSchema {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ToolInputSchema {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub properties: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub required: Option<Vec<String>>,
pub r#type: String, }
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct ToolAnnotations {
#[serde(
rename = "destructiveHint",
default,
skip_serializing_if = "Option::is_none"
)]
pub destructive_hint: Option<bool>,
#[serde(
rename = "idempotentHint",
default,
skip_serializing_if = "Option::is_none"
)]
pub idempotent_hint: Option<bool>,
#[serde(
rename = "openWorldHint",
default,
skip_serializing_if = "Option::is_none"
)]
pub open_world_hint: Option<bool>,
#[serde(
rename = "readOnlyHint",
default,
skip_serializing_if = "Option::is_none"
)]
pub read_only_hint: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum ToolListChangedNotification {}
impl ModelContextProtocolNotification for ToolListChangedNotification {
const METHOD: &'static str = "notifications/tools/list_changed";
type Params = Option<serde_json::Value>;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub enum UnsubscribeRequest {}
impl ModelContextProtocolRequest for UnsubscribeRequest {
const METHOD: &'static str = "resources/unsubscribe";
type Params = UnsubscribeRequestParams;
type Result = Result;
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize, TS)]
pub struct UnsubscribeRequestParams {
pub uri: String,
}
impl TryFrom<JSONRPCRequest> for ClientRequest {
type Error = serde_json::Error;
fn try_from(req: JSONRPCRequest) -> std::result::Result<Self, Self::Error> {
match req.method.as_str() {
"initialize" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <InitializeRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::InitializeRequest(params))
}
"ping" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <PingRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::PingRequest(params))
}
"resources/list" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <ListResourcesRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::ListResourcesRequest(params))
}
"resources/templates/list" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <ListResourceTemplatesRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::ListResourceTemplatesRequest(params))
}
"resources/read" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <ReadResourceRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::ReadResourceRequest(params))
}
"resources/subscribe" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <SubscribeRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::SubscribeRequest(params))
}
"resources/unsubscribe" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <UnsubscribeRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::UnsubscribeRequest(params))
}
"prompts/list" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <ListPromptsRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::ListPromptsRequest(params))
}
"prompts/get" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <GetPromptRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::GetPromptRequest(params))
}
"tools/list" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <ListToolsRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::ListToolsRequest(params))
}
"tools/call" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <CallToolRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::CallToolRequest(params))
}
"logging/setLevel" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <SetLevelRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::SetLevelRequest(params))
}
"completion/complete" => {
let params_json = req.params.unwrap_or(serde_json::Value::Null);
let params: <CompleteRequest as ModelContextProtocolRequest>::Params =
serde_json::from_value(params_json)?;
Ok(ClientRequest::CompleteRequest(params))
}
_ => Err(serde_json::Error::io(std::io::Error::new(
std::io::ErrorKind::InvalidData,
format!("Unknown method: {}", req.method),
))),
}
}
}
impl TryFrom<JSONRPCNotification> for ServerNotification {
type Error = serde_json::Error;
fn try_from(n: JSONRPCNotification) -> std::result::Result<Self, Self::Error> {
match n.method.as_str() {
"notifications/cancelled" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <CancelledNotification as ModelContextProtocolNotification>::Params =
serde_json::from_value(params_json)?;
Ok(ServerNotification::CancelledNotification(params))
}
"notifications/progress" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <ProgressNotification as ModelContextProtocolNotification>::Params =
serde_json::from_value(params_json)?;
Ok(ServerNotification::ProgressNotification(params))
}
"notifications/resources/list_changed" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <ResourceListChangedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
Ok(ServerNotification::ResourceListChangedNotification(params))
}
"notifications/resources/updated" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <ResourceUpdatedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
Ok(ServerNotification::ResourceUpdatedNotification(params))
}
"notifications/prompts/list_changed" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <PromptListChangedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
Ok(ServerNotification::PromptListChangedNotification(params))
}
"notifications/tools/list_changed" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <ToolListChangedNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
Ok(ServerNotification::ToolListChangedNotification(params))
}
"notifications/message" => {
let params_json = n.params.unwrap_or(serde_json::Value::Null);
let params: <LoggingMessageNotification as ModelContextProtocolNotification>::Params = serde_json::from_value(params_json)?;
Ok(ServerNotification::LoggingMessageNotification(params))
}
_ => Err(serde_json::Error::io(std::io::Error::new(
std::io::ErrorKind::InvalidData,
format!("Unknown method: {}", n.method),
))),
}
}
}