telegram-api-mcp
Provides comprehensive access to the Telegram Bot API (185 methods, full Bot API 10.2 coverage) through a single MCP server — sending and editing messages, rich long-form posts with markdown/HTML/blocks and inline media, media and album uploads, polls, forum topics, stickers, payments and invoices, gifts, stories, business account tools, inline/callback queries, invite links, member administration, games, and webhook/update management. Includes schema reference tools so agents can look up rich_message/media/reply_markup syntax before sending, plus rate limiting, retries, circuit breaking, and Zod validation.
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., "@telegram-api-mcp send 'Deploy complete!' to chat -1001234567890"
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.
telegram-mcp-worker
Ultimate MCP server for Telegram Bot API — 185 methods, full v10.2 coverage, rich messages, meta-mode, rate limiting, circuit breaker — running on Cloudflare Workers.
185/185 Bot API methods with Zod validation, token masking, tool annotations, and zero bloat (2 dependencies) — 190 MCP tools in total, served over stateless Streamable HTTP. The same Worker also receives bot updates through a built-in webhook endpoint, so one deployment covers both sending and receiving.
Live deployment: https://telegram-mcp-worker.dawod.workers.dev
Endpoint | Method | Purpose |
| GET | Plain-text status check |
| POST | MCP endpoint (Streamable HTTP, stateless) |
| POST | Telegram webhook receiver for bot updates |
| GET | Webhook endpoint status check |
What this fork adds
Worker entry point (
src/worker.ts) — the original MCP server served over Streamable HTTP on Cloudflare Workers, a fresh server per request.Webhook receiver (
POST /webhook) — acknowledges updates and writes them to the Worker log (Cloudflare observability /wrangler tail), optionally verified with Telegram's secret-token header.Token auth for
/mcp— whenMCP_AUTH_TOKENis set, clients must send the token in any form their connector supports:Authorization: Bearer <MCP_AUTH_TOKEN>,x-api-key: <MCP_AUTH_TOKEN>,api-key: <MCP_AUTH_TOKEN>or?token=<MCP_AUTH_TOKEN>in the URL (same token, four options; headers preferred — URLs get logged).GitHub-connected deployment — pushes to
maindeploy automatically from the Cloudflare dashboard.
Everything else — the tool registry with Zod validation, rate limiting,
circuit breaker, retry with backoff, token masking, meta-mode and the
telegram_format helper — is inherited from the original project (see the
fork notice at the end).
Related MCP server: telegram-api-mcp
Connect an MCP client
Point any MCP client at the hosted endpoint:
{
"mcpServers": {
"telegram": {
"url": "https://telegram-mcp-worker.dawod.workers.dev/mcp",
"headers": {
"Authorization": "Bearer <your MCP_AUTH_TOKEN>"
}
}
}
}Claude plugin
This repo is also a Claude plugin (and its own plugin marketplace). In Claude Code:
/plugin marketplace add EngDawood/telegram-mcp-worker
/plugin install telegram-mcp-worker@telegram-mcp-workerThe plugin registers the hosted MCP server from .mcp.json. Export your
token first so Claude can expand it:
export MCP_AUTH_TOKEN=<your MCP_AUTH_TOKEN>To deploy and use your own Worker instead, change the url in .mcp.json
to your deployment.
The plugin also ships a skill at
skills/telegram-mcp-worker/SKILL.md
(linked from .claude/skills/), which teaches the agent the working rules
above: verify with get_me, ask telegram_format before complex payloads,
and work within the Worker limits.
Deploy your own
Option A — Cloudflare dashboard (GitHub-connected)
Fork or clone this repo to your GitHub account.
In the Cloudflare dashboard: Workers & Pages → Create → Import a repository and pick the repo. Pushes to
mainnow deploy automatically.Add the secrets below under Settings → Variables and Secrets.
Option B — Wrangler
npm install
npx wrangler secret put TELEGRAM_BOT_TOKEN # from @BotFather
npx wrangler secret put MCP_AUTH_TOKEN # bearer token for /mcp
npx wrangler secret put WEBHOOK_SECRET # webhook verification token
npm run worker:deploySecrets
Secret | Required | Purpose |
| Yes | Bot token from @BotFather |
| Recommended | Token clients must send to |
| Optional | When set, |
Optional plain variables (TELEGRAM_DEFAULT_CHAT_ID,
TELEGRAM_DEFAULT_THREAD_ID, TELEGRAM_META_MODE and the tuning knobs) are
documented in src/config.ts.
Webhook
Register the webhook through the MCP server itself by calling the
set_webhook tool:
{
"url": "https://<your-worker>.workers.dev/webhook",
"secret_token": "<same value as the WEBHOOK_SECRET secret>",
"allowed_updates": ["message", "edited_message", "channel_post", "edited_channel_post", "callback_query", "inline_query"]
}Notes:
While a webhook is registered, Telegram rejects
get_updatescalls. Run thedelete_webhooktool to go back to polling.get_webhook_infoshows the registered URL, pending update count and the last delivery error, if any.The receiver currently logs updates; it does not reply to messages.
Local development
npm install
npm run worker:dev # wrangler dev — Worker build on localhost
npm run build # tsc — also builds the original stdio server
npm test # vitest
npm run typecheckCreate a .dev.vars file (git-ignored) with the same secret names for
local runs.
The original stdio build is unchanged and still available:
npm run build && npm startFrom source
The original stdio build still runs locally from source:
git clone https://github.com/EngDawood/telegram-mcp-worker.git
cd telegram-mcp-worker
npm install
npm run build
TELEGRAM_BOT_TOKEN=<your bot token> npm startTo run the Worker build locally from the same checkout instead:
npm run worker:devPut the secrets in a .dev.vars file first (see Local development above).
Limitations on Workers
Features of the original Node build that rely on a local filesystem return errors on Workers:
Uploading files from local paths (sending by
file_id, URL or bytes works as before)download_fileThe TRAIL log tools
Mirroring URL media to disk
Architecture
MCP client ──POST /mcp (Bearer)──▶ Worker ──fetch──▶ api.telegram.org
Telegram ──POST /webhook───────▶ Worker ──▶ update written to Worker logStateless per request. Each
POST /mcpbuilds a fresh MCP server on a web-standard Streamable HTTP transport with JSON responses. No session state is kept between requests, which is what makes the design fit Workers.One server builder, two transports.
buildServer(config)insrc/mcp/server.tsassembles the MCP server and the Telegram client from the configuration; the Worker entry (src/worker.ts) and the original stdio entry (src/index.ts) both use it unchanged.Declarative tool registry. All 185 Bot API methods are defined as data — name, Bot API endpoint, Zod input schema — and served by one generic handler, alongside the
telegram_formathelper,download_fileand the TRAIL tools. WithTELEGRAM_META_MODE=truethe registry collapses into two meta-tools (telegram_find/telegram_call).Telegram client. A plain
fetch-based Bot API client (src/telegram/telegram-client.ts) with global and per-chat rate limiting, a circuit breaker and retry with backoff. It also masks the bot token in every response and error.Configuration.
loadConfiginsrc/core/config.tsmaps the Worker's secrets/vars (or environment variables in the stdio build) into one validated config object.Webhook path.
POST /webhookverifies the secret-token header whenWEBHOOK_SECRETis set, writes the update JSON to the Worker log and acknowledges immediately with{"ok": true}.
Path | What it is |
| Cloudflare Worker entry: |
| MCP server: |
|
|
|
|
| TRAIL protocol: |
| Original stdio entry point |
| Environment/secrets loading and tuning knobs |
| Documentation: |
License
MIT — see LICENSE.
Acknowledgments
This project is a fork of
timoncool/telegram-api-mcp
(based on commit 34af6ba), and it would not exist without the original
author's work. All credit for the original MCP server — the tool registry
covering the full Telegram Bot API and the stdio build — goes to
@timoncool. Thank you for building it and
for releasing it under the MIT license, which is preserved in
LICENSE. This fork only adds the Cloudflare Worker conversion
(src/worker.ts), the /webhook receiver, and the deployment setup used
to run it at telegram-mcp-worker.dawod.workers.dev.
This fork (
telegram-mcp-worker) converts the server below to a Cloudflare Worker: the same 185 Bot API tools served over stateless Streamable HTTP atPOST /mcp(src/worker.ts). Based on timoncool/telegram-api-mcp @34af6ba(MIT — see LICENSE).
Available Tools
190 toolsadd_sticker_to_setCIdempotent
Add a sticker to an existing set.
Inputs: name (required), user_id (required), sticker.
answer_callback_queryB
Answer a callback query from an inline keyboard button.
Inputs: callback_query_id (required), url, text, cache_time, +1 more.
answer_chat_join_request_queryCIdempotent
Process a received chat join request query (v10.1). Used by guard bots that vet join requests.
Inputs: result (required), chat_join_request_query_id (required).
answer_guest_queryB
Reply to a received guest message (v10.0). Guest mode lets users message the bot without starting a chat.
Inputs: guest_query_id (required), result.
answer_inline_queryB
Send answers to an inline query. Max 50 results per query.
Inputs: inline_query_id (required), button, results, cache_time, +2 more.
answer_pre_checkout_queryA
Respond to pre-checkout queries. Must answer within 10 seconds.
Inputs: ok (required), pre_checkout_query_id (required), error_message.
answer_shipping_queryC
Reply to shipping queries. Called if sendInvoice used is_flexible.
Inputs: ok (required), shipping_query_id (required), error_message, shipping_options.
answer_web_app_queryA
Set the result of an interaction with a Web App and send a message on behalf of the user.
Inputs: web_app_query_id (required), result.
approve_chat_join_requestAIdempotent
Approve a chat join request.
Inputs: chat_id (required), user_id (required).
approve_suggested_postCIdempotent
Approve a suggested post in a direct messages chat (v9.2).
Inputs: chat_id (required), message_id (required), send_date.
ban_chat_memberADestructive
Ban a user from a chat. In supergroups/channels, the user cannot return without being unbanned.
Inputs: chat_id (required), user_id (required), until_date, revoke_messages.
ban_chat_sender_chatADestructive
Ban a channel chat from sending messages in a supergroup.
Inputs: chat_id (required), sender_chat_id (required).
closeAIdempotent
Close the bot instance. Use before moving between local servers.
Inputs: no named parameters.
close_forum_topicAIdempotent
Close an open topic in a forum supergroup.
Inputs: chat_id (required), message_thread_id (required).
close_general_forum_topicCIdempotent
Close the 'General' topic.
Inputs: chat_id (required).
convert_gift_to_starsCIdempotent
Convert a gift to Telegram Stars (v9.0).
Inputs: owned_gift_id (required), business_connection_id (required).
copy_messageB
Copy a message (sends without 'Forwarded from' header). Can change caption.
Inputs: chat_id (required), message_id (required), from_chat_id (required), caption, +13 more.
copy_messagesC
Copy multiple messages at once.
Inputs: chat_id (required), message_ids (required), from_chat_id (required), remove_caption, +4 more.
create_chat_invite_linkC
Create an additional invite link.
Inputs: chat_id (required), name, expire_date, member_limit, +1 more.
create_chat_subscription_invite_linkA
Create a subscription invite link for a channel chat.
Inputs: chat_id (required), subscription_price (required), subscription_period (required), name.
create_forum_topicA
Create a topic in a forum supergroup or private chat (v9.4+).
Inputs: name (required), chat_id (required), icon_color, icon_custom_emoji_id.
create_invoice_linkC
Create a link for an invoice.
Inputs: title (required), payload (required), currency (required), description (required), +18 more.
create_new_sticker_setC
Create a new sticker set owned by a user.
Inputs: name (required), title (required), user_id (required), stickers, +2 more.
decline_chat_join_requestBIdempotent
Decline a chat join request.
Inputs: chat_id (required), user_id (required).
decline_suggested_postCIdempotent
Decline a suggested post in a direct messages chat (v9.2).
Inputs: chat_id (required), message_id (required), comment.
delete_all_message_reactionsADestructive
Remove up to 10000 recent reactions added by a given user or chat in a group or supergroup (Bot API 10.0). Requires the can_delete_messages admin right.
Inputs: chat_id (required), user_id, actor_chat_id.
delete_business_messagesBDestructive
Delete business messages.
Inputs: message_ids (required), business_connection_id (required).
delete_chat_photoADestructive
Delete a chat photo.
Inputs: chat_id (required).
delete_chat_sticker_setADestructive
Delete the sticker set from a supergroup.
Inputs: chat_id (required).
delete_ephemeral_messageADestructive
Delete an ephemeral message (Bot API 10.2). Delivery of the deletion is not guaranteed if the user is offline.
Inputs: chat_id (required), receiver_user_id (required), ephemeral_message_id (required).
delete_forum_topicADestructive
Delete a forum topic along with all its messages.
Inputs: chat_id (required), message_thread_id (required).
delete_messageADestructive
Delete a message. Bot must have delete rights in the chat.
Inputs: chat_id (required), message_id (required).
delete_message_reactionBDestructive
Remove a reaction from a message in a group or supergroup (Bot API 10.0). Requires the can_delete_messages admin right.
Inputs: chat_id (required), message_id (required), user_id, actor_chat_id.
delete_messagesADestructive
Delete multiple messages at once. Max 100 messages.
Inputs: chat_id (required), message_ids (required).
delete_my_commandsBDestructive
Delete the bot's command list for a given scope and language.
Inputs: scope, language_code.
delete_sticker_from_setCDestructive
Delete a sticker from a set.
Inputs: sticker (required).
delete_sticker_setADestructive
Delete a sticker set created by the bot.
Inputs: name (required).
delete_storyCDestructive
Delete a story (v9.0).
Inputs: story_id (required), business_connection_id (required).
delete_webhookADestructive
Remove webhook integration and switch back to getUpdates.
Inputs: drop_pending_updates.
download_fileAIdempotent
Download a file from Telegram by file_id. Saves locally and returns the path. Use after receiving a message with a photo, video, document, voice, etc. Max 20MB (Telegram Bot API limit).
Inputs: file_id (required), dest_dir.
edit_chat_invite_linkBIdempotent
Edit a non-primary invite link.
Inputs: chat_id (required), invite_link (required), name, expire_date, +2 more.
edit_chat_subscription_invite_linkCIdempotent
Edit a subscription invite link.
Inputs: chat_id (required), invite_link (required), name.
edit_ephemeral_message_captionCIdempotent
Edit the caption of an ephemeral media message (Bot API 10.2).
Inputs: chat_id (required), receiver_user_id (required), ephemeral_message_id (required), caption, +3 more.
edit_ephemeral_message_mediaCIdempotent
Edit the media of an ephemeral message (Bot API 10.2).
Inputs: chat_id (required), receiver_user_id (required), ephemeral_message_id (required), media, +1 more.
edit_ephemeral_message_reply_markupCIdempotent
Edit the inline keyboard of an ephemeral message (Bot API 10.2).
Inputs: chat_id (required), receiver_user_id (required), ephemeral_message_id (required), reply_markup.
edit_ephemeral_message_textAIdempotent
Edit the text of an ephemeral message (Bot API 10.2). Delivery of the edit is not guaranteed if the user is offline.
Inputs: text (required), chat_id (required), receiver_user_id (required), ephemeral_message_id (required), +4 more.
edit_forum_topicAIdempotent
Edit name and icon of a forum topic.
Inputs: chat_id (required), message_thread_id (required), name, icon_custom_emoji_id.
edit_general_forum_topicAIdempotent
Edit the name of the 'General' forum topic.
Inputs: name (required), chat_id (required).
edit_message_captionCIdempotent
Edit the caption of a media message.
Inputs: caption, chat_id, message_id, parse_mode, +5 more.
edit_message_checklistCIdempotent
Edit a checklist message. Requires a business connection.
Inputs: chat_id (required), message_id (required), business_connection_id (required), checklist, +1 more.
edit_message_live_locationCIdempotent
Edit a live location message.
Inputs: latitude (required), longitude (required), chat_id, heading, +7 more.
edit_message_mediaBIdempotent
Edit the media content of a message (photo, video, animation, document, audio).
Inputs: media, chat_id, message_id, reply_markup, +2 more.
edit_message_reply_markupCIdempotent
Edit the inline keyboard of a message.
Inputs: chat_id, message_id, reply_markup, inline_message_id, +1 more.
edit_message_textBIdempotent
Edit the text of a message sent by the bot or via inline mode. Pass either text or rich_message.
Inputs: text, chat_id, entities, message_id, +6 more.
edit_storyCIdempotent
Edit a posted story (v9.0).
Inputs: story_id (required), business_connection_id (required), areas, caption, +3 more.
edit_user_star_subscriptionCIdempotent
Edit a user's Star subscription (cancel or extend).
Inputs: user_id (required), is_canceled (required), telegram_payment_charge_id (required).
export_chat_invite_linkADestructive
Generate a new primary invite link (revokes previous one).
Inputs: chat_id (required).
forward_messageC
Forward a message from one chat to another.
Inputs: chat_id (required), message_id (required), from_chat_id (required), protect_content, +6 more.
forward_messagesC
Forward multiple messages at once (maintains album grouping).
Inputs: chat_id (required), message_ids (required), from_chat_id (required), protect_content, +3 more.
get_available_giftsARead-onlyIdempotent
Get the list of gifts that can be sent.
Inputs: no named parameters.
get_business_account_giftsCRead-onlyIdempotent
Get gifts owned by a business account.
Inputs: business_connection_id (required), limit, offset, exclude_saved, +7 more.
get_business_account_star_balanceARead-onlyIdempotent
Get the Telegram Stars balance of a business account.
Inputs: business_connection_id (required).
get_business_connectionCRead-onlyIdempotent
Get information about a business connection.
Inputs: business_connection_id (required).
get_chatARead-onlyIdempotent
Get full information about a chat (title, description, photo, member count, permissions, etc).
Inputs: chat_id (required).
get_chat_administratorsBRead-onlyIdempotent
Get a list of administrators in a chat.
Inputs: chat_id (required), return_bots.
get_chat_giftsCRead-onlyIdempotent
Get the gifts owned and hosted by a chat (v9.3).
Inputs: chat_id (required), limit, offset, exclude_saved, +7 more.
get_chat_memberBRead-onlyIdempotent
Get information about a member in a chat.
Inputs: chat_id (required), user_id (required).
get_chat_member_countARead-onlyIdempotent
Get the number of members in a chat.
Inputs: chat_id (required).
get_custom_emoji_stickersARead-onlyIdempotent
Get information about custom emoji stickers by their identifiers.
Inputs: custom_emoji_ids (required).
get_fileARead-onlyIdempotent
Get file info for downloading. Returns file_path — use https://api.telegram.org/file/bot/<file_path> to download.
Inputs: file_id (required).
get_forum_topic_icon_stickersARead-onlyIdempotent
Get custom emoji stickers that can be used as forum topic icons.
Inputs: no named parameters.
get_game_high_scoresCRead-onlyIdempotent
Get high scores for a game.
Inputs: user_id (required), chat_id, message_id, inline_message_id.
get_managed_bot_access_settingsARead-onlyIdempotent
Get the access settings of a managed bot (v10.0).
Inputs: user_id (required).
get_managed_bot_tokenARead-onlyIdempotent
Get the token of a managed bot (v9.6).
Inputs: user_id (required).
get_meARead-onlyIdempotent
Get basic information about the bot (id, name, username, etc).
Inputs: no named parameters.
get_my_commandsARead-onlyIdempotent
Get the bot's current command list.
Inputs: scope, language_code.
get_my_default_administrator_rightsBRead-onlyIdempotent
Get default admin rights.
Inputs: for_channels.
get_my_descriptionBRead-onlyIdempotent
Get the bot's description.
Inputs: language_code.
get_my_nameARead-onlyIdempotent
Get the bot's name for a given language.
Inputs: language_code.
get_my_short_descriptionBRead-onlyIdempotent
Get the bot's short description.
Inputs: language_code.
get_my_star_balanceARead-onlyIdempotent
Get the bot's Telegram Stars balance (v9.1).
Inputs: no named parameters.
get_star_transactionsCRead-onlyIdempotent
Get the bot's Telegram Star transactions.
Inputs: limit, offset.
get_sticker_setARead-onlyIdempotent
Get a sticker set by name.
Inputs: name (required).
get_trailARead-onlyIdempotent
Query the TRAIL content log. Check what content was posted, failed, or skipped across pipelines.
Inputs: limit, since, action, offset, +3 more.
get_trail_statsARead-onlyIdempotent
Get summary statistics from the TRAIL content log.
Inputs: since, requester.
get_updatesARead-onlyIdempotent
Receive incoming updates via long polling.
Inputs: limit, offset, timeout, allowed_updates.
get_user_chat_boostsARead-onlyIdempotent
Get a user's boosts in a chat.
Inputs: chat_id (required), user_id (required).
get_user_giftsCRead-onlyIdempotent
Get the gifts owned and hosted by a user (v9.3).
Inputs: user_id (required), limit, offset, sort_by_price, +5 more.
get_user_personal_chat_messagesBRead-onlyIdempotent
Get the last messages from the personal chat a user has added to their profile (v10.0).
Inputs: limit (required), user_id (required).
get_user_profile_audiosBRead-onlyIdempotent
Get a user's profile audio tracks (v9.4).
Inputs: user_id (required), limit, offset.
get_user_profile_photosCRead-onlyIdempotent
Get a user's profile photos.
Inputs: user_id (required), limit, offset.
get_webhook_infoARead-onlyIdempotent
Get current webhook status.
Inputs: no named parameters.
hide_general_forum_topicBIdempotent
Hide the 'General' topic.
Inputs: chat_id (required).
leave_chatADestructive
Bot leaves a group, supergroup, or channel.
Inputs: chat_id (required).
log_outAIdempotent
Log out from the cloud Bot API server. Use before moving to a local server.
Inputs: no named parameters.
mark_trailA
Write an entry to the TRAIL content log. Use to explicitly record content actions.
Inputs: action (required), requester (required), content_id (required), tags, +2 more.
pin_chat_messageCIdempotent
Pin a message in a chat.
Inputs: chat_id (required), message_id (required), disable_notification, business_connection_id.
post_storyC
Post a story on behalf of a business account (v9.0).
Inputs: active_period (required), business_connection_id (required), areas, caption, +5 more.
promote_chat_memberBIdempotent
Promote or demote a user in a supergroup or channel.
Inputs: chat_id (required), user_id (required), is_anonymous, can_change_info, +15 more.
read_business_messageCIdempotent
Mark a business message as read.
Inputs: chat_id (required), message_id (required), business_connection_id (required).
refund_star_paymentCIdempotent
Refund a Telegram Star payment.
Inputs: user_id (required), telegram_payment_charge_id (required).
remove_business_account_profile_photoCIdempotent
Remove a business account profile photo.
Inputs: business_connection_id (required), is_public.
remove_chat_verificationBIdempotent
Remove chat verification.
Inputs: chat_id (required).
remove_my_profile_photoBIdempotent
Remove the bot's profile photo (v9.4).
Inputs: no named parameters.
remove_user_verificationBIdempotent
Remove user verification.
Inputs: user_id (required).
reopen_forum_topicBIdempotent
Reopen a closed topic.
Inputs: chat_id (required), message_thread_id (required).
reopen_general_forum_topicAIdempotent
Reopen the 'General' topic.
Inputs: chat_id (required).
replace_managed_bot_tokenAIdempotent
Replace the token of a managed bot (v9.6).
Inputs: user_id (required).
replace_sticker_in_setBIdempotent
Replace an existing sticker in a set with a new one.
Inputs: name (required), user_id (required), old_sticker (required), sticker.
repost_storyC
Repost a story on behalf of a managed business account (v9.3).
Inputs: from_chat_id (required), active_period (required), from_story_id (required), business_connection_id (required), +2 more.
restrict_chat_memberBIdempotent
Restrict a user's permissions in a supergroup.
Inputs: chat_id (required), user_id (required), until_date, permissions, +1 more.
revoke_chat_invite_linkCDestructive
Revoke an invite link.
Inputs: chat_id (required), invite_link (required).
save_prepared_inline_messageBIdempotent
Save a prepared inline message result for a user to send via inline button.
Inputs: user_id (required), result, allow_bot_chats, allow_user_chats, +2 more.
save_prepared_keyboard_buttonBIdempotent
Save a prepared keyboard button for later use (v9.6).
Inputs: user_id (required), button.
send_animationC
Send an animation (GIF or H.264/MPEG-4 AVC video without sound).
Inputs: chat_id (required), animation (required), width, height, +19 more.
send_audioC
Send an audio file. Telegram clients display it in the music player.
Inputs: audio (required), chat_id (required), title, caption, +17 more.
send_chat_actionB
Tell the user that the bot is performing an action (typing, uploading, etc).
Inputs: action (required), chat_id (required), message_thread_id, business_connection_id.
send_chat_join_request_web_appA
Show a Mini App to a user before deciding a join request (v10.1). Resolve the request afterwards with answer_chat_join_request_query.
Inputs: web_app_url (required), chat_join_request_query_id (required).
send_checklistC
Send an interactive checklist. Requires a business connection.
Inputs: chat_id (required), business_connection_id (required), checklist, reply_markup, +4 more.
send_contactC
Send a phone contact.
Inputs: chat_id (required), first_name (required), phone_number (required), vcard, +13 more.
send_diceC
Send an animated emoji that displays a random value.
Inputs: chat_id (required), emoji, reply_markup, protect_content, +8 more.
send_documentC
Send a general file (document).
Inputs: chat_id (required), document (required), caption, thumbnail, +15 more.
send_gameD
Send a game.
Inputs: chat_id (required), game_short_name (required), reply_markup, protect_content, +6 more.
send_giftC
Send a gift to a user or channel chat.
Inputs: gift_id (required), text, chat_id, user_id, +3 more.
send_invoiceC
Send an invoice for payment.
Inputs: title (required), chat_id (required), payload (required), currency (required), +27 more.
send_live_photoA
Send a live photo (Bot API 10.0) — a static photo plus a short video. The video must be at most 10 seconds and 10 MB; URLs are not supported for the video.
Inputs: photo (required), chat_id (required), live_photo (required), caption, +16 more.
send_locationC
Send a point on the map.
Inputs: chat_id (required), latitude (required), longitude (required), heading, +15 more.
send_media_groupB
Send a group of photos, videos, documents, or audios as an album (2-10 items).
Inputs: chat_id (required), media, protect_content, reply_parameters, +6 more.
send_messageA
Send a text message to a chat. Supports HTML, Markdown, MarkdownV2 formatting. Max 4096 characters — for longer posts use send_rich_message.
Inputs: text (required), chat_id (required), entities, parse_mode, +13 more.
send_message_draftA
Stream a partial text message while it is being generated. The draft is a temporary preview — send the final text with send_message to persist it.
Inputs: chat_id (required), draft_id (required), text, entities, +2 more.
send_paid_mediaC
Send paid media that requires Stars payment to view.
Inputs: chat_id (required), star_count (required), media, caption, +13 more.
send_photoB
Send a photo. Pass file_id, HTTP URL, or absolute file path. Caption is capped at 1024 characters — use send_rich_message for longer posts.
Inputs: photo (required), chat_id (required), caption, parse_mode, +15 more.
send_pollC
Send a poll or quiz. Supports revoting, shuffling, user-added options, descriptions, media in options, and multiple correct answers.
Inputs: chat_id (required), question (required), type, media, +30 more.
send_rich_messageA
Send a rich message (Bot API 10.1) — the long-form post format. Up to 32768 characters with headings, lists, tables, block quotes, pull quotes, collages, slideshows, details blocks, footnotes, formulas, maps and up to 50 inline media. Use this instead of send_photo when a post exceeds the 1024-character caption limit. Call telegram_format with topic "rich_message" for the exact syntax before building the post.
Inputs: chat_id (required), rich_message (required), reply_markup, protect_content, +8 more.
send_rich_message_draftA
Stream a partial rich message while it is still being generated. The draft is a temporary 30-second preview — call send_rich_message with the finished content to persist it. Private chats only.
Inputs: chat_id (required), draft_id (required), rich_message (required), message_thread_id.
send_stickerD
Send a sticker.
Inputs: chat_id (required), sticker (required), emoji, reply_markup, +11 more.
send_venueC
Send information about a venue.
Inputs: title (required), address (required), chat_id (required), latitude (required), +17 more.
send_videoC
Send a video file. Telegram clients support MPEG4 videos.
Inputs: video (required), chat_id (required), cover, width, +22 more.
send_video_noteC
Send a video note (round video message, max 1 minute).
Inputs: chat_id (required), video_note (required), length, duration, +13 more.
send_voiceC
Send a voice message (.OGG encoded with OPUS).
Inputs: voice (required), chat_id (required), caption, duration, +14 more.
set_business_account_bioBIdempotent
Set the bio of a business account.
Inputs: business_connection_id (required), bio.
set_business_account_gift_settingsCIdempotent
Configure gift settings for a business account.
Inputs: show_gift_button (required), business_connection_id (required), accepted_gift_types.
set_business_account_nameCIdempotent
Set the name of a connected business account.
Inputs: first_name (required), business_connection_id (required), last_name.
set_business_account_profile_photoCIdempotent
Set the profile photo of a business account.
Inputs: business_connection_id (required), photo, is_public.
set_business_account_usernameCIdempotent
Set the username of a business account.
Inputs: business_connection_id (required), username.
set_chat_administrator_custom_titleCIdempotent
Set a custom title for an administrator.
Inputs: chat_id (required), user_id (required), custom_title (required).
set_chat_descriptionBIdempotent
Change the description of a chat.
Inputs: chat_id (required), description.
set_chat_member_tagAIdempotent
Set or remove a tag for a chat member (v9.5).
Inputs: chat_id (required), user_id (required), tag.
set_chat_permissionsAIdempotent
Set default permissions for all members in a group/supergroup.
Inputs: chat_id (required), permissions, use_independent_chat_permissions.
set_chat_photoBIdempotent
Set a new chat photo.
Inputs: photo (required), chat_id (required).
set_chat_sticker_setBIdempotent
Set the sticker set for a supergroup.
Inputs: chat_id (required), sticker_set_name (required).
set_chat_titleBIdempotent
Change the title of a chat.
Inputs: title (required), chat_id (required).
set_custom_emoji_sticker_set_thumbnailBIdempotent
Set the thumbnail of a custom emoji sticker set.
Inputs: name (required), custom_emoji_id.
set_game_scoreCIdempotent
Set the score of a user in a game.
Inputs: score (required), user_id (required), force, chat_id, +3 more.
set_managed_bot_access_settingsCIdempotent
Change the access settings of a managed bot (v10.0).
Inputs: user_id (required), is_access_restricted (required), added_user_ids.
set_message_reactionAIdempotent
Set a reaction on a message. Use emoji or custom emoji.
Inputs: chat_id (required), message_id (required), is_big, reaction.
set_my_commandsCIdempotent
Set the bot's command list shown in the menu.
Inputs: scope, commands, language_code.
set_my_default_administrator_rightsAIdempotent
Set default admin rights requested when adding bot to groups/channels.
Inputs: rights, for_channels.
set_my_descriptionAIdempotent
Set the bot's description (shown in empty chat).
Inputs: description, language_code.
set_my_nameCIdempotent
Set the bot's name.
Inputs: name, language_code.
set_my_profile_photoCIdempotent
Set the bot's profile photo (v9.4).
Inputs: photo.
set_my_short_descriptionAIdempotent
Set the bot's short description (shown on profile page).
Inputs: language_code, short_description.
set_passport_data_errorsBIdempotent
Inform a user that some Telegram Passport elements contain errors.
Inputs: user_id (required), errors.
set_sticker_emoji_listBIdempotent
Change the list of emoji associated with a sticker.
Inputs: sticker (required), emoji_list (required).
set_sticker_keywordsBIdempotent
Change search keywords for a sticker.
Inputs: sticker (required), keywords.
set_sticker_mask_positionCIdempotent
Change the mask position of a mask sticker.
Inputs: sticker (required), mask_position.
set_sticker_position_in_setBIdempotent
Move a sticker to a specific position in the set.
Inputs: sticker (required), position (required).
set_sticker_set_thumbnailCIdempotent
Set the thumbnail of a sticker set.
Inputs: name (required), format (required), user_id (required), thumbnail.
set_sticker_set_titleAIdempotent
Set the title of a sticker set.
Inputs: name (required), title (required).
set_user_emoji_statusAIdempotent
Set a custom emoji status for a user (requires bot to have appropriate rights).
Inputs: user_id (required), emoji_status_custom_emoji_id, emoji_status_expiration_date.
set_webhookCIdempotent
Set a webhook URL for receiving updates.
Inputs: url (required), ip_address, certificate, secret_token, +3 more.
stop_message_live_locationCIdempotent
Stop updating a live location message.
Inputs: chat_id, message_id, reply_markup, inline_message_id, +1 more.
stop_pollBIdempotent
Stop a poll in a chat.
Inputs: chat_id (required), message_id (required), reply_markup, business_connection_id.
telegram_formatARead-onlyIdempotent
Ask what shape a structured Telegram parameter must have BEFORE sending. Call this whenever you are about to build a rich post, an album, a keyboard, or a poll and are not certain of the exact syntax. Topics: rich_message, caption, media, reply_markup, poll, checklist, reply_parameters, link_preview_options, suggested_post_parameters. Omit the topic to list them all. For a post longer than a 1024-character caption, ask for 'rich_message'.
Inputs: topic.
transfer_business_account_starsAIdempotent
Transfer Telegram Stars from a business account to the bot.
Inputs: star_count (required), business_connection_id (required).
transfer_giftBIdempotent
Transfer an owned unique gift to another user. Requires the can_transfer_and_upgrade_gifts business bot right.
Inputs: owned_gift_id (required), new_owner_chat_id (required), business_connection_id (required), star_count.
unban_chat_memberBIdempotent
Unban a previously banned user.
Inputs: chat_id (required), user_id (required), only_if_banned.
unban_chat_sender_chatAIdempotent
Unban a previously banned channel chat.
Inputs: chat_id (required), sender_chat_id (required).
unhide_general_forum_topicBIdempotent
Unhide the 'General' topic.
Inputs: chat_id (required).
unpin_all_chat_messagesBIdempotent
Unpin all messages in a chat.
Inputs: chat_id (required).
unpin_all_forum_topic_messagesCIdempotent
Unpin all messages in a forum topic.
Inputs: chat_id (required), message_thread_id (required).
unpin_all_general_forum_topic_messagesAIdempotent
Unpin all messages in the 'General' topic.
Inputs: chat_id (required).
unpin_chat_messageCIdempotent
Unpin a message in a chat.
Inputs: chat_id (required), message_id, business_connection_id.
upgrade_giftBIdempotent
Upgrade a regular gift to a unique gift. Requires the can_transfer_and_upgrade_gifts business bot right.
Inputs: owned_gift_id (required), business_connection_id (required), star_count, keep_original_details.
upload_sticker_fileAIdempotent
Upload a sticker file to Telegram for later use in createNewStickerSet.
Inputs: sticker (required), user_id (required), sticker_format (required).
verify_chatBIdempotent
Verify a chat on behalf of the bot's organization.
Inputs: chat_id (required), custom_description.
verify_userCIdempotent
Verify a user on behalf of the bot's organization.
Inputs: user_id (required), custom_description.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 190 tools
Most tools have distinct verb+resource purposes, but the sheer number of similar variants creates real ambiguity: send_message vs send_message_draft vs send_rich_message, edit_message_text vs edit_ephemeral_message_text, delete_message vs delete_messages, and forward/copy singular vs plural. Descriptions help distinguish them, but an agent must still parse many closely related options before choosing.
The surface overwhelmingly follows a predictable snake_case verb_noun pattern (send_message, get_chat, delete_sticker_from_set). Minor deviations exist, such as bare verbs 'close' and 'log_out', plus domain-specific names like 'telegram_format' and 'get_trail', but these do not seriously undermine readability.
190 tools is an extreme mismatch for a usable MCP surface, far beyond the typical 3-15 range and well past the 50+ threshold. Even though the tools mirror the Telegram Bot API, the volume creates severe selection and context burdens for an agent.
The tool set covers an unusually broad Telegram Bot API surface: messaging, media, chats, members, stickers, payments, gifts, business accounts, webhooks, inline mode, and formatting helpers. No obvious lifecycle or domain gap stands out for the stated purpose.
Maintenance
Related MCP Connectors
Zero-dependency Cloudflare Worker gateway turning websites and REST APIs into MCP tools.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Hosted Telegram MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Cloudflare Workers MCP server: ai-model-router
Related MCP Servers
- AlicenseBqualityDmaintenanceFull-featured Telegram Bot API server for MCP (Model Context Protocol). 174 tools covering the entire Bot API — messages, chats, stickers, payments, forums, stories, and more.100635 npm7MIT
- AlicenseCqualityCmaintenanceUltimate MCP server for Telegram Bot API — 169 methods, full v9.6 coverage, meta-mode, rate limiting, and circuit breaker, enabling AI to control Telegram bots with natural language.10034MIT
- FlicenseNot gradedqualityDmaintenanceDeploys a stateless remote MCP server on Cloudflare Workers without authentication, enabling MCP tool calls from clients like Claude Desktop and Cloudflare AI Playground.-
- FlicenseNot gradedqualityDmaintenanceEnables deploying a stateless remote MCP server on Cloudflare Workers without authentication, implementing the MCP 2026-07-28 specification and compatible with legacy clients for tool calls.-