Skip to content

Commit c9b8b8c

Browse files
committed
Match MCP message types more strictly
"id" is required for requests, while "params" is actually optional.
1 parent 76e3f46 commit c9b8b8c

File tree

2 files changed

+28
-30
lines changed

2 files changed

+28
-30
lines changed

crates/code_assistant/src/mcp/handler.rs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -296,38 +296,42 @@ impl MessageHandler {
296296
};
297297

298298
match message {
299-
JSONRPCMessage::Request(request) => {
300-
trace!("Processing request: {:?}", request);
301-
match (request.method.as_str(), request.id) {
302-
("initialize", Some(id)) => {
303-
let params: InitializeParams = serde_json::from_value(request.params)?;
299+
JSONRPCMessage::Request {
300+
method, id, params, ..
301+
} => {
302+
trace!("Processing request: method={}, id={:?}", method, id);
303+
match method.as_str() {
304+
"initialize" => {
305+
let params: InitializeParams =
306+
serde_json::from_value(params.unwrap_or_default())?;
304307
self.handle_initialize(id, params).await?;
305308
}
306309

307-
("resources/list", Some(id)) => {
310+
"resources/list" => {
308311
self.handle_resources_list(id).await?;
309312
}
310-
("resources/read", Some(id)) => {
311-
let params: ReadResourceRequest = serde_json::from_value(request.params)?;
313+
"resources/read" => {
314+
let params: ReadResourceRequest =
315+
serde_json::from_value(params.unwrap_or_default())?;
312316
self.handle_resources_read(id, params.uri).await?;
313317
}
314-
("resources/subscribe", Some(id)) => {
318+
"resources/subscribe" => {
315319
let params: SubscribeResourceRequest =
316-
serde_json::from_value(request.params)?;
320+
serde_json::from_value(params.unwrap_or_default())?;
317321
self.handle_resources_subscribe(id, params.uri).await?;
318322
}
319-
("resources/unsubscribe", Some(id)) => {
323+
"resources/unsubscribe" => {
320324
let params: UnsubscribeResourceRequest =
321-
serde_json::from_value(request.params)?;
325+
serde_json::from_value(params.unwrap_or_default())?;
322326
self.handle_resources_unsubscribe(id, params.uri).await?;
323327
}
324328

325-
("tools/list", Some(id)) => {
329+
"tools/list" => {
326330
self.handle_tools_list(id).await?;
327331
}
328332

329-
("tools/call", Some(id)) => {
330-
match serde_json::from_value::<ToolCallParams>(request.params) {
333+
"tools/call" => {
334+
match serde_json::from_value::<ToolCallParams>(params.unwrap_or_default()) {
331335
Ok(params) => {
332336
self.handle_tool_call(id, params).await?;
333337
}
@@ -346,18 +350,14 @@ impl MessageHandler {
346350
}
347351
}
348352

349-
("prompts/list", Some(id)) => {
353+
"prompts/list" => {
350354
self.handle_prompts_list(id).await?;
351355
}
352356

353-
(method, Some(id)) => {
357+
method => {
354358
self.send_error(id, -32601, format!("Method not found: {}", method), None)
355359
.await?;
356360
}
357-
358-
(_, None) => {
359-
debug!("Received notification request - ignoring");
360-
}
361361
}
362362
}
363363

crates/code_assistant/src/mcp/types.rs

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,16 @@ pub enum RequestId {
77
Number(i64),
88
}
99

10-
#[derive(Debug, Serialize, Deserialize)]
11-
pub struct JSONRPCRequest {
12-
pub jsonrpc: String,
13-
pub id: Option<RequestId>,
14-
pub method: String,
15-
pub params: serde_json::Value,
16-
}
17-
1810
#[derive(Debug, Serialize, Deserialize)]
1911
#[serde(untagged)]
2012
pub enum JSONRPCMessage {
21-
Request(JSONRPCRequest),
13+
Request {
14+
jsonrpc: String,
15+
id: RequestId,
16+
method: String,
17+
#[serde(default)]
18+
params: Option<serde_json::Value>,
19+
},
2220
Notification {
2321
jsonrpc: String,
2422
method: String,

0 commit comments

Comments
 (0)