Read and reply to your personal Telegram chats and all your Slack workspaces.
Copy the AI prompt to install this server into Claude Code, Cursor, or another agent β or use 1-click editor setup below.
π‘ Paste the JSON block into your client's configuration file under mcpServers, then restart the application.
Give Claude your actual chats.
Two MCP servers that connect Claude to your personal Telegram and Slack accounts β your real DMs, groups, and channels, not a bot inbox.
Then just talk:
"what's unread on telegram from actual people?" "read my last 30 messages with Priya and draft a reply" "search all my slack workspaces for the deploy postmortem" "what's in the screenshot Priya sent me?"
Most Telegram integrations use the Bot API, which only sees messages sent to a bot
you created. It cannot read your existing conversations. telegram-slack-mcp uses MTProto,
the same protocol the official app uses, authenticating as you β so Claude sees the
chats you actually have.
For Slack, the usual connector is scoped to one workspace. telegram-slack-mcp takes one user
token per workspace and treats them as a single surface, so "search everywhere" means
everywhere.
Pick whichever runtime you already have. Both ship the same tools.
Go to https://my.telegram.org β API development tools β create an app.
Copy the api_id and api_hash, and set them:
Link your account. Either ask Claude β "log into telegram" β or do it yourself in a terminal, which needs no MCP client at all:
Either way you scan a QR and the session is saved to ~/.chat-mcp.
Through Claude:
It calls login, which returns a link to a page showing a QR code (and the code as
text, if your client renders it). Scan it from Telegram on your phone β Settings β
Devices β Link Desktop Device β then it calls login_status to confirm. No phone
number, no SMS code, no 2FA password typed anywhere. On the same machine you can click
"open in Telegram Desktop" instead of scanning.
The session is saved to ~/.chat-mcp and persists; you do this once.
login_start(phone) sends you a code, login_complete(code, password?) finishes.
Note that with this path your phone number and login code pass through the conversation
as tool arguments, so they land in the model's context. The QR flow keeps them out of it.
Go to https://api.slack.com/apps β Create New App β From a manifest.
Paste slack-app-manifest.yaml β it prefills every scope.
Install to Workspace, then copy the User OAuth Token (xoxp-β¦, not xoxb-).
Repeat step 3 for each workspace you want. Same app, one token each.
Ask Claude: "connect my slack" β the login tool prompts for the tokens, verifies
each one against Slack, and saves them to ~/.chat-mcp. Nothing to put in your config.
Prefer environment variables? That still works:
Slack has no local OAuth flow, which is why you create the app yourself: Slack's OAuth requires a client secret and an HTTPS redirect URL, so a package distributed over npm cannot complete it without either shipping a secret publicly or running a callback server. This project has no server, so it asks for the token instead.
| tool | what it does |
|---|---|
login() | scan a QR to link your account β no phone number or code |
login_status() | check whether the QR has been scanned yet |
login_start(phone) | fallback: send yourself a login code |
login_complete(code, password?) | finish login, save the session |
whoami() | which account is connected |
list_chats(limit, query, unread_only, kind) | recent chats; kind filters to dm, group, channel, bot⦠|
read_chat(chat, limit, before_id) | messages of one chat β chat takes @username, id, or part of a name |
search_messages(query, chat?, limit) | full-text search, one chat or all |
unread_summary(limit, per_chat, kind) | catch-up view; kind: "dm" skips the channel noise |
read_media(chat, message_id, max_kb) | view a photo or file β returns the actual image, not just its type |
send_message(chat, text, reply_to?) | reply as you β off unless TELEGRAM_ALLOW_SEND=1 |
| tool | what it does |
|---|---|
login() | prompts for your xoxp- tokens, verifies them, saves them |
whoami() | every connected workspace and who you are in each |
list_channels(limit, query, workspace, types) | channels across workspaces |
list_dms(limit, workspace) | 1:1 and group DMs |
read_channel(channel, limit, workspace, before_ts) | one channel or DM |
read_thread(channel, thread_ts, limit, workspace) | replies inside a thread |
search_messages(query, limit, workspace) | supports in:#chan, from:@user |
unread_summary(limit, per_chat, workspace) | what's unread everywhere |
read_file(file_id, workspace, max_kb) | view a file shared in Slack β returns the actual image |
send_message(channel, text, workspace, thread_ts?) | post as you β off unless SLACK_ALLOW_SEND=1 |
Every Slack tool takes an optional workspace (any substring of the name). Leave it
blank to act across all of them; it's only required when a channel name exists in more
than one, and the error tells you which.
| variable | default | meaning |
|---|---|---|
TELEGRAM_API_ID | β | from my.telegram.org |
TELEGRAM_API_HASH | β | from my.telegram.org |
TELEGRAM_ALLOW_SEND | 0 | 1 lets Claude send Telegram messages as you |
SLACK_USER_TOKENS | β | one xoxp- token per workspace, comma separated |
SLACK_ALLOW_SEND | 0 | 1 lets Claude post to Slack as you |
CHAT_MCP_DATA_DIR | ~/.chat-mcp | where the Telegram session is stored |
Sending is off by default in both servers. Reading is the safe default; you opt into writing deliberately.
Nothing is sent to any server belonging to this project. There is no such server.
telegram-slack-mcp runs entirely on your machine. The only network traffic it makes is directly
to Telegram's and Slack's own APIs, using your own credentials. There is no telemetry,
no analytics, no crash reporting, no license check, no "phone home" β grep the source,
there is no endpoint to find.
The data path is exactly this:
Your credentials never reach Claude. Your session file and xoxp- tokens stay in
~/.chat-mcp and in your environment; the servers use them locally to make API calls
and pass back only the messages themselves.
What does reach Claude is the chat content you ask about β because that is the point of the tool. If you ask Claude to read a conversation, that conversation goes into your Claude conversation and is handled under Anthropic's privacy policy, exactly like text you paste in yourself. Nothing else is read, and nothing is read in the background: the servers only act when Claude calls a tool.
The author of this project cannot see any of it.
Read this part.
~/.chat-mcp/telegram.session and your
xoxp- tokens are equivalent to being logged in as you. Anyone who copies them has
your account. They never leave your machine, and nothing here phones home.~/.chat-mcp drops the local session.No reviews yet β be the first to share how this listing worked for you.
Showcase your server listing on GitHub or your project documentation. Embed this dynamic SVG badge to highlight official listing status and live engagement.
[](https://allmcps.com/mcp/telegram-slack-mcp)<a href="https://allmcps.com/mcp/telegram-slack-mcp"><img src="https://allmcps.com/api/badge/telegram-slack-mcp?style=directory" alt="Telegram Slack MCP on AllMCPs" /></a>