tgread
Provides read-only access to a Telegram account's channels, groups, and direct messages, with tools for listing chats, reading message history, searching messages, and viewing chat metadata. Deliberately exposes no write, edit, delete, or admin capabilities.
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., "@tgreadsummarize recent messages from my Telegram channel"
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.
tgread
A read-only Telegram reader — a CLI first, and an MCP server second. Fifteen tools for reading your channels, groups and DMs, and not one that can write to them.
./install.sh # pinned venv + launcher + MCP registration
tgread login # api_id/api_hash, phone, code, 2FA
tgread tools # the catalogue
tgread read_chat --chat @durov --limit 5 # …and every tool runs from a shellThe CLI comes first
Every tool is a subcommand; the MCP server is a second front end onto the same handlers. That ordering is the point. A tool you can only reach through an MCP client is a tool you cannot test against a real account, and "the code type-checks" is not evidence that a Telegram result unpacks the way you assumed.
tgread tools # catalogue, with required flags
tgread read_chat --help # one tool's arguments
tgread read_chat --chat @durov --limit 5 # JSON on stdout
tgread search_messages --query "postgres" | jq '.messages[].url'Flags are generated from each tool's inputSchema — the same object advertised
over MCP — so the two surfaces cannot drift. Adding a property to a schema adds
a flag; there is no second place to update. Types come from the schema too:
--limit 5 is coerced to an integer, --ids 1,2,3 to an array, --admins-only
is a bare boolean, and --kind banana is rejected against the enum.
exit | meaning |
0 | success; a JSON document on stdout, diagnostics on stderr |
1 | the tool ran and failed — not logged in, chat not visible, no such thread |
2 | usage error — unknown flag, bad type, missing required argument |
3 | a read tool attempted a write. Should be unreachable; it means a bug |
4 | an unexpected error escaped a tool — also a bug, never a stack trace |
CLI output carries no UNTRUSTED CONTENT banner. That envelope exists to frame
the payload for a model; a human or a jq pipeline wants the document itself.
TGREAD_TOOLS restricts what an agent sees, not what you can run — the person
at the terminal is not the threat it exists for. tgread tools marks anything
currently hidden from agents.
Related MCP server: telegram-mcp
As an MCP server
You never run tgread serve yourself. Claude Code spawns it as a child
process and speaks JSON-RPC over its stdin/stdout, dispatching to the same
handlers the CLI calls; install.sh registers it so that happens automatically:
claude mcp add --scope user tgread -- ~/.local/bin/tgread serveRestart Claude Code (or /mcp → reconnect) and the tools appear. To check:
claude mcp list # tgread: … - ✔ Connected
tgread status # account, session validity, tool surfaceThose two answer different questions, and the difference bites people:
Connected only means the process started and completed the MCP handshake.
It says nothing about whether you are logged in — connection to Telegram is
lazy, on the first tool call. tgread status is the one that talks to Telegram.
sequenceDiagram
participant C as Claude Code
participant S as tgread serve
participant T as Telegram
C->>S: spawn (stdio)
C->>S: initialize / tools/list
S-->>C: 4 read tools
Note over S,T: no connection yet — login is not needed to start
C->>S: tools/call read_chat
S->>T: connect, reuse stored auth_key
T-->>S: history
S-->>C: UNTRUSTED envelope + JSONAny other MCP client works too — it is a plain stdio server:
{ "mcpServers": { "tgread": { "command": "/home/you/.local/bin/tgread",
"args": ["serve"] } } }To drive it by hand while debugging, pipe JSON-RPC at it (TGREAD_LOG=DEBUG
puts diagnostics on stderr; stdout stays pure protocol):
printf '%s\n' \
'{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{}}}' \
'{"jsonrpc":"2.0","id":2,"method":"tools/list"}' | tgread serveWhy not one of the existing ones
There are good community servers — chigwell/telegram-mcp has 1.5k stars, 30 contributors and real release hygiene. The reason to write this one is not distrust of that code. It is that the honest gain from self-writing is tool surface and reviewability, not dependency count, and those are the two things that matter when the process holds a Telegram session and feeds an agent attacker-controlled text.
community server | tgread | |
MTProto | Telethon | Telethon — same, and rightly so |
resolved packages | 44 | 5 ( |
MCP layer |
| ~200 lines of stdio JSON-RPC in this repo |
read tools | ~15 | 15 |
runnable without an MCP client | no | yes — every tool is a subcommand |
write tools | send, edit, delete, forward, react, join, admin | none |
write enforcement | by convention | at the transport chokepoint |
code to review before trusting it | ~3,000 lines across 30 contributors | one file you can read in a sitting |
Writing MTProto by hand would be reckless — Telethon is the crypto, the DC migration and the reconnect logic. So it stays. Everything above it is ours.
The threat model
Reading channels means text an attacker chose enters an agent that holds a shell — and, usually, whatever else you have connected: mail, notes, cloud credentials. That is the dominant risk here, and it is not fixed by who wrote the server. Choosing a server with no write surface is one of the few mitigations that does not depend on the model behaving well.
flowchart TD
A["hostile channel post<br/>'ignore previous instructions…'"] --> B["tgread read_chat"]
B --> C["UNTRUSTED envelope<br/>wrapped around every payload"]
C --> D["agent context"]
D --> E{"agent tries to act on it"}
E -->|"send / delete / join"| F["no such tool exists<br/>tools/call → isError"]
E -->|"raw TL request"| G["guard at _call → WriteBlocked"]
E -->|"summarise for the user"| H["fine — this is the intended path"]
style F fill:#1f6f43,color:#fff
style G fill:#1f6f43,color:#fffThree layers, in increasing order of how much they'd survive a bug:
No write tool is advertised. An injected instruction has nothing to call.
Every payload is wrapped in an
UNTRUSTED CONTENTbanner naming it as data, not instructions — including chat titles and bios, which are attacker-controlled too.The transport guard. Telethon funnels every outbound TL request through
TelegramClient._call(68 internal call sites reach it viaawait self(req), and__call__is a one-line delegate).ReadOnlyClientoverrides it. A bug in this file still cannot mutate the account.
The guard fails closed: a request is refused unless its TL class name starts
with Get/Search/Resolve/Check/Find, or is on a nine-entry
infrastructure allowlist. Three read-shaped requests are denied by name
because they have effects other people can observe — GetMessagesViews
(bumps the public view counter), GetBotCallbackAnswer (presses an inline
button), GetInlineBotResults (queries a bot as you). Nested requests are
walked, so a write cannot ride inside an allowed InvokeWithLayer wrapper.
flowchart LR
R["TL request"] --> W["walk nested .query"]
W --> D{"in EXPLICIT_DENY?"}
D -->|yes| X["WriteBlocked"]
D -->|no| I{"in INFRA_ALLOW?"}
I -->|yes| P["to the wire"]
I -->|no| V{"starts with Get/Search/<br/>Resolve/Check/Find?"}
V -->|yes| P
V -->|"no — incl. every<br/>name we've never seen"| X
style X fill:#8b2020,color:#fff
style P fill:#1f6f43,color:#ffftgread check runs this offline: 26 write requests blocked, 17 reads allowed,
unknown names fail closed, nesting checked. No network, no session, no
credentials.
Tools
The surface is as wide as MTProto's read paths allow — narrowing it is the
deployment's job, not the server's (see below). Every tool takes a chat as a
@username, a t.me link, or a numeric id from list_chats.
Identity and discovery
Tool | What |
| which account this server is signed in as |
| dialogs, filterable by name and by kind |
| Telegram's public directory — finds channels never joined, split into already-known and strangers |
| chat folders (dialog filters) and their sizes |
| saved contacts |
Reading
Tool | What |
| history, oldest-first, paged by message id or date |
| specific ids, or a window around one — what a search hit was replying to |
| replies under a post: a channel item's comment section |
| pinned messages — usually a chat's rules and announcements |
Search
Tool | What |
| full text, in one chat or across everything the account sees |
| history filtered by attachment kind, via Telegram's server-side index |
People and metadata
Tool | What |
| kind, member count, description, verified/scam flags |
| participants with roles, searchable, |
| who reacted to a message, and with what |
| groups and channels shared with a given user |
Three things these deliberately do not do, despite being adjacent to tools that would:
No media download.
list_mediareturns captions and metadata; fetching attachments would mean writing attacker-chosen bytes to the agent's disk.Reading never marks as read.
messages.ReadHistoryis a write and the guard blocks it, so the unread badges on your phone stay exactly as they were.Nothing joins, reacts or presses.
search_public_chatsfinds channels without joining them;get_reactionsreads reactions without adding one;GetBotCallbackAnswer— which would press an inline button — is denied by name even though it is spelled like a read.
Restricting the tool surface
The server implements everything; the deployment decides what an agent sees. Those are separate concerns, so they are separate settings — a tool you might want next month should not have to be a tool your agent can reach today.
Set TGREAD_TOOLS in config.env (or the environment) to a comma-separated
allowlist. Unset means all fifteen, which is the right default: the cost of
a read tool is context, not risk, and the risky operations were never
implemented.
TGREAD_TOOLS=list_chats,read_chat # just follow some channels
TGREAD_TOOLS=list_chats,read_chat,search_messages,get_messages # + researchRestricted tools are not advertised in tools/list and are refused again
on the call path. That ordering matters: a denied-but-advertised tool still
costs context and is still something a model can be argued into attempting,
whereas a tool that was never listed does not exist as far as the model is
concerned. Same reason there are no write tools at all — absence beats denial.
An unknown name is fatal at startup, not a warning. A typo that silently fell back to "all tools" would widen the surface at exactly the moment someone was trying to narrow it.
There is no YAML config, deliberately: a YAML parser means PyYAML, and
5 dependencies is the point of this repo. config.env is KEY=VALUE.
Three places can narrow what an agent reaches, weakest last:
Layer | Where | Format |
Not advertised |
|
|
Advertised, denied | Claude Code | JSON |
Per-subagent |
| YAML |
Operational notes
Use a secondary account. Userbots (any MTProto client that is not the official app) are ToS-ban-able. This risk is identical for every server here.
The session file is a bearer token for the whole account. Changing your Telegram password does not invalidate it. Only
tgread logout— which revokes server-side before deleting locally — or Settings → Devices does. Treat it like an SSH private key.pip install telegram-mcpis not this, and not chigwell's either. That PyPI name belongs to an unrelated project; passingTELEGRAM_API_ID/TELEGRAM_API_HASHto it would hand your credentials to third-party code. Nothing here is published to PyPI on purpose.State lives in one directory —
$TGREAD_STATE_DIR, default~/.local/state/tgread, mode 0700, holdingconfig.env(0600) andtgread.session(0600). One directory to chmod, to back up, to destroy.tgread statusflags it if the permissions drift.install.shusesuv sync --frozen— it installs exactly the versions in the committeduv.lockand fails rather than re-resolving. A resolver that quietly picks up a fresh upstream release is how a compromised package reaches a process holding your session.
Layout
Path | What |
| the whole server: guard, tools, JSON-RPC loop, CLI |
| launcher — execs the pinned venv's interpreter |
| the pin |
| venv, symlink, |
| 45 offline tests — guard, catalogue, protocol, CLI, hygiene |
| every tool against the real account; skips cleanly with no session |
Commands
tgread tools the catalogue, and what agents see of it
tgread <tool> [--flag value ...] run one tool, JSON on stdout
tgread <tool> --help that tool's arguments
tgread login interactive: API credentials, phone, login code, 2FA
tgread status who am I, is the session valid, are permissions sane
tgread logout revoke server-side, then delete locally
tgread check offline self-test of the read-only guard (no network)
tgread serve speak MCP over stdio — what Claude Code runsTwo test suites, split by what they can actually prove:
./test-tgread.sh # 45 tests, no network/session/credentials needed
./test-tgread-live.sh # every tool against your account; skips without a sessionThe offline suite covers the guard, the catalogue, the protocol and the CLI — the properties that must hold before this is pointed at an account. The live suite covers the half it structurally cannot: that a TL result unpacks the way the code assumes. It is read-only like everything else, so it is safe to re-run.
It earned its keep on the first run, catching get_reactions crashing with
BroadcastForbiddenError — broadcast channels expose per-emoji totals but not
who reacted. Telegram declining a read is a normal answer, so every tool now
funnels through one seam that turns any RPC refusal into a readable error.
WriteBlocked is deliberately not caught there: that one really is a bug.
login and logout use a plain client, not the guarded one: the guard exists
to constrain the agent, not the human at the terminal establishing or
revoking the session. Everything the MCP server touches goes through
ReadOnlyClient.
Available Tools
15 toolschat_infoA
Metadata for one chat: kind, member count, description, verification flags. Useful for judging whether a channel is what it claims to be. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It explicitly marks the operation as 'Read-only', which is the key behavioral trait an agent needs for safety. It also summarizes the returned metadata fields, though it does not discuss auth requirements or error 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?
Two short sentences with zero filler. The core operation and returned fields are front-loaded, and the use case sentence adds genuine value rather than repeating the name or schema.
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 single-parameter, read-only metadata tool with no output schema, the description is complete enough: it states what is returned, that it is read-only, and when to use it. An agent can correctly select and invoke it without additional context.
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 already documents the single chat parameter with 100% coverage ('@username, t.me link, or numeric id'), so the description adds no additional parameter meaning. Baseline 3 is appropriate since the schema handles the parameter semantics.
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 identifies the operation as retrieving metadata for a single chat and enumerates specific fields ('kind, member count, description, verification flags'), which distinguishes it from list-oriented siblings like list_chats. However, it does not explicitly contrast with read_chat, so sibling differentiation is incomplete.
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 phrase 'Useful for judging whether a channel is what it claims to be' provides a clear, concrete use case for verification and trust checks. It does not name explicit alternatives or state when not to use it, but the intended context is explicit enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
common_chatsA
Groups and channels the account shares with a given user. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | @username or numeric id of the user. | |
| limit | No | Max chats, capped at 100. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It explicitly states 'Read-only,' which is a meaningful behavioral guarantee of no side effects, and the scoping 'account shares' clarifies ownership semantics. It does not mention response shape or pagination, but those are less critical for a simple read accessor.
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 short sentences carry the entire description with zero filler. The resource and scope come first, and the behavioral qualifier 'Read-only' follows immediately.
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 two-parameter, no-output-schema tool, the description plus schema is nearly sufficient. The output is implicitly a list of chats, which is natural from the name and description. A small gap is the absence of any mention of ordering or what 'common' means beyond shared membership, but neither is likely to block 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 coverage is 100%, so the schema fully documents both user and limit. The description adds only the vague echo 'with a given user,' which maps to the user parameter but provides no additional semantic value 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?
The description clearly identifies the resource: groups and channels shared with a specific user, which distinguishes it from siblings like list_chats and chat_info. It lacks an explicit verb like 'lists' or 'returns,' so the operation is inferred rather than stated.
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 phrase 'with a given user' implies this tool is for when a user relationship is the filter, but it never explicitly says when to choose it over list_chats or search_public_chats. No alternatives or exclusions are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_messagesA
Fetch specific messages by id, or the conversation around one — use around with context to see what a search hit was replying to. Deleted or inaccessible ids are simply absent from the result. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Explicit message ids, at most 200. | |
| chat | Yes | @username, t.me link, or numeric id from list_chats. | |
| around | No | Centre the window on this message id instead. | |
| context | No | Messages either side of `around`. Default 5, max 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It explicitly states 'Read-only' and discloses absent-id behavior ('Deleted or inaccessible ids are simply absent from the result'). These go beyond the schema and add useful operational knowledge. It does not mention auth or rate limits, but for a simple read tool these two disclosures are reasonably complete.
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, each earning its place: the first defines the purpose and use case, the second discloses behavior and safety. The key points are front-loaded and there is zero filler.
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 4 parameters and no output schema, the description covers purpose and some behavior, but it does not specify what the result looks like or how to handle ambiguous inputs (e.g., if both 'ids' and 'around' are provided, or if neither is provided beyond the required 'chat'). These gaps could cause an agent to call it incorrectly, so it is adequate but not 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 baseline is 3. The description adds meaning to 'around' and 'context' by explaining their purpose ('see what a search hit was replying to'), and it clarifies 'ids' behavior with the absent-ids note. This is more than the schema provides and helps the agent understand parameter intent.
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 and resource ('Fetch specific messages by id') and immediately contrasts it with a conversation-window mode ('or the conversation around one'). It also ties the 'around' usage to a search-message context, which clearly differentiates it from sibling tools like read_chat or search_messages without needing to open their 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 gives a concrete scenario: 'use `around` with `context` to see what a search hit was replying to.' This tells the agent when to use the tool (following up on a search result). It does not explicitly list exclusions or alternative names, but the 'specific messages' framing implies it is not for bulk reading, so context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reactionsA
Who reacted to a message, and with which emoji. Read-only — it adds no reaction.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id from list_chats. | |
| limit | No | Max reactors, capped at 200. Default 100. | |
| message_id | Yes | The message to inspect. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and it directly discloses the key safety-relevant trait: 'Read-only — it adds no reaction.' This rules out accidental side effects, though it doesn't cover other behavioral aspects such as auth requirements or rate limits.
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 short sentences deliver the core purpose first and then the read-only caveat. There is no filler, no repetition of schema details, and every word adds value.
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 retrieval with three well-documented parameters, the description is nearly sufficient: it covers the outcome and the no-side-effect guarantee. It lacks a small amount of context such as auth prerequisites, but that is minor given the schema coverage and low tool 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 description coverage is 100%, so the schema already explains chat, limit, and message_id. The description adds no parameter-level detail beyond implying that message_id targets the message whose reactions are returned, so it meets baseline but doesn't exceed it.
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 is clear about what the tool does, identifying the resource (reactions on a message) and the data returned (who reacted and with which emoji). It doesn't explicitly differentiate from siblings or use an imperative verb, so it stops short of a 5.
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?
There is no explicit guidance on when to use this tool versus alternatives, and no alternative is named. The intended usage is only implied by the phrase 'Who reacted to a message', so an agent must infer when this is the right tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_chatsA
List the Telegram chats, channels and groups this account can see, newest activity first. Use it to find the id or @username to pass to the other tools. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Restrict to one kind of chat. Default: all. | |
| limit | No | Max chats to return. Default 50. | |
| query | No | Case-insensitive filter over title and @username. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full behavioral burden. It explicitly states 'Read-only,' which is a meaningful safety disclosure, and adds ordering ('newest activity first') and scope ('this account can see'). It does not mention auth or rate limits, but those are less critical for a read-only listing operation.
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 wasted words. The core action and scope are front-loaded, followed by the practical use case and a concise safety note.
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 is complete enough for a low-complexity list tool: it gives purpose, ordering, scope, safety, and a hint about the output fields (id/@username). It does not describe the full response shape, but there is no output schema and the parameters are simple and well documented.
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 kind, limit, and query are already fully documented. The description adds no parameter-specific detail beyond the schema, which is acceptable at the baseline for fully covered parameters.
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 ('List'), a clear resource ('Telegram chats, channels and groups this account can see'), and a concrete purpose ('find the id or @username to pass to the other tools'). It distinguishes itself from search_public_chats by scoping to chats the account can see, and from search_messages by listing chats rather than messages.
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 explicitly says when to use this tool: before calling other tools that need a chat id or @username. It does not explicitly name alternatives or state when not to use it, but the usage context is clear enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsA
The account's saved contacts, optionally filtered by name. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max contacts, capped at 500. Default 100. | |
| query | No | Case-insensitive filter over name and @username. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'Read-only', which is a useful behavioral disclosure. However, with no annotations provided, the description carries the full burden, and it does not disclose other behavioral traits such as pagination behavior, whether the query filter matches partial strings, or how the limit cap of 500 behaves. The read-only note adds value but leaves gaps.
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 with no wasted words. The core purpose is front-loaded, and the read-only note is placed efficiently. 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?
For a simple read-only list tool with two optional parameters and full schema coverage, the description is mostly adequate. However, it lacks any mention of return format or pagination behavior, and with no annotations or output schema, a bit more context about what the response contains would make it 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%, so the schema already documents both parameters. The description adds the phrase 'optionally filtered by name', which aligns with the query parameter but does not add meaning beyond the schema's 'Case-insensitive filter over name and @username'. 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 clear verb-resource pair: 'list' the account's 'saved contacts', and adds the optional name filter. It is distinguishable from siblings like list_chats and list_members because it targets saved contacts, though it does not explicitly name a sibling to differentiate from.
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 implies usage context: it is a read-only listing of saved contacts with an optional filter. It does not explicitly state when to use this over alternatives like list_chats or search_public_chats, nor does it provide exclusions, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersA
The account's chat folders (Telegram 'dialog filters') and their sizes. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly states 'Read-only,' which is valuable, and scopes the operation to the account. However, it does not disclose return format, pagination, or any access/authentication requirements.
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 a single sentence that conveys the resource, scope, output content, and read-only nature with no wasted words. It is front-loaded with what the agent needs most.
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 zero-parameter, read-only listing tool, the description is largely sufficient: it states what is listed and that it is safe. It could be more complete by explaining the output structure, but the simplicity of the tool lowers that requirement.
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 tool has zero parameters, so there is no parameter semantics to clarify. The schema coverage is 100% and the description adds no parameter expectations, which 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 identifies the resource (the account's chat folders, also called Telegram dialog filters) and the information returned (their sizes). It is unambiguous and distinct from sibling tools like list_chats or list_contacts, though it does not explicitly name a sibling to differentiate from.
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 no guidance on when to use this tool versus alternatives such as list_chats or read_chat. It gives context (account-level, read-only) but no exclusions, prerequisites, or selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_mediaA
Messages in a chat filtered by attachment kind, using Telegram's own server-side index. Returns metadata and captions only — there is no download tool. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id from list_chats. | |
| kind | Yes | Which attachment kind to list. | |
| limit | No | Max messages, capped at 200. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden. It explicitly states the tool is read-only, returns only metadata and captions, and clarifies that there is no download tool. This gives an agent important safety and capability expectations, though it does not cover auth or rate-limit details.
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 tight sentences with no filler. The core purpose and filtering mechanism are front-loaded, followed by key output and limitation information.
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 parameterized tool with full schema coverage, this is complete. It clarifies the return content and the lack of a download capability, which are the main contextual facts an agent needs before calling 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?
Schema description coverage is 100%, and the schema already documents chat, kind, and limit well. The description adds little parameter-specific meaning beyond the overall intent, 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 states a specific verb and resource: listing messages in a chat filtered by attachment kind. It is clear about the scope and result, but it does not explicitly differentiate from sibling tools like search_messages or get_messages, so it stops short of full sibling distinction.
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: this is for attachment-kind filtering and uses Telegram's server-side index. It does not explicitly name alternatives or state when not to use it, but it conveys a clear use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_membersA
Participants of a group or channel, searchable, with their roles. Broadcast channels hide this from non-admins — admins_only still works there. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id from list_chats. | |
| limit | No | Max members, capped at 500. Default 100. | |
| query | No | Filter by name or @username. | |
| admins_only | No | Only creators, admins and their ranks. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the safety burden and does state 'Read-only.' It also discloses the non-admin visibility restriction in broadcast channels and notes that admins_only filtering still works there. It doesn't mention errors, pagination, or auth details, but this is solid coverage for a read-only listing tool.
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 and front-loaded: the core function comes first, followed by a high-value edge case and a clear read-only safety note. Every sentence earns its place without 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 simple 4-parameter read-only list tool, the description covers what it returns conceptually (members with roles), searchability, and the key broadcast-channel restriction. No output schema exists, but the description gives enough context for an agent to call it correctly; it could add explicit return-shape info, though that is not critical here.
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 well documented. The description adds marginal context by saying results are searchable and include roles, and it clarifies admins_only behavior in broadcast channels, but it does not meaningfully deepen per-parameter understanding.
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 identifies the resource (participants of a group or channel) and adds useful traits: searchable and with roles. However, it is phrased as a noun fragment rather than an explicit verb+resource statement, and it doesn't explicitly differentiate from siblings like chat_info or list_chats.
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 implies when to use the tool — to get/search group or channel participants — and provides a meaningful broadcast-channel caveat about non-admin visibility. It does not name alternatives or explicitly state when not to use this tool in favor of a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_pinnedB
Pinned messages in a chat — usually its rules, links or announcements. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id from list_chats. | |
| limit | No | Max messages, capped at 200. Default 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden and does state 'Read-only', which is the most important safety-relevant trait. It does not disclose ordering, pagination, or other return behavior, but for a simple read-only list the missing detail is not severe.
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 extremely compact, front-loading the resource and its read-only nature with no filler. Minor grammatical polish could improve readability, but it is efficient overall.
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?
Adequate for a simple read-only list: the resource type and safety posture are clear, and parameters are fully documented in the schema. Since there is no output schema, an explicit statement about the returned message list or pagination behavior would make it more 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%, so the baseline of 3 applies. The description adds no parameter-specific detail, but the schema already documents the chat identifier and limit parameter adequately.
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 identifies the resource as pinned messages within a chat and characterizes them as rules, links, or announcements. It does not use an explicit verb like 'List', but 'Read-only' and the tool name make the retrieval intent clear.
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 phrase 'usually its rules, links or announcements' gives implied context for when pinned messages are relevant. However, it does not explicitly route an agent away from sibling tools like read_chat, get_messages, or search_messages, so the usage guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_chatA
Read recent messages from one channel, group or conversation, returned oldest-first. Accepts a @username, a t.me link, or a numeric id from list_chats. Read-only: reading here does not mark anything as read.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id. | |
| limit | No | Max messages, capped at 200. Default 30. | |
| since | No | Stop once messages are older than this ISO-8601 date. | |
| before | No | Start from this ISO-8601 date, going backwards. | |
| after_id | No | Only messages newer than this id. | |
| before_id | No | Only messages older than this id — page backwards. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description carries the behavioral burden and does well: it explicitly says the operation is read-only and does not mark anything as read, and that results are returned oldest-first. It does not cover error behavior or authentication, but the safety profile is clear.
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, front-loaded with the core action and scope. Every clause adds value: what it reads, how results are ordered, what identifiers work, and the read-only guarantee.
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 is nearly complete for a read tool with fully documented parameters. It covers purpose, ordering, identifier forms, and side-effect safety. The only gap is not describing the return shape beyond 'messages,' but the schema and tool name provide enough context for 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 all six parameters. The description adds only minor context — the numeric id can come from list_chats — but otherwise repeats the chat identifier formats already in 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 uses a specific verb and resource: reading recent messages from exactly one channel, group, or conversation. This clearly differentiates it from sibling tools like list_chats (listing chats) and search_messages (searching across messages), even without naming them explicitly.
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 context is clear: use this tool to read recent messages from a single chat, and the accepted identifier formats are stated. However, it does not explicitly contrast with alternatives like get_messages or read_thread, nor does it state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_threadA
The replies under one post — a channel item's comment section, or a reply chain in a group. Only posts with a linked discussion group have one. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | Yes | @username, t.me link, or numeric id from list_chats. | |
| limit | No | Max replies, capped at 200. Default 50. | |
| message_id | Yes | The post whose replies you want. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations present, the description must carry the behavioral burden. It explicitly says 'Read-only,' which is a crucial safety signal, and it discloses a real limitation: not every post has a thread because a linked discussion group is required. It does not describe pagination, error responses, or whether nested replies are included, but those gaps are partially mitigated by the simple scope and the schema's limit parameter.
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 short sentences deliver the core definition, the two possible contexts, the linked-discussion prerequisite, and the read-only nature. There is no filler or redundant restatement of the tool name.
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 three-parameter read operation with a complete schema, the description covers the essential context: what is returned, where threads exist, and the read-only safety property. The lack of an output schema is partly offset by the phrase 'replies under one post,' though a bit more detail about response shape or limits would make it fully 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%, so the baseline is 3. The description reinforces that message_id identifies 'the post' and that the tool returns 'replies under one post,' but it adds no parameter-specific meaning beyond what the schema already states.
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 precisely defines the resource: replies under a single post, with concrete examples of where such threads exist (channel comment sections or group reply chains). This clearly differentiates read_thread from siblings like read_chat or get_messages, which operate at chat or message-list granularity.
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 contextual guidance: this tool is for reading replies to one specific post, not general chat content. It also states a key precondition—only posts with a linked discussion group have a thread—which helps an agent decide when read_thread is applicable. It does not explicitly name alternatives or when-not-to-use cases, so it stops 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_messagesA
Full-text search over message history. With chat, searches that one chat; without it, searches every chat this account can see. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| chat | No | Optional: restrict to one chat. | |
| limit | No | Max results, capped at 200. Default 30. | |
| query | Yes | Text to search for. | |
| since | No | Ignore messages older than this ISO-8601 date (global search only). | |
| before | No | Ignore messages newer than this ISO-8601 date (global search only). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation block is empty, so the description carries the burden of behavioral disclosure. It explicitly states 'Read-only', which tells the agent the operation is safe and non-mutating, and it clarifies that scope is limited to chats the account can see. It does not mention rate limits, pagination, or result ordering, but the read-only declaration covers the primary safety concern.
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, each earning its place: the core action, the scoping behavior, and the safety trait. The most decision-relevant information is front-loaded. No redundant filler.
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 search tool with five fully documented parameters, the description covers the main facts: what is searched, how scope changes, and that it is read-only. There is no output schema and the description does not describe the return format or sorting, but this is a minor gap given the tool's simplicity.
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 genuine meaning by explaining that `chat` scopes to one chat, while omitting it triggers a search across all visible chats—this behavioral nuance goes beyond the schema's 'restrict to one chat'.
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 the specific verb 'Full-text search' over 'message history', immediately clarifying the tool's core function. The description further distinguishes between scoped and global search, and 'this account can see' differentiates it from public-chat search 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?
Clearly explains when to use the tool with and without the `chat` parameter, giving direct scoping guidance. It does not explicitly name alternatives like search_public_chats or state exclusions, 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_public_chatsA
Search Telegram's public directory by name — finds channels and groups the account has never joined. Results are split into ones already known to this account and strangers. Read-only; does not join anything.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results, capped at 100. Default 20. | |
| query | Yes | Name or handle to look for. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It explicitly states 'Read-only; does not join anything', which is valuable for a public-directory search tool. It also discloses a behavioral nuance about result composition (known vs strangers), though it omits details like auth needs or rate limits.
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 tight sentences, front-loaded with the core purpose, followed by the key behavioral note. No filler or redundant restatement of the tool name.
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 two-parameter read-only search, the description covers what the tool does, who it targets, and a critical safety behavior. There is no output schema, but the known/stranger split is disclosed. Minor gaps remain around pagination and result shape, but they are not essential for invoking 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%, with both 'query' and 'limit' already documented. The description adds only that the search is by name, which aligns with 'query'. This is adequate but not additive 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 and resource: 'Search Telegram's public directory by name'. It clearly targets channels and groups the account has never joined, which distinguishes it from message search or listing already-known chats.
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: this is for searching public chats by name, and results are split into known and stranger entities. It does not explicitly name sibling alternatives or state when not to use it, but the context is strong enough to route most agents correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whoamiA
The Telegram account this server is signed in as. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Read-only' clearly signals that the tool performs no mutation, which is useful. However, it does not describe the return format or any edge cases, leaving some behavioral detail implicit.
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 clauses with no filler. It is front-loaded with the key identity information and then adds the read-only qualification, making it appropriately sized and efficiently 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?
For a zero-parameter tool, the description is essentially complete: it names the exact object (the signed-in Telegram account) and the safety profile. It stops short of describing the returned fields, but an agent can confidently invoke it without 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 tool has zero parameters and schema coverage is 100%, so there is no parameter detail for the description to add. The baseline of 4 applies because nothing is missing.
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 identifies what the tool reports: the Telegram account the server is signed in as. This distinguishes it from the sibling chat, message, and folder tools, though it lacks an explicit verb like 'Get' or 'Return'.
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 'Read-only' flag and 'this server is signed in as' scope imply a safe identity-lookup use case, but the description gives no explicit when-to-use guidance or alternative conditions. No sibling tool has the same purpose, so the omission is minor.
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.
15 tool updates
v0.1.0- First observed
chat_info - First observed
common_chats - First observed
get_messages - First observed
get_reactions - First observed
list_chats - First observed
list_contacts - First observed
list_folders - First observed
list_media - First observed
list_members - First observed
list_pinned - First observed
read_chat - First observed
read_thread - First observed
search_messages - First observed
search_public_chats - First observed
whoami
TDQS
Scored across 15 tools
Each tool targets a distinct read operation or resource: chat metadata, message lists, specific message fetches, threads, media, members, reactions, contacts, folders, and shared chats. Even the message-related tools (read_chat, get_messages, read_thread) are clearly separated by scope and purpose.
The vast majority of tools follow a clear verb_noun pattern (list_*, get_*, read_*, search_*), with three exceptions: chat_info, whoami, and common_chats. These deviations are minor and still readable, but they prevent a perfect consistency score.
At 15 tools, the server sits at the upper edge of the well-scoped range, and every tool earns its place for a read-only Telegram interface. The count is substantial but not bloated, with each tool covering a distinct aspect of the domain.
The read surface is remarkably comprehensive: chat enumeration, message retrieval, search, threads, pinned messages, media, members, reactions, contacts, folders, public directory search, and account info are all present. The only excluded capability, media downloading, is explicitly documented as out of scope, so there are no hidden gaps.
Maintenance
Related MCP Connectors
Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
Unofficial Telegram MCP server — read, search, reply and react in your own Telegram account.
Run a Telegram channel from your AI agent. Posts go out through your own bot, not your account.
Read-only Remote MCP for externally grounded AI agent trust receipts.
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
- FlicenseBqualityDmaintenanceEnables users to read, search, and manage Telegram messages in channels, groups, and private chats through MCP tools.8-
- AlicenseBqualityBmaintenanceProvides read-only access to Telegram chats, allowing AI agents to list chats, read messages, and search within chats via local MCP.14MIT
- AlicenseNot gradedqualityBmaintenanceEnables sending and reading Telegram messages through MCP, using either a bot or a personal user account.34 npmMIT