Troubleshooting

MCP Server Timeout Errors - Fix & Configure Timeouts

Diagnose and fix MCP server timeout errors across all clients. Learn how to configure timeouts for Claude Desktop, Cursor, and VS Code.

Understanding MCP Server Timeout Errors

Timeout errors are among the most frustrating MCP issues because they can appear intermittently and have multiple root causes. When an MCP client sends a request to a server and doesn't receive a response within the expected window, it terminates the connection and throws a timeout error. This guide covers every common cause and shows you how to fix each one.

Timeout errors typically manifest with messages like Request timed out after 30000ms, Server failed to respond within timeout period, or MCP connection timed out. The exact message varies by client, but the underlying problem is always the same: the server took too long to respond.

Understanding whether the timeout is caused by slow server startup, network latency, large response payloads, or misconfigured timeout limits is the first step toward a permanent fix. Let's walk through each cause systematically.

Common Causes of Timeout Errors

1. Slow Server Startup

Many MCP servers need to initialize connections to databases, load large models, or compile TypeScript before they can respond. If initialization takes longer than the client's connection timeout (typically 10-30 seconds), you'll see a timeout on the very first request. This is especially common with servers that connect to external APIs or load heavy dependencies.

Symptoms: Timeout occurs immediately when the client starts. Subsequent restarts sometimes work (because dependencies are cached). The server logs show initialization steps in progress when the client gives up.

2. Network Latency

When using Streamable HTTP transport instead of stdio, network conditions directly affect response times. High latency connections, VPN tunnels, or proxy servers can push response times beyond the timeout threshold. This is particularly common in corporate environments with strict network policies.

3. Large Response Payloads

MCP servers that return large datasets - such as database query results, file system listings, or web scraping output - may exceed the timeout while the response is still being serialized and transmitted. A query returning thousands of rows or a file listing with deep recursion can easily take 30+ seconds.

4. Client-Specific Timeout Defaults

Each MCP client has its own default timeout, and they vary significantly:

Client Default Timeout Configurable?
Claude Desktop 30 seconds Not directly
Cursor 30 seconds Yes (settings)
VS Code (Copilot) 60 seconds Yes (settings.json)
Windsurf 30 seconds Yes
Claude Code (CLI) 60 seconds Yes (settings)

Configuring Timeouts Per Client

Claude Desktop

Claude Desktop doesn't expose a direct timeout setting, but you can work around this by making your server respond faster. The key is ensuring your server sends an initial response quickly, then streams additional data. Check the Claude Desktop MCP setup guide for full configuration details.

Cursor

In Cursor, you can adjust MCP timeout behavior through the settings UI. Navigate to Settings > MCP and look for timeout-related options. For servers that need more time, consider implementing progress notifications so Cursor knows the server is still working.

VS Code

In VS Code, add timeout configuration to your settings.json:

{
  "mcp": {
    "servers": {
      "my-slow-server": {
        "command": "node",
        "args": ["server.js"],
        "timeout": 120000
      }
    }
  }
}

Server-Side Timeout Handling

The best way to prevent timeout errors is to handle them on the server side. Implement progress reporting, chunked responses, and graceful timeout handling in your server code.

TypeScript Server Example

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";

const server = new McpServer({
  name: "timeout-resilient-server",
  version: "1.0.0",
});

server.tool(
  "long-running-query",
  "Executes a query that may take time",
  {
    query: z.string().describe("The query to execute"),
    timeoutMs: z.number().optional().describe("Custom timeout in ms"),
  },
  async ({ query, timeoutMs = 30000 }) => {
    const controller = new AbortController();
    const timeout = setTimeout(() => controller.abort(), timeoutMs);

    try {
      const result = await executeQuery(query, {
        signal: controller.signal,
      });
      return {
        content: [{ type: "text", text: JSON.stringify(result) }],
      };
    } catch (error) {
      if (error instanceof DOMException && error.name === "AbortError") {
        return {
          content: [
            {
              type: "text",
              text: "Query timed out. Try narrowing your query or increasing the timeout.",
            },
          ],
          isError: true,
        };
      }
      throw error;
    } finally {
      clearTimeout(timeout);
    }
  }
);

Python Server Example

import asyncio
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("timeout-resilient-server")

@mcp.tool()
async def long_running_query(query: str, timeout_seconds: int = 30) -> str:
    """Executes a query with configurable timeout."""
    try:
        result = await asyncio.wait_for(
            execute_query(query),
            timeout=timeout_seconds,
        )
        return str(result)
    except asyncio.TimeoutError:
        return (
            f"Query timed out after {timeout_seconds}s. "
            "Try narrowing your query or increasing the timeout."
        )

@mcp.tool()
async def chunked_file_read(path: str) -> str:
    """Reads a large file in chunks to avoid timeouts."""
    chunks = []
    async with aiofiles.open(path, "r") as f:
        while True:
            chunk = await f.read(8192)
            if not chunk:
                break
            chunks.append(chunk)
    return "".join(chunks)

Actual Timeout Error Messages

Here are real timeout error messages you might encounter, along with what each means:

# Claude Desktop
Error: MCP server "my-server" failed to respond within 30000ms
Connection to MCP server timed out

# Cursor
[MCP] Request to "my-server" timed out after 30s
Error: Server did not respond in time

# VS Code
MCP server connection timed out. The server at "my-server" did not respond.
TimeoutError: MCP request exceeded 60000ms limit

# Generic stdio transport
Error: Timeout waiting for server response on stdin/stdout
ETIMEDOUT: Server process did not produce output within deadline

Each of these points to the same root cause - the server didn't respond fast enough - but the fix depends on why it was slow. Use the diagnostic steps above to identify the specific cause.

Performance Optimization Strategies

Beyond configuring timeouts, consider these strategies to make your servers respond faster and avoid timeouts entirely:

  • Lazy initialization: Don't connect to databases or load models until the first request that needs them. Return tool listings immediately.
  • Connection pooling: Reuse database connections and HTTP clients instead of creating new ones per request.
  • Response pagination: If a tool returns large datasets, implement pagination so each response stays small. Let the AI request additional pages as needed.
  • Caching: Cache frequently requested data. If a tool returns the same result for the same input, cache it for a reasonable TTL.
  • Health checks: Implement a simple health check tool that returns immediately, allowing clients to verify the server is alive without triggering a full operation.

For a comprehensive guide on making your MCP servers faster, see our performance optimization tutorial.

Common Pitfalls

  • Setting timeouts too high: A 5-minute timeout means users wait 5 minutes before seeing an error. Better to fail fast and let users retry with a narrower query.
  • Ignoring startup time: Your server might start fine on your fast machine but timeout on a user's older laptop. Test with cold starts on modest hardware.
  • Not handling AbortSignal: If you don't pass abort signals to downstream operations, your server keeps working even after the client has given up.
  • Blocking the event loop (Node.js): Synchronous file operations or CPU-intensive work blocks the event loop, preventing the server from responding to keepalive pings.
  • Missing error responses: If your server throws an unhandled exception instead of returning an error response, the client sees a timeout instead of a useful error message.

Security Considerations

Timeout configuration also has security implications. Servers without proper timeout limits can be exploited for resource exhaustion attacks. Always set reasonable upper bounds on timeout values, even when making them configurable. For a deeper dive into MCP server security, see our MCP server security guide.

Frequently Asked Questions

Related Guides

Ready to explore MCP servers?

Browse 100+ curated MCP servers
Step-by-step setup tutorials
Community-driven reviews and ratings