service-business-tools MCP

Erster MCP unter dem neuen Modell (Service mit Brain + MCPs, siehe ADR keine-eigene-plattform). Generisch — funktioniert fuer Restaurant, Friseur, Werkstatt, Praxis, Hotel, weil alle dasselbe Datenmodell haben (Reservierungen + Bestellungen + Service-Katalog).

Tools

ToolZweckArgsStorage
book_reservationReservierung anlegendate, time, guests, name, phone, notes?SQLite reservations
take_orderTelefonbestellung aufnehmenitems, customer_name, phone, address?, pickup_time?SQLite orders
get_servicesService-Katalog abfragenstatisch (Mock)

Reservierungen und Bestellungen landen in einer lokalen SQLite-Datei (data/orders.db, gitignored). Pro Insert wird eine kurze ID generiert (RES-3F2A8C / ORD-52760E), die Bestaetigungs-Antwort an den Anrufer enthaelt die ID bewusst NICHT (vermeidet ID-Vorlesen durch den Voice-Bot). get_services ist noch Mock — kommt spaeter aus Markdown-KB pro Tenant.

Setup

cd intern/projekte/telefon-assistent-aws/tools-mcp
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env.local   # dann TELEGRAM_BOT_TOKEN ausfuellen

.env.local wird beim Server-Start automatisch via python-dotenv geladen.

Telegram-Push (Unit 1)

book_reservation und take_order triggern bei jedem erfolgreichen DB-Insert eine Telegram-Nachricht im Standardformat (siehe agents-platform):

[Aylem Voice · 19:45]
✓ Reservierung RES-3F2A8C — 4P am 2026-05-17 um 19:00 — Mueller — 0170...

Bot-Token von @BotFather oder aus av-production Secrets Manager:

aws secretsmanager get-secret-value \
  --secret-id agent-platform/telegram-bot-token \
  --profile av-production \
  --query SecretString --output text

Bei fehlendem Token loggt der Wrapper eine Warnung, Tool-Calls failen NICHT.

Run

Lokal als stdio-MCP (fuer Aylem-Worker)

source .venv/bin/activate
python server.py

Wird vom LiveKit-Worker als Subprocess gestartet — siehe ../livekit-agent/agent.py.

DB inspizieren

sqlite3 -header -column data/orders.db "SELECT id, date, time, guests, name, phone, notes FROM reservations ORDER BY created_at DESC LIMIT 20;"
sqlite3 -header -column data/orders.db "SELECT id, customer_name, phone, items_json, address, pickup_time, status FROM orders ORDER BY created_at DESC LIMIT 20;"

Pfad + Tenant ueberschreiben:

TOOLS_DB_PATH=/tmp/test.db TOOLS_TENANT=demo python server.py

Test mit MCP Inspector

npx @modelcontextprotocol/inspector python server.py

Browser-UI auf http://localhost:5173, dort kannst du die Tools manuell aufrufen.

Test mit Claude Code

In .mcp.json (Project-scope):

{
  "mcpServers": {
    "service-business-tools": {
      "command": "python",
      "args": ["/Users/marvinkuehlmann/source/agentic-ventures/intern/projekte/telefon-assistent-aws/tools-mcp/.venv/bin/python", "server.py"],
      "cwd": "/Users/marvinkuehlmann/source/agentic-ventures/intern/projekte/telefon-assistent-aws/tools-mcp"
    }
  }
}

Dann in Claude Code: „buch mir einen Tisch fuer 4 am Samstag um 19 Uhr” — der MCP nimmt’s an, gibt Bestaetigung zurueck.

Phase B Roadmap (nach Aylem-POC)

  • Lokale Persistenz fuer book_reservation + take_order (SQLite, Phase A)
  • Telegram-Push bei jedem DB-Insert (Unit 1, 2026-05-13)
  • Eskalations-Tool + escalations-Tabelle (Unit 5)
  • Markdown-Knowledge-Base + search_knowledge/get_menu/get_hours/get_allergens (Unit 2)
  • Verfuegbarkeits-Check (Unit 3)
  • Multi-Tenant: Stammdaten + Chat-ID + Tonalitaet aus knowledge/<tenant>/_meta.md (Unit 11)
  • DSGVO-Pre-Flight: AVV, Drittland, Retention, Loesch-CLI (Unit 12)
  • HTTP/SSE-Transport fuer hosted Production (Fargate in av-production)
  • DB-Backend swap-bar (Postgres in av-production, SQLite nur lokal)

Cross-Refs