@@ -7,7 +7,7 @@ use rmcp::{
7
7
} ;
8
8
use schemars:: JsonSchema ;
9
9
use serde:: { Deserialize , Serialize } ;
10
- use serde_json:: json;
10
+ use serde_json:: { Value , json} ;
11
11
12
12
#[ derive( Serialize , Deserialize , JsonSchema ) ]
13
13
pub struct CalculationRequest {
@@ -122,8 +122,20 @@ async fn test_structured_content_in_call_result() {
122
122
123
123
let result = CallToolResult :: structured ( structured_data. clone ( ) ) ;
124
124
125
- assert ! ( result. content. is_none ( ) ) ;
125
+ assert ! ( result. content. is_some ( ) ) ;
126
126
assert ! ( result. structured_content. is_some( ) ) ;
127
+
128
+ let contents = result. content . unwrap ( ) ;
129
+
130
+ assert_eq ! ( contents. len( ) , 1 ) ;
131
+
132
+ let content_text = contents. first ( ) . unwrap ( ) . as_text ( ) ;
133
+
134
+ assert ! ( content_text. is_some( ) ) ;
135
+
136
+ let content_value: Value = serde_json:: from_str ( & content_text. unwrap ( ) . text ) . unwrap ( ) ;
137
+
138
+ assert_eq ! ( content_value, structured_data) ;
127
139
assert_eq ! ( result. structured_content. unwrap( ) , structured_data) ;
128
140
assert_eq ! ( result. is_error, Some ( false ) ) ;
129
141
}
@@ -138,8 +150,20 @@ async fn test_structured_error_in_call_result() {
138
150
139
151
let result = CallToolResult :: structured_error ( error_data. clone ( ) ) ;
140
152
141
- assert ! ( result. content. is_none ( ) ) ;
153
+ assert ! ( result. content. is_some ( ) ) ;
142
154
assert ! ( result. structured_content. is_some( ) ) ;
155
+
156
+ let contents = result. content . unwrap ( ) ;
157
+
158
+ assert_eq ! ( contents. len( ) , 1 ) ;
159
+
160
+ let content_text = contents. first ( ) . unwrap ( ) . as_text ( ) ;
161
+
162
+ assert ! ( content_text. is_some( ) ) ;
163
+
164
+ let content_value: Value = serde_json:: from_str ( & content_text. unwrap ( ) . text ) . unwrap ( ) ;
165
+
166
+ assert_eq ! ( content_value, error_data) ;
143
167
assert_eq ! ( result. structured_content. unwrap( ) , error_data) ;
144
168
assert_eq ! ( result. is_error, Some ( true ) ) ;
145
169
}
@@ -180,10 +204,24 @@ async fn test_structured_return_conversion() {
180
204
assert ! ( result. is_ok( ) ) ;
181
205
let call_result = result. unwrap ( ) ;
182
206
183
- assert ! ( call_result. content. is_none( ) ) ;
207
+ // Tools which return structured content should also return a serialized version as
208
+ // Content::text for backwards compatibility.
209
+ assert ! ( call_result. content. is_some( ) ) ;
184
210
assert ! ( call_result. structured_content. is_some( ) ) ;
185
211
212
+ let contents = call_result. content . unwrap ( ) ;
213
+
214
+ assert_eq ! ( contents. len( ) , 1 ) ;
215
+
216
+ let content_text = contents. first ( ) . unwrap ( ) . as_text ( ) ;
217
+
218
+ assert ! ( content_text. is_some( ) ) ;
219
+
220
+ let content_value: Value = serde_json:: from_str ( & content_text. unwrap ( ) . text ) . unwrap ( ) ;
186
221
let structured_value = call_result. structured_content . unwrap ( ) ;
222
+
223
+ assert_eq ! ( content_value, structured_value) ;
224
+
187
225
assert_eq ! ( structured_value[ "sum" ] , 7 ) ;
188
226
assert_eq ! ( structured_value[ "product" ] , 12 ) ;
189
227
}
@@ -227,7 +265,7 @@ async fn test_output_schema_requires_structured_content() {
227
265
assert ! ( call_result. is_ok( ) ) ;
228
266
let call_result = call_result. unwrap ( ) ;
229
267
230
- // Verify it has structured_content and no content
268
+ // Verify it has structured_content and content
231
269
assert ! ( call_result. structured_content. is_some( ) ) ;
232
- assert ! ( call_result. content. is_none ( ) ) ;
270
+ assert ! ( call_result. content. is_some ( ) ) ;
233
271
}
0 commit comments