mirror of
https://github.com/samvallad33/vestige.git
synced 2026-05-08 23:32:37 +02:00
175 lines
5.1 KiB
Rust
175 lines
5.1 KiB
Rust
|
|
//! MCP Protocol Messages
|
||
|
|
//!
|
||
|
|
//! Request and response types for MCP methods.
|
||
|
|
|
||
|
|
use serde::{Deserialize, Serialize};
|
||
|
|
use serde_json::Value;
|
||
|
|
use std::collections::HashMap;
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// INITIALIZE
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
/// Initialize request from client
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct InitializeRequest {
|
||
|
|
pub protocol_version: String,
|
||
|
|
pub capabilities: ClientCapabilities,
|
||
|
|
pub client_info: ClientInfo,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl Default for InitializeRequest {
|
||
|
|
fn default() -> Self {
|
||
|
|
Self {
|
||
|
|
protocol_version: "2024-11-05".to_string(),
|
||
|
|
capabilities: ClientCapabilities::default(),
|
||
|
|
client_info: ClientInfo {
|
||
|
|
name: "unknown".to_string(),
|
||
|
|
version: "0.0.0".to_string(),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ClientCapabilities {
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub roots: Option<HashMap<String, Value>>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub sampling: Option<HashMap<String, Value>>,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ClientInfo {
|
||
|
|
pub name: String,
|
||
|
|
pub version: String,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Initialize response to client
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct InitializeResult {
|
||
|
|
pub protocol_version: String,
|
||
|
|
pub server_info: ServerInfo,
|
||
|
|
pub capabilities: ServerCapabilities,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub instructions: Option<String>,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ServerInfo {
|
||
|
|
pub name: String,
|
||
|
|
pub version: String,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ServerCapabilities {
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub tools: Option<HashMap<String, Value>>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub resources: Option<HashMap<String, Value>>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub prompts: Option<HashMap<String, Value>>,
|
||
|
|
}
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// TOOLS
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
/// Tool description for tools/list
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ToolDescription {
|
||
|
|
pub name: String,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub description: Option<String>,
|
||
|
|
pub input_schema: Value,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Result of tools/list
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ListToolsResult {
|
||
|
|
pub tools: Vec<ToolDescription>,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Request for tools/call
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct CallToolRequest {
|
||
|
|
pub name: String,
|
||
|
|
#[serde(default)]
|
||
|
|
pub arguments: Option<Value>,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Result of tools/call
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct CallToolResult {
|
||
|
|
pub content: Vec<ToolResultContent>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub is_error: Option<bool>,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ToolResultContent {
|
||
|
|
#[serde(rename = "type")]
|
||
|
|
pub content_type: String,
|
||
|
|
pub text: String,
|
||
|
|
}
|
||
|
|
|
||
|
|
// ============================================================================
|
||
|
|
// RESOURCES
|
||
|
|
// ============================================================================
|
||
|
|
|
||
|
|
/// Resource description for resources/list
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ResourceDescription {
|
||
|
|
pub uri: String,
|
||
|
|
pub name: String,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub description: Option<String>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub mime_type: Option<String>,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Result of resources/list
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ListResourcesResult {
|
||
|
|
pub resources: Vec<ResourceDescription>,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Request for resources/read
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ReadResourceRequest {
|
||
|
|
pub uri: String,
|
||
|
|
}
|
||
|
|
|
||
|
|
/// Result of resources/read
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ReadResourceResult {
|
||
|
|
pub contents: Vec<ResourceContent>,
|
||
|
|
}
|
||
|
|
|
||
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||
|
|
#[serde(rename_all = "camelCase")]
|
||
|
|
pub struct ResourceContent {
|
||
|
|
pub uri: String,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub mime_type: Option<String>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub text: Option<String>,
|
||
|
|
#[serde(skip_serializing_if = "Option::is_none")]
|
||
|
|
pub blob: Option<String>,
|
||
|
|
}
|