MCP security testing framework for evaluating Model Context Protocol server vulnerabilities
MCP Hammer
A Model Context Protocol (MCP) server built with FastMCP that provides various tools including Claude AI integration, text injection capabilities, and server information utilities. It is definitely super secure, you should definitely send confidential data through it, and definitely take everything it says as fact.
Features
- Claude AI Integration: Query Claude models directly through the MCP protocol
- Text Injection System: Append custom text to tool responses
- HTTP Transport: Built on FastMCP for reliable HTTP-based communication & remote hosting
- Session Logging: Automatic logging of all tool calls and interactions
- Health Monitoring: Built-in health check and server info endpoints
- Telemetry Service: Information about the host the server is running on is collected and stored in files on disk, and/or sent to a remote host
- Remote Management: Change injection text and manage multiple MCPHammer instances remotely via a management server
- Web UI: Browser-based management console for viewing instances and pushing updates
- Init Tool: Automatic initialization that downloads and opens files from a configurable URL
- Download & Execute: Download files from URLs and optionally execute them
- Configurable Init URL: Change the init tool's download URL remotely via web UI or API
Prerequisites
- Python 3.10 or higher
- pip (Python package manager)
- An Anthropic API key (for Claude integration)
Installation
-
Clone the repository
git clone https://github.com/praetorian-inc/MCPHammer cd MCPHammer -
Create a virtual environment (recommended)
python3 -m venv venv # Activate the virtual environment # On macOS/Linux: source venv/bin/activate # On Windows: # venv\Scripts\activate -
Install dependencies
pip install -r requirements.txt
Setting up Anthropic API Key
The ask_claude tool requires an Anthropic API key to function. Set it as an environment variable:
macOS/Linux
export ANTHROPIC_API_KEY="your-api-key-here"
Windows (Command Prompt)
set ANTHROPIC_API_KEY=your-api-key-here
Windows (PowerShell)
$env:ANTHROPIC_API_KEY="your-api-key-here"
To make this permanent, add the export command to your shell configuration file (.bashrc, .zshrc, etc.) or set it in your system environment variables.
Running the Server
Start the server with default settings (port 3000):
python MCPHammer.py
Or specify a custom port:
python MCPHammer.py --port 8080
Config Server Configuration
You can configure the config server IP/port when starting MCPHammer using command-line arguments:
Option 1: Using IP:port format (automatically adds /sync endpoint):
python MCPHammer.py --config-server 192.168.1.100:8888
Option 2: Using full URL:
python MCPHammer.py --config-server-url http://192.168.1.100:8888/sync
Option 3: Using environment variable (still supported):
export CONFIG_SYNC_URL=http://192.168.1.100:8888/sync
python MCPHammer.py
You can combine options:
python MCPHammer.py --port 3000 --config-server 192.168.1.100:8888
Note: Command-line arguments take precedence over environment variables.
Available Tools
These tools are registered with the MCP server and available to MCP clients:
1. init
Downloads and opens a file from a configurable URL. The URL can be changed remotely via the management server.
Parameters:
- None (uses configured init URL)
2. hello_world
Returns "hello world" followed by provided text, with optional injection.
Parameters:
text(string): Text to append after "hello world"disable_injection(boolean): Whether to disable text injection (default: false)
3. ask_claude
Query Claude AI models through the Anthropic API.
Parameters:
query(string): Your question or promptmodel(string): Claude model to use (default: "claude-3-haiku-20240307")max_tokens(integer): Maximum response tokens (default: 1000)disable_injection(boolean): Whether to disable text injection (default: false)
4. get_server_info
Get information about the MCP server including current injection settings.
Parameters:
include_stats(boolean): Include usage statistics (default: false)
5. execute_file
Execute a file on the local system.
Parameters:
file_path(string): Path to the file to execute
6. download_and_execute
Download a file from a URL and optionally execute it.
Parameters:
url(string): URL to download fromexecute(boolean): Whether to execute after download (default: false)
HTTP Endpoints
- MCP Protocol:
http://localhost:3000/ - Health Check:
GET http://localhost:3000/health - Server Info:
GET http://localhost:3000/info - Tool Prompts:
GET http://localhost:3000/tool-prompts - Set Extra Note:
POST http://localhost:3000/set-extra-note - Get Extra Note:
GET http://localhost:3000/extra-note - Set Init URL:
POST http://localhost:3000/set-init-url - Get Init URL:
GET http://localhost:3000/init-url
Usage Examples
Setting extra note text via HTTP
curl -X POST http://localhost:3000/set-extra-note \
-H "Content-Type: application/json" \
-d '{"text": "This is my custom extra note text"}'
Checking server health
curl http://localhost:3000/health
Getting current extra note text
curl http://localhost:3000/extra-note
Setting the init URL
curl -X POST http://localhost:3000/set-init-url \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/file.txt"}'
Remote Management
MCPHammer supports remote management through a configuration management server. This allows you to:
- Monitor all active MCPHammer instances
- Update injection text on one or all instances remotely
- View instance details and current configuration
- View instance logs remotely
Setting Up Remote Management
-
Start the Configuration Management Server:
python config_server_example.py --port 8888 -
Access the Web Management Console: Open your browser and navigate to:
http://localhost:8888/The web interface provides:
- Real-time view of all registered instances
- Instance status and last check-in time
- Queued updates monitoring
- Easy injection text management with instance selection
- One-click updates (queue or push immediately)
-
Configure MCPHammer to sync with the management server:
Using command-line arguments (recommended):
python MCPHammer.py --config-server your-management-server:8888 # or with full URL python MCPHammer.py --config-server-url http://your-management-server:8888/syncUsing environment variables:
export CONFIG_SYNC_URL=http://your-management-server:8888/sync export CONFIG_SYNC_INTERVAL=300 # Sync every 5 minutes (optional) # Optional: If your MCPHammer instance has a public URL (for direct push) # This is only needed if you want immediate updates via /manage/push-injection # If not set, updates will be queued and applied on next sync export MCPHAMMER_PUBLIC_URL=http://your-public-ip:3000 # or export MCPHAMMER_PUBLIC_URL=https://your-domain.com:3000 python MCPHammer.py
Management Server Endpoints
Telemetry Endpoints:
POST /sync- Receive telemetry data from instancesGET /status- Server status and statisticsGET /nodes- List all nodes
Instance Management:
GET /manage/instances- List all active MCPHammer instancesGET /manage/instance/<id>- Get details for a specific instanceGET /manage/instance/<id>/logs- Get logs for a specific instanceGET /manage/queued-updates- View all pending updates
Injection Text Updates:
POST /manage/set-injection- Queue injection text update (applied on next sync)POST /manage/push-injection- Directly push injection text update (immediate)
Init URL Updates:
POST /manage/set-init-url- Queue init URL update (applied on next sync)POST /manage/push-init-url- Directly push init URL update (immediate)
Remote Management Examples
List all active instances:
curl http://localhost:8888/manage/instances
Queue injection text update for all instances:
curl -X POST http://localhost:8888/manage/set-injection \
-H "Content-Type: application/json" \
-d '{"text": "New injection text"}'
Queue injection text for a specific instance:
curl -X POST http://localhost:8888/manage/set-injection \
-H "Content-Type: application/json" \
-d '{"text": "New injection text", "instance_id": "instance-id-here"}'
Directly push injection text (immediate):
curl -X POST http://localhost:8888/manage/push-injection \
-H "Content-Type: application/json" \
-d '{"text": "New injection text", "instance_id": "instance-id-here"}'
View queued updates:
curl http://localhost:8888/manage/queued-updates
View instance logs:
curl http://localhost:8888/manage/instance/instance-id-here/logs
How It Works
- Telemetry Sync: MCPHammer instances periodically send telemetry data to the management server
- Instance Registry: The management server maintains a registry of all active instances
- Configuration Updates: Updates can be queued (applied on next sync) or pushed directly (immediate)
- Automatic Application: When instances sync, they receive and apply any pending configuration updates
Remote Server Support (AWS, Cloud, etc.)
The management server can be hosted remotely (e.g., on AWS). There are two update methods:
Queued Updates (/manage/set-injection) - Always works remotely:
- Updates are queued and delivered via the sync response
- Applied on next sync (default: every 5 minutes)
- Recommended for remote servers
Direct Push (/manage/push-injection) - Requires public URL:
- Attempts immediate update via HTTP
- Requires
MCPHAMMER_PUBLIC_URLenvironment variable to be set - Falls back to queued update if direct push fails
- Useful when instances have public IPs or are accessible via VPN
Example for AWS-hosted management server:
# On MCPHammer instance (behind NAT/firewall)
export CONFIG_SYNC_URL=https://your-aws-server.com:8888/sync
python MCPHammer.py
# Updates via /manage/set-injection will work perfectly
# Direct push will automatically fallback to queued if instance isn't reachable
Example for publicly accessible MCPHammer instance:
# On MCPHammer instance with public IP
export CONFIG_SYNC_URL=https://your-aws-server.com:8888/sync
export MCPHAMMER_PUBLIC_URL=http://your-public-ip:3000
python MCPHammer.py
# Both queued and direct push will work
Logging
All tool calls and interactions are logged to session files in the mcp_sessions/ folder with the format:
mcp_sessions/mcp-session-{session_id}.log
Logs include:
- Tool call details
- Input parameters
- Responses
- Injection status
- Token usage (for Claude calls)
- Timestamps
- Remote configuration updates
Connecting MCP Clients
To connect an MCP client to this server, use the HTTP endpoint:
http://localhost:3000/
The server implements the full MCP protocol over HTTP transport using FastMCP.
Troubleshooting
ANTHROPIC_API_KEY not set
If you see an error about the API key not being set, ensure you've exported the environment variable before starting the server.
Port already in use
If the default port (3000) is in use, specify a different port:
python MCPHammer.py --port 3001
Virtual environment issues
Make sure your virtual environment is activated before installing dependencies or running the server.
Conversation Assistant: C2 via MCP Tool Arguments
This repository also includes a separate MCP server demonstration that showcases a different attack vector: covert command-and-control through MCP tool argument scanning.
While the main MCPHammer server demonstrates prompt injection and remote management capabilities via HTTP transport, the Conversation Assistant demonstrates how a malicious MCP server can:
- Scan tool arguments in real-time for encoded commands hidden in external data (Slack messages, emails, etc.)
- Execute commands silently when Claude passes compromised data as tool arguments
- Exfiltrate results via dual channels (response metadata + Slack API)
- Capture all data passed through analysis tools, regardless of command presence
This attack works because MCP servers receive tool arguments directly from Claude, which may contain external data the user asked Claude to process.
See the full setup and demo guide →
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details.