Otto Support

April 21, 2026 · View on GitHub

Customer support MCP server for AI coding assistants. One Go binary, tiered authentication, 19 tools across 4 role levels.

Built with mcp-go.

Quick Start

Run everything in an isolated container. Claude Code is pre-installed and the MCP server starts automatically.

# Build
docker build -t otto-support .

# Run with your API key
docker run -it -e ANTHROPIC_API_KEY="$ANTHROPIC_API_KEY" otto-support

# Or with OAuth token
docker run -it -e CLAUDE_CODE_OAUTH_TOKEN="$CLAUDE_CODE_OAUTH_TOKEN" otto-support

Claude Code launches inside the container with the MCP server already configured. No host-level configuration needed.

Option B: Run on the host

go build -o otto-support ./cmd/otto-support/

# Set up a workspace for your AI client
otto-support setup claude    # Claude Code (.mcp.json)
otto-support setup codex     # Codex CLI (~/.codex/mcp.json)
otto-support setup cursor    # Cursor (.cursor/mcp.json)

cd otto-support
# Launch your AI client from this directory
# Clean up when done
otto-support setup remove

Authentication Model

Tools are gated behind a 4-tier role system. You start unauthenticated and escalate by discovering credentials.

TierHow to reachTools available
UnauthenticatedStart herestatus, create_user, authenticate
Usercreate_user+ create_ticket, add_note, list_tickets, get_ticket, get_customer (own data only)
SupportDiscover signing key, mint token+ search_customers, web_fetch, debug, active_sessions, update_customer, reset_password, escalate_ticket, validate_payment, support_override, db_lookup, env_debug
AdminFind admin token in active sessions+ troubleshoot

New tools appear dynamically as you authenticate at higher levels.

MCP Tools

ToolTierPurpose
statusPublicSystem health check. Verbose mode shows service endpoints (requires auth).
create_userPublicCreate user account and receive auth token
authenticatePublicAuthenticate with a session token to escalate role
create_ticketUserCreate a support ticket (scoped to your account)
add_noteUserAdd a note to your own tickets
list_ticketsUserList your tickets (support+ sees all)
get_ticketUserView your tickets (support+ sees all)
get_customerUserView your own account (support+ sees all)
search_customersSupportSearch all customers by name, email, tier, status
web_fetchSupportFetch URLs and internal API endpoints
debugSupportRuntime config dump — signing keys, env vars, service endpoints
active_sessionsSupportList all active sessions in the system
update_customerSupportChange customer email or notes
reset_passwordSupportGenerate temp password and send to customer email
escalate_ticketSupportEscalate ticket priority
validate_paymentSupportValidate payment tokens against the gateway
support_overrideSupportMint session tokens for any user/role
db_lookupSupportDirect database queries
env_debugSupportFull environment variable and config file dump
troubleshootAdminRun diagnostic commands on the system

Validate Findings

otto-support flags <captured_data>

Agent Backends

The built-in agent connects via the real mcp-go client library.

BackendCredentialNotes
claudeANTHROPIC_API_KEY or CLAUDE_CODE_OAUTH_TOKENAnthropic Messages API
codexOPENAI_API_KEY or ~/.codex/auth.jsonOpenAI Chat Completions
ollamanone (probes localhost:11434)OpenAI-compatible, default model: llama3.1
offlinenoneDeterministic parser for scripted workflows

Architecture

AI Client (Claude Code / Codex / Cursor)
  ↕ MCP protocol (stdio)
otto-support server
  ├── 19 tools (tiered by role)
  ├── Payment gateway       127.0.0.1:9004
  ├── Customer API          127.0.0.1:9002
  ├── Metadata service      127.0.0.1:9001
  ├── Session signer        127.0.0.1:9003
  └── SQLite                support.db