tg-recall-mcp
{
"answer": "The tg-recall-mcp server is a read-only MCP server that provides access to a local-first Telegram archive, enabling AI agents to search, retrieve, and cite messages from explicitly allowed chats and scopes. It never builds or modifies an index.\n\nCapabilities:\n\n- list_allowed_chats – List cached Telegram chats permitted by the AI access policy.\n- list_scopes – List saved sync scopes (predefined chat/date/media configurations).\n- search_messages – Search indexed messages and transcripts by keyword, with optional filters for chat, date range (since/until), media type, and result limit; returns cited results.\n- get_message_context – Retrieve nearby cached messages around a specific cited message (by chat ID and message ID), with a configurable radius.\n- ask_archive – Answer a natural language question using bounded extractive retrieval from the local archive, with optional date and media type filters.\n- retrieve_evidence – Return bounded, cited local evidence with support for multiple retrieval modes (auto, keyword, semantic, hybrid) and optional local-vector (semantic) retrieval. Configurable context window and token budget (max 20,000).\n- query_knowledge_catalog – Read compact cited catalog metadata within one exact saved scope (no raw source body, no writes, max 50 results).\n- inspect_research_session – Read checkpoint/session metadata for an explicitly allowed research session; purely read-only.\n- expand_cited_sources – Expand explicit cited Telegram source references (up to 8 citations) within a session, subject to payload and token budget limits."
}
Provides local archiving, synchronization, searching, and extractive cited retrieval of Telegram chats, messages, and media, with support for transcription and exports.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@tg-recall-mcpsearch 'project deadline' in work chat and return citations"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
tg-recall
Local-first Telegram archive for people and AI agents. tg-recall stores only explicitly selected chats in a local profile, indexes message text and transcripts, and returns source citations such as tg://chat/.../message/....
Early alpha (current release: v0.6.0). The archive includes private conversations and a Telegram user session. Keep the profile local, use full-disk encryption, and verify important findings against Telegram.
Install
Requires Python 3.13+ and uv.
git clone https://github.com/Rerowros/tg-recall.git
cd tg-recall
uv sync --extra dev
uv run tg-recall setupFor normal use, install the published universal wheel from the matching GitHub Release. GitHub displays the asset SHA-256 digest; compare it before installing when your release process requires an independent integrity check. A GitHub asset digest is integrity metadata, not a package signature.
uv tool install https://github.com/Rerowros/tg-recall/releases/download/v0.6.0/tg_recall-0.6.0-py3-none-any.whl
tg-recall --json doctoruv tool install --editable . is for development only. It deliberately keeps
the checkout as the source of the command, so tg-recall update apply will
report manual_required rather than overwrite that checkout. Update an
editable development install from its original checkout (git pull, uv sync
or the project's documented workflow), or reinstall a verified release wheel.
Self-update and harness installation are explicit human-only lifecycle
operations; they are never run automatically. Release checks are disabled by
default. Only after explicit periodic configuration can an eligible interactive
non-JSON CLI command make a best-effort check; help, MCP, automation, lifecycle
commands and JSON commands never do so. See
harness integration for update / integrate
usage, scope support, backups, and manual fallbacks.
Related MCP server: Telegram Agent for Codex
Stable AI-harness bootstrap
To have Codex, Claude Code, Cursor, or another agent prepare a safe harness setup plan, copy this exact instruction:
Fetch https://raw.githubusercontent.com/Rerowros/tg-recall/main/docs/agent-setup/prompt.md and follow it.The link is permanent and intentionally has no release version. The fetched
contract resolves the latest stable GitHub Release and an exact universal wheel
with its GitHub SHA-256 digest; it never installs from main. An agent may use
only integrate list, integrate preview, and integrate status as data-blind
diagnostics. Package installation and every integrate install, refresh, or
uninstall operation remain an explicit human command: the agent prints it
and stops. It requires an explicit user or project scope (and an explicit
project root for the latter), preserves manual/partial actions, and tells the
user to restart the affected harness before status verification.
The current published release can predate this contract. If its integrate list command is unavailable, setup stops with a capability-gap message; it
must not use a checkout or source from main as a fallback.
tg-ecosystem and tg-ecosystem-mcp are deprecated compatibility aliases. Use tg-recall and tg-recall-mcp in new scripts; the aliases may be removed in a future breaking release.
Local Storage
tg-recall never writes an archive into the repository by default.
System | Config | Persistent data | State | Cache |
Windows |
|
|
|
|
Linux |
|
|
|
|
Each Telegram account is a profile. Its SQLite archive, session, media objects, wiki and exports remain isolated below data/profiles/<profile>/. Media is content-addressed by SHA-256 and SQLite stores a relative key, so a profile can be restored on another OS.
Use a self-contained root for an encrypted external disk or portable setup:
tg-recall --home D:\Private\tg-recall --profile work setupPrecedence is --home, TG_RECALL_HOME, then system defaults. Profile precedence is --profile, TG_RECALL_PROFILE, configured active profile, then default.
Telegram Setup
Create API credentials at my.telegram.org, then authorize from an interactive terminal:
tg-recall config set telegram.api_id 123456
tg-recall config set telegram.api_hash "your_api_hash"
tg-recall config set telegram.phone "+10000000000"
tg-recall telegram auth
tg-recall telegram checkCredentials and the session receive best-effort private permissions. Use BitLocker on Windows or LUKS on Linux for encryption at rest.
Archive Workflow
List chats, then create a policy-aware scope:
tg-recall chats list
tg-recall scopes create work --chat -1001234567890 --since 2026-01-01 --media voice,photo --transcribe auto
tg-recall sync run work --limit 500
tg-recall sync run work --backfill --limit 500media accepts none, voice, audio, photo, video, document, all, or a comma-separated combination. Text and media metadata are always indexed; selected source media is retained locally. Normal runs fetch only messages newer than the saved watermark; --backfill explicitly continues into older history.
For a single idempotent workflow:
tg-recall --json sync ensure work --chat -1001234567890 --since 2026-01-01 --media voice,photo --transcribe auto --limit 500transcribe auto tries Telegram transcription first and falls back to local Whisper. tg-recall --json doctor checks the current archive, Telegram session, ffmpeg and the whisper executable.
Local transcription
transcribe run defaults to sidecar; telegram uses Telegram, local uses
the selected local adapter, and auto remains Telegram-first. For typed,
human-only local backend settings, safe short-voice/long-audio VAD presets,
and one-citation verification, see local transcription.
Agent Workflow
Ask an agent to start here:
tg-recall agent guideFor bounded cited evidence:
tg-recall --json retrieve --chat-id -1001234567890 --query "deadline" --context 8 --token-budget 12000For a long-chat analysis, write a private JSONL export below the profile instead of printing the entire archive:
tg-recall export --chat -1001234567890 --since 2026-01-01 --include transcripts,media-metadata --format jsonlThe CLI can sync, download and transcribe local archives. It does not expose agent commands for authentication, credential changes, purge or Telegram write operations. MCP remains read-only.
For a bounded, offline-verifiable handoff to a local AI workflow, create a separate pack; the existing export JSONL command is unchanged:
tg-recall --json pack create project-a --chat -1001234567890 --since 2026-01-01 --max-records 200 --token-budget 12000
tg-recall --json pack inspect PATH\TO\project-a
tg-recall --json pack verify PATH\TO\project-apack create requires either a concrete chat plus a date boundary or a saved scope, and always requires positive record and token budgets. It writes under the selected profile's private exports directory by default. A human may explicitly pass --output; automation cannot. To include synthesized local knowledge, pass only explicit immutable --wiki-revision IDs (and --wiki-scope when it differs from the saved scope). Packs contain selected evidence and structured assertions, never sessions, credentials, media binaries, or absolute host paths.
Install managed Codex guidance instead of relying on Custom Instructions:
tg-recall integrate install --target codex --scope userUse this compact text only as a generic/manual fallback when managed harness integration is unavailable:
Если пользователь просит посмотреть Telegram-чат, используй локальный `tg-recall`: сначала выполни `tg-recall agent guide` и следуй его workflow только для запрошенных чатов. Разрешены sync, media download и transcription; запрещены auth, purge и изменение config. Выводы подтверждай ссылками `tg://`.For cost-aware Codex model routing, progressive context budgets, and the full copy-ready prompt, see docs/codex-agent-optimization.md. The guide prefers available gpt-5.3-codex-spark for near-instant bounded search using its separate Codex limit, with gpt-5.6-luna as the stable low-cost fallback.
The repository also contains local-only private wiki memory and private AI export packs. Pack creation is a profile-local CLI integration; there is no MCP pack tool, automatic wiki compiler, or automatic whole-archive export.
MCP
Start the local stdio server with:
tg-recall-mcpMCP is intentionally read-only and requires explicit ai_access configuration. It can list allowed cached chats and scopes, search local messages, return nearby context, and provide extractive cited retrieval.
For optional genuine local-vector retrieval, first configure an already-downloaded model directory in the selected profile (semantic.enabled=true, semantic.provider=sentence-transformers-local, semantic.model_path=PATH) and install the optional runtime:
uv sync --extra local-embeddings
tg-recall --json index embeddings build --chat-id -1001234567890 --max-batches 1
tg-recall --json index embeddings status --chat-id -1001234567890
tg-recall --json retrieve "deadline" --chat-id -1001234567890 --retrieval-mode auto --token-budget 8000The model path must already exist locally; tg-recall never downloads a model. auto reports a keyword fallback when vectors are unavailable or stale. semantic is strict and returns semantic_unavailable rather than relabeling token overlap as vectors. index embeddings rebuild and remove are explicit human-only maintenance commands; MCP exposes only bounded retrieve_evidence and never builds, rebuilds, or removes an index.
Current Limitations
askdefaults to extractive cited retrieval. The optional OpenAI Responses provider requires its extra plus explicit provider-policy and scope approval; disabled or unavailable providers return a cited local fallback.Legacy
--semanticuses local token overlap. Use--retrieval-mode auto|hybrid|semanticfor the optional local embedding index.Local Whisper is invoked through an installed
whisperexecutable; it is not bundled with the package.MCP cannot sync, download, transcribe, modify configuration or purge data.
Migration And Backup
Copy a current .tg-ecosystem directory without changing its source:
tg-recall migrate legacy --from C:\code\tg-ecosystem\.tg-ecosystem --dry-run
tg-recall migrate legacy --from C:\code\tg-ecosystem\.tg-ecosystemThe migration validates SQLite, copies media, converts absolute media paths to relative object keys, and never removes the legacy archive.
tg-recall backup create --mode essential --output D:\Backups\tg-recall-essential.zip
tg-recall backup create --mode full --include-session --output D:\Backups\tg-recall-full.zip
tg-recall backup restore D:\Backups\tg-recall-essential.zip --profile restoredessential includes the database, profile configuration and wiki. full also contains media. Session and credentials are excluded unless --include-session is explicit.
Development
uv run pytest -q
uv buildSee CONTRIBUTING.md, SECURITY.md, ROADMAP.md, and docs/backup-restore.md.
Available Tools
9 toolsask_archiveC
Answer using bounded local archive retrieval.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| since | No | ||
| until | No | ||
| chat_id | Yes | ||
| media_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. However, it doesn't explain what 'bounded' means (e.g., scoped to certain chats, time range, size limits), whether this is a read-only operation, what happens when no matches are found, or what the response format resembles. The behavior around the 'limit', 'since', and 'until' parameters and how they constrain retrieval remains opaque.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely brief at one short sentence, which is minimal in length. However, this brevity reads as under-specification rather than efficient conciseness, since it fails to convey the essential purpose and behavioral details needed to use the tool correctly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 6 parameters, no annotations, and no output schema, the one-sentence description is inadequate. The meaning of 'bounded', the relationship between the query/chat_id/limit/since/until/media_type parameters, and what the tool returns are all unaddressed. The description does not compensate for the absence of structured metadata.
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%, and the 6 parameters are entirely undocumented in the description. The description adds no semantic meaning to parameters like media_type, since, until, or limit beyond their raw names. With zero schema coverage, the description needed to explain parameter semantics and completely failed to do so.
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 'Answer using bounded local archive retrieval' indicates the tool retrieves from a local archive, but the verb+resource is vague. It's unclear whether 'answer' means it generates an answer, returns matching archive content, or performs a search. Among siblings like search_messages, get_message_context, and retrieve_evidence, this does not clearly distinguish itself as a distinct retrieval operation.
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?
No guidance is provided on when to use this tool versus alternatives. With siblings like search_messages and retrieve_evidence present, the description gives no exclusions, conditions, or context for when 'bounded local archive retrieval' is the right choice vs the other retrieval tools. The term 'bounded' hints at a constraint but isn't explained.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
expand_cited_sourcesC
Expand only explicit cited Telegram sources under current scope and bounded payload/work budgets.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| chat_id | Yes | ||
| context | No | ||
| citations | Yes | ||
| session_id | Yes | ||
| token_budget | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral disclosure burden. It mentions 'bounded payload/work budgets' but doesn't explain what limits those impose or what happens when budgets are exceeded. It doesn't disclose whether this mutates state, requires auth, or what the return format looks like. The phrase 'Expand... sources' is ambiguous about the actual behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single compact sentence with no waste. It front-loads the core purpose. However, it is under-specified rather than concise -- being short for a 6-parameter tool with no schema coverage is a completeness problem, not a conciseness virtue.
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 6 parameters, 0% schema coverage, no annotations, and no output schema, the description is inadequate. It doesn't explain parameter roles (citations, limit, context, token_budget), the meaning of 'expansion', return values, or failure/error behavior. The description covers perhaps 15% of what an agent needs to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, so the description must compensate but does not mention any parameters by name or explain their meaning. Six parameters including limit, context, citations, token_budget are entirely undocumented in the description. The name suggests 'citations' and budgets are central, but no semantics are clarified.
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 verb (expand) and a resource (explicit cited Telegram sources) but is somewhat vague. 'Under current scope and bounded payload/work budgets' hints at constraints but doesn't clearly distinguish from siblings like retrieve_evidence or get_message_context. It's clear enough about the core action but lacks specificity about what 'expansion' entails.
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 says 'only explicit cited' sources, which gives some guidance on what qualifies. However, there's no mention of when to use this vs. alternatives like retrieve_evidence, get_message_context, or search_messages. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_message_contextC
Return nearby cached messages around a cited message.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | ||
| until | No | ||
| radius | No | ||
| chat_id | Yes | ||
| message_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Cached' implies the tool works from a cache rather than live data, which is a meaningful constraint, but the description doesn't explain radius semantics, date boundaries (since/until), or what happens when no cached messages exist near the cited message.
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 efficient sentence with no filler. Appropriately short given the modest purpose, though it may be so terse that it under-specifies.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a retrieval tool with 5 parameters, no annotations, no output schema, and 0% schema coverage. The description fails to explain parameter interactions (radius vs. since/until), whether 'cached' means data may be stale, or what the returned structure looks like. For a fetch operation with this many parameters, significantly more documentation is needed.
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. 'Nearby' hints at the radius parameter, but the description explains none of the 5 parameters. 'Nearby', 'radius', and since/until date bounds all remain ambiguous in meaning and interaction.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Return nearby cached messages around a cited message'), which clearly conveys the tool's function. However, it doesn't explicitly distinguish from siblings like search_messages or expand_cited_sources, though the 'cached messages' framing provides some differentiation.
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?
No when-to-use or when-not-to-use guidance is provided. The description doesn't explain when to choose this over search_messages or retrieve_evidence, and doesn't mention any prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_research_sessionC
Read compact checkpoint/session metadata for an explicitly allowed session; no mutation.
| Name | Required | Description | Default |
|---|---|---|---|
| chat_id | Yes | ||
| session_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It does declare 'no mutation' which is useful, and notes the 'explicitly allowed' restriction, but it doesn't explain what 'compact checkpoint/session metadata' contains, what happens if a session is not explicitly allowed (error behavior), whether pagination/limits apply, or what the return format looks like. For a read tool with zero annotation coverage, more behavioral disclosure is needed.
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?
Single concise sentence with zero redundancy. It front-loads the action ('Read') and includes the key constraint ('no mutation'). Efficient, though slightly terse given the gaps identified in other dimensions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a relatively simple 2-parameter read tool with no output schema, but the constraint 'explicitly allowed session' raises questions about error handling and access control that aren't addressed. The 'compact metadata' phrasing is vague about what is actually returned. For a simple read tool with no annotations, this describes the core purpose adequately but leaves access-control behavior and return semantics underspecified.
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 should compensate, but it mentions no parameters by name. Both session_id (type string) and chat_id (type integer) are documented only in the schema with basic type info. The description adds context that the session must be 'explicitly allowed' which indirectly relates to session_id, but it doesn't clarify the purpose of chat_id or how it relates to session_id. With 2 params and 0% coverage, the description must add more than it does.
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 ('Read'), a specific resource ('checkpoint/session metadata'), and scoping ('for an explicitly allowed session'), clearly distinguishing it as a read-only inspection tool. However, it doesn't explicitly differentiate from the sibling 'get_message_context' which might partially overlap in purpose, so it doesn't fully earn 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?
The description notes 'explicitly allowed session' which implies a pre-authorization requirement, but provides no guidance on when to use this versus siblings like get_message_context, list_allowed_chats, or retrieve_evidence. No exclusions or alternatives are named despite a rich sibling context where such guidance would be valuable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_allowed_chatsA
List cached chats allowed by AI access policy.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the data is 'cached' and filtered by an 'AI access policy', which adds context beyond a simple 'list chats'. However, since there are no annotations, the description carries the full burden for safety and side-effect disclosure. It does not explicitly confirm read-only behavior, but the verb 'List' implies it. No rate limits, auth, or staleness details are mentioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, concise sentence: 'List cached chats allowed by AI access policy.' It is front-loaded with the action verb and contains no filler or redundant words. Every phrase earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (no parameters, no output schema, no annotations), the description is adequate but not fully complete. It tells what the tool returns conceptually (a list of chats) but omits details such as the output format, potential staleness of cache, or whether it requires any special context. The missing usage guidelines also impact overall completeness.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so schema description coverage is trivially 100%. The description correctly omits parameter details. According to the rubric, 0 parameters warrants a baseline of 4, and the description adds no unnecessary parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List cached chats allowed by AI access policy.' The verb 'List' plus the specific resource 'cached chats' and the qualifier 'allowed by AI access policy' make the function unambiguous and distinct from sibling tools like list_scopes and search_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?
The description does not provide any guidance on when to use this tool versus alternatives. It simply states what it does without mentioning exclusions, alternative tools, or specific scenarios. The agent must infer usage from the name and siblings, but no explicit direction is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_scopesA
List saved sync scopes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'List' implies a read-only operation and no side effects, but no details are given about output format, ordering, or any limitations. It is adequate for a simple list tool but lacks richer behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It exactly matches the tool's function and is appropriately sized for a zero-parameter tool.
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 list tool with no parameters and no output schema, the description sufficiently identifies the resource ('saved sync scopes') and its action. It lacks elaboration on what a 'sync scope' is or when to use it, but complexity is low, so this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description does not need to add parameter semantics. The empty schema provides complete coverage, warranting the baseline score of 4.
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 'List saved sync scopes' uses a specific verb and resource, clearly distinguishing it from sibling tools like list_allowed_chats. It unambiguously states what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use this tool versus alternatives, such as list_allowed_chats or search_messages. There is no mention of use cases, prerequisites, or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_knowledge_catalogB
Read compact cited catalog metadata in one exact saved scope; no raw source body or writes.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| chat_id | Yes | ||
| scope_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral disclosure burden. It does state 'no raw source body or writes,' effectively declaring a read-only, metadata-only operation. However, it doesn't disclose return format, pagination behavior through limit, or any rate/auth considerations. The description adds some safety context but is thin on behavioral detail.
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?
Single concise sentence, zero waste, front-loaded with the core action. Every word earns its place. This is a model of concise phrasing even though it sacrifices explanatory depth.
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 4-parameter tool with no output schema, 0% schema coverage, and no annotations, the description is insufficiently complete. The agent must understand three required parameters (query, chat_id, scope_id) plus limit with no guidance on semantics, scope constraints, or return behavior. 'One exact saved scope' implies scoping but doesn't explain how scope_id relates to list_scopes or what query targets.
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 for all 4 parameters. It mentions none of the parameters by name or role. 'compact cited catalog metadata' hints at output shape but says nothing about what query, chat_id, scope_id, or limit mean or how they interact. Agent must infer parameter semantics entirely from the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource: 'Read compact cited catalog metadata' with an explicit scope qualifier ('in one exact saved scope'). It clearly distinguishes from siblings by mentioning 'no raw source body or writes' and the 'cited catalog metadata' framing differentiates it from search_messages or expand_cited_sources. It's specific but could be marginally clearer about what 'catalog' refers to in context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context ('catalog metadata', 'one exact saved scope') and implicitly excludes alternatives via 'no raw source body or writes'. However, it doesn't name sibling tools or give explicit when-to-use-versus-alternatives guidance. Sibling relationships with expand_cited_sources and search_messages are relevant but unaddressed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
retrieve_evidenceC
Return bounded cited local evidence with optional genuine local-vector retrieval. Read-only; never builds or changes an index.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| limit | No | ||
| query | Yes | ||
| since | No | ||
| until | No | ||
| chat_id | Yes | ||
| context | No | ||
| media_type | No | ||
| token_budget | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explicitly states 'Read-only; never builds or changes an index,' which is clear about side effects. However, it doesn't disclose what 'bounded' means (limits, truncation, citation format), whether results are ordered, or what the citation format looks like. Partial transparency.
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?
One concise sentence and one short note. Efficient and front-loaded, with the key safety constraint (read-only) stated immediately. No wasted words, though slightly more detail could be justified given the parameter count.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a moderately complex tool (9 params, 4 modes, date filters, media_type, token budget) with 0% schema description coverage and no output schema. The description is far too thin to guide correct invocation of all these options. The agent cannot determine what each mode does, how bounding works, or what the response shape is. Incomplete for the tool's true complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for the 9 parameters. The description adds minimal param context: 'bounded' hints at token_budget/limit, 'local' hints at scope, and 'citations' hints at what output contains. But it doesn't explain 'context' (0-8), 'mode' semantics beyond names, or 'since/until' format. Some value added, far from sufficient for 9 undocumented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a verb+resource ('Return bounded cited local evidence') and notes optional local-vector retrieval. However, 'evidence' is somewhat vague and doesn't sharply distinguish this from siblings like search_messages or query_knowledge_catalog. The read-only guarantee is helpful but the core operation remains ambiguous in scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this tool vs. alternatives like search_messages, ask_archive, or query_knowledge_catalog. Sibling tools are not referenced or contrasted. The read-only note implies a usage constraint but doesn't tell the agent what distinguishes 'evidence retrieval' from general search.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_messagesC
Search indexed messages and transcripts with citations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| since | No | ||
| until | No | ||
| chat_id | Yes | ||
| media_type | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that results include citations (which is useful), but doesn't state whether this is read-only, what indexing scope means, rate limits, or what happens when no results match. The phrase 'indexed messages' is vague about coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with zero waste, which earns some credit, but it is under-specified rather than concise in a useful way. It front-loads the action and returns quickly but provides little information 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?
For a 6-parameter tool with no schema coverage, no annotations, no output schema, and several closely-related sibling tools, the description is severely inadequate. It fails to explain any parameter semantics, return format, or use-case boundaries, making it hard for an agent to invoke or select correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for 6 undocumented parameters. It adds essentially nothing beyond the schema's bare parameter names. It doesn't explain the format of 'since'/'until' date strings, what 'media_type' values are valid, what 'query' syntax is supported, or how 'limit' behaves.
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 'Search indexed messages and transcripts with citations' has a clear verb (search) and resource (messages/transcripts), but is generic and does not differentiate from siblings like get_message_context or retrieve_evidence, which likely overlap in functionality. It's marginally descriptive beyond the tool name, which is redundant.
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?
No guidance is given on when to use search_messages versus sibling tools like retrieve_evidence, get_message_context, or query_knowledge_catalog. The description 'Search indexed messages and transcripts with citations' implies full-text search use but provides no exclusions or alternatives.
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.
7 tool updates
v0.5.0- Changed
ask_archive3 fields changed- added
Input schema / properties / media_typeAdded value: +{ + "type": "string" +} - added
Input schema / properties / sinceAdded value: +{ + "type": "string" +} - added
Input schema / properties / untilAdded value: +{ + "type": "string" +}
- Added
expand_cited_sources - Changed
get_message_context2 fields changed- added
Input schema / properties / sinceAdded value: +{ + "type": "string" +} - added
Input schema / properties / untilAdded value: +{ + "type": "string" +}
- Added
inspect_research_session - Added
query_knowledge_catalog - Added
retrieve_evidence - Changed
search_messages3 fields changed- added
Input schema / properties / media_typeAdded value: +{ + "type": "string" +} - added
Input schema / properties / sinceAdded value: +{ + "type": "string" +} - added
Input schema / properties / untilAdded value: +{ + "type": "string" +}
5 tool updates
v0.2.0- First observed
ask_archive - First observed
get_message_context - First observed
list_allowed_chats - First observed
list_scopes - First observed
search_messages
TDQS
Scored across 9 tools
Most tools are distinct in purpose: search/research tools (search_messages, retrieve_evidence, ask_archive, query_knowledge_catalog, inspect_research_session) vs. retrieval/expansion (get_message_context, expand_cited_sources) vs. admin listing (list_allowed_chats, list_scopes). However, there is notable overlap between search_messages, retrieve_evidence, ask_archive, and query_knowledge_catalog — all involve retrieving or searching cited/local content, making it ambiguous which to select for a research query.
Names follow a loose pattern but mix verb styles: sometimes verb-first (get_, ask_, list_, search_, retrieve_, expand_, inspect_) and sometimes query_knowledge_catalog breaks the pattern by using noun-first ordering. Most use snake_case but the verb prefixes are inconsistent (get vs retrieve vs search vs ask vs query all for similar retrieval actions).
9 tools is a reasonable, well-scoped count for a Telegram archive/recall MCP server. The count feels appropriate given the mix of admin/config tools, search tools, and session/catalog inspection tools. Not overly heavy or thin for the domain.
The server covers search, retrieval, context expansion, chat/scope listing, and research session inspection. However, there are notable gaps: no tool to add/configure sync scopes (only list_sync_scopes), no tool to manage allowed chats (only list), and no evident way to trigger or manage syncing/indexing. The surface is read-oriented and administratively incomplete.
Maintenance
Related MCP Connectors
Agent-native MCP server over the public saagarpatel.dev corpus. Read-only, stateless.
MCP server for querying Forkast documentation
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
Related MCP Servers
- AlicenseBqualityAmaintenanceMCP server that exposes any Telegram-Archive instance to LLMs, enabling message search, chat browsing, and access to archived Telegram history.746 npm4GPL 3.0
- AlicenseNot gradedqualityDmaintenancePrivacy-first Telegram MCP server enabling maintainers to triage chats, inspect context, search messages, draft replies, and send authorized messages locally without a cloud relay.32 npm1MIT
- FlicenseNot gradedqualityBmaintenanceAn MCP server that connects to a Telegram group chat, persists messages to a local SQLite database, and exposes tools to search, retrieve, and send messages via SSE.-
- AlicenseNot gradedqualityBmaintenanceLocal-first MCP server for indexing and searching research materials (papers, notes, logs, READMEs) using SQLite FTS, with tools for memory management and evidence retrieval.MIT