Lemma Telepath
Server Details
Search, read and reply to your Telegram Business chats, transcribed voice included.
- Status
- Healthy
- Uptime
- 85.1% over 41 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- Telepath — Telegram Connector
- Claude
- Lemma Telepath
TDQS
Scored across 34 tools
Most boundaries are explicitly carved out (bot DMs vs business chats, get_photo vs show_photo, reminders vs scheduled messages), but the 34-tool surface has several near-neighbors that require careful reading. Notably, telegram_create_post and telegram_send_media both begin with the same AI voice-message instructions, making their actual roles genuinely confusable.
The set mostly follows predictable domain prefixes plus verb_noun naming, such as kb_create_note, telegram_send_message, and telegram_list_scheduled_messages. The bot DM tools deviate from the pattern with telegram_bot_direct_messages and telegram_bot_dm_react, but overall naming remains readable and grouped by domain.
34 tools is heavy for this surface, with many separate tools for closely related Telegram actions such as photo display, photo reading, bulk photo reading, scheduled-message management, and post editing. Several could be consolidated without losing capability.
The core domains are well covered: notes have full CRUD/search, reminders have create/list/cancel, and Telegram supports reading, searching, sending, scheduling, editing posts, deleting posts, reactions, and media. Minor gaps remain, such as retracting a normal non-channel message, forwarding a message, and editing an existing reminder rather than cancelling and recreating it.
Available Tools
34 toolscancel_reminderCancel a reminderADestructiveIdempotentInspect
Cancel a specific reminder at the user's request, using its id from list_reminders. Keeps any linked task. Available regardless of the plan or creation allowance; cancellation does not restore the daily creation allowance. Does not recall an already sent message; an in-progress delivery cannot be guaranteed cancelled. Repeated cancellation is safe.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Reminder id, not the numeric task id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations: it discloses that linked tasks are kept, the daily creation allowance is not restored, an already-sent message is not recalled, in-progress delivery cannot be guaranteed cancelled, and repeated cancellation is safe. Those are exactly the edge cases an agent needs before a destructive call.
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?
Four short sentences, each carrying a distinct fact (source of id, task preservation, allowance, delivery limits, idempotency) with no repetition. Slightly dense but nothing wasted.
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 one-parameter mutation tool with no output schema, it covers safety, side effects, allowance implications and idempotency. An agent has everything required to call it correctly and to warn the user about limitations.
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% and the schema already clarifies that the id is the reminder id and not the numeric task id. The description only adds the provenance ('from list_reminders'), so the baseline of 3 is right.
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 ('Cancel a specific reminder') and scopes it to a single reminder identified by id, which cleanly separates it from list_reminders and create_reminder. An agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Says to use it 'at the user's request, using its id from list_reminders,' which both names the trigger and routes the agent to the sibling that supplies the id. It lacks an explicit when-not-to-use statement, keeping it just below the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_reminderCreate a reminderADestructiveInspect
Schedule one reminder message from the Telepath bot to the authenticated account owner, only when requested or accepted by that user. Does not create a Notes task and cannot message another recipient. Clarify the reminder text, time and timezone when ambiguous. Uses the same daily creation allowance as task reminders. Returns entitlement_required without scheduling when the allowance is exhausted. Confirm scheduling only after success; scheduled is not delivered. Existing reminders stay scheduled when a plan ends.
| Name | Required | Description | Default |
|---|---|---|---|
| at | Yes | Exact future ISO 8601 time with Z or UTC offset; clarify ambiguous dates and times. | |
| text | Yes | Reminder text authorized by the user, in their language. | |
| timezone | Yes | User-confirmed IANA timezone, e.g. Europe/Samara. | |
| request_id | No | Unique id for this creation. Reuse the same id and details on a retry to avoid duplicate reminders. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only flag mutation and non-idempotency; the description adds substantial behavior the annotations cannot convey: the shared daily creation allowance, the specific `entitlement_required` failure with no scheduling, the "scheduled is not delivered" distinction, and that existing reminders survive plan termination. These are exactly the side-effect and failure-mode facts an agent needs before calling.
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?
Front-loaded with purpose and recipient scope, then boundaries, then failure behavior. Seven short sentences with no filler, though the allowance, entitlement, and plan-expiry points could be merged into fewer clauses without loss.
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 mutating tool with no output schema, the description covers what an agent needs: authorization precondition, ambiguity handling, dedupe expectations, quota failure signal, and the confirmation contract. Nothing material about invoking it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter including the `request_id` retry key is already documented in structured data. The description reinforces the ambiguity-clarification expectation for text/time/timezone but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
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 (schedule a reminder message), the actor (Telepath bot) and the recipient scope (authenticated account owner only). It also explicitly distinguishes the tool from a close sibling ("Does not create a Notes task"), so an agent can separate it from kb_create_note without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit gating condition ("only when requested or accepted by that user") plus two negative boundaries (no Notes task, no other recipient). It also tells the agent how to proceed under ambiguity ("Clarify the reminder text, time and timezone when ambiguous") and how to report outcomes ("Confirm scheduling only after success").
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_create_noteCreate a noteADestructiveInspect
Save a new note to your knowledge base. Titles are unique; if one exists, use kb_update_note instead. The body is markdown and may reference other notes with [[Title]]. Tags help you find it later. An optional reminder on a task schedules a future Telegram bot message to the account owner; only set it with user authorization. It shares the creation allowance with standalone reminders; entitlement_required means the save did not happen.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | Markdown body. May contain [[links]] to other notes. | |
| tags | No | Tags, e.g. ["work", "idea"]. | |
| type | No | Page type. Existing pages keep their type if omitted. Only tasks support attached reminders. Standalone reminders use create_reminder. | |
| title | Yes | Unique title for the note. | |
| reminder | No | Only with user authorization: schedule one Telegram bot DM to the account owner. Null cancels; omitted preserves the existing reminder. Never infer a reminder from a task or date alone. | |
| task_status | No | Task status. Completing a task cancels its pending reminder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare mutation, destructive, non-idempotent and open-world behavior, so the bar is lower, yet the description still adds non-obvious facts: titles are unique so duplicates fail rather than overwrite, reminders dispatch a real Telegram DM to the account owner, and 'entitlement_required' signals the save did not happen. It stops short of stating what a successful save returns or whether storing a reminder is irreversible once scheduled.
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?
Five short sentences, front-loaded with the core action and the duplicate-title exception. A couple of clauses echo the schema's own parameter descriptions, which is mild redundancy but not bloat.
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 six-parameter mutation tool with no output schema, it covers the important traps: uniqueness collision, reminder authorization, shared quota, and a failure sentinel. The main omission is what a successful creation returns (e.g., a note identifier) so the agent can chain into kb_update_note or kb_get_note.
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 alone documents body/[[links]], tags and the type enum, and the description largely restates the markdown-link and tags points. Its marginal additions (shared creation allowance, entitlement_required) are behavioral rather than parameter-level detail.
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?
Opens with a specific verb and resource ('Save a new note to your knowledge base') and immediately differentiates itself from the sibling kb_update_note by the uniqueness rule. An agent can tell exactly which tool handles new-note creation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the branch condition ('Titles are unique; if one exists, use kb_update_note instead') and names the sibling to use in that case. It also gates the reminder feature on user authorization, so the agent knows both when to use this tool and when to defer or ask.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_delete_noteDelete a noteADestructiveInspect
Permanently delete a note from your knowledge base, by id or exact title. This cannot be undone. Deleting a task also cancels its pending reminder.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Note id. | |
| title | No | Exact note title. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare destructiveHint=true, but the description adds meaningful context: the deletion is permanent and cannot be undone. It also discloses an additional side effect, namely that deleting a task cancels its pending reminder, which is valuable beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no wasted text. The irreversible nature and deletion target are front-loaded, and the side effect is appended where it is most useful.
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 destructive tool with full schema coverage and annotations, the description covers the key facts: permanence, lookup by id or exact title, and the reminder side effect. It could be slightly more complete by explicitly stating that exactly one identifier should be provided, but the core context is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented by the input schema. The description reinforces that id or exact title is used, but it does not clarify edge cases such as what happens if both or neither are supplied, which matters because neither parameter is required.
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: permanently delete a note from the knowledge base. It also clarifies that the note can be identified by id or exact title, which distinguishes it from read/update siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the delete operation clear and explains the two lookup modes, but it does not explicitly say when to use this versus kb_update_note or kb_get_note, nor does it discuss exclusions or prerequisites. Usage is implied by the destructive nature rather than explicitly guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_get_noteRead a noteARead-onlyIdempotentInspect
Read one note in full — its body, tags, the notes it links to via [[Title]], and the notes that link back to it. Address it by id or by exact title.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Note id. | |
| title | No | Exact note title, if you do not have the id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint, idempotentHint, destructiveHint=false), so the bar is lower, and the description earns credit by disclosing the actual return payload including the link graph and backlinks. It stops short of stating what happens when no note matches or when id and title disagree.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight clauses, front-loaded with the core action and then the return contents, with zero filler. Every phrase carries information an agent can use.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description correctly carries the burden of describing what comes back (body, tags, links, backlinks) and how to address the note. Only edge behavior — not-found handling and id/title precedence — is left unstated for a tool whose required-parameter count is zero.
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 'id' and 'title' including the 'exact title, if you do not have the id' caveat. The description restates the id-or-exact-title addressing rule without adding precedence or fallback semantics, so baseline 3 applies.
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 gives a specific verb and resource ('Read one note in full') and even enumerates the payload: body, tags, outbound [[Title]] links, and backlinks. That is enough to separate it from kb_list_notes/kb_search_notes by implication, but it never names those siblings or states the contrast 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?
It tells the agent how to address the note ('by id or by exact title') but never says when to reach for this tool instead of kb_search_notes or kb_list_notes. Usage is inferable — fetch a single known note — but not stated, and there are no exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_list_notesList notesBRead-onlyIdempotentInspect
List notes, newest first. Optionally only those with a given tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Only notes with this tag. | |
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the ordering guarantee ('newest first'), which is genuine value beyond the annotations, but says nothing about pagination or result limits despite the 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, zero waste, with the core action and ordering front-loaded before the optional filter. Appropriately sized for the tool's simplicity.
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 annotations covering safety and no output schema, the description is largely adequate. The unaddressed limit/pagination gap and lack of sibling differentiation keep it at minimum viability.
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 only 50%: 'tag' is documented in the schema and merely restated in the description, while 'limit' is undocumented in both schema and description, including no mention of its 1-200 bounds. The description adds no parameter meaning beyond what the schema already provides.
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?
Specific verb+resource ('List notes') with a stated ordering ('newest first'), so an agent knows exactly what it returns. However, it does not differentiate itself from the close sibling kb_search_notes, leaving the boundary to inference.
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 'Optionally only those with a given tag' hints at the tag-filter use case, but there is no guidance on when to use this versus kb_search_notes or kb_get_note. No exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_search_notesSearch your notesARead-onlyIdempotentInspect
Full-text search over your personal knowledge base (notes you keep here). The last word is prefix-matched. Optionally restrict to a tag. Nothing leaves the server. With an empty query it lists recent notes.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Restrict to notes carrying this tag. | |
| limit | No | ||
| query | Yes | Words to search for. Empty lists recent notes. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld=false, non-destructive), and the description adds behavior the annotations do not: the last word is prefix-matched, results can be tag-restricted, and 'nothing leaves the server' discloses locality. It does not cover result ordering or pagination, which is a minor gap.
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?
Four short sentences, each carrying distinct information (what it searches, prefix rule, tag filter, locality, empty-query fallback), with the core purpose front-loaded and no 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?
With no output schema and a partially documented input schema, the description supplies the search semantics an agent needs to call it correctly. It is nearly complete, though it omits how results are ordered and whether the limit defaults to anything.
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 67%; the description compensates by explaining the prefix-match rule for the query's last word and restating the empty-query semantics that the schema also documents. The 'limit' parameter is left unexplained in both places, which keeps this below a 5.
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 ('Full-text search over your personal knowledge base'), which is enough to separate it from kb_get_note and kb_create_note. It does not explicitly contrast itself with the closer sibling kb_list_notes, 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?
It gives a concrete usage rule — an empty query lists recent notes — which tells the agent how this tool behaves at its boundary and implicitly when it overlaps with kb_list_notes. It never explicitly names an alternative tool or a when-not condition, so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
kb_update_noteUpdate a noteADestructiveInspect
Change an existing note. Address it by id or exact title. Pass only what changes. Set append=true to add the given body below what is already there — the natural 'add this to my notes' path — otherwise the body is replaced. An optional reminder schedules one future Telegram bot message to the owner; new schedules share the standalone creation allowance and may return entitlement_required; null cancels it. Completing or changing a task to another type cancels its pending reminder.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Note id. | |
| body | No | New body, or text to append. | |
| tags | No | Replace the tag list. | |
| type | No | Page type. Existing pages keep their type if omitted. Only tasks support attached reminders. Standalone reminders use create_reminder. | |
| title | No | Current exact title (to find it), or the new title. | |
| append | No | Append body instead of replacing it. | |
| reminder | No | Only with user authorization: schedule one Telegram bot DM to the account owner. Null cancels; omitted preserves the existing reminder. Never infer a reminder from a task or date alone. | |
| task_status | No | Task status. Completing a task cancels its pending reminder. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that omitted body is destroyed/replaced unless append=true, that reminders are one-shot Telegram DMs requiring user authorization, that new schedules consume the standalone creation allowance and may return entitlement_required, and that completing or retyping a task cancels its pending reminder. This is exactly the destructive and side-effect context destructiveHint=true only hints at.
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?
Five tightly packed sentences, front-loaded with the core action and addressee before the append, reminder, and task caveats. Dense but every sentence carries operational information; only the "natural 'add this to my notes' path" phrasing is decorative.
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 an 8-parameter, zero-required, nested-reminder mutation with no output schema, the description covers the destructive default, the reminder lifecycle, and entitlement failure mode. Minor gaps remain: no guidance on failure/ambiguity handling (e.g., duplicate titles) or what a successful update returns, though the latter is arguably outside its scope.
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, but the description adds real meaning: the append/replace dichotomy for body, id-vs-exact-title addressing, and the null-cancels / omitted-preserves distinction plus reminder cancellation on task completion. It stops short of covering tag replacement semantics or required reminder fields, which the schema already handles.
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 ("Change an existing note") and immediately specifies addressing by id or exact title, which distinguishes it from kb_create_note and kb_get_note. It also names the task/reminder interaction, so the agent can tell this mutation apart from create_reminder and cancel_reminder.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly explains append=true as the "add this to my notes" path versus default body replacement, and routes standalone reminders to create_reminder. It does not explicitly say when to prefer kb_create_note for new notes or how to disambiguate a title that matches multiple notes, but context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remindersList remindersARead-onlyIdempotentInspect
List the account owner's standalone and task reminders, their text, scheduled time and delivery status. No messages are sent. Available regardless of the plan or creation allowance. By default excludes cancelled and completed reminders. scheduled is not delivered; delivered means Telegram accepted the message, not that the owner read it; uncertain must not be treated as delivered.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavior beyond the annotations: no messages are sent, the tool is unaffected by plan or creation allowance, cancelled/completed reminders are excluded by default, and the delivery statuses carry precise semantics ('scheduled is not delivered', 'delivered means Telegram accepted the message, not that the owner read it', 'uncertain must not be treated as delivered'). That last point is exactly the kind of interpretation rule an agent cannot infer from readOnlyHint/idempotentHint.
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?
Front-loaded with the resource and returned fields, and each sentence carries information (scope, side-effect freedom, availability, default filtering, status semantics). The status-semantics sentence is dense and names values without naming the parameter they belong to, which costs a bit of scanability.
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?
There is no output schema, and the description compensates by naming the returned fields and the meaning of each delivery status, which is the main thing an agent needs to interpret results. The main gap is that pagination via limit/offset and total-count behavior are not described for what is a list endpoint.
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 0%, so the description must compensate: it does explain three enum values (scheduled, delivered, uncertain) and the default exclusion of cancelled and done, which effectively documents the status parameter. It says nothing about limit or offset, leaving pagination semantics entirely to inference from the bare numeric bounds.
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 ('List the account owner's standalone and task reminders') and names the fields returned (text, scheduled time, delivery status), which no sibling tool does. It does not explicitly contrast itself with cancel_reminder or create_reminder, but the read-only listing scope differentiates it well enough in practice.
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?
'By default excludes cancelled and completed reminders' implies that a status filter is needed to see those, and 'available regardless of the plan or creation allowance' tells the agent it won't be blocked. However, there is no explicit routing guidance (e.g. 'use cancel_reminder to cancel', or which status value to pass to include completed items), so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_bot_direct_messagesMessages sent to the bot's own account directlyARead-onlyIdempotentInspect
Messages someone sent straight to the bot's account, outside the owner's Business connection — a different chat than the owner's business line, kept separate because it is a different conversation with the same chat_id. Not covered by telegram_get_messages or telegram_search_messages.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds a useful behavioral nuance — this is a different conversation that can share the same chat_id, kept separate deliberately — but says nothing about return shape, ordering, or pagination 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?
A single dense sentence that front-loads the identity of the resource and then the exclusions. It is efficient with no filler, though the nested 'kept separate because it is a different conversation with the same chat_id' clause is slightly convoluted.
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?
There is no output schema, so the description carries the burden of return expectations, and it only implies 'messages' without describing fields, ordering, or how limit interacts with paging. For a one-parameter read tool the conceptual explanation is solid, but the retrieval mechanics are left unstated.
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 single parameter (limit, 1-100) has 0% schema description coverage and is never mentioned in the description, so neither structured data nor prose explains its meaning, default, or effect. With coverage this low the description is expected to compensate and it does not.
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 resource and scope: messages sent straight to the bot's own account, explicitly distinct from the owner's Business connection. It names the two sibling tools (telegram_get_messages, telegram_search_messages) that do NOT cover this case, so an agent can distinguish it without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly signals the routing condition by stating this chat is a separate conversation not covered by telegram_get_messages or telegram_search_messages, which effectively tells the agent when to pick this tool. It stops short of an explicit trigger phrase (e.g. 'use when the user asks about DMs sent to the bot'), and it doesn't name the other bot-DM siblings (telegram_bot_dm_reply/react) as related actions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_bot_dm_reactReact in the bot's own DMADestructiveIdempotentInspect
Put an emoji reaction, as the bot, on a message in the bot's OWN direct chat — one returned by telegram_bot_direct_messages. That inbox is stored separately from the main archive and this tool reaches only it: it does not react in groups, and it cannot react in your 1:1 business chats. Only Telegram's standard reaction emoji are accepted; omit emoji to remove one. The other person is notified, so confirm the message and emoji with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| big | No | Play the big animation for the recipient. | |
| emoji | No | The reaction emoji. Leave out to remove it. | |
| chat_id | Yes | chat_id from telegram_bot_direct_messages. | |
| message_id | Yes | message_id from telegram_bot_direct_messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (destructiveHint=true, idempotentHint=true, openWorldHint=true), and the description adds genuinely new behavior: the other person is notified, only standard Telegram emoji are accepted, and omitting emoji removes the reaction. The notification side effect is exactly the kind of consequence an agent needs before acting.
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?
Four sentences, all information-bearing, with the scope constraint front-loaded before the caveats. Slightly dense, but nothing is redundant with the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers scope, side effects, parameter edge cases, and a user-confirmation safeguard. An agent has everything needed to call it correctly and safely.
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 baseline is 3. The description adds a constraint not in the schema — only standard reaction emoji are accepted — and reinforces the omit-to-remove semantics for `emoji`, going modestly beyond the structured fields.
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 (react) and resource (a message in the bot's OWN DM), and immediately scopes it against the main archive and other chat types. An agent can distinguish it from telegram_set_reaction or telegram_bot_dm_reply without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: only chats returned by telegram_bot_direct_messages, explicitly not groups and not 1:1 business chats, plus a 'confirm with the user first' instruction. It never names the sibling tool to use for the excluded chat types (e.g. telegram_set_reaction), so the routing guidance is one step short of fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_bot_dm_replyReply in the bot's own DMADestructiveInspect
Reply to someone in the bot's OWN direct chat — the messages from telegram_bot_direct_messages — sent as the bot. This is a different conversation from that person's business chat with you, even though the chat_id is the same, so it is a separate tool on purpose: use this for the bot's DM line, and telegram_send_message for your business chats. The other person sees it and is notified, so confirm the message with the user first.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The reply, sent as the bot. | |
| chat_id | Yes | chat_id from telegram_bot_direct_messages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, openWorldHint=true, idempotentHint=false, so the safety profile is covered. The description adds genuinely new behavioral context: the recipient sees and is notified, so confirmation is required, and that the chat_id overlaps with a different conversation. It stops short of rate limits or delivery failure behavior, so not a 5.
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?
Front-loaded with the core action and scope, and each sentence carries weight (the chat_id trap, the sibling routing, the confirmation requirement). Slightly dense but no wasted 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 two-parameter messaging tool with no output schema and full annotation coverage, everything an agent needs is present: what it does, which sibling to prefer, the chat_id ambiguity, and the user-confirmation 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?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning by clarifying that chat_id comes from telegram_bot_direct_messages and that the same chat_id denotes a different conversation than the business chat — resolving a real ambiguity the schema cannot.
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 (Reply) and resource (the bot's OWN direct chat / bot DM line), and explicitly distinguishes it from telegram_send_message and the business chat. An agent can identify the tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: 'use this for the bot's DM line, and telegram_send_message for your business chats,' and adds a precondition ('confirm the message with the user first'). Both the when and the alternative are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_cancel_scheduled_messageCancel a scheduled messageADestructiveIdempotentInspect
Cancel one pending Telepath scheduled message. Does not delete a message already sent to Telegram. Refresh the list if revision changed or delivery has already started.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | ||
| revision | Yes | Current revision returned by list/create; prevents overwriting concurrent changes. | |
| request_id | Yes | Stable ID for this approved action. Reuse for retries; never change it to retry uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover destructive/idempotent/non-read-only, yet the description adds the pending-only restriction and the two failure modes (stale revision, delivery already started) that force a list refresh. It stops short of stating permissions required or the result of a cancel on an already-cancelled id, but it clearly exceeds the annotation baseline.
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, scope stated first, exclusions and the recovery action after; no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive mutation with no output schema and three required parameters, the description supplies the essential guardrails (pending-only, staleness handling). Minor gaps remain around what the response looks like and whether authorization or workspace constraints apply.
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 67% and already documents revision and request_id semantics. The description only indirectly illuminates revision via the 'refresh the list if revision changed' hint and says nothing about the id pattern or request_id retry behavior, so it adds modest value over 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 ('Cancel one pending ... scheduled message') with an explicit scope limit ('one', 'pending'), and the second sentence separates it from deletion tools that act on already-delivered 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?
Gives a clear when-not ('Does not delete a message already sent to Telegram') and an implied prerequisite step ('Refresh the list if revision changed'), but never names an alternative sibling such as telegram_reschedule_message for changing delivery time instead of cancelling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_create_postPublish text, media or an AI voice to a channelADestructiveIdempotentInspect
Generate an AI voice message from speech_text and send it to Telegram in one call. Maximum 800 characters. Requires the confirmed recipient and exact speech text, disclosure of AI generation, confirmed=true and a stable request_id. Available voices: Marin (female) and Cedar (male). Set voice only to a choice explicitly provided by the user; otherwise omit it to use the saved preference. If no preference exists, voice_choice_required is returned without generation, delivery or quota usage. Ask the user to choose a voice and whether to remember it, then repeat with the same request_id. save_voice=true stores the explicitly selected voice; it can be changed on a later send. On voice_limit_exhausted, explain the allowance and reset date returned in quota. On uncertain delivery, inspect the chat before any further send. Free includes 3 lifetime voices; Plus includes 30 per paid period; Unlimited includes 100. Report the remaining allowance after sending. Publish text, a generated voice from speech_text, one photo/document, or an album of 2–10 photos/videos or documents to a connected channel as the channel. This broadcasts to its audience, not a private recipient. Show the complete text, all media URLs in order, buttons and channel, obtain explicit confirmation, then call once. Albums cannot have buttons or mix documents with photos/videos. Requires channel ownership and bot Post messages permission. Use read/search tools to inspect posts. No scheduling. On uncertain delivery inspect the channel; never automatically resend with a new request_id.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Exact post text or caption; captions have a 1024-character limit. | |
| album | No | Ordered album of 2–10 public HTTPS media URLs. Photos and videos may mix; documents must form a document-only album. Mutually exclusive with media and buttons. text/format supplies the first item caption (max 1024 characters). Returns message_ids for all items and media_group_id; edit/delete targets one item, not the whole album. | |
| media | No | ||
| voice | No | Use only a voice explicitly chosen by the user: marin (female) or cedar (male). Otherwise omit this field to use their saved choice; if none exists, the tool returns voice_choice_required. Never guess from the message text. | |
| format | No | ||
| buttons | No | HTTPS link buttons. Empty array removes buttons on edit. Arbitrary callbacks and executable actions are not supported. | |
| confirmed | Yes | True only after showing the channel, exact content/button destinations or target post/action and receiving explicit user confirmation. | |
| channel_id | Yes | Channel chat_id returned by telegram_list_chats or telegram_find_chat, connected through /channels. | |
| request_id | Yes | Unique key for this user-approved action. Reuse the same key for retries; never generate a new one to retry uncertain delivery. | |
| save_voice | No | Save this voice for future sends only when the user asks to remember/change their preference. | |
| speech_text | No | Exact text to synthesize and send as an AI-generated Telegram voice message, up to 800 Unicode characters. Audio generation and delivery are included in this call. Mutually exclusive with url, archived media and album. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond annotations, disclosing quota tiers, the voice_choice_required and voice_limit_exhausted return states, request_id reuse semantics for retries, and the no-resend-on-uncertain-delivery rule. This is exactly the behavioral context an agent needs before a destructive, idempotent open-world send.
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?
Information-dense with little filler, but poorly front-loaded: voice-specific mechanics dominate the opening and the actual general purpose appears only in the second half. The rules around request_id/confirmed are also restated, adding length without new 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 an 11-parameter, nested-object, destructive send tool with no output schema, the description covers quota, confirmation flow, retry safety, voice preferences, album constraints, and failure recovery. Nothing material to correct invocation appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 82%, and the description adds real meaning: voice must be an explicitly user-chosen value, save_voice stores only on explicit user request, request_id must be stable and reused on retry, and speech_text is mutually exclusive with media/album. The mutual-exclusivity and preference-persistence rules are not obvious from the schema alone.
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 tool publishes text, media, or a generated AI voice to a connected channel and broadcasts to an audience rather than a private recipient, which distinguishes it from the DM siblings. However, the description leads with voice-generation details before stating the general purpose, so the core 'what it does' is buried and arrives mid-paragraph.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives strong operational guidance: show full content, obtain explicit confirmation, call once, no scheduling, use read/search tools to inspect posts, and never auto-resend on uncertain delivery. It differentiates from private recipient tools but never names the close siblings telegram_send_message or telegram_send_media, leaving that routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_delete_postDelete a channel postADestructiveIdempotentInspect
Permanently delete one post from Telegram and mark our archived copy deleted. Confirm the exact channel and post first. Requires current channel ownership and bot Delete messages permission. Telegram normally allows deletion only within 48 hours. This is not telegram_forget, which only removes archived data. Manual deletions by other admins cannot be reliably observed.
| Name | Required | Description | Default |
|---|---|---|---|
| confirmed | Yes | True only after showing the channel, exact content/button destinations or target post/action and receiving explicit user confirmation. | |
| channel_id | Yes | Channel chat_id returned by telegram_list_chats or telegram_find_chat, connected through /channels. | |
| message_id | Yes | Post message_id from this channel, not an ID from its discussion group. | |
| request_id | Yes | Unique key for this user-approved action. Reuse the same key for retries; never generate a new one to retry uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true; the description goes further by disclosing the dual deletion (Telegram post plus archived copy), the 48-hour Telegram-side limit, permission requirements, and the observability gap for deletions by other admins. It stops short of describing failure modes or what a partial success looks like, which keeps it from a 5.
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?
Five short sentences, each carrying distinct operational information: the action, the confirmation prerequisite, permissions, the time limit, and the sibling it is not. The destructive action and the confirmation requirement are front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, no-output-schema tool with fully documented parameters, the description covers safety prerequisites, external API limits, side effects on the archive, and known observability limits. An agent has everything needed to decide whether to call it and what to warn the user about.
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 channel_id, message_id, request_id and confirmed are already fully documented in the schema. The description's 'confirm the exact channel and post first' echoes the confirmed/request_id semantics but adds no format or edge-case detail beyond the schema. Baseline 3 applies.
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 ('Permanently delete one post from Telegram') plus the secondary effect on the archived copy. It explicitly separates itself from telegram_forget, which only removes archived data, so an agent can distinguish it from the sibling write/edit tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a precondition ('Confirm the exact channel and post first'), required authorization (channel ownership plus bot Delete messages permission), a hard external constraint (48-hour window), and a named alternative for the archived-only case. This is explicit when/when-not guidance with an alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_edit_messageEdit a message you sentADestructiveIdempotentInspect
Rewrite one of the user's own already-sent messages. The recipient sees it change and Telegram marks it edited. Incoming messages cannot be edited.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | The new full text. | |
| chat_id | Yes | Chat the message is in. | |
| message_id | Yes | message_id of a message the user sent. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true and openWorldHint=true, so the mutation profile is covered. The description adds real value beyond that: the edit is recipient-visible and Telegram marks the message as edited, which tells the agent the change is externally observable and irreversible in appearance. It does not discuss permission requirements or failure modes.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the core action and then the constraint, with no filler or redundancy. Every sentence carries a distinct fact.
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?
No output schema exists, and the annotations plus description together cover the safety profile and the observable effect of the edit, which is sufficient for a three-parameter mutation tool. Minor gaps remain around what happens on invalid or too-old message IDs, but nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% with three well-documented parameters, so the schema carries the parameter burden and the baseline is 3. The description reinforces the ownership constraint on message_id ('the user's own already-sent messages') but adds no format, length, or ID-resolution detail 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 ('Rewrite one of the user's own already-sent messages') and immediately scopes it to the user's own sent messages, which cleanly separates it from telegram_send_message (new messages) and telegram_get_messages (reads). An agent can identify the operation and its boundary without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Incoming messages cannot be edited' is an explicit when-not condition, which is genuinely useful routing information. However, it never names an alternative (e.g., send a new message or reply via telegram_bot_dm_reply) for the case where editing is not possible, so the guidance stops short of full alternative-routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_edit_postEdit a channel postADestructiveIdempotentInspect
Overwrite text, caption, media or link buttons of one archived channel post. Read it first and confirm the exact replacement and channel. Omitted fields are preserved; empty buttons removes them. Requires current channel ownership and bot Edit messages permission. Not for comments or private chats.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Exact post text or caption; captions have a 1024-character limit. | |
| media | No | ||
| format | No | ||
| buttons | No | HTTPS link buttons. Empty array removes buttons on edit. Arbitrary callbacks and executable actions are not supported. | |
| confirmed | Yes | True only after showing the channel, exact content/button destinations or target post/action and receiving explicit user confirmation. | |
| channel_id | Yes | Channel chat_id returned by telegram_list_chats or telegram_find_chat, connected through /channels. | |
| message_id | Yes | Post message_id from this channel, not an ID from its discussion group. | |
| request_id | Yes | Unique key for this user-approved action. Reuse the same key for retries; never generate a new one to retry uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: states that omitted fields are preserved, that an empty buttons array removes buttons, and that channel ownership plus bot 'Edit messages' permission are required. These are the exact mutation semantics and authorization facts the destructiveHint/idempotentHint flags cannot convey.
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?
Four sentences, front-loaded with the action, then safety workflow, then mutation semantics, then scope exclusion. No filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, nested-schema mutation with no output schema, it covers what changes, what's preserved, permissions, and scope limits. It could note the retry semantics around request_id, though the schema description already handles that.
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 75%, so the schema already documents most parameters; the description still adds real meaning with the preserve-by-default rule for omitted fields and the empty-array removal semantics for buttons. Channel_id, request_id and confirmed are left entirely to their schema descriptions.
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?
Names a specific verb ('Overwrite') plus the exact editable surfaces (text, caption, media, link buttons) scoped to 'one archived channel post'. The closing clause 'Not for comments or private chats' explicitly separates it from telegram_edit_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear precondition workflow ('Read it first and confirm the exact replacement and channel') and a negative boundary ('Not for comments or private chats'), which is what routes an agent away from the DM/comment edit sibling. It stops short of naming the alternative tool for those cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_find_chatFind a Telegram chatARead-onlyIdempotentInspect
Find a person, group or channel by a partial name/title, @username, public Telegram link or numeric chat ID. Use chat_type to filter channels, groups or private chats. With Session, exact @usernames/public links resolve directly through Telegram; partial names search up to 1000 recent account dialogs, case-insensitively. Without Session, search is limited to this account's archive. A post link resolves its chat, not the specific post. This does not join channels or perform global fuzzy search. Clarify ambiguous matches; use a known chat_id directly. If the requested channel cannot be read with the current connection, explain /session in @lemma_telepath_bot; do not require channel ownership or bot admin rights just for Session reading. Management of an owned channel uses /channels separately. On no matches, explain only the observed search scope in the user's language; do not invent a cause or say the chat does not exist. For a Session name-search miss, explain the 1000-dialog bound and try a known exact @username/public link; otherwise ask for one or a more precise name. For an exact-username miss, ask the user to check the username; do not treat it as a confirmed access denial. For a confirmed archive-only miss, say the chat is absent from the saved archive; not yet connected or no saved messages are possibilities, not established facts. Offer the relevant setup path, not every option: private conversations use Telegram Chat Automation, selecting @lemma_telepath_bot and the desired chats, then saving; send /setup to https://t.me/lemma_telepath_bot for device-specific steps. For an owned channel, send /channels to that bot, choose Connect my channel and add it as administrator. For a group, an administrator can add @lemma_telepath_bot as a group administrator; the connected user must be a member. Do not request delete, ban or invite permissions just for reading. Bot API saves new messages received after setup; older history needs /import or accessible Session reads. If the user prefers not to add a bot, cannot add it, or wants to read someone else's accessible channel, offer Session: open https://t.me/lemma_telepath_bot, send /session, tap Connect Telegram and sign in by QR or phone on the connection page. Session also reads the user's own chats; private channels still require account access. Never ask for login codes/passwords in the assistant chat. Do not prescribe reconnection solely for an empty result or require setup for already usable archive content. If the tool errors, distinguish that from zero matches: explain the reported reason and an appropriate next step. Respect a returned retry delay; do not describe a timeout or temporary service failure as lost permissions. If the cause is unknown, say so and suggest retrying or support at https://t.me/hellolemma.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many candidates to return. Default 20; Session returns at most 50, archive search at most 100. | |
| query | Yes | Partial name/title, exact @username, public t.me link, or numeric chat id. | |
| chat_type | No | Filter by chat type. group includes basic groups and supergroups; channel means broadcast channels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only and idempotent annotations, the description discloses search scope (Session up to 1000 recent dialogs vs. archive-only), case-insensitive matching, that post links resolve to the chat rather than the post, and extensive error/miss handling expectations. It clearly separates errors from zero matches and warns against inferring access denial.
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 definition is front-loaded with a strong two-sentence purpose and usage core, but it then expands into a very long support and setup manual. Much of the later content concerns user-facing remediation rather than helping an agent select or invoke the tool, so many sentences do not earn their place in this definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the open-world search behavior, the description is thorough about scope limits, Session versus archive behavior, no-match interpretation, and error handling. However, with no output schema, it does not describe the shape of returned candidates, leaving a gap for an agent that needs to interpret results.
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 already documents query, limit, and chat_type. The description adds some nuance about chat_type filtering and search behavior, but it does not meaningfully expand parameter semantics beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource: find a person, group, or channel by partial name, @username, public link, or numeric chat ID. It clearly distinguishes this lookup tool from actions like joining channels or global fuzzy search, and from management via /channels.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly covers when to use Session versus archive-only search, says to clarify ambiguous matches, recommends using a known chat_id directly, and states that it does not join channels or perform global fuzzy search. It also routes owned-channel management to /channels.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_get_fileRead a Telegram attachmentAIdempotentInspect
Use this to read a document shared in Telegram and answer questions about its contents, such as a contract, invoice or spreadsheet. First locate the message with telegram_get_messages or telegram_search_messages to obtain chat_id and message_id. This does not search for files by name. For a spreadsheet (.xlsx), Word document (.docx), PDF or any text format this returns the actual contents — cells, paragraphs, rows — so you can answer questions about what is inside it. Spreadsheet rows come back tab-separated, one sheet per '## name' heading. For a video, audio or image there is a link and metadata; Session audio/video also returns a ready transcript when available. Reusing a ready bot or Session transcript is free. For Session audio/video, transcribe=true explicitly requests a new transcript using ordinary minutes only if none exists. Pending work persists; check again later, without repeated polling. Use the chat_id and message_id of a message whose message_type is not 'text'. Telegram refuses to serve files over 20 MB to a bot, so those cannot be fetched.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | Chat the file is in. | |
| max_chars | No | How much text to return at once. Defaults to a readable slice. | |
| message_id | Yes | message_id of the message carrying the file. | |
| transcribe | No | Default false. Only on an explicit user request, transcribe Session audio/video if no ready transcript exists; consumes normal minutes on success. | |
| include_text | No | Default true. Set false to get only metadata and skip reading contents. | |
| offset_lines | No | Skip this many lines before reading. A big spreadsheet does not fit in one response, so page through it: the result says which lines you got and how many there are in total. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations mark this readOnlyHint=false, idempotent, non-destructive and open-world; the description justifies the non-read-only flag by disclosing that transcribe consumes minutes while reusing a ready transcript is free, and that pending work persists so the agent should check back rather than poll. It also states the 20 MB bot limit and the tab-separated/per-sheet return format. The only gap is it does not describe what a pending or error response actually looks like.
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?
Front-loads purpose, then prerequisite, then the exclusion, then return-shape detail — a sensible ordering with no filler sentences. It is on the long side (roughly ten sentences) and could compress the media/transcript sentences, but each one carries distinct operational 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?
With no output schema, the description carries the return-value burden and does so: cells, paragraphs and rows for documents, tab-separated rows with '## name' sheet headings, link plus metadata for media, and a paging signal for large spreadsheets. It also closes the loop on the asynchronous transcript case, so nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics on top: transcribe is scoped to explicit user requests and gated on no transcript existing, and offset_lines is explained as a paging mechanism because a big spreadsheet does not fit in one response. max_chars and include_text are left entirely to their schema text.
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?
Opens with a specific verb and resource ('read a document shared in Telegram') scoped to answering questions about its contents. It explicitly carves out what it is not ('does not search for files by name'), which separates it from telegram_search_messages and the photo 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?
Gives an explicit prerequisite chain ('First locate the message with telegram_get_messages or telegram_search_messages to obtain chat_id and message_id'), a targeting rule ('a message whose message_type is not 'text''), and a hard constraint on transcribe ('only on an explicit user request'). It also names the failure case (over 20 MB cannot be fetched) so the agent knows when to stop rather than retry.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_get_messagesGet one chat's historyARead-onlyIdempotentInspect
Read or summarize one Telegram conversation or channel, recover agreements, or gather context for a reply. Returns message text/captions and available voice/video transcripts, not just links. Resolve the chat with telegram_find_chat first. The tools choose the account archive or connected Session. Use source/coverage/partial and message dates to interpret the result. Use since for a time window and before to page back; one page is not full history. Archive pages contain at most 200 messages; Session pages at most 50, even if a larger limit was requested. Use effective_limit when returned; fewer messages than the requested limit alone does not establish the end of history. Read additional pages only when needed for the user's question or requested period, preserving since. Stop when there is enough context, the requested start is reached, or paging returns no messages or makes no progress. Do not automatically scan the entire history. State the dates and coverage actually read; do not claim an exhaustive review from a limited sample. Archive history is limited to saved/imported messages; Session can read older messages accessible to that Telegram account without importing them. Reading through Session does not require channel ownership or a bot administrator. If connection is needed, send /session to @lemma_telepath_bot. Existing readable archive content needs no new connection. Reading does not mark messages as read or send a reply. Messages include is_forwarded and forward_origin (original author/channel and Unix date when available). For forwards, from identifies who forwarded it in this chat, not the original author. Missing origin data does not prove authorship; never infer a hidden author's identity. Interpret errors and empty results separately, and explain the relevant next step briefly in the user's language. A thrown tool error or an error field in the response is not a successful empty read. Explain only the reported cause; respect retry delays and do not describe a timeout or temporary service failure as missing chats or lost permissions. If the cause is unknown, say so and suggest retrying or support at https://t.me/hellolemma. If the chat is missing from the archive or Session reports chat_not_available, resolve it again with telegram_find_chat using the known name, @username or public link. Clarify ambiguous matches; do not invent a chat_id or claim that the chat does not exist in Telegram. If discovery still fails, follow that tool's recovery guidance. If the chat is found but count=0, check the requested since/before range and returned history_notice, setup_required, source, coverage and partial when present. For this read, use the user's known timezone; if none is known, silently use UTC without asking or adding a timezone caveat. Do not infer timezone from language. For calendar days such as today or yesterday, calculate since as inclusive midnight and before as the exclusive next midnight in that timezone, passing ISO 8601 timestamps with the correct UTC offset at each boundary rather than literal today/yesterday or offset-free dates. Keep rolling windows such as the last 24 hours distinct from calendar days. Do not silently broaden an explicitly requested period. Say that no messages were returned in the available history for that range, not that the conversation has never had messages. Use returned connection/history facts to distinguish an empty period, limited saved history and missing or disabled setup; a missing field does not establish a cause. For limited Bot API history, explain that only new messages delivered from included chats after connection are collected. Offer /import in https://t.me/lemma_telepath_bot for older exported history, or Session for older history accessible to the user's Telegram account. Do not claim imports never happened if history_notice says otherwise. When setup is actually needed, offer only the relevant route: private chats via Telegram Chat Automation with @lemma_telepath_bot, selected chats and saved settings (/setup in the bot for device steps); owned channels via /channels and adding the bot as administrator; groups via an administrator adding the bot as group administrator while the user is a member. If the user prefers not to add a bot, cannot add it, or needs another accessible channel, explain the alternative: open https://t.me/lemma_telepath_bot, send /session, tap Connect Telegram, then sign in by QR or phone on the connection page. Never ask for login codes/passwords in the assistant chat. Do not require reconnecting a working Session or connecting again to read usable archive content. Do not repeat identical empty requests or offer import/setup for every empty page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many messages to return. Default 50; archive maximum 200, Session maximum 50 even when a larger limit is requested. | |
| since | No | Only messages at or after this time. Accepts an ISO 8601 timestamp, unix seconds, 'today', 'yesterday', or a relative window like '24h' / '7d'. | |
| before | No | Only messages strictly older than this time, for paging back. Accepts an ISO 8601 timestamp, unix seconds, 'today', 'yesterday', or a relative window like '24h' / '7d'. | |
| chat_id | Yes | Chat id, from telegram_find_chat or telegram_list_chats. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish the safe-read profile (readOnlyHint, idempotentHint, destructiveHint=false), yet the description still adds substantial behavioral context: reading does not mark messages read or send a reply, archive caps at 200 versus Session at 50, effective_limit must be honored, and archive history is limited to saved/imported messages. It also discloses forward-provenance semantics (from is the forwarder, not the original author) and the archive-vs-Session distinction. It loses a point only because the error/empty-result discussion drifts into recovery policy rather than defining what the tool itself does.
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 core operating instructions are front-loaded, but the description balloons into roughly a thousand words that blend tool behavior with error taxonomy, onboarding scripts, bot commands, and conversational phrasing rules. Several passages duplicate guidance that belongs in sibling tools (find_chat recovery) or in a system prompt, and the volume makes the essential paging logic harder to extract.
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?
Very thorough for operating this tool correctly across sources, and no output schema exists so return-value explanation is warranted. However, the definition spends a large share of its budget on setup/connection recovery paths for other tools, leaving the essential paging and since/before semantics buried rather than absent.
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, but the description adds real meaning beyond the schema: it explains that since is an inclusive time window while before is for paging back, that one page is not full history, that limit is silently capped per source and effective_limit should be consulted, and that calendar-day requests must be converted to ISO 8601 boundaries with correct UTC offsets rather than literal 'today'/'yesterday'.
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?
Opens with a concrete verb+resource pair ('Read or summarize one Telegram conversation or channel') and states what the return payload contains (message text/captions plus voice/video transcripts, not just links). It is clearly differentiated from siblings such as telegram_search_messages and telegram_recent_messages by asserting one-chat scope and by naming telegram_find_chat as the required resolver.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent to resolve the chat with telegram_find_chat first, when to use since versus before for paging, and when to stop paging ('enough context, the requested start is reached, or paging returns no messages or makes no progress'). It also states the negative case ('Do not automatically scan the entire history') and routes alternative needs to /import or Session, which is about as complete as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_get_photoLook at a Telegram photoARead-onlyIdempotentInspect
Look at a Telegram photo so you can describe it, read text in it or answer questions about it. Use the chat_id and message_id of a message whose message_type is 'photo'. For several photos use telegram_get_photos instead. Include the returned link in your reply so the user can open the picture. To simply display a photo to the user, use telegram_show_photo.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | Chat the photo is in. | |
| message_id | Yes | message_id of the photo message. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so safety is covered. The description adds real behavior beyond that: the tool returns a link that should be included in the reply, and the input must be a photo-type message. It stops short of describing image format/size limits or failure modes, so it is not a full 5.
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?
Four short sentences, each with a distinct job: purpose, input precondition, sibling for the multi-photo case, and the required link-in-reply behavior. The main purpose is front-loaded and there is no 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?
No output schema exists, yet the description still discloses the salient return value (a link to include in the reply) and the input precondition. For a two-parameter read tool with full annotation coverage, nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the two parameters are already documented and the baseline is 3. The description adds a genuine semantic constraint the schema lacks: the message_id must refer to a message whose message_type is 'photo', which is meaningful selection criteria.
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 ("Look at a Telegram photo") plus the concrete goals it enables (describe, OCR, answer questions). It also explicitly distinguishes itself from two siblings, telegram_get_photos and telegram_show_photo, so the agent can route without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives the exact selection condition (a message whose message_type is 'photo'), names the alternative for multiple photos (telegram_get_photos), and names the alternative for mere display (telegram_show_photo). When-to-use and when-not-to-use are both covered explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_get_photosView several Telegram photosARead-onlyIdempotentInspect
Look at several photos from one chat in a single call. Prefer this over calling telegram_get_photo repeatedly: the pictures share one size budget, so six of them cost about what one does, and a client that drops six separate image blocks keeps these. Pass the message_ids of messages whose message_type is 'photo'. Each photo also comes with a link — include the links in your reply.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | Chat the photos are in. | |
| message_ids | Yes | Up to 10 message_ids of photo messages in that chat. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, open-world and non-destructive traits, but the description adds real behavioral context the annotations cannot: the shared size budget across photos, client image-block dropping behavior, and that each photo returns a link. It stops short of describing failure modes when a message_id is not a photo.
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?
Front-loaded with the core purpose and the sibling comparison before any detail; every sentence carries information, though the closing instruction about including links in the reply is slightly incidental.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by telling the agent what comes back (photos plus a link each) and how to use it, and the two required parameters are covered. Nothing needed to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds a genuine constraint beyond the schema: the message_ids must correspond to messages whose message_type is 'photo', which the schema's 'photo messages' phrasing only implies.
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 ('Look at several photos from one chat') plus the batching scope ('in a single call'), which cleanly separates it from the singular telegram_get_photo sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Prefer this over calling telegram_get_photo repeatedly' and gives the reason (shared size budget, six cost about one; clients that drop separate image blocks keep these), so both the when and the why are present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_list_chatsList Telegram chatsARead-onlyIdempotentInspect
Use this to browse the user's Telegram chats available in Telepath, including private chats, groups and channels, with archive or Session coverage disclosed in the result. Returns chat_id, display name, username, message count and last message time, not message contents. Default 20 chats; archive maximum 200, Session maximum 50. Connected channel inbox archives can supplement Session results; read effective_limit, session_limit, source, coverage and partial. This is a bounded list, not a total chat count. There is no pagination: repeating the same call does not advance. A full page may omit other chats. chat_type filters private chats, groups or channels; group includes supergroups. Session type filtering examines up to 1000 recent account dialogs, not the entire account. Null counts or dates mean unknown, not zero or no activity. Archive counts/dates describe saved/imported messages only. An empty filtered result means no matches in this source coverage, not that the account has no chats. Follow empty_reason and returned setup_required/history_notice; do not infer a lost connection or reconnect a working Session from an empty list. Operational errors are not empty results. For a named person, group or channel use telegram_find_chat; for a catch-up across chats use telegram_recent_messages. This is not a directory of all Telegram users or chats.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many chats to return. Default 20; archive maximum 200, Session maximum 50. Repeating a call does not fetch a next page. | |
| chat_type | No | Filter by chat type. group includes basic groups and supergroups; channel means broadcast channels. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/idempotent annotations, the description discloses the bounded-list behavior, per-source limits (archive 200, Session 50), no-pagination semantics, null meaning, archive-only counts, and how to interpret empty results via empty_reason/setup_required/history_notice. It also clarifies that operational errors are not empty results, which prevents a harmful reconnect inference.
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 front-loaded with purpose, then return fields, then limits, then interpretation guidance, and most sentences carry distinct operational value. It is dense and long with several run-on clauses, but little is redundant given the number of edge cases it must preempt.
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 list tool with no output schema, the description names the returned fields, the coverage metadata to inspect, limit behavior per source, and empty-result interpretation. An agent has everything needed to call it and interpret the result without guessing about pagination or missing chats.
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 both limit and chat_type are already documented in the schema, including the group-includes-supergroups note and the no-next-page warning. The description reinforces the limit ceilings and filter meaning but adds little syntactic or semantic detail beyond the schema, so the baseline 3 applies.
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 (browse the user's Telegram chats) and immediately scopes the contents (private chats, groups, channels) with what is returned. It explicitly distinguishes itself from the closest siblings, telegram_find_chat and telegram_recent_messages, and clarifies it is not a user directory.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing: use telegram_find_chat for a named person/group/channel and telegram_recent_messages for catch-up across chats, and it names the case this tool is not for. It also warns that repeating the call does not page, so an agent knows not to loop for more results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_list_scheduled_messagesList scheduled messagesARead-onlyIdempotentInspect
List Telepath scheduled messages and delivery states for this account. Includes the saved timezone and effective quota across both transports; limit=null and remaining=null mean a personal unlimited scheduling allowance. Pending messages can be changed or cancelled using id and revision. Uncertain means inspect the destination before any new send. This list does not include messages scheduled independently in Telegram. Filter status=scheduled for pending messages.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| status | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's value is in the extras it supplies: returned timezone and effective quota, the null-means-unlimited convention, the durable id+revision handle needed for follow-up mutations, and the operational meaning of the "uncertain" state. Remaining gaps are ordering/pagination rather than safety or side effects.
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?
Front-loaded with purpose and generally dense, but the quota sentence ("limit=null and remaining=null mean a personal unlimited scheduling allowance") introduces terms (Transports, Telepath, quota) that are never grounded and collide with the identically named input parameter, costing clarity per word.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description does a fair job sketching the return surface (delivery states, timezone, quota, id/revision) and the exclusion of Telegram-native scheduled messages. It still omits default page size, ordering, and whether cancellation of a delivered message is possible, which matters for a list-then-mutate workflow.
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 0%, so the description must carry the parameter burden. It explains the status values "scheduled" and "uncertain," but leaves the limit parameter (1-100) completely undefined and the "limit=null and remaining=null" sentence is ambiguous — it reads as a quota field in the response, not the integer input parameter, which risks misreading.
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 ("List Telepath scheduled messages and delivery states for this account") and explicitly delimits scope with "This list does not include messages scheduled independently in Telegram," which cleanly separates it from the sibling schedule_message/cancel_scheduled_message operations. An agent can identify the tool without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage conditions: "Filter status=scheduled for pending messages," "Pending messages can be changed or cancelled using id and revision," and "Uncertain means inspect the destination before any new send." It does not name the sibling tool to use for editing/cancelling, so the routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_mark_readMark a chat as readAIdempotentInspect
Clear the unread badge on a conversation by marking a message, and everything before it, as read. Defaults to the newest message. Nothing is sent.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | Chat to mark read. | |
| message_id | No | Read up to this message. Defaults to the newest one known. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, so the bar is lower. The description nonetheless adds genuinely useful context: the read state change applies retroactively to all earlier messages, it targets the newest message by default, and 'Nothing is sent' disambiguates it from sibling messaging tools. It stops short of noting any rate limits or permission 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?
Three short sentences, front-loaded with the effect and followed by the default behavior and the negative guarantee. No 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 two-parameter, non-destructive state tool with full schema coverage and no output schema, the description covers effect, scope, and default adequately. Only minor gaps remain (permissions, error behavior on an unknown chat_id).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description restates the message_id default ('Defaults to the newest message') but adds no format or edge-case detail beyond the schema, so the baseline 3 applies.
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 ('clear the unread badge on a conversation by marking ... as read') and precisely defines the scope ('a message, and everything before it'). This distinguishes it cleanly from sibling write tools like telegram_send_message and telegram_edit_message.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies its use case (clearing unread state) but never states when to prefer it over alternatives or any prerequisites such as needing a resolved chat_id. Usage is inferable but not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_recent_messagesRecent Telegram messagesARead-onlyIdempotentInspect
Use this for a catch-up across the user's available Telegram chats: 'What did I miss in Telegram today?' or 'Who wrote while I was away?' Returns recent incoming and outgoing messages, newest first, with available voice/video transcripts. Default 20 results; archive maximum 200, Session maximum 50. Session samples up to 20 dialogs and reads at most 20 messages from each of up to 10 selected by latest message date within that sample. It does not inspect every chat. Connected channel inbox archives can supplement the results. Read source, coverage, partial, effective_limit and session_limit. There is no pagination or upper date bound; repeating a call does not advance. since is inclusive: yesterday includes today too. For a precise historical interval inspect relevant chats with telegram_get_messages using since and before. Do not claim complete coverage of the requested period. Use the user's known timezone; if unknown, silently use UTC without asking or adding a caveat. For today, pass local midnight as an ISO timestamp with the correct offset; distinguish calendar days from rolling 24h windows. Zero results mean none returned from this source/window, not that nobody wrote. Follow empty_reason and setup_required/history_notice when present; operational failures are not empty results. Do not reconnect a working Session or retry unchanged calls in a loop. Set since for the requested time window. Results are a bounded archive or Session slice, not a complete unread inbox; inspect an individual chat before concluding who still needs a reply. For one named conversation use telegram_find_chat and telegram_get_messages. Messages include is_forwarded and forward_origin (original author/channel and Unix date when available). For forwards, from identifies who forwarded it in this chat, not the original author. Missing origin data does not prove authorship; never infer a hidden author's identity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many messages to return. Default 20; archive maximum 200, Session maximum 50. No pagination. | |
| since | No | Only messages at or after this time. Accepts an ISO 8601 timestamp, unix seconds, 'today', 'yesterday', or a relative window like '24h' / '7d'. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent and open-world traits, but the description adds substantive behavior the annotations cannot: sampling limits, the archive-versus-Session caps, no pagination, no advancement on repeated calls, inclusive since semantics, and the meaning of zero results versus setup_required/history_notice. What it lacks is any sense of latency or cost, and the dense caveat stream is hard to parse, but the disclosure is well beyond the annotation baseline.
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 first sentence is well front-loaded, but the remainder is a long run of undifferentiated sentences mixing coverage limits, timezone policy, retry policy and forward-authorship caveats with no grouping or emphasis. Most sentences carry an instruction, so little is pure waste, yet the volume makes key constraints easy to miss.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema present, the description carries the return-value burden and does so: it names the fields to read (source, coverage, partial, effective_limit, session_limit) and explains is_forwarded/forward_origin semantics. Combined with explicit coverage caveats and failure-versus-empty distinctions, an agent has what it needs to call and interpret this 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 coverage is 100%, so the parameters are already documented, yet the description adds real meaning: since is inclusive (yesterday includes today), local midnight must be passed with the correct offset, and calendar days must be distinguished from rolling 24h windows. That is semantics an agent would otherwise get wrong, though limit is only echoed rather than enriched.
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 opening sentence names a specific retrieval task (a catch-up across the user's available Telegram chats) and illustrates it with two example questions. It explicitly contrasts the scope with telegram_get_messages, telegram_find_chat and single-conversation lookups, so an agent can separate it from its siblings without reading 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?
It states when to use this tool (broad catch-up, 'what did I miss'), when not to (precise historical intervals, one named conversation) and names the alternative tools to use instead. It also gives a decision rule for the since window and warns against looping retries, which is unusually actionable routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_reschedule_messageChange a scheduled messageADestructiveIdempotentInspect
Change time and/or exact text of a pending scheduled message. Read the current revision first. Destination and sender stay fixed. Obtain approval for the revised text and local date/time. Omitted text or time stays unchanged; timezone defaults to that message’s saved timezone.
| Name | Required | Description | Default |
|---|---|---|---|
| at | No | Exact future ISO 8601 time including UTC offset, e.g. 2026-11-08T18:00:00+04:00. Between one minute and one year ahead. | |
| id | Yes | ||
| text | No | Exact plain text to send once. No Markdown/HTML parsing, media, repeats or attachments. | |
| revision | Yes | Current revision returned by list/create; prevents overwriting concurrent changes. | |
| timezone | No | User-confirmed IANA timezone, e.g. Europe/Ulyanovsk. Required the first time; afterwards the saved timezone can be reused. Never guess it from language. | |
| confirmed | Yes | The user has approved the destination, sender (bot or account), exact text and local date/time. An explicit request containing all of these is sufficient; ask only for missing details. | |
| request_id | Yes | Stable ID for this approved action. Reuse for retries; never change it to retry uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds the substantive part: only pending messages are affected, destination and sender are immutable, omitted fields are preserved, and timezone falls back to the message's saved value. It does not say what happens when the frozen destination/sender is passed or what a stale revision produces, which is the main residual gap for a destructive mutation.
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?
Five short sentences, front-loaded with the mutation scope, then prerequisites, then immutability, then partial-update semantics. Nothing is filler; the only mild duplication is the approval sentence overlapping the confirmed parameter description.
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 7-parameter destructive mutation with annotations but no output schema, the description covers the non-obvious behavior an agent needs: partial update, timezone inheritance, revision freshness, and fixed destination/sender. Conflict/error handling for a stale revision is the one omission that would matter in practice.
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 86%, so the baseline is 3 and the schema already explains at, text, timezone, revision, confirmed and request_id well. The description adds genuine PATCH semantics ("Omitted text or time stays unchanged") and the timezone inheritance default, but nothing beyond the schema for revision conflict behavior or the id format.
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?
"Change time and/or exact text of a pending scheduled message" gives a specific verb plus resource and bounds the editable surface, which separates it in practice from telegram_edit_message (already-sent messages) and telegram_schedule_message (creates). It does not name a sibling explicitly, so an agent must infer the boundary from the word "pending".
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 states prerequisites ("Read the current revision first") and approval requirements ("Obtain approval for the revised text and local date/time"), which tells the agent how to sequence the call rather than just what it does. It stops short of naming explicit alternatives such as cancel_scheduled_message for removal or list_scheduled_messages as the source of the revision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_schedule_messageSchedule a messageAIdempotentInspect
Schedule one plain text message to a group or channel. Telepath sends it even after this conversation closes. Resolve the destination first. Explicitly select bot_api or session; never silently change sender. Bot API needs a connected group or owned channel (/channels) and bot posting permission. Session sends using the connected Telegram account and its actual permissions; connect via /session in @lemma_telepath_bot if needed. Ask for timezone if not established; reuse the saved timezone. Confirm destination, sender, exact text and local time. Default pending-message allowance: Free 3, Plus 20, Unlimited 100, shared across groups, channels and both transports. Use the list response quota for any personal allowance. Delivery/cancellation frees a slot; plan expiry preserves existing schedules and allows edits/cancellation. Normally delivered within 15 seconds; more than 15 minutes late fails instead of sending. No automatic retry of uncertain deliveries. These are scheduled sends, not personal reminders or recurring tasks.
| Name | Required | Description | Default |
|---|---|---|---|
| at | Yes | Exact future ISO 8601 time including UTC offset, e.g. 2026-11-08T18:00:00+04:00. Between one minute and one year ahead. | |
| text | Yes | Exact plain text to send once. No Markdown/HTML parsing, media, repeats or attachments. | |
| chat_id | Yes | ||
| timezone | No | User-confirmed IANA timezone, e.g. Europe/Ulyanovsk. Required the first time; afterwards the saved timezone can be reused. Never guess it from language. | |
| confirmed | Yes | The user has approved the destination, sender (bot or account), exact text and local date/time. An explicit request containing all of these is sufficient; ask only for missing details. | |
| transport | Yes | ||
| request_id | Yes | Stable ID for this approved action. Reuse for retries; never change it to retry uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnly=false, idempotent=true, openWorld=true) by disclosing pending-message quotas per plan tier and that they are shared across transports, that delivery/cancellation frees a slot, that expiry preserves existing schedules, that delivery is normally within 15 seconds and fails past 15 minutes late, and that uncertain deliveries are not auto-retried. That is exactly the operational context an agent needs before committing a scheduled write.
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?
Front-loaded with purpose and the destination/transport/timezone ordering, and nearly every sentence carries a distinct constraint (quota, timing, failure, no-retry). It is dense to the point of being a single unbroken block; slight trimming of the quota enumeration would improve scanability without losing 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 7-parameter, 6-required mutation tool with no output schema, the description covers transport selection, confirmation requirements, timezone reuse, quota accounting, delivery timing, and failure semantics. Nothing an agent needs to call it correctly or interpret a refusal appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 71%, and the description compensates for the two undocumented fields: transport is explained by precondition (bot_api needs a connected group or owned channel plus posting permission; session uses the account's actual permissions), and timezone handling is spelled out. chat_id still gets only an indirect 'resolve the destination first' rather than a pointer to telegram_find_chat/channels, so it falls just short of full coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope: 'Schedule one plain text message to a group or channel.' It also explicitly separates itself from the reminder siblings with 'These are scheduled sends, not personal reminders or recurring tasks,' so an agent can distinguish it from create_reminder and telegram_send_message without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives ordered preconditions (resolve destination, explicitly pick bot_api vs session, ask for timezone if unestablished) and names the setup routes (/channels, /session in @lemma_telepath_bot). It also states the exclusion case, so when-to-use and when-not-to-use are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_search_messagesSearch Telegram messagesARead-onlyIdempotentInspect
Find a topic, decision, link or mention in available Telegram messages. Archive search covers text, captions and saved transcripts, with all terms required and a prefix match on the last word. Connected Session uses Telegram cloud search; it does not search bot-archive transcripts for extra matches, although returned media may include a ready archive transcript. Neither path searches attachment bytes or filenames. Use a few distinctive words, not a full natural-language question. To search a person's or channel's conversation, resolve its name/@username/link with telegram_find_chat and pass chat_id; query searches message content, not contact names. Default 30 matches; archive maximum 200, Session maximum 50. Read effective_limit, source, coverage and partial; a full page is not an exhaustive search. Use since inclusively and before exclusively for a precise date interval. When has_more=true, pass next_cursor as cursor with the same query, chat_id and date filters to continue. Never construct or edit cursors. A repeated query without cursor starts again. Request another page only when needed for the user's question; stop when enough context is found, has_more=false, or a cursor fails/makes no progress. A filtered Session page can be empty with continuation; has_more means continuation is available, not guaranteed visible matches. Cursors expire after 15 minutes and may expire on restart or cache eviction: explain and restart explicitly, never claim complete history. Search reflects changing live data, not a fixed snapshot. For a conversation summary use telegram_get_messages. Use the user's known timezone; if unknown, silently use UTC without asking or adding a timezone caveat. Do not infer it from language. For calendar days pass since at inclusive midnight and before at the exclusive next midnight as ISO 8601 timestamps with the correct offsets; distinguish calendar days from rolling 24h windows. Do not silently broaden the requested period. Distinguish errors from successful zero matches. Read empty_reason, chat_found, history_notice and setup_required when present. chat_not_in_archive means this ID is absent from the saved archive, not from Telegram: resolve the chat again and follow telegram_find_chat recovery guidance. For no_matches, consider fewer distinctive words and verify the intended chat/time range; no_searchable_terms needs a word or number. Do not loop on unchanged searches or claim the conversation never happened. For limited archive history offer /import in https://t.me/lemma_telepath_bot or accessible older history through Session: send /session to that bot, tap Connect Telegram and sign in there. Never ask for login codes/passwords here. Do not prescribe reconnection from zero matches alone or reconnect a working Session. Errors need the reported cause and an appropriate next step; respect retry delays and never call a timeout missing history or lost permission. If unknown, say so and offer support at https://t.me/hellolemma. Use telegram_get_file with returned chat_id/message_id to read supported archive or Session attachments; photos use telegram_get_photo. Messages include is_forwarded and forward_origin (original author/channel and Unix date when available). For forwards, from identifies who forwarded it in this chat, not the original author. Missing origin data does not prove authorship; never infer a hidden author's identity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Page size. Default 30; archive maximum 200, Session maximum 50. Use next_cursor to continue when has_more is true. | |
| query | Yes | Distinctive words in message content, not a contact lookup. Session supports up to 200 characters. | |
| since | No | Only messages at or after this time. Accepts an ISO 8601 timestamp, unix seconds, 'today', 'yesterday', or a relative window like '24h' / '7d'. | |
| before | No | Only messages strictly older than this time; exclusive end of the search interval. Accepts an ISO 8601 timestamp, unix seconds, 'today', 'yesterday', or a relative window like '24h' / '7d'. | |
| cursor | No | Opaque next_cursor from the preceding search page. Keep query, chat_id, since and before unchanged; do not invent a cursor. | |
| chat_id | No | Restrict to this chat, resolved with telegram_find_chat. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, it discloses backend-dependent coverage differences (Archive vs Connected Session), that attachment bytes and filenames are not searched, cursor expiry after 15 minutes and on restart, that results reflect live changing data, and the response fields to inspect (effective_limit, source, coverage, partial, has_more, empty_reason). It also explains the forwarding semantics of from vs forward_origin, which is non-obvious behavior an agent would otherwise misread.
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 critical information (what it searches, archive vs Session, pagination) is front-loaded, but the description runs to roughly 450 words of dense prose mixing selection guidance, error policy, reconnect instructions and authorship caveats. Much of the recovery/support/escalation material would fit better in error payloads, and the lack of any structure makes it hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the response fields that govern correct follow-up (coverage, partial, has_more, next_cursor, empty_reason, chat_found, history_notice, setup_required) and by explaining what each continuation signal means. For a six-parameter search tool with two backends and cursor pagination, nothing an agent needs to call it correctly appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: all terms are required with prefix matching on the last word, since is inclusive and before exclusive, calendar days should be passed as inclusive-midnight/exclusive-next-midnight ISO intervals, and cursors must never be constructed or edited. That meaningfully extends what the schema itself conveys.
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 opening sentence names a specific verb and resource ('Find a topic, decision, link or mention in available Telegram messages') and immediately scopes what is searched: text, captions and saved transcripts. It also differentiates itself from the nearest sibling by naming telegram_get_messages for conversation summaries and telegram_find_chat for chat resolution.
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?
Explicit routing rules are given: use telegram_get_messages for a conversation summary, resolve a chat with telegram_find_chat and pass chat_id, and use a few distinctive words rather than a natural-language question. It also states when to stop paging (enough context, has_more=false, cursor failure) and what to do for empty results or missing archive history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_send_mediaGenerate a voice message or send media to TelegramADestructiveInspect
Generate an AI voice message from speech_text and send it to Telegram in one call. Maximum 800 characters. Requires the confirmed recipient and exact speech text, disclosure of AI generation, confirmed=true and a stable request_id. Available voices: Marin (female) and Cedar (male). Set voice only to a choice explicitly provided by the user; otherwise omit it to use the saved preference. If no preference exists, voice_choice_required is returned without generation, delivery or quota usage. Ask the user to choose a voice and whether to remember it, then repeat with the same request_id. save_voice=true stores the explicitly selected voice; it can be changed on a later send. On voice_limit_exhausted, explain the allowance and reset date returned in quota. On uncertain delivery, inspect the chat before any further send. Free includes 3 lifetime voices; Plus includes 30 per paid period; Unlimited includes 100. Report the remaining allowance after sending.
Send to a resolved private chat or group. Choose exactly one source: • speech_text — generate and send a new AI voice message from text. • from_chat_id + from_message_id — resend an existing archived file using its Telegram file ID; no upload. Imported history has no file ID. • url — send an existing media file at a public http(s) link.
Sending is immediately visible: confirm the recipient and content first. Private business chats send as the user; groups send as the bot. Use telegram_create_post for connected channels.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public http(s) link to an existing media file. Mutually exclusive with speech_text and from_chat_id + from_message_id. | |
| voice | No | Use only a voice explicitly chosen by the user: marin (female) or cedar (male). Otherwise omit this field to use their saved choice; if none exists, the tool returns voice_choice_required. Never guess from the message text. | |
| caption | No | Text under the media. Markdown is converted. | |
| chat_id | Yes | Where to send it, from telegram_find_chat. | |
| confirmed | No | For generated voices, true only after confirming recipient and exact speech text. | |
| request_id | No | Required for generated voices: stable action key, 8–100 letters, digits, underscores or hyphens. Reuse on retries. | |
| save_voice | No | Save this voice for future sends only when the user asks to remember/change their preference. | |
| as_document | No | Send as a file rather than a photo/video, keeping full quality. | |
| speech_text | No | Exact text to synthesize and send as an AI-generated Telegram voice message, up to 800 Unicode characters. Audio generation and delivery are included in this call. Mutually exclusive with url, archived media and album. | |
| from_chat_id | No | Chat holding the file to resend. | |
| from_message_id | No | message_id of the message holding the file. | |
| message_thread_id | No | Forum topic to post into, in a group that has them. | |
| reply_to_message_id | No | Quote this message_id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Well beyond the annotations, it discloses that sending is instantly visible and irreversible, that missing voice choice returns voice_choice_required without using quota or generating, that voice_limit_exhausted returns a reset date, that free tier is 3 lifetime voices, and that uncertain delivery requires inspecting the chat first. It also specifies asymmetric identity behavior (private business chats as user, groups as bot) and the request_id retry contract.
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?
Purpose and the critical constraints are front-loaded, and the bulleted source list is scannable. It is dense but most sentences carry non-redundant operational rules (quota tiers, voice_choice_required loop); a few quota details and the 'Markdown is converted' style asides could be trimmed without loss.
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 13-parameter mutation tool with no output schema, it covers the hard parts: mode exclusivity, confirmation gating, idempotency via request_id, error states and their required follow-ups. What it lacks is any statement of what a successful call returns (message id, remaining allowance shape) despite telling the agent to report remaining allowance, leaving the success path inferred.
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, but the description adds policy meaning the schema does not: the exclusivity between speech_text, from_chat_id + from_message_id and url, the 800-character cap, the voice-selection rule (only user-specified, never guess), and that save_voice can be changed later. Remaining parameters (caption, message_thread_id, reply_to_message_id, as_document) are not elaborated in prose, which keeps it from a 5.
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 opening sentence names a specific verb and resource ('Generate an AI voice message ... and send it to Telegram in one call') and the second block enumerates the three mutually exclusive send modes. An agent can immediately tell this apart from telegram_send_message, telegram_create_post and the read-only telegram_get_file 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?
It explicitly states when this tool is wrong ('Use telegram_create_post for connected channels'), how to pick a chat ('Send to a resolved private chat or group'), and the rule for choosing a source ('Choose exactly one source'). It also gives a conditional path ('If no preference exists ... ask the user to choose a voice') that tells the agent exactly what to do next.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_send_messageSend a Telegram messageADestructiveInspect
For channel comments use the discussion group chat_id and reply_to_message_id returned with the post. Never use this tool to publish channel posts; use telegram_create_post. Send confirmed text. Private Business replies send as the account; group messages and comments send as the bot; channel inbox replies send as the channel. Confirm the exact recipient, sender and wording. Resolve an unknown chat with telegram_find_chat; a chat found through Session may have no Bot API archive/connection. Bot API requires a known archive chat and private Business reply access. Telegram accepts a business reply only within 24 hours of that person's last message to you (incoming, not your own outgoing message). Missing history does not prove the window expired. BUSINESS_PEER_INVALID may also mean chat access or permissions. Choose transport=bot_api or session explicitly; default bot_api. Session can send to accessible private chats and groups as the account, without the Business 24-hour window. For missing Session: open https://t.me/lemma_telepath_bot, send /session, tap Connect Telegram, and sign in there; never request codes here. Session still respects Telegram restrictions and cannot automatically pay for messages. Use one stable request_id per exact confirmed action. Retrying that ID checks its receipt without sending again. Never use a new ID or switch transport after uncertain delivery. A definitive not_sent result permits a new confirmed attempt after fixing its cause. Only status=sent confirms Telegram acceptance, not human reading. archived=false means delivered but archive persistence failed: do not resend. Read error_code, next_step and retry_after_seconds; avoid polling or retry loops. Auto-reply may be paused immediately before dispatch; report auto_reply_paused even if the send fails. For channel inboxes reply_to_message_id must identify the customer's archived message; do not use message_thread_id. For group quotes/topics use IDs from that destination; never silently drop a requested quote or change topic.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Exactly the text to send. | |
| chat_id | Yes | Recipient, from telegram_find_chat. | |
| confirmed | No | True only after user authorization of exact recipient, sender and text. Required with request_id and for Session; older Bot API clients still require user confirmation through the conversation. | |
| transport | No | Explicit sender route; never switch after an uncertain send. | bot_api |
| request_id | No | Provide a stable ID for this exact action; required for Session. Reuse to recover a receipt; never replace after uncertain delivery. Optional only for compatibility with older Bot API clients. | |
| message_thread_id | No | Known forum topic in the destination group. For channel comments use reply_to_message_id from the post discussion metadata. | |
| reply_to_message_id | No | Existing message in the same destination; required for channel inbox replies. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Far beyond the annotations it adds the real operational semantics: sender identity varies by destination (account for Business replies, bot for groups, channel for inbox), a stable request_id turns a retry into a receipt check rather than a resend, status=sent means Telegram acceptance only, and archived=false means delivered-but-unsaved so it must not be resent. It also documents error_code/next_step/retry_after_seconds and the BUSINESS_PEER_INVALID ambiguity, none of which the annotations convey.
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 content is nearly all substantive, but it arrives as an undifferentiated wall of sentences mixing transport selection, error handling, retry policy and threading rules, with no grouping or front-loaded purpose statement. A few points (transport stability, request_id reuse) are restated from the schema and could be consolidated for easier scanability.
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 destructive, non-idempotent outbound-send tool with no output schema, the description covers a remarkable amount: idempotency/receipt semantics, delivery-vs-read distinction, archived persistence failure, the Business 24-hour window and its false-negative traps, and channel-inbox threading. The one notable omission is what a successful response payload looks like beyond status and archived flags.
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 already defines all seven parameters; the description nevertheless adds routing meaning the schema cannot express – transport selects the sender identity and window constraints, reply_to_message_id must reference the customer's archived message for channel inboxes (and must not be replaced by message_thread_id), and message_thread_id is only for known forum topics/group quotes in that destination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb and resource are identifiable ('Send confirmed text' to a Telegram chat), and the negative routing to telegram_create_post makes clear this is for messages/replies rather than channel posts. However, the core purpose never appears as a clean, front-loaded statement – it is embedded among scoping rules about channel comments and transports, so the agent must assemble it from fragments.
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?
Explicit when-to-use and when-not-to-use: 'Never use this tool to publish channel posts; use telegram_create_post', resolve unknown chats with telegram_find_chat, and choose transport=bot_api vs session deliberately with the tradeoff stated. It also names the preconditions (known archive chat, private Business reply access, 24-hour incoming window) that determine whether this tool can be used at all.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_set_post_pinnedSet channel post pinAIdempotentInspect
Pin or unpin one specific channel post. Confirm the channel, post and desired pinned state first. Never unpins all posts. Requires current ownership and bot Edit messages permission.
| Name | Required | Description | Default |
|---|---|---|---|
| pinned | Yes | ||
| confirmed | Yes | True only after showing the channel, exact content/button destinations or target post/action and receiving explicit user confirmation. | |
| channel_id | Yes | Channel chat_id returned by telegram_list_chats or telegram_find_chat, connected through /channels. | |
| message_id | Yes | Post message_id from this channel, not an ID from its discussion group. | |
| request_id | Yes | Unique key for this user-approved action. Reuse the same key for retries; never generate a new one to retry uncertain delivery. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly=false, idempotent=true, destructive=false), and the description adds real value beyond them: the ownership precondition, the bot 'Edit messages' permission requirement, and the guarantee that other posts' pin state is untouched. It doesn't say what the response looks like or what happens if the post is already in the requested state, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and immediately followed by the safety confirmation, scope limit, and permission requirement. No filler and nothing redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With five required params, high schema coverage, and no output schema, the description covers preconditions and scope adequately. Minor gap: it doesn't clarify whether the confirmation requirement is enforced by the server or is a caller discipline, or what failure modes (no permission, message not found) look like.
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 80%, so channel_id, message_id, request_id, and confirmed are already well documented in the schema. The description's 'channel, post and desired pinned state' maps loosely onto channel_id/message_id/pinned but adds no format or validation detail beyond what the schema 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?
Names a specific verb pair (pin/unpin), the exact resource (one specific channel post), and explicitly bounds scope with 'Never unpins all posts'. This clearly separates it from siblings such as telegram_delete_post, telegram_edit_post, and telegram_create_post.
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?
'Confirm the channel, post and desired pinned state first' gives a pre-call checklist, which implies the usage context but doesn't state when to choose this over an alternative or when not to call it. No sibling or alternative is named for routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_set_reactionReact to a Telegram messageADestructiveIdempotentInspect
Also supports posts in explicitly connected channels after ownership verification. Put an emoji reaction on a message in a group the bot belongs to. The reaction is the bot's, not yours. The other person sees it and is notified, so confirm the message and the emoji with the user first. Only Telegram's standard reaction emoji are accepted — 👍 👎 ❤ 🔥 🥰 👏 😁 🤔 🎉 🤩 🙏 👌 💯 🤣 ⚡ 🤝 🫡 and similar; anything else is refused by Telegram, not by this server. Omit emoji to remove a reaction previously set. The message must already be in the archive. Two kinds of chat are out of scope: your 1:1 business chats, where the Bot API's setMessageReaction takes no business_connection_id and the call is refused here rather than failing obscurely; and the bot's own direct-message inbox, which is stored separately and is covered by telegram_bot_dm_react.
| Name | Required | Description | Default |
|---|---|---|---|
| big | No | Play the big animation for the recipient. | |
| emoji | No | The reaction emoji. Leave out to remove the existing reaction. | |
| chat_id | Yes | Chat the message is in. | |
| message_id | Yes | message_id to react to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that the reaction is the bot's, that the recipient sees it and is notified, that only Telegram standard reaction emoji are accepted and the server merely relays Telegram's refusal, that the message must already be in the archive, and that business 1:1 chats are refused locally rather than failing obscurely. These are meaningful behavioral details for a destructive, open-world mutation.
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 content is dense and mostly earns its place, especially the emoji list and the exclusions. However, the description opens with an 'Also supports...' caveat before stating the main purpose, and the long final sentence about out-of-scope chats could be tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a four-parameter tool with an output schema absent but full schema coverage and annotations present, the description covers scope, emoji constraints, removal behavior, user confirmation, archive requirements, and the two excluded chat types. Nothing an agent needs in order to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline would be 3, but the description adds real semantic value: the allowed emoji set is constrained in prose despite no enum in the schema, and omitting emoji is explained as removal. It also clarifies the chat and archive constraints on chat_id, though it does not explain the 'big' parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Put an emoji reaction on a message in a group the bot belongs to') and extends it to connected channels. It also explicitly distinguishes this tool from telegram_bot_dm_react and from business 1:1 chats, so an agent can select it without inspecting sibling 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?
It gives explicit when-to-use conditions (group the bot belongs to, connected channel posts after ownership verification) and explicit when-not-to-use cases (1:1 business chats, bot DM inbox, which routes to telegram_bot_dm_react). It also tells the agent to confirm the message and emoji with the user first, and explains that omitting emoji removes an existing reaction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
telegram_show_photoShow a Telegram photoARead-onlyIdempotentInspect
Display a Telegram photo to the user as a picture in the conversation. This does not let you see the image — to describe it or read anything in it, use telegram_get_photo. Use the chat_id and message_id of a message whose message_type is 'photo'. Always include the returned link as a clickable link, since not every client renders the picture.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | Chat the photo is in. | |
| message_id | Yes | message_id of the photo message. |
Output Schema
| Name | Required | Description |
|---|---|---|
| url | Yes | Direct link to the image. |
| caption | Yes | Caption, if the message had one. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, openWorld), so the bar is lower. The description adds real value beyond that: it discloses the key capability limit (the model cannot see the image itself) and the rendering caveat that not every client draws the picture, so the returned link must be surfaced as clickable.
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, zero filler, and the primary purpose plus the critical sibling distinction are front-loaded before the operational detail.
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?
Output schema exists, so return values need no explanation; the description still flags the returned link's use. Purpose, alternative routing, precondition, and rendering caveat together cover everything needed to invoke this 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 coverage is 100%, so the baseline is 3. The description goes beyond the schema by constraining which message is valid — the chat_id/message_id must reference a message whose message_type is 'photo' — which the schema does not state.
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 ('Display a Telegram photo to the user as a picture in the conversation') and immediately distinguishes itself from the look-alike sibling telegram_get_photo. An agent can pick this over telegram_get_photo without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative and the condition that selects it: 'This does not let you see the image — to describe it or read anything in it, use telegram_get_photo.' It also states the precondition that the target message must have message_type 'photo'.
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.
3 tool updates
- Changed
telegram_list_chats1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"How many chats to return. Default 20."New value: +"How many chats to return. Default 20; archive maximum 200, Session maximum 50. Repeating a call does not fetch a next page."
- Changed
telegram_recent_messages1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"How many messages to return. Default 20."New value: +"How many messages to return. Default 20; archive maximum 200, Session maximum 50. No pagination."
- Changed
telegram_search_messages3 fields changed- added
Input schema / properties / beforeAdded value: +{ + "description": "Only messages strictly older than this time; exclusive end of the search interval. Accepts an ISO 8601 timestamp, unix seconds, 'today', 'yesterday', or a relative window like '24h' / '7d'.", + "type": "string" +} - added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque next_cursor from the preceding search page. Keep query, chat_id, since and before unchanged; do not invent a cursor.", + "maxLength": 4096, + "minLength": 1, + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"How many matches to return. Default 30; archive maximum 200, Session maximum 50. This tool currently has no pagination."New value: +"Page size. Default 30; archive maximum 200, Session maximum 50. Use next_cursor to continue when has_more is true."
2 tool updates
- Changed
telegram_search_messages3 fields changed- changed
Input schema / properties / chat_id / descriptionPrevious value: -"Restrict the search to this chat."New value: +"Restrict to this chat, resolved with telegram_find_chat." - changed
Input schema / properties / limit / descriptionPrevious value: -"How many matches to return. Default 30."New value: +"How many matches to return. Default 30; archive maximum 200, Session maximum 50. This tool currently has no pagination." - changed
Input schema / properties / query / descriptionPrevious value: -"Words to search for."New value: +"Distinctive words in message content, not a contact lookup. Session supports up to 200 characters."
- Changed
telegram_send_message10 fields changed- added
Input schema / properties / confirmedAdded value: +{ + "const": true, + "description": "True only after user authorization of exact recipient, sender and text. Required with request_id and for Session; older Bot API clients still require user confirmation through the conversation.", + "type": "boolean" +} - changed
Input schema / properties / message_thread_id / descriptionPrevious value: -"Known forum topic in the destination discussion group. For ordinary channel comments use reply_to_message_id from the post discussion metadata."New value: +"Known forum topic in the destination group. For channel comments use reply_to_message_id from the post discussion metadata." - added
Input schema / properties / message_thread_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / message_thread_id / minimumAdded value: +-9007199254740991 - changed
Input schema / properties / reply_to_message_id / descriptionPrevious value: -"Quote this message_id in the reply."New value: +"Existing message in the same destination; required for channel inbox replies." - added
Input schema / properties / reply_to_message_id / exclusiveMinimumAdded value: +0 - added
Input schema / properties / reply_to_message_id / maximumAdded value: +9007199254740991 - added
Input schema / properties / reply_to_message_id / minimumAdded value: +-9007199254740991 - added
Input schema / properties / request_idAdded value: +{ + "description": "Provide a stable ID for this exact action; required for Session. Reuse to recover a receipt; never replace after uncertain delivery. Optional only for compatibility with older Bot API clients.", + "pattern": "^[a-zA-Z0-9_-]{8,100}$", + "type": "string" +} - added
Input schema / properties / transportAdded value: +{ + "default": "bot_api", + "description": "Explicit sender route; never switch after an uncertain send.", + "enum": [ + "bot_api", + "session" + ], + "type": "string" +}
3 tool updates
- Changed
telegram_find_chat1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"How many candidates to return. Default 20."New value: +"How many candidates to return. Default 20; Session returns at most 50, archive search at most 100."
- Changed
telegram_get_file1 field changed- added
Input schema / properties / transcribeAdded value: +{ + "description": "Default false. Only on an explicit user request, transcribe Session audio/video if no ready transcript exists; consumes normal minutes on success.", + "type": "boolean" +}
- Changed
telegram_get_messages1 field changed- changed
Input schema / properties / limit / descriptionPrevious value: -"How many messages to return. Default 50."New value: +"How many messages to return. Default 50; archive maximum 200, Session maximum 50 even when a larger limit is requested."
4 tool updates
- Added
telegram_cancel_scheduled_message - Added
telegram_list_scheduled_messages - Added
telegram_reschedule_message - Added
telegram_schedule_message
2 tool updates
- Changed
telegram_find_chat2 fields changed- added
Input schema / properties / chat_typeAdded value: +{ + "description": "Filter by chat type. group includes basic groups and supergroups; channel means broadcast channels.", + "enum": [ + "private", + "group", + "supergroup", + "channel", + "channel_dm" + ], + "type": "string" +} - changed
Input schema / properties / query / descriptionPrevious value: -"Name, @username, or numeric chat id."New value: +"Partial name/title, exact @username, public t.me link, or numeric chat id."
- Changed
telegram_list_chats1 field changed- added
Input schema / properties / chat_typeAdded value: +{ + "description": "Filter by chat type. group includes basic groups and supergroups; channel means broadcast channels.", + "enum": [ + "private", + "group", + "supergroup", + "channel", + "channel_dm" + ], + "type": "string" +}
2 tool updates
- Changed
telegram_create_post2 fields changed- changed
Input schema / properties / speech_text / descriptionPrevious value: -"Generate an AI voice reading this exact text, up to 800 Unicode characters. Exclusive with URL, archived media or album. Ask Marin (female) or Cedar (male) once if no saved preference."New value: +"Exact text to synthesize and send as an AI-generated Telegram voice message, up to 800 Unicode characters. Audio generation and delivery are included in this call. Mutually exclusive with url, archived media and album." - changed
Input schema / properties / voice / descriptionPrevious value: -"Explicit voice choice; omit to use the saved voice."New value: +"Use only a voice explicitly chosen by the user: marin (female) or cedar (male). Otherwise omit this field to use their saved choice; if none exists, the tool returns voice_choice_required. Never guess from the message text."
- Changed
telegram_send_media3 fields changed- changed
Input schema / properties / speech_text / descriptionPrevious value: -"Generate an AI voice reading this exact text, up to 800 Unicode characters. Exclusive with URL, archived media or album. Ask Marin (female) or Cedar (male) once if no saved preference."New value: +"Exact text to synthesize and send as an AI-generated Telegram voice message, up to 800 Unicode characters. Audio generation and delivery are included in this call. Mutually exclusive with url, archived media and album." - changed
Input schema / properties / url / descriptionPrevious value: -"Public http(s) link for Telegram to fetch, instead of from_*."New value: +"Public http(s) link to an existing media file. Mutually exclusive with speech_text and from_chat_id + from_message_id." - changed
Input schema / properties / voice / descriptionPrevious value: -"Explicit voice choice; omit to use the saved voice."New value: +"Use only a voice explicitly chosen by the user: marin (female) or cedar (male). Otherwise omit this field to use their saved choice; if none exists, the tool returns voice_choice_required. Never guess from the message text."
2 tool updates
- Changed
telegram_create_post3 fields changed- added
Input schema / properties / save_voiceAdded value: +{ + "description": "Save this voice for future sends only when the user asks to remember/change their preference.", + "type": "boolean" +} - added
Input schema / properties / speech_textAdded value: +{ + "description": "Generate an AI voice reading this exact text, up to 800 Unicode characters. Exclusive with URL, archived media or album. Ask Marin (female) or Cedar (male) once if no saved preference.", + "type": "string" +} - added
Input schema / properties / voiceAdded value: +{ + "description": "Explicit voice choice; omit to use the saved voice.", + "enum": [ + "marin", + "cedar" + ], + "type": "string" +}
- Changed
telegram_send_media5 fields changed- added
Input schema / properties / confirmedAdded value: +{ + "description": "For generated voices, true only after confirming recipient and exact speech text.", + "type": "boolean" +} - added
Input schema / properties / request_idAdded value: +{ + "description": "Required for generated voices: stable action key, 8–100 letters, digits, underscores or hyphens. Reuse on retries.", + "type": "string" +} - added
Input schema / properties / save_voiceAdded value: +{ + "description": "Save this voice for future sends only when the user asks to remember/change their preference.", + "type": "boolean" +} - added
Input schema / properties / speech_textAdded value: +{ + "description": "Generate an AI voice reading this exact text, up to 800 Unicode characters. Exclusive with URL, archived media or album. Ask Marin (female) or Cedar (male) once if no saved preference.", + "type": "string" +} - added
Input schema / properties / voiceAdded value: +{ + "description": "Explicit voice choice; omit to use the saved voice.", + "enum": [ + "marin", + "cedar" + ], + "type": "string" +}
1 tool update
- Changed
telegram_create_post1 field changed- added
Input schema / properties / albumAdded value: +{ + "description": "Ordered album of 2–10 public HTTPS media URLs. Photos and videos may mix; documents must form a document-only album. Mutually exclusive with media and buttons. text/format supplies the first item caption (max 1024 characters). Returns message_ids for all items and media_group_id; edit/delete targets one item, not the whole album.", + "items": { + "additionalProperties": false, + "properties": { + "type": { + "enum": [ + "photo", + "video", + "document" + ], + "type": "string" + }, + "url": { + "$ref": "#/properties/media/properties/url" + } + }, + "required": [ + "type", + "url" + ], + "type": "object" + }, + "maxItems": 10, + "minItems": 2, + "type": "array" +}
5 tool updates
- Added
telegram_create_post - Added
telegram_delete_post - Added
telegram_edit_post - Changed
telegram_send_message1 field changed- added
Input schema / properties / message_thread_idAdded value: +{ + "description": "Known forum topic in the destination discussion group. For ordinary channel comments use reply_to_message_id from the post discussion metadata.", + "exclusiveMinimum": 0, + "type": "integer" +}
- Added
telegram_set_post_pinned
5 tool updates
- Added
cancel_reminder - Added
create_reminder - Changed
kb_create_note1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Page type. Existing pages keep their type if omitted. Only tasks support reminders (Plus or Unlimited)."New value: +"Page type. Existing pages keep their type if omitted. Only tasks support attached reminders. Standalone reminders use create_reminder."
- Changed
kb_update_note1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Page type. Existing pages keep their type if omitted. Only tasks support reminders (Plus or Unlimited)."New value: +"Page type. Existing pages keep their type if omitted. Only tasks support attached reminders. Standalone reminders use create_reminder."
- Added
list_reminders
2 tool updates
- Changed
kb_create_note1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Page type. Existing pages keep their type if omitted. Only tasks support reminders."New value: +"Page type. Existing pages keep their type if omitted. Only tasks support reminders (Plus or Unlimited)."
- Changed
kb_update_note1 field changed- changed
Input schema / properties / type / descriptionPrevious value: -"Page type. Existing pages keep their type if omitted. Only tasks support reminders."New value: +"Page type. Existing pages keep their type if omitted. Only tasks support reminders (Plus or Unlimited)."
2 tool updates
- Changed
kb_create_note3 fields changed- added
Input schema / properties / reminderAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "at": { + "description": "Exact future ISO 8601 time with Z or UTC offset. Ask if the intended time or timezone is unclear.", + "type": "string" + }, + "text": { + "description": "The specific reminder text authorized by the user, in their language.", + "maxLength": 1500, + "minLength": 1, + "type": "string" + }, + "timezone": { + "description": "User-confirmed IANA timezone, for example Europe/Samara.", + "type": "string" + } + }, + "required": [ + "at", + "timezone", + "text" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Only with user authorization: schedule one Telegram bot DM to the account owner. Null cancels; omitted preserves the existing reminder. Never infer a reminder from a task or date alone." +} - added
Input schema / properties / task_statusAdded value: +{ + "description": "Task status. Completing a task cancels its pending reminder.", + "enum": [ + "open", + "done" + ], + "type": "string" +} - added
Input schema / properties / typeAdded value: +{ + "description": "Page type. Existing pages keep their type if omitted. Only tasks support reminders.", + "enum": [ + "note", + "project", + "person", + "task" + ], + "type": "string" +}
- Changed
kb_update_note3 fields changed- added
Input schema / properties / reminderAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "at": { + "description": "Exact future ISO 8601 time with Z or UTC offset. Ask if the intended time or timezone is unclear.", + "type": "string" + }, + "text": { + "description": "The specific reminder text authorized by the user, in their language.", + "maxLength": 1500, + "minLength": 1, + "type": "string" + }, + "timezone": { + "description": "User-confirmed IANA timezone, for example Europe/Samara.", + "type": "string" + } + }, + "required": [ + "at", + "timezone", + "text" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "Only with user authorization: schedule one Telegram bot DM to the account owner. Null cancels; omitted preserves the existing reminder. Never infer a reminder from a task or date alone." +} - added
Input schema / properties / task_statusAdded value: +{ + "description": "Task status. Completing a task cancels its pending reminder.", + "enum": [ + "open", + "done" + ], + "type": "string" +} - added
Input schema / properties / typeAdded value: +{ + "description": "Page type. Existing pages keep their type if omitted. Only tasks support reminders.", + "enum": [ + "note", + "project", + "person", + "task" + ], + "type": "string" +}
Publisher details
- Operator
- Lemma · Publisher source
- Operator website
- https://lemma.company · Publisher source
- Vendor relationship
- Independent · Publisher source
- Documentation
- https://telepath.lemma.company/start
- Trust center
- Not available
- Restrictions
- Requires a Telegram account with the Telepath bot added under Settings → Telegram Business → Chatbots; the user chooses which conversations it may access. Telegram Premium is not required to connect a business bot. Telegram permits a reply only within 24 hours of the other person's last incoming message. Reading, searching and replying are available to every connected account. Voice transcription, group archiving, history import and connecting your own bot are paid, billed in Telegram Stars inside Telegram. No regional restrictions and no admin approval. Authentication is OAuth 2.1 with PKCE and dynamic client registration; no custom OAuth app to s · Publisher source
Related MCP Connectors
Read, search and draft replies across all your mailboxes, Google Chat and Telegram.
1Read, search and answer your messages on WhatsApp, iMessage, Slack, Telegram and 14 more networks.
1Unified inbox MCP for WhatsApp, Telegram, Email, voice — read/send messages, search, AI agents.
Read, search and reply to your WhatsApp chats from your AI, using your own number.
Related MCP Servers
- AlicenseAqualityBmaintenanceConnect any AI agent to your personal Telegram messages through the official Business API, enabling message history search and draft replies with optional manual approval.718MIT
- AlicenseNot gradedqualityAmaintenanceLets MCP clients like ChatGPT Web and Claude Web read, search, and reply to your personal Telegram chats through the official Telegram Business API, using a self-hosted SQLite archive without MTProto sessions.3Apache 2.0
- AlicenseAqualityAmaintenanceEnables searching Telegram messages and chats, retrieving recent messages, and extracting text from attached documents (PDF, TXT, MD, CSV) using your personal Telegram account.4Apache 2.0
- FlicenseNot gradedqualityAmaintenanceEnables AI assistants to read Telegram conversations, search messages, retrieve chat context, resolve recipients, and send messages with delivery status.1-
Glama MCP Gateway
Add one secure layer between your agents and this server.