Skip to main content
Glama
Beeper Texts MCP Server

Beeper Texts MCP Server

by tetmin

Beeper Texts MCP Server

A local-only MCP (Model Context Protocol) server tested on macOS that exposes Beeper Texts data (messages, contacts, chats) for use with AI assistants and automation tools. Local-only means the MCP accesses your local Beeper SQLite database only, and does not make or trigger any network requests.

Features

  • Chat Management: List and browse conversations across platforms

  • Message Access: Retrieve messages from specific chats

  • Search: Search messages by content, chat name, or by sender

  • Media Access: Fetch attachment bytes/paths via a URI returned in messages

  • Multi-Platform Support: Tested with WhatsApp, Telegram, Signal, Instagram, Twitter/X and LinkedIn. Should work with any Beeper-supported platform.

Related MCP server: imessage-mcp

Requirements

  • macOS only: This server relies on Beeper Desktop's local database structure only

  • Beeper Desktop: Must be installed, configured with at least one connected account and running to receive new messages

  • Python 3.10+: Required for running the server

Installation

Install from PyPI using pip or uvx:

pip install mcp-beeper-texts

Or use uvx for isolated execution:

uvx mcp-beeper-texts

Configuration

Claude Desktop

Add the following to your Claude Desktop configuration file (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "beeper": {
      "command": "uvx",
      "args": ["mcp-beeper-texts"]
    }
  }
}

Other MCP Clients

For other MCP clients, use the command:

uvx mcp-beeper-texts

The server communicates over stdio transport.

TODO

Add support for:

  • Creating, Editing, and Deleting drafts

  • Sending messages

  • Sending media attachments

Available Tools

list_chats

List group and DM chats with metadata.

  • label (optional): Filter set: inbox, archive, favourite, all, unread (default: inbox)

  • sort_by (optional): latest_message, last_active, or name (default: latest_message)

  • limit (optional): Max chats to return (default: 25)

  • recent_messages_limit (optional): Include last N messages per chat (default: 3, set 0 to disable)

  • max_participants (optional): Max participant names for groups (default: 5)

  • include_low_priority (optional): Include low priority in non-inbox views (default: false)

get_messages

Get chronologically ordered messages from a specific chat.

  • chat_id (required)

  • limit (optional): Default 50

  • before/after (optional): ISO-8601 timestamps to page

search_message_contents

Search message contents across chats with optional context.

  • query (required)

  • chat_id (optional): Limit to one chat

  • limit (optional): Default 25

  • include_context (optional): Include surrounding messages (default: true)

search_chat_names

Search chats by name/title with label filtering.

  • query (required)

  • label (optional): Default all

  • limit (optional): Default 25

get_person_messages

Get messages sent by a specific person across chats.

  • person_name (required)

  • limit (optional): Max per chat (default: 50)

  • platform (optional): Platform filter

  • chat_type (optional): dm, group, or all

  • days_back (optional): Only include messages from the last N days

  • include_context (optional): Include surrounding messages

get_media_attachment

Retrieve media attachment bytes/path by URI returned in Message.attachments.

  • attachment_uri (required): e.g., beeper://attachment/{message_id}/{attachment_index}

  • optimize_for_context (optional): For images, resize to ≤1568px for efficiency (default: true)

Development

Setup

  1. Clone the repository

  2. Install dependencies: uv sync

  3. Run tests: uv run pytest

  4. Format code: uv run ruff format .

  5. Lint code: uv run ruff check . --fix

Testing

Run the test suite:

uv run pytest tests/ -v

MCP Inspector

Use the MCP Inspector for development and testing:

uv run mcp dev src/mcp_beeper_texts/server.py

Claude Desktop

For Claude Desktop testing (or other local MCP clients), use this configuration in ~/Library/Application Support/Claude/claude_desktop_config.json:

{
  "mcpServers": {
    "Beeper": {
      "command": "/opt/homebrew/bin/uv",
      "args": [
        "run",
        "--dev",
        "--project",
        "/path/to/your/mcp-beeper-texts",
        "mcp-beeper-texts"
      ]
    }
  }
}

Replace /path/to/your/mcp-beeper-texts with the actual path to your local repository.

Hot-Reload Development

For faster development with automatic reloading when files change, you can use MCP Reloader:

# Install MCP Reloader (one-time setup)
git clone https://github.com/mizchi/mcp-reloader.git
cd mcp-reloader
npm install
npm run build

# Run with hot-reload (from your project directory)
npx mcp-reloader --command "uv run src/mcp_beeper_texts/server.py"

This automatically restarts the server when you modify any Python files, providing a faster development workflow.

Database Access

The server reads from Beeper's local SQLite databases located at:

~/Library/Application Support/BeeperTexts/

  • index.db: Beeper UI-optimized message and chat index and metadata

  • local-{platform}/megabridge.db: Platform-specific data and contacts

The server only requires read access for most operations, with write access eventually needed for draft management and message sending.

Troubleshooting

"Beeper directory not found"

Ensure Beeper Desktop is installed and has been run at least once. The application creates its data directory on first launch.

"Database not found"

Make sure Beeper Desktop is properly configured with at least one connected account. The databases are created when platforms are connected.

Permission errors

Ensure the server has read access to ~/Library/Application Support/BeeperTexts/. This should be automatic on macOS.

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome. Please follow these steps:

  1. Fork the repository

  2. Create a feature branch (git checkout -b feat/new-feature)

  3. Add functionality and tests if applicable

  4. Run the test suite (uv run pytest)

  5. Format and lint your code (uv run ruff format . && uv run ruff check . --fix)

  6. Commit, Push, and create a Pull Request

Changelog

0.0.1

  • Initial release

  • Basic chat, message, and contact management

  • Search functionality across all platforms

  • Basic test suite

Available Tools

6 tools
get_media_attachmentA

Retrieve media attachment content by URI from message attachments.

Args:
    attachment_uri: URI from Message.attachments (e.g., "beeper://attachment/{message_id}/{attachment_index}")
    optimize_for_context: For images, resize to ≤1568px max dimension for cost efficiency (default True)

Returns:
    For images: {"type": "image", "mime_type": "image/jpeg", "base64": "..."}
    For audio: {"type": "audio", "mime_type": "audio/mpeg", "base64": "..."}
    For files/videos: {"type": "file"|"video", "mime_type": "...", "filepath": "/path/to/file"}
    For errors: {"error": "description", "uri": "original_uri"}

Inputs: attachment_uri (required), optimize_for_context.

get_messagesA

Get chronologically orderedmessages from a specific chat with metadata and optional filtering.

Args:
    chat_id: ID of the chat/conversation
    limit: Maximum number of messages to return (default 50)
    before: Optional ISO-8601 timestamp to get messages before this date
    after: Optional ISO-8601 timestamp to get messages after this date

Returns:
    List of Message objects with metadata including platform, sender names, timestamps, reactions etc.

Inputs: chat_id (required), after, limit, before. Returns: result

get_person_messagesA

Get all messages sent by a specific person across all chats.

Args:
    person_name: Name of the person to search for
    limit: Maximum number of messages per chat (default 50)
    platform: Filter by platform ("WhatsApp", "Telegram", etc.)
    chat_type: Filter by chat type ("dm", "group", or "all")
    days_back: Only include messages from the last N days
    include_context: Include surrounding messages for context

Returns:
    List of ChatSearchResult objects, each containing a chat and the person's messages in that chat

Inputs: person_name (required), limit, platform, chat_type, +2 more. Returns: result

list_chatsA

List group and DM chats with metadata, filtering and sorting options.

Args:
    label: chat label/folder - "inbox", "archive", "all","favourite", "unread" (default "inbox")
    sort_by: Sort order - "latest_message", "last_active" or "name" (default "latest_message")
    limit: Maximum number of chats to return (default 25)
    recent_messages_limit: Number of recent messages to include per chat (default 3, set to 0 to disable)
    max_participants: Maximum number of participant names to list for group chats (default 5)
    include_low_priority: Whether to include low priority chats in archive/all views (default False)

Returns:
    List of Chat objects with metadata including platform, truncated recent
    messages for context, participants, timestamps etc.

Inputs: label, limit, sort_by, max_participants, +2 more. Returns: result

search_chat_namesA

Search for chats by name/title with filtering by label.

Args:
    query: Chat name or partial name to search for
    label: Filter results by chat type: 'inbox', 'archive', 'favourite', 'all' (default 'all')
    limit: Maximum number of results to return (default 25)

Returns:
    List of Chat objects matching the search criteria

Inputs: query (required), label, limit. Returns: result

search_message_contentsA

Search message contents across all chats with optional context and filtering.

Args:
    query: Text to search for across message contents
    chat_id: Optional chat ID to limit search to specific chat
    limit: Maximum number of results to return (default 25)
    include_context: Whether to include messages before and after matches (default True)

Returns:
    List of ChatSearchResult objects with message, chat info, and context

Inputs: query (required), limit, chat_id, include_context. Returns: result

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.9/5.0

    Scored across 6 tools

    Disambiguation4/5

    Tools are mostly distinct with clear purposes. Some overlap exists between search_message_contents and get_person_messages (both return messages), but their descriptions clarify different use cases (text query vs person name). Similarly, list_chats and search_chat_names have overlapping functionality but are distinguished by filtering vs name search.

    Naming Consistency5/5

    All tool names follow a consistent verb_noun pattern in snake_case (e.g., search_message_contents, list_chats, get_messages). The verbs are appropriately varied (search, list, get) and predictably used across the set.

    Tool Count5/5

    Six tools is well-scoped for a messaging server. Each tool fulfills a clear role: searching messages, listing chats, retrieving messages, searching chats, getting person messages, and fetching media attachments. No tool feels redundant or missing.

    Completeness2/5

    The tool set is entirely read-only, lacking any write operations like sending messages, creating chats, or muting conversations. This is a significant gap for a messaging server, as agents cannot perform basic actions beyond retrieval.

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      D
      maintenance
      Enables full-text search of macOS iMessages including link preview metadata. Works as an MCP server for Claude Desktop to search your messages locally.
      1
      MIT
    • F
      license
      A
      quality
      D
      maintenance
      A read-only MCP server that exposes your iMessage data to Claude Code and Claude Desktop, with automatic contact name resolution.
      3
      -
    • A
      license
      Not graded
      quality
      D
      maintenance
      Read-only MCP server for local macOS Messages database, enabling querying of chats, messages, attachments, and metadata.
      698 npm
      MIT