Skip to content

Commit 77578ed

Browse files
Merge pull request #10 from mebaran/main
bug: added support for notifications message type (returning nothing per spec)
2 parents 0b658fd + 8844bf3 commit 77578ed

File tree

2 files changed

+36
-17
lines changed

2 files changed

+36
-17
lines changed

src/include/server/mcp_server.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ class MCPServer {
135135
void ServerLoop();
136136
void HandleConnection(unique_ptr<MCPTransport> transport);
137137
MCPMessage HandleRequest(const MCPMessage &request);
138+
void HandleNotification(const MCPMessage &request);
138139

139140
// Protocol handlers
140141
MCPMessage HandleInitialize(const MCPMessage &request);
@@ -173,4 +174,4 @@ class MCPServerManager {
173174
mutable mutex manager_mutex;
174175
};
175176

176-
} // namespace duckdb
177+
} // namespace duckdb

src/server/mcp_server.cpp

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,10 @@ void MCPServer::ServerLoop() {
254254

255255
MCPMessage MCPServer::ProcessRequest(const MCPMessage &request) {
256256
// Public wrapper for HandleRequest - allows direct testing without transport
257+
if (request.IsNotification()) {
258+
HandleNotification(request);
259+
return MCPMessage::CreateResponse(Value(), request.id);
260+
}
257261
return HandleRequest(request);
258262
}
259263

@@ -269,11 +273,15 @@ bool MCPServer::ProcessOneMessage() {
269273
try {
270274
auto request = test_transport->Receive();
271275
requests_received.fetch_add(1);
272-
auto response = HandleRequest(request);
273-
test_transport->Send(response);
274-
responses_sent.fetch_add(1);
275-
if (response.IsError()) {
276-
errors_returned.fetch_add(1);
276+
if (request.IsNotification()) {
277+
HandleNotification(request);
278+
} else {
279+
auto response = HandleRequest(request);
280+
test_transport->Send(response);
281+
responses_sent.fetch_add(1);
282+
if (response.IsError()) {
283+
errors_returned.fetch_add(1);
284+
}
277285
}
278286
return true;
279287
} catch (const std::exception &) {
@@ -289,16 +297,20 @@ void MCPServer::HandleConnection(unique_ptr<MCPTransport> transport) {
289297
try {
290298
auto request = transport->Receive();
291299
requests_received.fetch_add(1);
292-
auto response = HandleRequest(request);
293-
transport->Send(response);
294-
responses_sent.fetch_add(1);
295-
if (response.IsError()) {
296-
errors_returned.fetch_add(1);
297-
}
298-
299-
// If this was a shutdown request, break out of the loop
300-
if (request.method == MCPMethods::SHUTDOWN) {
301-
break;
300+
if (request.IsNotification()) {
301+
HandleNotification(request);
302+
} else {
303+
auto response = HandleRequest(request);
304+
transport->Send(response);
305+
responses_sent.fetch_add(1);
306+
if (response.IsError()) {
307+
errors_returned.fetch_add(1);
308+
}
309+
310+
// If this was a shutdown request, break out of the loop
311+
if (request.method == MCPMethods::SHUTDOWN) {
312+
break;
313+
}
302314
}
303315

304316
// Check max_requests limit (0 = unlimited)
@@ -348,6 +360,12 @@ MCPMessage MCPServer::HandleRequest(const MCPMessage &request) {
348360
}
349361
}
350362

363+
void MCPServer::HandleNotification(const MCPMessage &request) {
364+
if (request.method == MCPMethods::INITIALIZED) {
365+
return;
366+
}
367+
}
368+
351369
MCPMessage MCPServer::HandleInitialize(const MCPMessage &request) {
352370
// MCP spec requires capabilities to be objects with specific sub-fields
353371
// See: https://modelcontextprotocol.io/specification/2024-11-05/basic/lifecycle
@@ -723,4 +741,4 @@ MCPMessage MCPServerManager::SendRequest(const MCPMessage &request) {
723741
return server->ProcessRequest(request);
724742
}
725743

726-
} // namespace duckdb
744+
} // namespace duckdb

0 commit comments

Comments
 (0)