objectiveai_sdk/mcp/tool/
tool.rs1use indexmap::IndexMap;
4use schemars::JsonSchema;
5use serde::{Deserialize, Serialize};
6
7#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
9#[schemars(rename = "mcp.tool.Tool")]
10pub struct Tool {
11 pub name: String,
13 #[serde(skip_serializing_if = "Option::is_none")]
15 #[schemars(extend("omitempty" = true))]
16 pub title: Option<String>,
17 #[serde(skip_serializing_if = "Option::is_none")]
19 #[schemars(extend("omitempty" = true))]
20 pub description: Option<String>,
21 #[serde(skip_serializing_if = "Option::is_none")]
23 #[schemars(extend("omitempty" = true))]
24 pub icons: Option<Vec<super::super::shared::Icon>>,
25 #[serde(rename = "inputSchema")]
28 pub input_schema: ToolSchemaObject,
29 #[serde(skip_serializing_if = "Option::is_none")]
32 #[schemars(extend("omitempty" = true))]
33 #[serde(rename = "outputSchema")]
34 pub output_schema: Option<ToolSchemaObject>,
35 #[serde(skip_serializing_if = "Option::is_none")]
37 #[schemars(extend("omitempty" = true))]
38 pub annotations: Option<super::ToolAnnotations>,
39 #[serde(skip_serializing_if = "Option::is_none")]
41 #[schemars(extend("omitempty" = true))]
42 pub execution: Option<super::ToolExecution>,
43 #[serde(skip_serializing_if = "Option::is_none")]
45 #[schemars(extend("omitempty" = true))]
46 pub _meta: Option<IndexMap<String, serde_json::Value>>,
47}
48
49impl Tool {
50 pub fn tool_key(&self, connection_tool_key: &str) -> String {
52 format!("{connection_tool_key}-{}", self.name)
53 }
54}
55
56#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, JsonSchema)]
58#[serde(rename_all = "lowercase")]
59#[schemars(rename = "mcp.tool.ToolSchemaType")]
60pub enum ToolSchemaType {
61 Object,
62}
63
64#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, JsonSchema)]
66#[schemars(rename = "mcp.tool.ToolSchemaObject")]
67pub struct ToolSchemaObject {
68 pub r#type: ToolSchemaType,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 #[schemars(extend("omitempty" = true))]
73 pub properties: Option<IndexMap<String, serde_json::Value>>,
74 #[serde(skip_serializing_if = "Option::is_none")]
76 #[schemars(extend("omitempty" = true))]
77 pub required: Option<Vec<String>>,
78 #[serde(flatten)]
80 pub extra: IndexMap<String, serde_json::Value>,
81}