Beeper Texts MCP Server
Allows retrieving messages, chats, and contacts from Instagram via Beeper's local database, including search and media access.
Allows retrieving messages, chats, and contacts from Signal via Beeper's local database, including search and media access.
Allows retrieving messages, chats, and contacts from Telegram via Beeper's local database, including search and media access.
Allows retrieving messages, chats, and contacts from WhatsApp via Beeper's local database, including search and media access.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Beeper Texts MCP Server list my recent unread messages"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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-textsOr use uvx for isolated execution:
uvx mcp-beeper-textsConfiguration
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-textsThe 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, orname(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 50before/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 chatlimit(optional): Default 25include_context(optional): Include surrounding messages (default: true)
search_chat_names
Search chats by name/title with label filtering.
query(required)label(optional): Defaultalllimit(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 filterchat_type(optional):dm,group, oralldays_back(optional): Only include messages from the last N daysinclude_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
Clone the repository
Install dependencies:
uv syncRun tests:
uv run pytestFormat code:
uv run ruff format .Lint code:
uv run ruff check . --fix
Testing
Run the test suite:
uv run pytest tests/ -vMCP Inspector
Use the MCP Inspector for development and testing:
uv run mcp dev src/mcp_beeper_texts/server.pyClaude 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 metadatalocal-{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:
Fork the repository
Create a feature branch (
git checkout -b feat/new-feature)Add functionality and tests if applicable
Run the test suite (
uv run pytest)Format and lint your code (
uv run ruff format . && uv run ruff check . --fix)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 toolsget_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
Scored across 6 tools
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.
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.
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.
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
MCP connector for iMessage & Contacts via a local Mac agent + Vercel relay
Bot-free macOS Zoom/Meet/Teams call transcripts, Apple Vision screen OCR, and live SQLite MCP.
MCP server for SuperPhone — contacts, conversations, tags and consent-based text messages.
An MCP server for search and retrieval over a local LanceDB database
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables full-text search of macOS iMessages including link preview metadata. Works as an MCP server for Claude Desktop to search your messages locally.1MIT
- FlicenseAqualityDmaintenanceA read-only MCP server that exposes your iMessage data to Claude Code and Claude Desktop, with automatic contact name resolution.3-
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server for your iMessage DB. No hosted service.MIT
- AlicenseNot gradedqualityDmaintenanceRead-only MCP server for local macOS Messages database, enabling querying of chats, messages, attachments, and metadata.698 npmMIT