Skip to main content
Glama

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 shell

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

Restart Claude Code (or /mcp → reconnect) and the tools appear. To check:

claude mcp list        # tgread: … - ✔ Connected
tgread status          # account, session validity, tool surface

Those 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 + JSON

Any 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 serve

Why 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 (telethon, pyaes, pyasn1, rsa, itself)

MCP layer

mcp SDK → starlette, uvicorn, pydantic, pyjwt[crypto], opentelemetry

~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:#fff

Three layers, in increasing order of how much they'd survive a bug:

  1. No write tool is advertised. An injected instruction has nothing to call.

  2. Every payload is wrapped in an UNTRUSTED CONTENT banner naming it as data, not instructions — including chat titles and bios, which are attacker-controlled too.

  3. The transport guard. Telethon funnels every outbound TL request through TelegramClient._call (68 internal call sites reach it via await self(req), and __call__ is a one-line delegate). ReadOnlyClient overrides 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:#fff

tgread 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

whoami

which account this server is signed in as

list_chats

dialogs, filterable by name and by kind

search_public_chats

Telegram's public directory — finds channels never joined, split into already-known and strangers

list_folders

chat folders (dialog filters) and their sizes

list_contacts

saved contacts

Reading

Tool

What

read_chat

history, oldest-first, paged by message id or date

get_messages

specific ids, or a window around one — what a search hit was replying to

read_thread

replies under a post: a channel item's comment section

list_pinned

pinned messages — usually a chat's rules and announcements

Search

Tool

What

search_messages

full text, in one chat or across everything the account sees

list_media

history filtered by attachment kind, via Telegram's server-side index

People and metadata

Tool

What

chat_info

kind, member count, description, verified/scam flags

list_members

participants with roles, searchable, admins_only

get_reactions

who reacted to a message, and with what

common_chats

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_media returns captions and metadata; fetching attachments would mean writing attacker-chosen bytes to the agent's disk.

  • Reading never marks as read. messages.ReadHistory is 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_chats finds channels without joining them; get_reactions reads 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   # + research

Restricted 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

TGREAD_TOOLS here

KEY=VALUE

Advertised, denied

Claude Code settings.json → permissions.deny: ["mcp__tgread__search_messages"]

JSON

Per-subagent

.claude/agents/*.md frontmatter tools:

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-mcp is not this, and not chigwell's either. That PyPI name belongs to an unrelated project; passing TELEGRAM_API_ID / TELEGRAM_API_HASH to 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, holding config.env (0600) and tgread.session (0600). One directory to chmod, to back up, to destroy. tgread status flags it if the permissions drift.

  • install.sh uses uv sync --frozen — it installs exactly the versions in the committed uv.lock and 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

tgread.py

the whole server: guard, tools, JSON-RPC loop, CLI

bin/tgread

launcher — execs the pinned venv's interpreter

pyproject.toml, uv.lock

the pin

install.sh

venv, symlink, claude mcp add --scope user

test-tgread.sh

45 offline tests — guard, catalogue, protocol, CLI, hygiene

test-tgread-live.sh

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 runs

Two 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 session

The 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 tools
chat_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
userYes@username or numeric id of the user.
limitNoMax chats, capped at 100. Default 50.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idsNoExplicit message ids, at most 200.
chatYes@username, t.me link, or numeric id from list_chats.
aroundNoCentre the window on this message id instead.
contextNoMessages either side of `around`. Default 5, max 50.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id from list_chats.
limitNoMax reactors, capped at 200. Default 100.
message_idYesThe message to inspect.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
kindNoRestrict to one kind of chat. Default: all.
limitNoMax chats to return. Default 50.
queryNoCase-insensitive filter over title and @username.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax contacts, capped at 500. Default 100.
queryNoCase-insensitive filter over name and @username.

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id from list_chats.
kindYesWhich attachment kind to list.
limitNoMax messages, capped at 200. Default 50.

TDQS

A4.1/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id from list_chats.
limitNoMax members, capped at 500. Default 100.
queryNoFilter by name or @username.
admins_onlyNoOnly creators, admins and their ranks.

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id from list_chats.
limitNoMax messages, capped at 200. Default 50.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id.
limitNoMax messages, capped at 200. Default 30.
sinceNoStop once messages are older than this ISO-8601 date.
beforeNoStart from this ISO-8601 date, going backwards.
after_idNoOnly messages newer than this id.
before_idNoOnly messages older than this id — page backwards.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatYes@username, t.me link, or numeric id from list_chats.
limitNoMax replies, capped at 200. Default 50.
message_idYesThe post whose replies you want.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
chatNoOptional: restrict to one chat.
limitNoMax results, capped at 200. Default 30.
queryYesText to search for.
sinceNoIgnore messages older than this ISO-8601 date (global search only).
beforeNoIgnore messages newer than this ISO-8601 date (global search only).

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results, capped at 100. Default 20.
queryYesName or handle to look for.

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 15 tool updatesv0.1.0
    • First observedchat_info
    • First observedcommon_chats
    • First observedget_messages
    • First observedget_reactions
    • First observedlist_chats
    • First observedlist_contacts
    • First observedlist_folders
    • First observedlist_media
    • First observedlist_members
    • First observedlist_pinned
    • First observedread_chat
    • First observedread_thread
    • First observedsearch_messages
    • First observedsearch_public_chats
    • First observedwhoami

TDQS

A4/5.0

Scored across 15 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to interact with Telegram accounts through MCP, supporting messaging, contacts, groups, media, and admin functions.
    4
    Apache 2.0
  • F
    license
    B
    quality
    D
    maintenance
    Enables users to read, search, and manage Telegram messages in channels, groups, and private chats through MCP tools.
    8
    -
  • A
    license
    B
    quality
    B
    maintenance
    Provides read-only access to Telegram chats, allowing AI agents to list chats, read messages, and search within chats via local MCP.
    14
    MIT