---
name: mcp-debug
# prettier-ignore
description: "Use when testing MCP servers, debugging MCP tool responses, exploring MCP capabilities, or diagnosing why an MCP tool returns unexpected data"
version: 1.0.0
category: debugging
triggers:
- "mcp"
- "test mcp"
- "debug mcp"
- "mcp tool"
- "mcp server"
- "mcptools"
---
Enable Claude to directly test and debug MCP servers during development sessions. Call
MCP tools directly, see raw responses, and diagnose issues in real-time.
Use this skill when:
- Testing an MCP server during development
- Debugging why an MCP tool isn't returning expected data
- Exploring what operations an MCP server supports
- Verifying MCP server connectivity and auth
- Working across application and MCP server repos simultaneously
This skill uses `mcptools` (https://github.com/f/mcptools) for MCP communication.
Before using MCP debug commands, ensure mcptools is installed:
```bash
# Check if installed
which mcp || which mcpt
# Install via Homebrew (macOS)
brew tap f/mcptools && brew install mcp
# Or via Go
go install github.com/f/mcptools/cmd/mcptools@latest
```
If mcptools is not found, install it first before proceeding.
MCP server configs can come from multiple sources:
1. **Claude Code config**: `~/.config/claude/claude_desktop_config.json`
2. **Direct URL**: `http://localhost:9900` with optional auth
3. **mcptools aliases**: Previously saved with `mcp alias add`
To find available servers:
```bash
# Scan all known config locations
mcp configs scan
# List saved aliases
mcp alias list
```
## List Tools
See what tools/operations an MCP server provides:
```bash
# HTTP server with bearer auth
mcp tools http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
# Using an alias
mcp tools server-alias
# Pretty JSON output
mcp tools --format pretty http://localhost:9900
```
## Call a Tool
Execute an MCP tool directly with parameters:
```bash
# Call with JSON params
mcp call describe --params '{"action":"describe"}' http://localhost:9900 \
--headers "Authorization=Bearer $AUTH_TOKEN"
# Gateway-style (single tool with action param)
mcp call server-tool --params '{"action":"messages_recent","params":{"limit":5}}' \
http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
# Format output as pretty JSON
mcp call tool_name --params '{}' --format pretty http://localhost:9900
```
## Interactive Shell
Open persistent connection for multiple commands:
```bash
mcp shell http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
# Then in shell:
# mcp> tools
# mcp> call describe --params '{"action":"describe"}'
```
## Web Interface
Visual debugging in browser:
```bash
mcp web http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
# Opens http://localhost:41999
```
## Example: Gateway Pattern MCP Server
Many MCP servers use a gateway pattern - a single tool with an `action` parameter for
progressive disclosure:
```bash
# List all operations
mcp call server-tool --params '{"action":"describe"}' http://localhost:9900 \
--headers "Authorization=Bearer $AUTH_TOKEN"
# Call specific operation
mcp call server-tool --params '{"action":"resource_list","params":{"limit":5}}' \
http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
```
### Common Debug Commands
```bash
# Check if server is responding
curl -s http://localhost:9900/health
# List all tools via mcptools
mcp tools http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
# Get operation descriptions
mcp call server-tool --params '{"action":"describe"}' --format pretty \
http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
# Test a specific operation
mcp call server-tool --params '{"action":"resource_list","params":{"limit":3}}' \
--format pretty http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
```
## Common Issues
**Connection refused**
- Check if server is running: `curl http://localhost:9900/health`
- Check if process is running (e.g., `ps aux | grep mcp-server`)
- Check logs: `tail -20 /path/to/server/logs/error.log`
**401 Unauthorized**
- Verify token: `echo $AUTH_TOKEN`
- Check mcptools header syntax: `Authorization=Bearer` (mcptools uses `=`, HTTP uses
`:`)
**Tool not found**
- Gateway pattern servers use a single tool with `action` param
- Not direct tool names - check server documentation for tool name
**Empty/error results**
- Check server permissions and configuration
- Run server-specific diagnostics if available
- Check server logs for errors
**mcptools not found**
- Install: `brew tap f/mcptools && brew install mcp`
- Or: `go install github.com/f/mcptools/cmd/mcptools@latest`
## Typical Debug Session
1. **Verify connectivity**
```bash
curl -s http://localhost:9900/health
```
2. **List available tools**
```bash
mcp tools http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
```
3. **Get operation descriptions**
```bash
mcp call server-tool --params '{"action":"describe"}' --format pretty \
http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
```
4. **Test specific operation**
```bash
mcp call server-tool --params '{"action":"resource_list","params":{"limit":3}}' \
--format pretty http://localhost:9900 --headers "Authorization=Bearer $AUTH_TOKEN"
```
5. **If issues, check logs**
```bash
tail -50 /path/to/server/logs/error.log
```
## Reading MCP Results
MCP tools return JSON with this structure:
```json
{
"content": [
{
"type": "text",
"text": "{ ... actual result as JSON string ... }"
}
]
}
```
The inner `text` field contains the actual result, often as a JSON string that needs
parsing. Use `jq` to extract:
```bash
mcp call server-tool --params '...' --format json http://localhost:9900 \
--headers "Authorization=Bearer $AUTH_TOKEN" \
| jq -r '.content[0].text' | jq .
```