Skip to main content
The bot supports Model Context Protocol (MCP) servers that extend Claude’s capabilities beyond basic file access and shell commands. Built-in MCP servers provide session control and user interaction, and you can add custom servers for Things, Notion, Typefully, and more.

Built-In MCP Servers

ask_user — Interactive Buttons

ask_user shows Telegram inline buttons in the active chat and pauses the turn so the user can pick an option. Tool input shape:
  • question is required
  • options is required
  • At least 2 options are required (schema allows up to 10; 2-6 is recommended)
IPC mechanism (how it works internally):
  1. MCP server writes /tmp/ask-user-<id>.json with status: "pending" and the current chat_id
  2. The streaming handler scans /tmp, sends ❓ <question> with inline buttons, then marks the request as sent
  3. When the user taps a button, callback handling loads the same request file, validates the selected index, and deletes the file
  4. The selected option text is injected as the user’s next message, and the model continues from that choice
Return text to Claude:
  • Success: [Buttons sent to user. STOP HERE - do not output any more text. Wait for user to tap a button.]
  • Invalid input: throws question and at least 2 options required
Example:

bot_control — Session Management

bot_control is the bot’s control-plane tool. It handles usage checks, model/driver switching, session management, and process restart. Tool input shape:
  • action is required
  • params is optional and depends on action
IPC mechanism (how it works internally):
  1. MCP server writes a pending request file to /tmp/bot-control-<id>.json
  2. The streaming handler scans /tmp, executes the action, then writes result back into the same file
  3. MCP server polls every 100ms, up to 10 seconds, and returns the result text to Claude
  4. Request files are deleted after completion/error (best-effort cleanup)
Action reference (quick table): Per-action details and examples:

usage

  • Params: none
  • Example call:
  • Return: USAGE DATA (show this to the user as-is, in a code block): ... or Failed to fetch usage data.

switch_model

  • Params:
    • model (optional): model ID or display name
    • effort (optional)
  • Effort values:
    • Claude driver: low, medium, high
    • Codex driver: minimal, low, medium, high, xhigh
  • Example call:
  • Return: current or updated model/effort summary, or an Unknown model... / Invalid effort... message

switch_driver

  • Params: driver required (claude or codex)
  • Example call:
  • Return:
    • Success: "Switched to Codex" or "Switched to Claude Code"
    • Validation: Invalid driver "...". Use: claude or codex
    • Availability failure: Cannot switch to Codex: ... if Codex is disabled/unavailable

new_session

  • Params: none

pino_logs — Pino Log Tail

pino_logs returns recent entries from the bot’s Pino log file with simple filters. Tool input shape:
  • level is the minimum severity (default: error)
  • levels (optional) is an exact list of levels like ["error","warn"] (overrides level)
  • limit controls how many entries to return (1-500)
  • module filters by module field (e.g., claude, streaming, bot)
IPC mechanism (how it works internally):
  1. MCP server writes /tmp/pino-logs-<id>.json with status: "pending" and the current chat_id
  2. The streaming handler scans /tmp, tails the log file, filters entries, and writes the result back
  3. MCP server polls every 100ms, up to 10 seconds, and returns the result text to Claude
Example calls:
  • Example call:
  • Return: "Session cleared. Next message will start a fresh session."

list_sessions

  • Params: none
  • Example call:
  • Return: numbered lines in the format "<index>. "<title>" (<date>) — ID: <prefix>..." or "No saved sessions."

resume_session

  • Params: session_id required (full ID or prefix)
  • Example call:
  • Return:
    • Success: Resumed: "<title>"
    • Errors: Missing session_id parameter., No session found matching "...", or Failed: ...

restart

  • Params: none
  • Example call:
  • Return: "Restarting bot..."

send_turtle — Emoji Kitchen Turtle Stickers

send_turtle sends a turtle mashup sticker to the current Telegram chat. It combines 🐢 with another emoji using Google’s Emoji Kitchen images. Tool input shape:
  • emoji is optional. It accepts either a Unicode emoji ("😍") or hex codepoint ("1f60d"). If omitted, it sends turtle + turtle.
  • caption is optional text.
What happens internally:
  1. MCP server resolves the emoji combo to a prebuilt Emoji Kitchen URL
  2. It writes /tmp/send-turtle-<id>.json
  3. The streaming handler sends the sticker to Telegram for the active chat
  4. If sticker upload fails, it falls back to sending the URL as a text message
Return text to Claude:
  • Success: [Turtle sticker sent to chat: 🐢 + <emoji>]
  • Missing combo: [No turtle combo found for emoji "..." (codepoint: ...). Try a different emoji ...]
Example:

Custom MCP Servers

Adding Your Own Tools

The bot loads MCP server definitions from mcp-config.ts. This file connects Claude to external tools like:
  • Things 3 — Your to-do manager
  • Notion — Your notes and databases
  • Typefully — Social media scheduling
  • Slack — Team communication
  • GitHub — Repository management
  • Stripe — Payment processing
  • Custom tools you create

Setup: Create mcp-config.ts

Copy the example:
Example configuration:
mcp-config.ts is gitignored — keep it local. Store secrets in environment variables, not in the file.

Server Configuration

Each MCP server config has: Example with all options:

Things 3 (macOS)

Todo management via natural language:
Setup:

Notion

Query and update Notion databases:
Setup:
Get your API key from Notion Settings → Integrations.

GitHub

Access repositories and pull requests:
Setup:

Slack

Send messages and query channels:

Secrets Management

Never commit secrets to git. Use environment variables:
Then reference them in mcp-config.ts:
Environment variables are passed to the MCP process but not logged or exposed. Keep sensitive values in .superturtle/.env only.

Troubleshooting

MCP server not connecting?
  1. Check the bot logs:
  2. Verify the command runs:
  3. Check environment variables are set:
Claude won’t use the tool?
  • Ensure mcp-config.ts exists (not just the example)
  • Restart the bot after editing mcp-config.ts
  • Ask Claude explicitly: “Use my Notion integration to…”
  • Check /status to see which MCP servers loaded
Tool is slow or timing out?
  • Increase the timeout in the config (default: 5000ms)
  • Check if the external service is responding
  • Look at service logs for errors

Examples

Personal Assistant Setup

Connect your entire workflow:
Now Claude can:
  • Check your to-dos (Things)
  • Query your notes (Notion)
  • Review PRs (GitHub)
  • Send team messages (Slack)
  • All from your phone

Workflow Example

Next Steps