mcp_host/content/
prompt.rs

1//! Prompt message types for MCP prompts/get responses
2//!
3//! Per MCP spec, prompt responses have `messages` with `role` + `content`
4
5use serde::{Deserialize, Serialize};
6
7/// A single message in a prompt response
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct PromptMessage {
10    /// Message role (user or assistant)
11    pub role: PromptRole,
12
13    /// Message content
14    pub content: PromptContent,
15}
16
17/// Role in a prompt conversation
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(rename_all = "lowercase")]
20pub enum PromptRole {
21    /// User message
22    User,
23
24    /// Assistant message
25    Assistant,
26}
27
28/// Content in a prompt message
29#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(tag = "type", rename_all = "camelCase")]
31pub enum PromptContent {
32    /// Text content
33    #[serde(rename = "text")]
34    Text { text: String },
35
36    /// Image content
37    #[serde(rename = "image")]
38    Image {
39        data: String,
40        #[serde(rename = "mimeType")]
41        mime_type: String,
42    },
43
44    /// Resource content
45    #[serde(rename = "resource")]
46    Resource {
47        uri: String,
48        #[serde(skip_serializing_if = "Option::is_none", rename = "mimeType")]
49        mime_type: Option<String>,
50        #[serde(skip_serializing_if = "Option::is_none")]
51        text: Option<String>,
52    },
53}
54
55impl PromptMessage {
56    /// Create a user message with text content
57    pub fn user(text: impl Into<String>) -> Self {
58        Self {
59            role: PromptRole::User,
60            content: PromptContent::Text { text: text.into() },
61        }
62    }
63
64    /// Create an assistant message with text content
65    pub fn assistant(text: impl Into<String>) -> Self {
66        Self {
67            role: PromptRole::Assistant,
68            content: PromptContent::Text { text: text.into() },
69        }
70    }
71
72    /// Create a user message with image content
73    pub fn user_image(data: impl Into<String>, mime_type: impl Into<String>) -> Self {
74        Self {
75            role: PromptRole::User,
76            content: PromptContent::Image {
77                data: data.into(),
78                mime_type: mime_type.into(),
79            },
80        }
81    }
82
83    /// Create an assistant message with image content
84    pub fn assistant_image(data: impl Into<String>, mime_type: impl Into<String>) -> Self {
85        Self {
86            role: PromptRole::Assistant,
87            content: PromptContent::Image {
88                data: data.into(),
89                mime_type: mime_type.into(),
90            },
91        }
92    }
93}