@@ -254,6 +254,10 @@ void MCPServer::ServerLoop() {
254254
255255MCPMessage 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+
351369MCPMessage 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