1use serde::{Deserialize, Serialize};
7
8pub const PROTOCOL_VERSION: &str = "0.2";
10
11pub const HEADER_PROTOCOL_VERSION: &str = "ACT-Protocol-Version";
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct ServerInfo {
17 pub name: String,
18 pub version: String,
19 pub description: String,
20 pub default_language: String,
21 #[serde(skip_serializing_if = "Option::is_none")]
22 pub capabilities: Option<Vec<Capability>>,
23 #[serde(skip_serializing_if = "Option::is_none")]
24 pub metadata: Option<serde_json::Value>,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct Capability {
30 pub id: String,
31 pub required: bool,
32 #[serde(skip_serializing_if = "Option::is_none")]
33 pub description: Option<String>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize)]
38pub struct ToolDefinition {
39 pub name: String,
40 pub description: String,
41 pub parameters_schema: serde_json::Value,
42 #[serde(skip_serializing_if = "Option::is_none")]
43 pub metadata: Option<serde_json::Value>,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct ListToolsResponse {
49 pub tools: Vec<ToolDefinition>,
50 #[serde(skip_serializing_if = "Option::is_none")]
51 pub metadata: Option<serde_json::Value>,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize, Default)]
56pub struct MetadataSchemaRequest {
57 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub metadata: Option<serde_json::Value>,
59}
60
61#[derive(Debug, Clone, Serialize, Deserialize, Default)]
63pub struct MetadataRequest {
64 #[serde(default, skip_serializing_if = "Option::is_none")]
65 pub metadata: Option<serde_json::Value>,
66}
67
68#[derive(Debug, Clone, Serialize, Deserialize)]
70pub struct ToolCallRequest {
71 pub arguments: serde_json::Value,
72 #[serde(default, skip_serializing_if = "Option::is_none")]
73 pub metadata: Option<serde_json::Value>,
74}
75
76#[derive(Debug, Clone, Serialize, Deserialize)]
78pub struct ContentPart {
79 pub data: serde_json::Value,
80 #[serde(default, skip_serializing_if = "Option::is_none")]
81 pub mime_type: Option<String>,
82 #[serde(default, skip_serializing_if = "Option::is_none")]
83 pub metadata: Option<serde_json::Value>,
84}
85
86#[derive(Debug, Clone, Serialize, Deserialize)]
88pub struct ToolCallResponse {
89 pub content: Vec<ContentPart>,
90 #[serde(default, skip_serializing_if = "Option::is_none")]
91 pub metadata: Option<serde_json::Value>,
92}
93
94#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct ToolError {
97 pub kind: String,
98 pub message: String,
99 #[serde(default, skip_serializing_if = "Option::is_none")]
100 pub metadata: Option<serde_json::Value>,
101}
102
103#[derive(Debug, Clone, Serialize, Deserialize)]
105pub struct ErrorResponse {
106 pub error: ToolError,
107}
108
109#[derive(Debug, Clone, Serialize, Deserialize)]
111pub struct ResourceInfo {
112 pub uri: String,
113 #[serde(default, skip_serializing_if = "Option::is_none")]
114 pub mime_type: Option<String>,
115 pub description: String,
116 #[serde(default, skip_serializing_if = "Option::is_none")]
117 pub metadata: Option<serde_json::Value>,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct ListResourcesResponse {
123 pub resources: Vec<ResourceInfo>,
124 #[serde(default, skip_serializing_if = "Option::is_none")]
125 pub metadata: Option<serde_json::Value>,
126}
127
128pub fn error_kind_to_status(kind: &str) -> u16 {
130 use crate::constants::*;
131 match kind {
132 ERR_NOT_FOUND => 404,
133 ERR_INVALID_ARGS => 422,
134 ERR_TIMEOUT => 504,
135 ERR_CAPABILITY_DENIED => 403,
136 _ => 500,
137 }
138}