Skip to main content

subcog/mcp/prompts/
types.rs

1//! MCP prompt type definitions.
2//!
3//! Contains the core data structures for MCP prompts.
4
5use serde::{Deserialize, Serialize};
6
7/// Definition of an MCP prompt.
8#[derive(Debug, Clone, Serialize, Deserialize)]
9pub struct PromptDefinition {
10    /// Prompt name.
11    pub name: String,
12    /// Optional description.
13    pub description: Option<String>,
14    /// Prompt arguments.
15    pub arguments: Vec<PromptArgument>,
16}
17
18/// Argument for a prompt.
19#[derive(Debug, Clone, Serialize, Deserialize)]
20pub struct PromptArgument {
21    /// Argument name.
22    pub name: String,
23    /// Optional description.
24    pub description: Option<String>,
25    /// Whether the argument is required.
26    pub required: bool,
27}
28
29/// A message in a prompt.
30#[derive(Debug, Clone, Serialize, Deserialize)]
31pub struct PromptMessage {
32    /// Role: user, assistant, or system.
33    pub role: String,
34    /// Message content.
35    pub content: PromptContent,
36}
37
38/// Content of a prompt message.
39#[derive(Debug, Clone, Serialize, Deserialize)]
40#[serde(tag = "type", rename_all = "lowercase")]
41pub enum PromptContent {
42    /// Text content.
43    Text {
44        /// The text content.
45        text: String,
46    },
47    /// Image content.
48    Image {
49        /// Image data (base64 or URL).
50        data: String,
51        /// MIME type.
52        mime_type: String,
53    },
54    /// Resource reference.
55    Resource {
56        /// Resource URI.
57        uri: String,
58    },
59}
60
61/// Converts a user `PromptTemplate` to a `PromptDefinition`.
62pub fn user_prompt_to_definition(template: &crate::models::PromptTemplate) -> PromptDefinition {
63    let description = if template.description.is_empty() {
64        None
65    } else {
66        Some(template.description.clone())
67    };
68
69    PromptDefinition {
70        name: format!("user/{}", template.name),
71        description,
72        arguments: template
73            .variables
74            .iter()
75            .map(|v| PromptArgument {
76                name: v.name.clone(),
77                description: v.description.clone(),
78                required: v.required,
79            })
80            .collect(),
81    }
82}