diff --git a/src/Azure.DataApiBuilder.Mcp/Core/McpStdioServer.cs b/src/Azure.DataApiBuilder.Mcp/Core/McpStdioServer.cs
index aef3b63dcc..49974296be 100644
--- a/src/Azure.DataApiBuilder.Mcp/Core/McpStdioServer.cs
+++ b/src/Azure.DataApiBuilder.Mcp/Core/McpStdioServer.cs
@@ -6,6 +6,7 @@
using Azure.DataApiBuilder.Config.ObjectModel;
using Azure.DataApiBuilder.Core.AuthenticationHelpers.AuthenticationSimulator;
using Azure.DataApiBuilder.Core.Configurations;
+using Azure.DataApiBuilder.Core.Services.MetadataProviders;
using Azure.DataApiBuilder.Core.Telemetry;
using Azure.DataApiBuilder.Mcp.Model;
using Azure.DataApiBuilder.Mcp.Telemetry;
@@ -30,6 +31,8 @@ public class McpStdioServer : IMcpStdioServer
private readonly McpStdoutWriter _stdoutWriter;
private readonly TextReader? _inputReader;
private readonly string _protocolVersion;
+ private readonly object _initializationLock = new();
+ private Task? _initializationTask;
private const int MAX_LINE_LENGTH = 1024 * 1024; // 1 MB limit for incoming JSON-RPC requests
@@ -134,7 +137,7 @@ public async Task RunAsync(CancellationToken cancellationToken)
break;
case "tools/list":
- HandleListTools(id);
+ await HandleListToolsAsync(id);
break;
case "tools/call":
@@ -284,8 +287,10 @@ private void HandleInitialize(JsonElement? id, JsonElement root)
///
/// The request identifier extracted from the incoming JSON-RPC request. Used to correlate the response with the request.
///
- private void HandleListTools(JsonElement? id)
+ private async Task HandleListToolsAsync(JsonElement? id)
{
+ await EnsureToolsInitializedAsync();
+
List