Debugging ↗
noOriginal Documentation
Documentation Index#
Fetch the complete documentation index at: https://modelcontextprotocol.io/llms.txt Use this file to discover all available pages before exploring further.
A comprehensive guide to debugging Model Context Protocol (MCP) integrations
Effective debugging is essential when developing MCP servers or integrating them with applications. This guide covers the debugging tools and approaches available in the MCP ecosystem.
Debugging tools overview#
MCP provides several tools for debugging at different levels:
- MCP Inspector: interactive, transport-agnostic testing UI. Connect to stdio or Streamable HTTP servers, invoke tools, prompts, and resources, and watch the notification stream. This should be your first stop.
- Server logging: structured logs to stderr (stdio transport) or via
notifications/message(all transports). - Client developer tools: most MCP clients expose logs and connection state. See Debugging in Claude Desktop below for one example, or consult your client’s documentation.
Implementing logging#
Server-side logging#
When building a server that uses the local stdio transport, all messages logged to stderr (standard error) will be captured by the host application automatically.
Local MCP servers should not log messages to stdout (standard out), as this will interfere with protocol operation.
For servers using the
Streamable HTTP transport,
stderr is not captured by the client. Use the log message notifications below,
your own server-side log aggregation, or standard HTTP tooling (curl, browser
DevTools Network panel) to inspect requests,
Mcp-Session-Id headers,
and SSE streams.
For all transports, you can also provide logging to the client by sending a log message notification:
@server.tool()
async def my_tool(ctx: Context) -> str:
await ctx.session.send_log_message(
level="info",
data="Server started successfully",
)
return "done"await server.sendLoggingMessage({
level: "info",
data: "Server started successfully",
});MCP defines eight
RFC 5424 severity levels
(debug through emergency). Clients can adjust the minimum level at runtime
via the
logging/setLevel
request.
Important events to log:
- Initialization steps
- Resource access
- Tool execution
- Error conditions
- Performance metrics
Common issues#
The examples below use Claude Desktop’s
claude_desktop_config.json; the same
principles apply to any stdio-based MCP client.
Working directory#
When an MCP client launches a stdio server:
- The working directory for servers launched via the client’s config may be
undefined (like
/on macOS) since the client could be started from anywhere - Always use absolute paths in your configuration and
.envfiles to ensure reliable operation - For testing servers directly via command line, the working directory will be where you run the command
For example in claude_desktop_config.json, use:
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-filesystem",
"/Users/username/data"
]
}
}
}Instead of relative paths like ./data
Environment variables#
MCP servers launched over stdio inherit only a limited subset of environment variables automatically (the exact set is platform-dependent).
To override the default variables or provide your own, you can specify an
env key in claude_desktop_config.json:
{
"mcpServers": {
"myserver": {
"command": "mcp-server-myapp",
"env": {
"MYAPP_API_KEY": "some_key"
}
}
}
}Server initialization#
Common initialization problems:
Path Issues
- Incorrect server executable path
- Missing required files
- Permission problems
- Try using an absolute path for
command
Configuration Errors
- Invalid JSON syntax
- Missing required fields
- Type mismatches
Environment Problems
- Missing environment variables
- Incorrect variable values
- Permission restrictions
Connection problems#
When servers fail to connect:
- Check client logs
- Verify server process is running
- Test standalone with Inspector
- Verify protocol compatibility
- Check
capability negotiation:
error
-32602is the standard JSON-RPC “Invalid params” code and is returned in many contexts. One common cause is a server sending sampling or elicitation requests to a client that hasn’t declared that capability. Inspect theinitializeexchange to verify both sides declared what you expect
Debugging in Claude Desktop#
Claude Desktop is one of many MCP clients. It is available on macOS and Windows.
Checking server status#
Click the “Add files, connectors, and more” plus icon in the chat input, then hover over the Connectors menu to see connected servers and available tools.

Viewing logs#
Log files are written to:
macOS:
~/Library/Logs/ClaudeWindows:
%APPDATA%\Claude\logstail -n 20 -F ~/Library/Logs/Claude/mcp*.logtype "$env:AppData\Claude\logs\mcp*.log"
The logs capture:
- Server connection events
- Configuration issues
- Runtime errors
- Message exchanges
Using Chrome DevTools#
Access Chrome’s developer tools inside Claude Desktop to investigate client-side errors:
- Create a
developer_settings.jsonfile withallowDevToolsset to true:
echo '{"allowDevTools": true}' > ~/Library/Application\ Support/Claude/developer_settings.json'{"allowDevTools": true}' | Set-Content "$env:AppData\Claude\developer_settings.json"- Open DevTools:
Command-Option-I(macOS) orCtrl+Alt+I(Windows)
Note: You’ll see two DevTools windows:
- Main content window
- App title bar window
Use the Console panel to inspect client-side errors.
Use the Network panel to inspect:
- Message payloads
- Connection timing
Debugging workflow#
Development cycle#
Initial Development
- Use Inspector for basic testing
- Implement core functionality
- Add logging points
Integration Testing
- Test in your target MCP client
- Monitor logs
- Check error handling
Testing changes#
To test changes efficiently:
- Configuration changes: Restart the MCP client
- Server code changes: Restart the client (for Claude Desktop, fully quit and reopen; closing the window is not enough)
- Quick iteration: Use Inspector during development
Best practices#
Logging strategy#
Structured Logging
- Use consistent formats
- Include context
- Add timestamps
- Track request IDs
Error Handling
- Log stack traces
- Include error context
- Track error patterns
- Monitor recovery
Performance Tracking
- Log operation timing
- Monitor resource usage
- Track message sizes
- Measure latency
Security considerations#
When debugging:
Sensitive Data
- Sanitize logs
- Protect credentials
- Mask personal information
Access Control
- Verify permissions
- Check authentication
- Monitor access patterns
For a full treatment of MCP attack vectors and mitigations, see Security Best Practices.
Getting help#
When encountering issues:
First Steps
- Check server logs
- Test with Inspector
- Review configuration
- Verify environment
Support Channels
Providing Information
- Log excerpts
- Configuration files
- Steps to reproduce
- Environment details
Next steps#
Learn to use the MCP Inspector
Walk through building a server from scratch
Full claude_desktop_config.json reference and troubleshooting