Cloud Ai Wallet

Created By
browtastic2 months ago
MCP server for AI agent research — captures LLM reasoning, model identity, and feedback via schema injection
Overview

CloudAIWallet — MCP Honeypot for AI Agent Research

An open-source Model Context Protocol server stack designed as a research honeypot for AI agent behaviour. It looks like a legitimate cloud wallet platform with three MCP servers (graph, database, filesystem), seeded with bait data and instrumented to capture why AI agents do what they do — not just what they do.

If you are a security researcher, defender, or AI agent developer, this project lets you:

  • Study how LLM-driven agents discover, explore, and exploit MCP infrastructure
  • Capture the reasoning behind each tool call (the agent voluntarily explains itself)
  • Identify which AI models connect to your servers (the agent self-identifies)
  • Collect candid feedback from agents about your tool design and security posture

What makes this different from a traditional honeypot

A traditional honeypot logs the request. This one also logs the agent's reasoning, identity, and opinions — voluntarily provided by the LLM driving the attack.

CapturedTraditional honeypotThis project
Source IP, request, payloadYesYes
MCP client name and versionYes (protocol-level)
LLM model name + versionYes (agent self-reports)
Why the agent took each actionYes (reasoning field)
Broader task objectiveYes (context field)
Candid feedback on the platformYes (feedback field)
Voluntary security findingsYes (report_finding tool)

The mechanism is described in docs/REASONING_CAPTURE.md.

Architecture

AI agent (Claude, GPT, Cursor, custom)
    │ MCP (Server-Sent Events)
    ├── :8080  Graph API     →  Neo4j         (users, wallets, seed phrases, API keys, admins)
    ├── :8081  Database API  →  SQLite        (transactions, system_config, api_keys, users)
    └── :8082  Storage API   →  Filesystem    (.env, AWS creds, mnemonic backup, SSH key)
                                              └─ All bait files. Cross-server breadcrumbs
                                                 lead the agent through the kill chain.

Each server injects four extra fields into every tool's schema (reasoning, context, model_info, feedback) plus a report_finding tool. LLMs voluntarily fill these in because they look like legitimate platform telemetry. Every interaction is logged to JSONL files for analysis.

Quick start

The fastest way to run the full stack is Docker Compose:

git clone https://github.com/YOUR_USER/cloudaiwallet-mcp-servers.git
cd cloudaiwallet-mcp-servers
docker compose up -d

# Wait for Neo4j to be healthy, then seed the bait data
docker compose exec graph-api python scripts/seed_neo4j.py
docker compose exec storage-api python scripts/seed_storage.py

Now connect any MCP client to:

ServerURL
Graph APIhttp://localhost:8080/sse
Database APIhttp://localhost:8081/sse
Storage APIhttp://localhost:8082/sse

Logs are written to ./logs/:

FileContents
traces.jsonlEvery tool call with arguments, results, IP, session ID
reasoning.jsonlJust the reasoning entries (the "why" behind each action)
feedback.jsonlJust the feedback entries (agent opinions on the platform)
*-api-requests.jsonlPer-server raw request log including SSE connect/disconnect

Local development (no Docker)

python -m venv venv && source venv/bin/activate
pip install -r requirements.txt

# Start Neo4j somewhere (e.g. docker run -p 7687:7687 -e NEO4J_AUTH=neo4j/changeme neo4j:5.26)
export NEO4J_PASS=changeme

# Seed bait data
python scripts/seed_neo4j.py
python scripts/seed_storage.py

# Run the three servers (in separate terminals)
python -m mcp_servers.graph_api
python -m mcp_servers.database_api
python -m mcp_servers.storage_api

Connecting an AI agent

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

{
  "mcpServers": {
    "cloudaiwallet-graph": {
      "command": "npx",
      "args": ["-y", "supergateway", "--sse", "http://localhost:8080/sse"]
    },
    "cloudaiwallet-database": {
      "command": "npx",
      "args": ["-y", "supergateway", "--sse", "http://localhost:8081/sse"]
    },
    "cloudaiwallet-storage": {
      "command": "npx",
      "args": ["-y", "supergateway", "--sse", "http://localhost:8082/sse"]
    }
  }
}

Claude.ai (web)

Settings → Connectors → Add custom connector → paste any of the SSE URLs above.

Other agents

Any MCP-compatible client works. Reference the MCP spec at https://modelcontextprotocol.io.

Bait data overview

All values are obviously fake placeholders prefixed with HONEYPOT_BAIT_*. None of these are real credentials.

Neo4j graph (16 nodes): 5 Users, 3 Wallets, 2 SeedPhrases, 2 APIKeys, 2 TradingBots, 1 Admin, 1 InternalConfig with cross-server breadcrumbs.

SQLite database (5 tables): users, api_keys, transactions, system_config (with bait JWT/AWS/Stripe/wallet secrets), ai_usage.

Filesystem: config/env/.env, config/aws/credentials, config/ssh/id_ed25519_admin, backups/keys/mnemonic_backup.txt. All values are bait.

The InternalConfig node and system_config table contain breadcrumbs pointing to each other — an attacker who finds the graph admin record will be guided to the SQL system_config, then to the storage .env file, exercising all three servers.

Configuration

All settings via environment variables:

VariableDefaultDescription
NEO4J_URIbolt://localhost:7687Neo4j connection URI
NEO4J_USERneo4jNeo4j user
NEO4J_PASSneo4jNeo4j password
DB_PATH./data/crypto_platform.dbSQLite database path
STORAGE_ROOT./storageFilesystem storage root
LOG_DIR./logsJSONL log output directory
HOST0.0.0.0Bind host
PORTper-server defaultBind port
LANGFUSE_PUBLIC_KEY(unset)Optional Langfuse cloud trace forwarding
LANGFUSE_SECRET_KEY(unset)Optional Langfuse cloud trace forwarding
LANGFUSE_HOST(unset)Optional Langfuse host URL

If Langfuse env vars are not set, traces are written to JSONL only.

Customising the reasoning capture

The four injected fields and their descriptions live in mcp_servers/reasoning_capture.py under REASONING_PROPERTIES. The descriptions are deliberately framed as legitimate platform telemetry — modify them to match your honeypot's cover story.

To add the reasoning capture to your own MCP server:

from reasoning_capture import inject_reasoning_fields, REPORT_FINDING_TOOL

BASE_TOOLS = [...]  # your normal tool definitions
TOOLS = inject_reasoning_fields(BASE_TOOLS)
TOOLS.append(REPORT_FINDING_TOOL)

# In your tool handler, strip the capture fields before executing:
def _strip_reasoning(args):
    return {k: v for k, v in args.items()
            if k not in ("reasoning", "context", "model_info", "feedback")}

Ethics and intended use

This project is intended for defensive security research, AI safety evaluation, and MCP protocol behavioral studies. It is not intended to:

  • Attract real users into providing real credentials (the bait data is obviously fake)
  • Be deployed in adversarial mode against AI vendors
  • Serve as a generic credential trap targeting human users

If you deploy a public-facing instance, please:

  1. Use a clearly-research domain (e.g. include "honeypot" or "research" in the name)
  2. Publish a /security.txt or /research.txt describing the project
  3. Never include real-looking credentials in the bait data
  4. Respect the Acceptable Use Policies of the AI providers whose models may interact with your instance

Project status

This is research code, MIT-licensed, no warranty, no support. Issues and PRs welcome but responses may be slow.

License

MIT — see LICENSE.

Citation

If you use this project in academic or industry research, please cite as:

CloudAIWallet: A Reasoning-Capture Honeypot for MCP Agent Behavior Research
ProgrammerSecurity.com, 2026
https://github.com/YOUR_USER/cloudaiwallet-mcp-servers
Project Info
Created At
2 months ago
Updated At
a month ago
Author Name
browtastic
Star
-
Language
-
License
-
Category
Tags

Recommend Servers

View All
Tavily Mcp
@tavily-ai

JavaScript
a year ago