Skip to main content

mcp_kit/types/
sampling.rs

1use serde::{Deserialize, Serialize};
2
3use super::content::Content;
4
5/// A message param used in sampling requests
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct MessageParam {
8    pub role: SamplingRole,
9    pub content: Content,
10}
11
12/// Role in a sampling conversation
13#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "lowercase")]
15pub enum SamplingRole {
16    User,
17    Assistant,
18}
19
20/// A sampling message (alias for clarity)
21pub type SamplingMessage = MessageParam;
22
23/// Model hints for sampling requests
24#[derive(Debug, Clone, Default, Serialize, Deserialize)]
25pub struct ModelHint {
26    #[serde(skip_serializing_if = "Option::is_none")]
27    pub name: Option<String>,
28}
29
30/// Model preferences for sampling
31#[derive(Debug, Clone, Default, Serialize, Deserialize)]
32#[serde(rename_all = "camelCase")]
33pub struct ModelPreferences {
34    #[serde(skip_serializing_if = "Option::is_none")]
35    pub hints: Option<Vec<ModelHint>>,
36    /// Cost priority [0.0, 1.0]
37    #[serde(skip_serializing_if = "Option::is_none")]
38    pub cost_priority: Option<f64>,
39    /// Speed priority [0.0, 1.0]
40    #[serde(skip_serializing_if = "Option::is_none")]
41    pub speed_priority: Option<f64>,
42    /// Intelligence priority [0.0, 1.0]
43    #[serde(skip_serializing_if = "Option::is_none")]
44    pub intelligence_priority: Option<f64>,
45}
46
47/// Sampling stop reason
48#[derive(Debug, Clone, Serialize, Deserialize)]
49#[serde(rename_all = "camelCase")]
50pub enum StopReason {
51    EndTurn,
52    MaxTokens,
53    StopSequence,
54    #[serde(other)]
55    Other,
56}
57
58/// Request from server → client to sample from a model
59#[derive(Debug, Clone, Serialize, Deserialize)]
60#[serde(rename_all = "camelCase")]
61pub struct CreateMessageRequest {
62    pub messages: Vec<SamplingMessage>,
63    #[serde(skip_serializing_if = "Option::is_none")]
64    pub model_preferences: Option<ModelPreferences>,
65    #[serde(skip_serializing_if = "Option::is_none")]
66    pub system_prompt: Option<String>,
67    #[serde(skip_serializing_if = "Option::is_none")]
68    pub include_context: Option<IncludeContext>,
69    #[serde(skip_serializing_if = "Option::is_none")]
70    pub temperature: Option<f64>,
71    pub max_tokens: u32,
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub stop_sequences: Option<Vec<String>>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub metadata: Option<serde_json::Value>,
76}
77
78#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
79#[serde(rename_all = "camelCase")]
80pub enum IncludeContext {
81    None,
82    ThisServer,
83    AllServers,
84}
85
86/// Result of a sampling/createMessage call
87#[derive(Debug, Clone, Serialize, Deserialize)]
88#[serde(rename_all = "camelCase")]
89pub struct CreateMessageResult {
90    pub role: SamplingRole,
91    pub content: Content,
92    pub model: String,
93    #[serde(skip_serializing_if = "Option::is_none")]
94    pub stop_reason: Option<StopReason>,
95}