Telegram MCP — Next Generation
This server lets MCP clients interact with Telegram through a tiered, safety-gated tool suite for messaging, account/chat management, media transfers, and offline local caching.
Account & identity: get current profile (
get_me), list/search contacts, resolve usernames, search public chats/channels/groups globally.Chat exploration: list all chats/channels/groups with filters, fetch chat details, retrieve paginated messages, and search messages within a specific chat.
Messaging operations: send text messages, reply to messages, edit messages, pin/unpin, mark chats as read, and delete messages (delete requires the destructive gate).
Media handling: upload and send local files, download media attachments to disk, and inspect media metadata before downloading.
Local offline cache: sync chat history into a SQLite/FTS5 archive, run instant offline message searches without Telegram API calls, and check cache health/integrity.
Safety & control: tool tiers (
essential,core,standard,full) control registered tools;TELEGRAM_SEND_ENABLEDgates writes;TELEGRAM_DESTRUCTIVE_ENABLEDgates destructive/admin operations; rate limiting, bounded retries, and MCP root-restricted file paths protect runtime behavior.Multi-account support: optional account labels allow selecting or fanning out across multiple configured Telegram accounts.
Provides tools for interacting with Telegram, enabling AI agents to manage accounts, chats, contacts, messages, groups, media, profiles, folders, and incoming events through the Telegram API.
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 MCP — Next GenerationSearch my cached Telegram messages for the word 'deploy'."
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 — Next Generation
A production-oriented Telegram integration for MCP-compatible clients, maintained by LoneVertex and built on Telethon and the Model Context Protocol. This repository preserves the upstream Telegram capability surface while adding explicit tool tiers, fail-closed mutation controls, keyed concurrency limits, bounded retries, local SQLite/FTS5 caching, safer media paths, package entrypoints, and reproducible CI.
Default posture: local stdio,
essentialtool tier, no Telegram writes, no destructive operations, and no unverified filesystem roots.
Project governance: Contributing · Security Policy · Apache License 2.0
What is included
The implementation registers 129 tools: the upstream 125 tools covering accounts, chats, contacts, messages, groups, media, profiles, folders, and incoming events, plus check_cache_health (with backward-compatible cache_health alias), search_cached_messages, and sync_chat_cache. The upstream provenance is preserved at commit 52cca204d945e4ec292801a9d972334c0c2a4b63; the next-generation package is version 4.3.0.
Tier | Purpose | Default | Tool Count |
| Highly coherent curated lifecycle suite (read, write, pin, media, cache) with zero dead-end references | Yes | 22 |
| Extended read-only account, chat, message, search, profile, media, contact, folder, and local-cache tools | No | 36 |
| Core plus common message/media sends, replies, forwards, reactions, drafts, aliases, and event waits | No | 69 |
| All 129 tools, including full administrative and destructive operations | No | 129 |
Set TELEGRAM_MCP_TIER to select a tier. Tier selection controls which tools are registered. TELEGRAM_SEND_ENABLED independently controls whether write operations can execute, and TELEGRAM_DESTRUCTIVE_ENABLED is a second gate for destructive/admin actions. The server returns a structured nothing_sent or nothing_done response when a gate blocks a call.
Related MCP server: Telegram MCP
Quick start
Use Python 3.11 or 3.12. Obtain Telegram API credentials from my.telegram.org/apps, and generate an authorized session outside the MCP process using the included session generator.
git clone https://github.com/LoneVertex/telegram-mcp-nextgen.git
cd telegram-mcp-nextgen
python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# edit .env with TELEGRAM_API_ID, TELEGRAM_API_HASH, and an authorized session
telegram-mcpFor package development and release validation:
pip install -e '.[dev]'
pytest -q
ruff check telegram_mcp/config.py telegram_mcp/core telegram_mcp/db telegram_mcp/models
mypy --explicit-package-bases telegram_mcp/config.py telegram_mcp/core telegram_mcp/db telegram_mcp/models
python -m buildThe server is intentionally non-interactive. Use telegram-mcp-generate-session before startup and keep the resulting session string private. Never commit .env, a Telethon .session file, API hashes, or session strings.
Configuration
The complete secret-free template is in .env.example. The important controls are summarized below.
Variable | Safe default | Meaning |
|
| Registered tool tier: |
|
| Global write-operation gate |
|
| Additional gate for delete, ban, leave, and similar operations |
|
| Persistent state root |
| Derived | SQLite cache path; must remain beneath |
|
| Maximum bounded FloodWait/transient retry attempts |
|
| Maximum provider-requested wait accepted for retry |
|
| Per-account token-bucket burst capacity |
|
| Per-account token refill rate |
|
| Maximum downloaded media size |
|
| Maximum uploaded media size |
Configuration construction is side-effect free. Credentials and authorization are checked when a live client starts, not when local tooling imports the package. Runtime state is created under owner-only directories when a cache or session operation requires it.
MCP clients and transports
See config/mcp-configs.md for secret-free examples for desktop MCP clients. Local stdio is preferred. Streamable HTTP is available for a long-lived local service:
MCP_TRANSPORT=http
MCP_HOST=127.0.0.1
MCP_PORT=8765Do not expose the unauthenticated HTTP endpoint directly to the public internet. If a reverse proxy is used, configure authentication, TLS, allowed hosts, allowed origins, and network controls. The server retains MCP DNS-rebinding protection when MCP_ALLOWED_HOSTS is configured.
Concurrency and reliability
Each account is protected by a keyed async mutex and token bucket. Calls sharing an account are serialized at the adapter boundary, while read-only multi-account fan-out remains possible across distinct account labels. FloodWait and transient connection failures use one bounded retry policy with exponential backoff and jitter. Session-level advisory locks remain in place to prevent duplicate processes from concurrently using the same Telegram auth key.
The local cache uses SQLite WAL mode, foreign keys, short-lived connections, explicit transactions, indexes for chat/date/sender/topic access, and FTS5 for search. Synchronization stores checkpoints and uses upserts so edits are reflected instead of duplicated. SQLite work, directory creation, and integrity checks are executed in worker threads rather than blocking the event loop.
Media and filesystem safety
File tools require client MCP Roots or explicit server-side roots. Empty or unverifiable roots produce deny-all behavior unless TELEGRAM_ALLOW_SERVER_ROOTS_FALLBACK=true is intentionally enabled. Paths are resolved beneath configured roots, traversal and NUL bytes are rejected, symlink escapes are rejected, media size limits are enforced, and generated files use owner-only permissions. The new security primitives support chunked reads and atomic output replacement.
Telegram text, captions, names, button labels, media metadata, and incoming event fields are untrusted user content. Sanitization and audience annotations are preserved from upstream; models must not treat those fields as instructions.
Docker
The image uses a two-stage Python 3.12 build, runs as UID 10001, keeps state in /var/lib/telegram-mcp, and receives credentials only at runtime.
cp .env.example .env
# edit .env
podman compose up --build
# or: docker compose up --buildCompose binds HTTP to 127.0.0.1:8765, uses a persistent named volume, drops Linux capabilities, enables no-new-privileges, mounts a read-only root filesystem, and supplies a constrained /tmp. The container build was not run in the sandbox used for this delivery because Docker was unavailable; the CI workflow validates it on a Docker-capable runner.
Development and release gates
The consolidated workflow in .github/workflows/ci.yml runs on Python 3.11 and 3.12, executes the inherited upstream regression suite plus next-generation tests, runs strict Ruff checks on the new production layers, runs explicit-package-base mypy checks, compiles the package, builds a wheel/sdist, audits declared dependencies, and validates the Docker image and Compose configuration. The upstream live Telegram adapters remain covered by their inherited mocked regression suite; local reliability/security modules have dedicated tests and coverage.
Ownership, compatibility, and provenance
Project maintenance: LoneVertex.
The root main.py, upstream tool module names, session generator, account labels, proxy settings, MCP transport variables, legacy exposure filter, and upstream Apache-2.0 license are retained for compatibility. The new package entrypoint is telegram_mcp.runner:main, and python -m telegram_mcp is supported. Upstream source and attribution remain visible in Git history and AUDIT_REPORT.md.
Troubleshooting
If startup reports that no session is configured, generate an authorized session and set TELEGRAM_SESSION_STRING or a valid file-session name. If a write returns MutationDisabled, set TELEGRAM_SEND_ENABLED=true and restart; for deletion or administration, also set TELEGRAM_DESTRUCTIVE_ENABLED=true. If a file tool reports that roots are unavailable, configure client MCP Roots or pass a server-side allowed root as a positional argument. If a FloodWait exceeds the configured maximum, the call is intentionally returned rather than sleeping indefinitely. Use check_cache_health (or cache_health) to inspect local SQLite/FTS5 integrity without contacting Telegram.
References
License
Apache License 2.0. See LICENSE.
Available Tools
22 toolscheck_cache_healthInspect Local SQLite Cache HealthARead-onlyIdempotent
Inspect local SQLite/FTS5 archive integrity, database size, and active tool tier diagnostics. Use to verify cache readiness before running local searches. Operates entirely offline without Telegram API calls.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already include readOnlyHint: true, idempotentHint: true, and destructiveHint: false, which establish the tool as a safe read-only operation. The description adds valuable context beyond annotations by specifying the offline nature ('without Telegram API calls') and the specific diagnostics it returns (integrity, size, tier). This extra context helps the agent understand the operational scope and side-effect-free behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise, two sentences, and front-loads the key purpose and the use case. Every word adds value: the first sentence lists specific diagnostics, the second gives the usage trigger and a key behavioral trait (offline). No wasted words or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with zero parameters and a rich output schema (which likely details the return values), the description is complete. It covers the purpose, usage context, and key behavioral trait (offline). The annotations cover safety, and the output schema handles the return format. Nothing important is missing for an agent to decide whether and how to invoke it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, and the schema coverage is 100% (trivially, as there are no parameters). The description doesn't need to document parameters. Since there are none, the baseline is 3, and the description adds no parameter-specific information because there is nothing to add. This is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool inspects local SQLite/FTS5 archive integrity, database size, and active tool tier diagnostics. It distinguishes itself from sibling tools by focusing on cache health rather than chat operations or search. The purpose is specific and actionable, though it doesn't explicitly name a sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use this tool: 'Use to verify cache readiness before running local searches.' This provides clear guidance on the trigger condition, and the mention of 'Operates entirely offline without Telegram API calls' implies it is a safe, low-cost operation compared to API calls. However, it doesn't explicitly say when not to use it or name alternatives, which is a minor gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_messageDelete Single Message from ChatADestructiveIdempotent
Delete a single message from a chat by message ID. Destructive operation requiring TELEGRAM_SEND_ENABLED=true and TELEGRAM_DESTRUCTIVE_ENABLED=true.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds value by naming the exact environment prerequisites (TELEGRAM_SEND_ENABLED=true and TELEGRAM_DESTRUCTIVE_ENABLED=true), giving operational authorization context that is not present in the annotations. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no fluff: the first states the primary action and mechanism, the second provides critical safety prerequisites. The main purpose is front-loaded, and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and a rich input schema covering all parameters, the description provides the essential missing context: destructive operation and environment-flag requirements. It does not explain post-deletion behavior or error cases, but the idempotentHint annotation and the output schema mitigate that need. Minor gap, but otherwise complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with detailed descriptions for chat_id and message_id already present. The description only repeats 'by message ID,' which is already in the schema, so it adds no new parameter-level meaning beyond the baseline set by the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Delete a single message from a chat by message ID.' It unambiguously distinguishes this tool from editing, pinning, or sending messages among the sibling tools, and the deletion scope (single message) is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear operational context by stating the destructive nature and the two required environment flags, which tells an agent when its use is permitted. It does not explicitly name alternative tools or conditions where another sibling would be more appropriate, but no direct deletion sibling exists, so the context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_mediaDownload Media Attachment to Local DiskAIdempotent
Download an attachment or media file from a message to the local filesystem. Destination path must resolve within configured MCP allowed roots. To check metadata before downloading, use get_media_info.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| file_path | No | Local filesystem path to the file to upload or send. Must resolve within configured MCP allowed roots. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already expose mutability (readOnlyHint=false), idempotency, and non-destructive behavior. The description adds the operational constraint that the destination path must be within configured MCP allowed roots, which is useful beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core purpose, followed by the key constraint and the alternative tool. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a download operation, the description explains what it does, the key path constraint, and the metadata alternative; an output schema exists, so return-value details are not necessary. Minor ambiguity about the default destination when file_path is omitted prevents a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the 'destination path' framing, but it largely restates file_path's root constraint and does not clarify the file_path schema phrase about 'upload or send' or the behavior when file_path is omitted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence names a specific operation ('Download an attachment or media file'), the resource (message attachment), and the destination (local filesystem). It clearly distinguishes itself from siblings like get_media_info (metadata only) and send_file (upload).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use it to physically fetch media, and use get_media_info when only metadata is needed. It lacks an explicit exclusion for send_file or a fuller when-not-to-use statement, but the main alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_messageEdit Text of Sent Telegram MessageAIdempotent
Edit the text content of an existing message previously sent by this account. Mutation operation requiring TELEGRAM_SEND_ENABLED=true. Cannot edit messages sent by other users.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| new_text | Yes | New replacement text content when editing an existing sent message. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. | |
| parse_mode | No | Text formatting parser: 'markdown' (default), 'html', or 'none'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive, idempotent operation. The description adds valuable behavioral context beyond annotations: it identifies the operation as a mutation and discloses the configuration prerequisite (TELEGRAM_SEND_ENABLED=true) plus the ownership restriction. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with no filler. The main action and target are front-loaded, followed immediately by the critical mutation and permission constraints. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 5 parameters, an output schema, and all parameters fully documented, the description covers the essential operational constraints: mutation status, environment flag, and message ownership. It is complete enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description complements this with the ownership constraint but does not add substantial semantic detail beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Edit'), a precise resource ('text content of an existing message'), and a key scope constraint ('previously sent by this account'). This immediately differentiates the tool from siblings like send_message, reply_to_message, and delete_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when this tool applies: editing an existing message sent by this account, and explicitly rules out editing messages sent by other users. It does not name sibling alternatives, but the scope and the TELEGRAM_SEND_ENABLED prerequisite provide adequate usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chatGet Chat Details and MetadataARead-onlyIdempotent
Retrieve core metadata, title, member count, and type for a specific chat or channel. Use when inspecting a known chat ID or @username.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the read-only nature is covered. The description adds no side-effect, auth, rate-limit, or error behavior beyond restating that metadata is retrieved; the listed return fields are redundant with the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler; the primary purpose is front-loaded, and the usage condition is appended in the same breath.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only lookup with two params, a full schema, an output schema, and safety annotations, the description plus structured data is complete. An agent knows exactly when to call it and what it returns.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline applies. The description's mention of 'chat ID or @username' merely echoes (and slightly under-specifies) the chat_id property description, and it adds nothing about the account parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('core metadata, title, member count, and type for a specific chat or channel'). It distinguishes the tool from list-oriented siblings by limiting to a specific known chat, and the usage clause ('known chat ID or @username') disambiguates further.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context ('Use when inspecting a known chat ID or @username'), which indicates the intended condition for use. It does not name alternatives (e.g., list_chats for discovery, resolve_username for resolution) or offer explicit when-not-to-use guidance, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_meGet Current Account Profile and IdentityARead-onlyIdempotent
Retrieve detailed profile identity of the current Telegram user account (ID, name, username, phone). Use when verifying account identity, session details, or caller permissions.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, non-destructive, and idempotent behavior. The description adds value by specifying the exact identity fields returned and mentioning account/session verification use cases. No contradictions with annotations exist.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences: the first states what the tool returns, the second states when to use it. No filler or redundancy; key distinctions are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple, low-risk read-only tool with no required parameters, a rich annotation set, and an output schema. The description fully covers what an agent needs to know to call it correctly and appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the optional 'account' parameter is fully documented by the schema. The description does not add parameter-level detail, but the baseline 3 is appropriate because the schema carries the full burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and a precise resource ('detailed profile identity of the current Telegram user account') and lists the concrete fields returned (ID, name, username, phone). This clearly distinguishes it from sibling tools like resolve_username or list_contacts, which operate on other accounts or entities.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear context for use: 'verifying account identity, session details, or caller permissions.' There are no explicit exclusions or alternative tool references, but because the tool is unique among siblings, the context provided is sufficient for an agent to select it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_media_infoInspect Media Metadata in MessageARead-onlyIdempotent
Inspect media metadata (file size, dimensions, mime type, duration) attached to a specific message. Use before downloading or viewing to verify file attributes and dimensions.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which fully cover the safety profile. The description adds no additional behavioral traits beyond the purpose, such as side effects or return semantics, but it also does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two crisp sentences. The first states the action and scope, the second gives usage guidance. No filler or redundancy, and the core purpose is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has a rich output schema, complete parameter descriptions, and strong annotations covering read-only/idempotent behavior. The description provides the remaining context needed to decide when to call it, making the overall definition complete for an AI agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters (account, chat_id, message_id) in detail. The description mentions 'attached to a specific message' but does not add parameter-level information beyond what the schema provides, which lands exactly at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Inspect') and resource ('media metadata attached to a specific message'), and enumerates the exact attributes (file size, dimensions, mime type, duration). This clearly distinguishes it from download_media and get_messages, which handle fetching or listing rather than metadata inspection.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to use the tool 'before downloading or viewing' to verify file attributes and dimensions. This gives clear context for when to invoke it, though it does not explicitly name download_media as the alternative for the actual file transfer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesGet Paginated Messages from ChatARead-onlyIdempotent
Retrieve paginated messages from a specific chat starting from an offset or limit. Use for sequential message retrieval. To search text across messages, use search_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-indexed page number for paginated result sets. | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| page_size | No | Maximum number of items to return per page (typically 10 to 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), so the description's job is lighter. It adds pagination behavior context ('paginated', 'sequential message retrieval'). Minor imprecision: it says 'offset or limit' while the schema actually uses page/page_size, which is a slight terminology mismatch but not a contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero waste: the action, the usage context, and the sibling alternative. The most decision-relevant information (what it does and when to use it) is front-loaded before the alternative routing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, rich annotations, and 100% schema param coverage, the description covers what remains: pagination intent and differentiation from search_messages. The only gap is the 'offset or limit' phrasing that doesn't match the page/page_size schema, which could mildly confuse an agent selecting pagination parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents all four parameters (page, page_size, account, chat_id). The description adds no real parameter semantics beyond the schema — 'offset or limit' loosely maps to page/page_size but is arguably a slightly less accurate framing. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Retrieve paginated messages from a specific chat') and clearly differentiates from search_messages by naming it explicitly. The title reinforces the same purpose. An agent can immediately tell this tool fetches messages sequentially rather than searching them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use guidance ('Use for sequential message retrieval') and names the alternative tool with the condition that selects it ('To search text across messages, use search_messages'). Nothing about selection is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsList All Telegram Chats and ChannelsARead-onlyIdempotent
List all accessible chats, groups, channels, and direct dialogs with pagination support. Use when locating specific conversations by title or type.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items or records to retrieve (integer between 1 and 100). | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| archived | No | If true, queries archived chats instead of main inbox chats. | |
| chat_type | No | Filter chats by type: 'all', 'private', 'group', 'channel', or 'bot'. | |
| with_about | No | If true, includes the about/bio description in the retrieved chat details. | |
| unread_only | No | If true, filters and returns only chats with unread messages. | |
| unmuted_only | No | If true, filters and returns only chats whose notifications are active. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond the annotations: it specifies 'accessible chats' (scope) and 'pagination support,' which are not covered by readOnlyHint or idempotentHint. It does not contradict any annotations. While it could mention rate limits or pagination mechanics, the read-only and idempotent nature is already disclosed, so this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no redundancy. The first sentence front-loads the primary function (listing all accessible chats) and the second provides a usage hint. Every word earns its place, making it highly efficient and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 7 optional parameters, all documented in the schema, and an output schema exists. The description mentions pagination and gives a usage context, which is enough for an agent to decide when to call it. It does not explain how to use pagination parameters, but they are fully documented in the schema, so the description is adequately complete for its purpose.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides complete descriptions for all 7 parameters with 100% coverage, including limit, account, archived, chat_type, with_about, unread_only, and unmuted_only. The description does not add any additional semantic meaning beyond the schema, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'List all accessible chats, groups, channels, and direct dialogs' with pagination support, defining a specific verb and resource. It distinguishes itself from single-chat fetch tools like get_chat by emphasizing 'all' and includes a usage hint about locating conversations by title or type, making its purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear usage context: 'Use when locating specific conversations by title or type.' This implies a use case but does not explicitly mention alternative tools such as search_messages or search_public_chats, nor does it state when not to use it. The guidance is present but could be more explicit about exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsList Telegram Account ContactsARead-onlyIdempotent
List all registered Telegram contacts in your account address book with IDs and phone numbers. Use when finding contacts to message. To search contacts by query, use search_contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is fully covered. The description adds the scope of what is returned ('with IDs and phone numbers'), but since an output schema exists this is largely redundant and no auth or rate-limit context is added. A 3 reflects annotations doing the heavy lifting with modest added value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero waste; the purpose is front-loaded and the routing hint follows immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema handling return values, rich annotations covering the safety profile, and 100% schema coverage of the sole parameter, the description supplies everything an agent needs to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single 'account' parameter is fully documented in the schema, so the baseline is 3. The description does not mention the account parameter or its multi-account fan-out behavior, adding nothing beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (list) and resource (Telegram contacts in the account address book) and explicitly distinguishes itself from search_contacts. An agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit when-to-use ('finding contacts to message') and names the alternative plus its triggering condition ('to search contacts by query, use search_contacts'). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
mark_as_readMark Messages in Chat as ReadAIdempotent
Mark all messages or messages up to a specific ID in a chat as read. Mutation operation requiring TELEGRAM_SEND_ENABLED=true. Clears unread badge counter.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context beyond those hints: the environment prerequisite, the badge-clearing side effect, and the all-or-up-to-ID scope. No contradiction with the annotations was found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with no filler. The core operation is front-loaded, and each sentence adds a distinct piece of information: scope, mutation requirement, and side effect.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a low-complexity mutation with rich annotations and an output schema, the description is mostly complete: it covers scope, prerequisites, and effect. The main gap is that 'up to a specific ID' is not representable through the current parameters, which leaves a small but real ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents both parameters thoroughly, so the baseline is 3. The description's phrase 'up to a specific ID' adds semantic interest, but it is ambiguous because the input schema exposes no message_id parameter; an agent may not know how to express that threshold with the declared inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact operation ('Mark...as read'), the resource ('messages in a chat'), and the scope ('all messages or messages up to a specific ID'). It is clearly distinct from the sibling tools, which handle sending, editing, deleting, pinning, or searching rather than changing read state.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear usage context: it is a mutation, requires TELEGRAM_SEND_ENABLED=true, and clears the unread badge counter. It does not explicitly mention when not to use it or name an alternative, but no sibling tool directly competes with mark-as-read functionality.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pin_messagePin Message to Top of ChatAIdempotent
Pin a message to the top of a chat or supergroup for high visibility. Mutation operation requiring TELEGRAM_SEND_ENABLED=true and admin permissions in supergroups/channels. To unpin, use unpin_message.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already indicating readOnlyHint=false and idempotentHint=true, the description adds valuable operational context: it is a mutation, requires a specific environment flag, and needs admin permissions in certain contexts. It does not mention error behavior or pin limits, but that is not a required disclosure given the existing annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short, focused sentences with no filler. The action is front-loaded, the mutation and prerequisites come second, and the unpin alternative is provided last. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists and the annotations cover safety/idempotency, the description supplies the remaining essentials: purpose, prerequisites, and the undo path. An agent can decide whether to call the tool and how to avoid common permission and configuration failures.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the parameters are already fully documented in the schema. The description adds minimal parameter-level meaning beyond confirming the chat/supergroup context, which matches the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Pin a message to the top'), identifies the target resource ('chat or supergroup'), and explains the intent ('for high visibility'). It is clearly distinct from siblings like unpin_message, delete_message, and send_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly names the operation type as a mutation and gives concrete preconditions: TELEGRAM_SEND_ENABLED=true and admin permissions in supergroups/channels. It also directs the agent to unpin_message when the goal is to remove a pin, which is explicit alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_messageReply Directly to Existing MessageA
Send a message in direct reply to a specific message ID in a chat. Mutation operation requiring TELEGRAM_SEND_ENABLED=true. To send a standalone message, use send_message.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Body text of the message, comment, or search query string. | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. | |
| parse_mode | No | Text formatting parser: 'markdown' (default), 'html', or 'none'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate a non-read-only, non-destructive, non-idempotent operation. The description adds the important environment requirement TELEGRAM_SEND_ENABLED=true. It does not detail side effects like reply thread placement, but the annotation coverage lowers the burden and no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences contain the core action, the operational prerequisite, and the key alternative tool. Every sentence earns its place and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with five schema-documented parameters and an output schema, the description covers purpose, the config gate, and the primary alternative. It could be slightly richer about side effects of replying, but nothing essential for calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with chat_id, message_id, text, account, and parse_mode each documented. The description adds no new parameter-level detail, but the schema carries the meaning, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Send a message in direct reply to a specific message ID in a chat.' It also names the sibling alternative send_message for standalone messages, so agents can distinguish it immediately without comparing schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when this tool is appropriate (direct reply to a specific message ID) and when it is not ('To send a standalone message, use send_message'). It also adds the TELEGRAM_SEND_ENABLED=true prerequisite, giving clear selection and operational guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resolve_usernameResolve Telegram Username to Entity IDARead-onlyIdempotent
Resolve a public @username to its underlying Telegram entity ID and object type (User, Channel, Group). Use before calling ID-based tools when only a username handle is known.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| username | Yes | Telegram username handle (without the leading '@' symbol). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds that the tool returns entity ID and object type but does not add behavioral details such as failure modes or account-fanout behavior. This is acceptable given the strong annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core action and outcome, followed by a direct usage hint. Every sentence earns its place with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a complete input schema, an output schema, and annotations covering read-only/idempotent behavior, the description fully covers what an agent needs to invoke this tool correctly. The usage hint ties it to the broader toolset without needing to enumerate return fields.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters clearly, including the '@' formatting note for username and the multi-account behavior for account. The description does not add parameter meaning beyond the schema, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action ('Resolve'), a specific resource ('public @username'), and a concrete outcome ('underlying Telegram entity ID and object type'). It also enumerates the possible object types, which clearly distinguishes it from list/search tools among its siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: 'Use before calling ID-based tools when only a username handle is known.' This is clear contextual guidance. It does not explicitly name alternatives or when not to use it, so it falls just short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cached_messagesSearch Local Offline SQLite Message ArchiveARead-onlyIdempotent
Search the local FTS5 SQLite archive for messages without making live Telegram API requests. Use for instantaneous, rate-limit-free search over synchronized messages. To sync messages into cache first, use sync_chat_cache.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items or records to retrieve (integer between 1 and 100). | |
| query | Yes | Search text string or keywords to match against messages, contacts, or entities. | |
| offset | No | Pagination offset indicating the number of initial records to skip. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds genuine behavioral context the annotations do not: no live API calls, no rate limits, and the dependency on previously synchronized messages. It doesn't mention staleness or what happens for unsynced chats, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core mechanism, then the benefit, then the prerequisite tool. Every sentence carries distinct information and nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the description covers the key non-obvious dependency (sync first) and the offline/rate-limit behavior. It could go further on cache staleness or coverage limits, but for a 4-param read tool it is largely complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with limit, offset, query, and chat_id all documented in the schema itself, so the baseline is 3. The description adds no extra meaning about query syntax (FTS5 matching rules) or pagination behavior beyond what the schema already says.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) plus the exact resource and mechanism (local FTS5 SQLite archive), and contrasts it with live Telegram API requests, which separates it from siblings like search_messages and search_global. An agent can tell which search tool to reach for without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use condition (instantaneous, rate-limit-free search over synchronized messages) and names a concrete prerequisite alternative, `sync_chat_cache`, for populating the cache. It does not explicitly state when NOT to use it (e.g., fall back to live search_messages when the cache lacks a chat), so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_contactsSearch Telegram Contact DirectoryARead-onlyIdempotent
Search your Telegram contacts directory by name, phone number, or username. Use when looking up a specific person. To view the entire directory, use list_contacts.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Search text string or keywords to match against messages, contacts, or entities. | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds scoping context (directory search by name/phone/username) but does not disclose the multi-account fan-out behavior that the account parameter implies. Adequate given annotation coverage, but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: purpose plus matchable fields front-loaded, then the use-when and the sibling alternative. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Complete enough for a read-only directory search: an output schema exists so return values need not be described, and annotations cover the safety profile. The only gap is that the multi-account behavior (fan-out vs. default) lives solely in the schema description rather than being reinforced here, but nothing an agent needs to call correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema, including the multi-account fan-out semantics. The description repeats the matchable fields (name, phone number, username) which loosely maps to the query parameter but adds no syntax or format detail beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (Telegram contacts directory), and enumerates matching fields (name, phone number, username). It also explicitly distinguishes from the sibling list_contacts, so the agent can pick correctly without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use it ('looking up a specific person') and names the alternative (list_contacts) plus its selection condition ('to view the entire directory'). Routing is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesSearch Messages Within Specific ChatARead-onlyIdempotent
Search for text keywords within a specific Telegram chat or supergroup. Use when finding past conversations in a single chat. To search the offline cache without live Telegram API calls, use search_cached_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items or records to retrieve (integer between 1 and 100). | |
| query | Yes | Search text string or keywords to match against messages, contacts, or entities. | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the context that this performs live Telegram API calls versus cached search, but does not disclose rate limits, auth requirements, or pagination behavior beyond what schema/annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two efficient sentences with no wasted words. The core purpose is front-loaded, and the alternative tool is named clearly in the second sentence.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given rich annotations, a full output schema, and complete schema descriptions for all parameters, the description covers everything needed to select and invoke the tool correctly. It clarifies scope, live API behavior, and the cached alternative.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema fully documents chat_id, query, limit, and account. The description aligns with the query and chat_id semantics but does not add meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb, resource, and scope: 'Search for text keywords within a specific Telegram chat or supergroup.' It is clearly distinguishable from sibling search tools (search_cached_messages, search_contacts, search_public_chats) because it specifies the single-chat scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use when finding past conversations in a single chat' and names the alternative: 'To search the offline cache without live Telegram API calls, use search_cached_messages.' This gives the agent clear routing guidance and an exclusion condition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_public_chatsSearch Public Channels and Groups GloballyARead-onlyIdempotent
Search Telegram globally for public channels, supergroups, and bots matching query terms. Use when discovering new public communities. To search within your existing chats, use list_chats or search_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of items or records to retrieve (integer between 1 and 100). | |
| query | Yes | Search text string or keywords to match against messages, contacts, or entities. | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety and idempotency profile is fully covered. The description adds the global-scope trait but says nothing about result volume, rate limits, or ordering beyond what structured fields provide. Adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with purpose then routing guidance. No filler and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and annotations carry the safety profile. The description covers scope, purpose, and alternatives, leaving only minor gaps (e.g., pagination/limit guidance) relevant to correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents query, limit, and account; baseline is 3. The description refines what the query targets (public communities rather than the generic "messages, contacts, or entities" in the schema), a marginal but real addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) plus the resources searched (public channels, supergroups, bots) and the scope (globally / Telegram-wide). It is immediately distinguishable from in-account search siblings. No schema opening required to understand the purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use ("when discovering new public communities") and names the alternatives with the condition that selects them ("search within your existing chats, use list_chats or search_messages"). The global-vs-local routing decision is fully specified.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_fileUpload and Send Document or FileA
Upload and send a local document or file to a chat. File path must resolve within configured MCP allowed roots. Requires TELEGRAM_SEND_ENABLED=true.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| caption | No | Optional caption text describing the media file (Markdown or plain text). | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| topic_id | No | Forum topic identifier (thread ID) in a supergroup where forum topics are enabled. | |
| file_path | Yes | Local filesystem path to the file to upload or send. Must resolve within configured MCP allowed roots. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as a non-read, non-idempotent mutation, so no restatement is needed. The description adds two operation-level traits beyond annotations: file_path must resolve within configured MCP allowed roots, and TELEGRAM_SEND_ENABLED=true must be set. These help the agent avoid permission and configuration failures.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences. The first leads with the core action, and the second packs only the two operation-level constraints an agent must know. There is no filler, redundancy, or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full 5-parameter schema, detailed per-parameter descriptions, and an output schema, the description only needed to state purpose and operation-level constraints, which it does. The allowed-root restriction and environment flag complete the picture for a safe first call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already explains chat_id formats, file_path string/array support, caption, topic_id, and account behavior. The tool description only restates the file_path allowed-roots constraint already present in the schema, adding no new parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'Upload and send' plus the resource 'local document or file to a chat' precisely states the operation. This clearly separates it from text-focused siblings like send_message and from download_media, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful context: a local file, a target chat, and the TELEGRAM_SEND_ENABLED=true prerequisite. However, it never names alternatives or says when not to use this tool, such as using send_message for plain text or download_media for retrieval, so the usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageSend Text Message to Telegram ChatA
Send a text message to a specified Telegram chat, group, channel, or user. Mutation operation requiring TELEGRAM_SEND_ENABLED=true. For replying to an existing message, prefer reply_to_message.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| message | Yes | Text content of the message to send or save as draft. Supports Markdown or HTML. | |
| parse_mode | No | Text formatting parser: 'markdown' (default), 'html', or 'none'. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=false, but the description adds the operational requirement TELEGRAM_SEND_ENABLED=true, which is not inferable from the schema. It also reinforces the mutation nature. While it does not detail side effects like duplicate delivery on retries, the existing annotations and output schema reduce that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact: two sentences that state the core action, the prerequisite, and the primary alternative. Every sentence adds distinct value and the most important information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter mutation tool with a full output schema, the description covers the essential selection and invocation needs: what it sends, where it sends, the required environment flag, and the sibling to use for replies. It does not mention sending files, but the 'text message' scope already implies `send_file` is for non-text media.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are already well documented. The description's 'text message' phrasing aligns with the `message` parameter but adds little beyond what the schema provides. Baseline of 3 is appropriate since the schema carries the parameter-semantic weight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('send') with a clear resource ('text message') and target scope ('Telegram chat, group, channel, or user'). It also differentiates itself from the sibling `reply_to_message` by explicitly directing replying use cases away, making the tool's role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides concrete usage context: it is a mutation, requires TELEGRAM_SEND_ENABLED=true, and explicitly tells the agent to prefer `reply_to_message` when replying to an existing message. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sync_chat_cacheSynchronize Chat History to Local ArchiveARead-onlyIdempotent
Synchronize remote Telegram chat messages into the local SQLite/FTS5 offline cache database. Use before performing offline text searches or when populating local message archives. To search already synced messages without Telegram API calls, use search_cached_messages. To verify database integrity and index status, use check_cache_health.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Synchronization mode: 'incremental' (new messages since checkpoint) or 'full' (all messages in batch). | incremental |
| limit | No | Maximum number of items or records to retrieve (integer between 1 and 100). | |
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description states that the tool 'synchronizes ... into the local ... database', which is a write operation, but the annotations include readOnlyHint=true. This is a direct contradiction: readOnlyHint typically means the tool does not modify state. The description also fails to add other behavioral context beyond what annotations already provide, but the contradiction alone forces a score of 1 per the rubric.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with zero fluff. The first sentence states the core purpose, the second provides usage context and alternatives. Information is front-loaded and every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, when to use, and alternatives. An output schema exists to describe return values, and annotations cover safety. The only gap is the contradiction with readOnlyHint, which makes the description slightly less reliable but does not leave out necessary call details. For a well-specified tool, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all four parameters. The description adds no parameter-specific meaning beyond what is already in the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('synchronize'), names the resource ('remote Telegram chat messages') and the target ('local SQLite/FTS5 offline cache database'), and explicitly differentiates from siblings by naming search_cached_messages and check_cache_health. This leaves no ambiguity about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context ('Use before performing offline text searches or when populating local message archives') and names two alternatives with their purposes, effectively telling the agent when not to use this tool. This is textbook usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unpin_messageUnpin Specific Message in ChatADestructiveIdempotent
Unpin a specific message from a chat or supergroup. Mutation operation requiring TELEGRAM_SEND_ENABLED=true. To pin a message, use pin_message.
| Name | Required | Description | Default |
|---|---|---|---|
| account | No | Optional account label for multi-account environments. If omitted in single-mode, the default account is used. In multi-mode without an account, read-only tools fan out across all configured accounts. | |
| chat_id | Yes | Target Telegram chat, group, supergroup, channel, or user identifier. Accepts numeric chat ID (e.g. -1001234567890 or 123456789), username (e.g. '@channel'), or phone number. | |
| message_id | Yes | Unique integer ID of the target message within the specified chat. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and readOnlyHint=false, and the description adds a valuable operational requirement: TELEGRAM_SEND_ENABLED=true must be set. This goes beyond what the schema or annotations provide. No contradiction with annotations was found.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is only three short sentences: purpose first, then the prerequisite, then the alternative tool. Every sentence earns its place, and there is no redundant restating of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with two required parameters, full schema coverage, and an output schema, the description is largely sufficient. It covers the operation, the required environment flag, and the sibling alternative. The scope phrase 'chat or supergroup' is slightly narrower than the schema's broader chat_id description, but this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with detailed descriptions for chat_id, message_id, and account. The description's phrases 'specific message' and 'chat or supergroup' loosely mirror the schema but add no new parameter-level meaning, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Unpin') and a specific resource ('a specific message from a chat or supergroup'), clearly distinguishing it from sibling tools like pin_message. The direct mention of pin_message as the inverse also reinforces what this tool does and does not do.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a clear context for use: removing a pinned message, and points to pin_message as the alternative operation when the goal is to pin instead. It also states the operational prerequisite TELEGRAM_SEND_ENABLED=true, which is useful guidance, though it does not enumerate exclusions or failure conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
33 tool updates
v4.2.0- Removed
cache_health - Added
check_cache_health - Added
delete_message - Added
download_media - Added
edit_message - Removed
get_admins - Removed
get_banned_users - Removed
get_bot_info - Removed
get_chats - Removed
get_contact_chats - Removed
get_contact_ids - Removed
get_folder - Removed
get_full_chat - Removed
get_history - Removed
get_last_interaction - Removed
get_message_context - Removed
get_photo_sheet - Removed
get_pinned_messages - Removed
get_privacy_settings - Removed
get_recent_actions - Removed
get_user_status - Removed
list_accounts - Removed
list_folders - Removed
list_messages - Removed
list_photos - Added
mark_as_read - Removed
open_photo - Added
pin_message - Added
reply_to_message - Removed
search_global - Added
send_file - Added
send_message - Added
unpin_message
35 tool updates
v4.1.1- First observed
cache_health - First observed
get_admins - First observed
get_banned_users - First observed
get_bot_info - First observed
get_chat - First observed
get_chats - First observed
get_contact_chats - First observed
get_contact_ids - First observed
get_folder - First observed
get_full_chat - First observed
get_history - First observed
get_last_interaction - First observed
get_me - First observed
get_media_info - First observed
get_message_context - First observed
get_messages - First observed
get_photo_sheet - First observed
get_pinned_messages - First observed
get_privacy_settings - First observed
get_recent_actions - First observed
get_user_status - First observed
list_accounts - First observed
list_chats - First observed
list_contacts - First observed
list_folders - First observed
list_messages - First observed
list_photos - First observed
open_photo - First observed
resolve_username - First observed
search_cached_messages - First observed
search_contacts - First observed
search_global - First observed
search_messages - First observed
search_public_chats - First observed
sync_chat_cache
TDQS
Scored across 22 tools
Every tool targets a distinct combination of resource and action, and descriptions explicitly cross-reference alternatives (e.g., get_messages vs search_messages, send_message vs reply_to_message, list_contacts vs search_contacts). Even the cached-search and live-search tools are clearly separated by offline/online behavior.
All tool names consistently follow a snake_case verb_noun pattern, such as list_chats, get_messages, send_message, pin_message, and search_contacts. Minor multi-word phrases like check_cache_health or mark_as_read still fit the same readable convention without stylistic mixing.
At 22 tools, the surface is noticeably heavy and borders on too many for the core purpose of interacting with Telegram. Each tool does add some distinct capability, but the cache-management cluster and multiple search variants contribute to a feeling of over-expansion.
The toolset covers the primary Telegram workflows well: reading chats and messages, sending/editing/deleting messages, replying, pinning, marking as read, file/media handling, contact lookup, public chat discovery, and offline cache search. Minor gaps such as forward_message, chat member management, and leaving chats mean it is not fully comprehensive for every possible account-level action.
Maintenance
Related MCP Connectors
Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
Multi-tenant Telegram gateway for AI agents — HTTP+stdio, 8 tools, MTProto User API
Unofficial Telegram MCP server — read, search, reply and react in your own Telegram account.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to interact with Telegram accounts through MCP, supporting messaging, contacts, groups, media, and admin functions.4Apache 2.0
- FlicenseBqualityCmaintenanceEnables MCP clients to interact with Telegram user accounts, providing tools for messaging, contacts, groups, channels, and media management through the Telegram API.853-
- AlicenseBqualityCmaintenanceEnables MCP clients to operate a Telegram account as a userbot, providing tools for reading and sending messages, searching chats and contacts, managing media, and performing other account actions via MTProto with a locally encrypted session.28MIT
- AlicenseNot gradedqualityBmaintenanceEnables MCP clients to drive a real Telegram account, exposing chats, messages, media, secret chats, admin rights, invite links, Mini Apps, and multi-account routing as callable tools.6GPL 3.0