Skip to main content
Glama
telegram-api-mcp

telegram-api-mcp

by EngDawood

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.

Stars License Bot API 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

/ or /health

GET

Plain-text status check

/mcp

POST

MCP endpoint (Streamable HTTP, stateless)

/webhook

POST

Telegram webhook receiver for bot updates

/webhook

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 — when MCP_AUTH_TOKEN is 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 main deploy 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-worker

The 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)

  1. Fork or clone this repo to your GitHub account.

  2. In the Cloudflare dashboard: Workers & Pages → Create → Import a repository and pick the repo. Pushes to main now deploy automatically.

  3. 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:deploy

Secrets

Secret

Required

Purpose

TELEGRAM_BOT_TOKEN

Yes

Bot token from @BotFather

MCP_AUTH_TOKEN

Recommended

Token clients must send to POST /mcp as Authorization: Bearer, x-api-key, api-key or ?token=. Without it the endpoint is open.

WEBHOOK_SECRET

Optional

When set, POST /webhook only accepts updates whose X-Telegram-Bot-Api-Secret-Token header matches it. Register the same value as the setWebhook secret_token.

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_updates calls. Run the delete_webhook tool to go back to polling.

  • get_webhook_info shows 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 typecheck

Create 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 start

From 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 start

To run the Worker build locally from the same checkout instead:

npm run worker:dev

Put 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_file

  • The 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 log
  • Stateless per request. Each POST /mcp builds 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) in src/mcp/server.ts assembles 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_format helper, download_file and the TRAIL tools. With TELEGRAM_META_MODE=true the 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. loadConfig in src/core/config.ts maps the Worker's secrets/vars (or environment variables in the stdio build) into one validated config object.

  • Webhook path. POST /webhook verifies the secret-token header when WEBHOOK_SECRET is set, writes the update JSON to the Worker log and acknowledges immediately with {"ok": true}.

Path

What it is

src/worker.ts

Cloudflare Worker entry: /mcp, /webhook, /health

src/mcp/

MCP server: server.ts, method-registry.ts, formats.ts, methods/

src/telegram/

telegram-client.ts, the Bot API client

src/core/

config.ts, rate-limiter.ts, circuit-breaker.ts

src/trail/

TRAIL protocol: trail.ts, post-log.ts

src/index.ts

Original stdio entry point

src/config.ts

Environment/secrets loading and tuning knobs

docs/

Documentation: project/ (this codebase), bot-api/ (official docs mirror), history/

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 at POST /mcp (src/worker.ts). Based on timoncool/telegram-api-mcp @ 34af6ba (MIT — see LICENSE).

Available Tools

190 tools
add_sticker_to_setC
Idempotent

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_queryC
Idempotent

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_requestA
Idempotent

Approve a chat join request.

Inputs: chat_id (required), user_id (required).

approve_suggested_postC
Idempotent

Approve a suggested post in a direct messages chat (v9.2).

Inputs: chat_id (required), message_id (required), send_date.

ban_chat_memberA
Destructive

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_chatA
Destructive

Ban a channel chat from sending messages in a supergroup.

Inputs: chat_id (required), sender_chat_id (required).

closeA
Idempotent

Close the bot instance. Use before moving between local servers.

Inputs: no named parameters.

close_forum_topicA
Idempotent

Close an open topic in a forum supergroup.

Inputs: chat_id (required), message_thread_id (required).

close_general_forum_topicC
Idempotent

Close the 'General' topic.

Inputs: chat_id (required).

convert_gift_to_starsC
Idempotent

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_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_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_requestB
Idempotent

Decline a chat join request.

Inputs: chat_id (required), user_id (required).

decline_suggested_postC
Idempotent

Decline a suggested post in a direct messages chat (v9.2).

Inputs: chat_id (required), message_id (required), comment.

delete_all_message_reactionsA
Destructive

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_messagesB
Destructive

Delete business messages.

Inputs: message_ids (required), business_connection_id (required).

delete_chat_photoA
Destructive

Delete a chat photo.

Inputs: chat_id (required).

delete_chat_sticker_setA
Destructive

Delete the sticker set from a supergroup.

Inputs: chat_id (required).

delete_ephemeral_messageA
Destructive

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_topicA
Destructive

Delete a forum topic along with all its messages.

Inputs: chat_id (required), message_thread_id (required).

delete_messageA
Destructive

Delete a message. Bot must have delete rights in the chat.

Inputs: chat_id (required), message_id (required).

delete_message_reactionB
Destructive

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_messagesA
Destructive

Delete multiple messages at once. Max 100 messages.

Inputs: chat_id (required), message_ids (required).

delete_my_commandsB
Destructive

Delete the bot's command list for a given scope and language.

Inputs: scope, language_code.

delete_sticker_from_setC
Destructive

Delete a sticker from a set.

Inputs: sticker (required).

delete_sticker_setA
Destructive

Delete a sticker set created by the bot.

Inputs: name (required).

delete_storyC
Destructive

Delete a story (v9.0).

Inputs: story_id (required), business_connection_id (required).

delete_webhookA
Destructive

Remove webhook integration and switch back to getUpdates.

Inputs: drop_pending_updates.

download_fileA
Idempotent

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_ephemeral_message_captionC
Idempotent

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_mediaC
Idempotent

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_markupC
Idempotent

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_textA
Idempotent

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_topicA
Idempotent

Edit name and icon of a forum topic.

Inputs: chat_id (required), message_thread_id (required), name, icon_custom_emoji_id.

edit_general_forum_topicA
Idempotent

Edit the name of the 'General' forum topic.

Inputs: name (required), chat_id (required).

edit_message_captionC
Idempotent

Edit the caption of a media message.

Inputs: caption, chat_id, message_id, parse_mode, +5 more.

edit_message_checklistC
Idempotent

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_locationC
Idempotent

Edit a live location message.

Inputs: latitude (required), longitude (required), chat_id, heading, +7 more.

edit_message_mediaB
Idempotent

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_markupC
Idempotent

Edit the inline keyboard of a message.

Inputs: chat_id, message_id, reply_markup, inline_message_id, +1 more.

edit_message_textB
Idempotent

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_storyC
Idempotent

Edit a posted story (v9.0).

Inputs: story_id (required), business_connection_id (required), areas, caption, +3 more.

edit_user_star_subscriptionC
Idempotent

Edit a user's Star subscription (cancel or extend).

Inputs: user_id (required), is_canceled (required), telegram_payment_charge_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_giftsA
Read-onlyIdempotent

Get the list of gifts that can be sent.

Inputs: no named parameters.

get_business_account_giftsC
Read-onlyIdempotent

Get gifts owned by a business account.

Inputs: business_connection_id (required), limit, offset, exclude_saved, +7 more.

get_business_account_star_balanceA
Read-onlyIdempotent

Get the Telegram Stars balance of a business account.

Inputs: business_connection_id (required).

get_business_connectionC
Read-onlyIdempotent

Get information about a business connection.

Inputs: business_connection_id (required).

get_chatA
Read-onlyIdempotent

Get full information about a chat (title, description, photo, member count, permissions, etc).

Inputs: chat_id (required).

get_chat_administratorsB
Read-onlyIdempotent

Get a list of administrators in a chat.

Inputs: chat_id (required), return_bots.

get_chat_giftsC
Read-onlyIdempotent

Get the gifts owned and hosted by a chat (v9.3).

Inputs: chat_id (required), limit, offset, exclude_saved, +7 more.

get_chat_memberB
Read-onlyIdempotent

Get information about a member in a chat.

Inputs: chat_id (required), user_id (required).

get_chat_member_countA
Read-onlyIdempotent

Get the number of members in a chat.

Inputs: chat_id (required).

get_chat_menu_buttonA
Read-onlyIdempotent

Get the current menu button for a chat or default.

Inputs: chat_id.

get_custom_emoji_stickersA
Read-onlyIdempotent

Get information about custom emoji stickers by their identifiers.

Inputs: custom_emoji_ids (required).

get_fileA
Read-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_stickersA
Read-onlyIdempotent

Get custom emoji stickers that can be used as forum topic icons.

Inputs: no named parameters.

get_game_high_scoresC
Read-onlyIdempotent

Get high scores for a game.

Inputs: user_id (required), chat_id, message_id, inline_message_id.

get_managed_bot_access_settingsA
Read-onlyIdempotent

Get the access settings of a managed bot (v10.0).

Inputs: user_id (required).

get_managed_bot_tokenA
Read-onlyIdempotent

Get the token of a managed bot (v9.6).

Inputs: user_id (required).

get_meA
Read-onlyIdempotent

Get basic information about the bot (id, name, username, etc).

Inputs: no named parameters.

get_my_commandsA
Read-onlyIdempotent

Get the bot's current command list.

Inputs: scope, language_code.

get_my_default_administrator_rightsB
Read-onlyIdempotent

Get default admin rights.

Inputs: for_channels.

get_my_descriptionB
Read-onlyIdempotent

Get the bot's description.

Inputs: language_code.

get_my_nameA
Read-onlyIdempotent

Get the bot's name for a given language.

Inputs: language_code.

get_my_short_descriptionB
Read-onlyIdempotent

Get the bot's short description.

Inputs: language_code.

get_my_star_balanceA
Read-onlyIdempotent

Get the bot's Telegram Stars balance (v9.1).

Inputs: no named parameters.

get_star_transactionsC
Read-onlyIdempotent

Get the bot's Telegram Star transactions.

Inputs: limit, offset.

get_sticker_setA
Read-onlyIdempotent

Get a sticker set by name.

Inputs: name (required).

get_trailA
Read-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_statsA
Read-onlyIdempotent

Get summary statistics from the TRAIL content log.

Inputs: since, requester.

get_updatesA
Read-onlyIdempotent

Receive incoming updates via long polling.

Inputs: limit, offset, timeout, allowed_updates.

get_user_chat_boostsA
Read-onlyIdempotent

Get a user's boosts in a chat.

Inputs: chat_id (required), user_id (required).

get_user_giftsC
Read-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_messagesB
Read-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_audiosB
Read-onlyIdempotent

Get a user's profile audio tracks (v9.4).

Inputs: user_id (required), limit, offset.

get_user_profile_photosC
Read-onlyIdempotent

Get a user's profile photos.

Inputs: user_id (required), limit, offset.

get_webhook_infoA
Read-onlyIdempotent

Get current webhook status.

Inputs: no named parameters.

gift_premium_subscriptionC

Gift a Telegram Premium subscription (v9.0).

Inputs: user_id (required), star_count (required), month_count (required), text, +2 more.

hide_general_forum_topicB
Idempotent

Hide the 'General' topic.

Inputs: chat_id (required).

leave_chatA
Destructive

Bot leaves a group, supergroup, or channel.

Inputs: chat_id (required).

log_outA
Idempotent

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_messageC
Idempotent

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_memberB
Idempotent

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_messageC
Idempotent

Mark a business message as read.

Inputs: chat_id (required), message_id (required), business_connection_id (required).

refund_star_paymentC
Idempotent

Refund a Telegram Star payment.

Inputs: user_id (required), telegram_payment_charge_id (required).

remove_business_account_profile_photoC
Idempotent

Remove a business account profile photo.

Inputs: business_connection_id (required), is_public.

remove_chat_verificationB
Idempotent

Remove chat verification.

Inputs: chat_id (required).

remove_my_profile_photoB
Idempotent

Remove the bot's profile photo (v9.4).

Inputs: no named parameters.

remove_user_verificationB
Idempotent

Remove user verification.

Inputs: user_id (required).

reopen_forum_topicB
Idempotent

Reopen a closed topic.

Inputs: chat_id (required), message_thread_id (required).

reopen_general_forum_topicA
Idempotent

Reopen the 'General' topic.

Inputs: chat_id (required).

replace_managed_bot_tokenA
Idempotent

Replace the token of a managed bot (v9.6).

Inputs: user_id (required).

replace_sticker_in_setB
Idempotent

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_memberB
Idempotent

Restrict a user's permissions in a supergroup.

Inputs: chat_id (required), user_id (required), until_date, permissions, +1 more.

save_prepared_inline_messageB
Idempotent

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_buttonB
Idempotent

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_bioB
Idempotent

Set the bio of a business account.

Inputs: business_connection_id (required), bio.

set_business_account_gift_settingsC
Idempotent

Configure gift settings for a business account.

Inputs: show_gift_button (required), business_connection_id (required), accepted_gift_types.

set_business_account_nameC
Idempotent

Set the name of a connected business account.

Inputs: first_name (required), business_connection_id (required), last_name.

set_business_account_profile_photoC
Idempotent

Set the profile photo of a business account.

Inputs: business_connection_id (required), photo, is_public.

set_business_account_usernameC
Idempotent

Set the username of a business account.

Inputs: business_connection_id (required), username.

set_chat_administrator_custom_titleC
Idempotent

Set a custom title for an administrator.

Inputs: chat_id (required), user_id (required), custom_title (required).

set_chat_descriptionB
Idempotent

Change the description of a chat.

Inputs: chat_id (required), description.

set_chat_member_tagA
Idempotent

Set or remove a tag for a chat member (v9.5).

Inputs: chat_id (required), user_id (required), tag.

set_chat_menu_buttonA
Idempotent

Set the bot's menu button in a private chat or default menu button.

Inputs: chat_id, menu_button.

set_chat_permissionsA
Idempotent

Set default permissions for all members in a group/supergroup.

Inputs: chat_id (required), permissions, use_independent_chat_permissions.

set_chat_photoB
Idempotent

Set a new chat photo.

Inputs: photo (required), chat_id (required).

set_chat_sticker_setB
Idempotent

Set the sticker set for a supergroup.

Inputs: chat_id (required), sticker_set_name (required).

set_chat_titleB
Idempotent

Change the title of a chat.

Inputs: title (required), chat_id (required).

set_custom_emoji_sticker_set_thumbnailB
Idempotent

Set the thumbnail of a custom emoji sticker set.

Inputs: name (required), custom_emoji_id.

set_game_scoreC
Idempotent

Set the score of a user in a game.

Inputs: score (required), user_id (required), force, chat_id, +3 more.

set_managed_bot_access_settingsC
Idempotent

Change the access settings of a managed bot (v10.0).

Inputs: user_id (required), is_access_restricted (required), added_user_ids.

set_message_reactionA
Idempotent

Set a reaction on a message. Use emoji or custom emoji.

Inputs: chat_id (required), message_id (required), is_big, reaction.

set_my_commandsC
Idempotent

Set the bot's command list shown in the menu.

Inputs: scope, commands, language_code.

set_my_default_administrator_rightsA
Idempotent

Set default admin rights requested when adding bot to groups/channels.

Inputs: rights, for_channels.

set_my_descriptionA
Idempotent

Set the bot's description (shown in empty chat).

Inputs: description, language_code.

set_my_nameC
Idempotent

Set the bot's name.

Inputs: name, language_code.

set_my_profile_photoC
Idempotent

Set the bot's profile photo (v9.4).

Inputs: photo.

set_my_short_descriptionA
Idempotent

Set the bot's short description (shown on profile page).

Inputs: language_code, short_description.

set_passport_data_errorsB
Idempotent

Inform a user that some Telegram Passport elements contain errors.

Inputs: user_id (required), errors.

set_sticker_emoji_listB
Idempotent

Change the list of emoji associated with a sticker.

Inputs: sticker (required), emoji_list (required).

set_sticker_keywordsB
Idempotent

Change search keywords for a sticker.

Inputs: sticker (required), keywords.

set_sticker_mask_positionC
Idempotent

Change the mask position of a mask sticker.

Inputs: sticker (required), mask_position.

set_sticker_position_in_setB
Idempotent

Move a sticker to a specific position in the set.

Inputs: sticker (required), position (required).

set_sticker_set_thumbnailC
Idempotent

Set the thumbnail of a sticker set.

Inputs: name (required), format (required), user_id (required), thumbnail.

set_sticker_set_titleA
Idempotent

Set the title of a sticker set.

Inputs: name (required), title (required).

set_user_emoji_statusA
Idempotent

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_webhookC
Idempotent

Set a webhook URL for receiving updates.

Inputs: url (required), ip_address, certificate, secret_token, +3 more.

stop_message_live_locationC
Idempotent

Stop updating a live location message.

Inputs: chat_id, message_id, reply_markup, inline_message_id, +1 more.

stop_pollB
Idempotent

Stop a poll in a chat.

Inputs: chat_id (required), message_id (required), reply_markup, business_connection_id.

telegram_formatA
Read-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_starsA
Idempotent

Transfer Telegram Stars from a business account to the bot.

Inputs: star_count (required), business_connection_id (required).

transfer_giftB
Idempotent

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_memberB
Idempotent

Unban a previously banned user.

Inputs: chat_id (required), user_id (required), only_if_banned.

unban_chat_sender_chatA
Idempotent

Unban a previously banned channel chat.

Inputs: chat_id (required), sender_chat_id (required).

unhide_general_forum_topicB
Idempotent

Unhide the 'General' topic.

Inputs: chat_id (required).

unpin_all_chat_messagesB
Idempotent

Unpin all messages in a chat.

Inputs: chat_id (required).

unpin_all_forum_topic_messagesC
Idempotent

Unpin all messages in a forum topic.

Inputs: chat_id (required), message_thread_id (required).

unpin_all_general_forum_topic_messagesA
Idempotent

Unpin all messages in the 'General' topic.

Inputs: chat_id (required).

unpin_chat_messageC
Idempotent

Unpin a message in a chat.

Inputs: chat_id (required), message_id, business_connection_id.

upgrade_giftB
Idempotent

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_fileA
Idempotent

Upload a sticker file to Telegram for later use in createNewStickerSet.

Inputs: sticker (required), user_id (required), sticker_format (required).

verify_chatB
Idempotent

Verify a chat on behalf of the bot's organization.

Inputs: chat_id (required), custom_description.

verify_userC
Idempotent

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

    C2.8/5.0

    Scored across 190 tools

    Disambiguation3/5

    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.

    Naming Consistency4/5

    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.

    Tool Count1/5

    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.

    Completeness5/5

    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

    ActivityMaintained
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      Full-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.
      100
      635 npm
      7
      MIT
    • A
      license
      C
      quality
      C
      maintenance
      Ultimate 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.
      100
      34
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables 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.
      -