limzo-mcp
OfficialIt is a read-only MCP server for public Limzo Telegram group statistics, with no API key required.
list_groups— search or browse public Telegram groups by keyword and language; returns slug, title, member count, language mix, 7-day activity, plan, and Limzo Score.get_group_stats— fetch full public stats for a group by slug: messages, active users, daily trends, top members, mood, languages, levels, leagues, reactions, and moderation-related status flags; supports 7d/30d/all ranges (with plan fallback to 7d).get_global_stats— get network-wide totals: public group count, messages, active users, replies, reactions, karma, members tracked, and spam removed.Works as a stdio MCP server via
npx limzo-mcp, or connect directly over HTTP to the hosted streamable MCP endpoint.Privacy-safe: never exposes verbatim member messages; private groups are anonymised and excluded from the directory.
Provides access to public Telegram group statistics such as leaderboards, activity trends, member levels, weekly awards, and moderation summaries for groups with public Limzo stats pages.
limzo-mcp
MCP (Model Context Protocol) server for Limzo, the Telegram anti-spam and moderation bot — read-only public Telegram group statistics: leaderboards, activity trends, member levels, weekly award history, and moderation summaries for any group with a public Limzo stats page.
No API key, no account. Everything served is already public at limzo.com/s/<slug> — payloads never include verbatim member messages.
Tools
Tool | What it returns |
| Search/browse the public group directory (slug, title, members, language) |
| Full public stats for one group by slug: activity, top members, levels, awards, moderation summary |
| Network-wide Limzo stats |
Related MCP server: Shadow-tg
Quick start
The server is hosted — this package is a stdio bridge for MCP clients:
npx limzo-mcpClaude Desktop / Claude Code
{
"mcpServers": {
"limzo": { "command": "npx", "args": ["-y", "limzo-mcp"] }
}
}Cursor / other MCP clients
Same pattern — command npx, args ["-y", "limzo-mcp"].
Direct HTTP (streamable MCP, no bridge)
Clients that support remote MCP can connect straight to:
https://limzo.com/api/public/mcpExample
Ask an assistant "How active is the hipo_chat Telegram group?" and it calls get_group_stats:
// get_group_stats { "slug": "hipo" } → (response trimmed)
{
"group": { "title": "Hipo Chat", "username": "hipo_chat", "member_count": 3920 },
"range": { "key": "7d", "label": "7 days", "days": 7 },
"stats": {
"messages": 1107,
"active_users": 236,
"mood": { "label": "Sunny", "emoji": "☀️", "positive_pct": 83 },
"top_members": [
{ "rank": 1, "name": "Josip", "messages": 238 },
{ "rank": 2, "name": "Behrang Norouzinia", "messages": 84 }
]
}
}Every value above is already public at limzo.com/s/hipo — the server never exposes verbatim member messages. Full response shape: openapi.json.
What is Limzo?
A Telegram community bot: public shareable stats pages, member levels/badges/achievements, weekly highlights and reports, mini-games, and smart anti-spam moderation (newcomer captcha, impersonator guard, link safety scan, /warn warnings, language lock, cross-group network shield). Free to start: @LimzoRobot.
Docs: https://limzo.com/docs/
llms.txt: https://limzo.com/llms.txt
Listed on
Official MCP Registry (com.limzo/telegram-group-stats) · Glama · Smithery · npm
License
MIT
Available Tools
3 toolsget_global_statsGet network-wide Limzo totalsARead-onlyInspect
Call this for network-wide numbers across all public Telegram groups tracked by Limzo (group count, messages, active users, replies, reactions, karma — 7-day and all-time) plus durable lifetime totals (messages analyzed, members tracked, spam messages removed) and the current top groups by Limzo Score. For finding a specific group, prefer list_groups.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| docs | No | Human-readable API documentation. |
| stats | Yes | |
| openapi | No | Machine-readable OpenAPI document for the REST API. |
| top_groups | No | Current top public groups by Limzo Score. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false. The description adds useful scope context: network-wide coverage, 7-day/all-time windows, durable lifetime totals, and top groups. It does not contradict annotations. Since the output schema exists, the lack of return format description is acceptable.
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 listing key outputs, followed by one concise sentence for guidance. No wasted words; every clause adds 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?
The tool is simple (0 params) and has an output schema. The description thoroughly covers the returned data (metrics, timeframes, totals, top groups) and provides usage context. It is complete and self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters and schema description coverage is 100% (vacuously). No parameter explanation is needed. The description adds meaning about what data is returned, which is beyond the empty 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 ('Call this for network-wide numbers') and clearly resources ('all public Telegram groups tracked by Limzo'), with an enumerated list of metrics. It is distinct from siblings: 'For finding a specific group, prefer list_groups' explicitly differentiates it.
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 provides an explicit alternative: 'For finding a specific group, prefer list_groups.' This gives clear when-to-use/when-not-to-use guidance and names the sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_group_statsGet public stats for one Telegram groupARead-onlyInspect
Call this when the user asks about the activity, health, leaderboard, mood, or trends of a specific Telegram group tracked by Limzo. slug is the last part of the group's public page URL, limzo.com/s/ (e.g. "hipo"). Returns the curated limzo.public_stats/v1 JSON: messages, replies, active members, daily series, top members, mood, reactions, language mix, the Limzo Levels ladder (lifetime XP + badge tiers), and weekly-league standings when the group has the league enabled. Optional range: 7d (default), 30d, all — the wider ranges only serve real data for groups on a paid plan and otherwise silently fall back to 7d, so check range.key in the result. Never includes verbatim member messages. For a private group (one with no public t.me handle) the member identities, the group description and member_count are withheld too: aggregates plus an anonymised leaderboard are all it returns.
| Name | Required | Description | Default |
|---|---|---|---|
| slug | Yes | The group's public slug — the last part of its limzo.com/s/<slug> URL. | |
| range | No | Stats window. Defaults to 7d. 30d/all require the group's paid plan; free groups silently fall back to 7d. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| docs | No | Human-readable API documentation. |
| group | Yes | |
| range | Yes | The range actually served — compare `key` with what you requested to detect the plan fallback. |
| stats | Yes | |
| schema | Yes | |
| openapi | No | Machine-readable OpenAPI document for the REST API. |
| generated_at | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only annotation, it discloses that verbatim member messages are never included, that private groups withhold identities/description/member_count and return an anonymised leaderboard, and that wider ranges silently fall back to 7d unless the group is on a paid plan. These are important behavioral caveats an agent needs to set correct expectations.
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 trigger is front-loaded, every sentence carries distinct information, and the detailed return-field list and caveats are justified given the tool's complexity. Nothing feels redundant or padded.
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 annotations, parameter schema, and output-schema presence, the description fully covers when to call, what to pass, what to expect, and edge cases such as paid-plan fallback and private-group anonymisation. An agent has enough context to call the tool correctly without additional inference.
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 actionable meaning: slug is tied to the URL pattern with an example, and range's default/paid-plan/fallback behavior is spelled out with the instruction to check range.key. That goes beyond simply restating parameter names.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear trigger: 'Call this when the user asks about... activity, health, leaderboard, mood, or trends of a specific Telegram group' and the title states the resource as 'public stats for one Telegram group'. This clearly distinguishes it from global-stats or group-listing tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to call the tool and scopes it to a specific group, which separates it from the global/listing siblings. It does not name the alternatives directly or state explicit when-not-to-use conditions, but the trigger phrasing and 'specific group' scope are strong enough to make intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_groupsList or search public Telegram groupsARead-onlyInspect
Call this to discover Telegram groups tracked by Limzo — to browse the directory, filter by language, or find a group's slug for get_group_stats. Optional query filters case-insensitively over group title, username, slug, and description. Optional lang (ISO 639-1, e.g. "fa", "es") keeps only groups where that language is a meaningful share of what members write — the way to answer "find active Persian/Spanish groups". Omit both to list the top groups by Limzo Score. The directory covers PUBLIC groups only — a group with no t.me handle is never listed, though it may still have a /s/ page. Each row carries a language mix (primary language + top languages as percentages); rows also include slug, title, username, plan, member_count, 7-day messages and active members, score and page URLs, plus total_matches so you can tell when more groups matched than were returned.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | ISO 639-1 language code (e.g. "fa", "es", "en"). Keeps groups whose main language it is (the detected top language, or the admin's chosen one when both are languages Limzo speaks) or where it is a meaningful share of the group. | |
| limit | No | Maximum groups to return. Defaults to 20, capped at 50. | |
| query | No | Keyword matched case-insensitively against group title, username, slug, and description. Omit to list the top groups by Limzo Score. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| docs | No | Human-readable API documentation. |
| lang | No | The applied ISO 639-1 language filter, or null when not filtering by language. |
| query | No | The normalized search keyword, or null when listing top groups. |
| groups | Yes | |
| openapi | No | Machine-readable OpenAPI document for the REST API. |
| total_matches | Yes | Groups that matched, before the limit was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are minimal (readOnlyHint: true, openWorldHint: false). The description goes beyond that by disclosing important behavioral details: it filters case-insensitively, has a language matching nuance ('meaningful share'), only includes public groups (with a caveat about /s/ pages), and returns a `total_matches` field to indicate when there are more results than returned. It also explains language detection ('top language' vs admin-chosen). This is rich behavioral context that is not in 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 comprehensive but a bit long. However, it is well-structured, front-loading the tool's purpose, then explaining each parameter's usage, and ending with output details. Every sentence adds value. The length is justified by the tool's complexity and the need to distinguish sibling usage, but it could be slightly 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?
Given the tool's moderate complexity (3 params, no required ones) and the existence of an output schema (which covers return structure), the description is complete. It explains the output fields (language mix, slug, title, etc.), the `total_matches` behavior, and the scope (public only). There's no missing information an agent would need to call it 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%, and the schema descriptions are already detailed. The tool description adds further value by specifying that `query` filters over four fields, that `lang` is ISO 639-1 and explains the 'meaningful share' semantics, and that omitting both yields top groups by Limzo Score. This goes beyond the schema's param descriptions, which are already good but less detailed about the nuances.
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: to discover Telegram groups tracked by Limzo, with options to browse, filter by language, or find a group's slug for get_group_stats. It uses a specific verb-resource combination ('Call this to discover Telegram groups') and distinguishes its two main modes: browsing and searching. This sets it apart from siblings like get_global_stats and get_group_stats, which are about stats rather than discovery.
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 explains when to use this tool versus alternatives: it mentions using get_group_stats as a follow-up after finding a group's slug, and it details when to use `query` vs `lang` vs neither. It also clarifies that it only lists public groups, which is a key exclusion criterion. This provides clear usage context and routing to siblings, leaving no ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
1 tool update
v1.3.1- Changed
list_groups1 field changed- changed
Input schema / properties / lang / descriptionPrevious value: -"ISO 639-1 language code (e.g. \"fa\", \"es\", \"en\"). Keeps only groups where that language is a meaningful share of the group."New value: +"ISO 639-1 language code (e.g. \"fa\", \"es\", \"en\"). Keeps groups whose main language it is (the detected top language, or the admin's chosen one when both are languages Limzo speaks) or where it is a meaningful share of the group."
3 tool updates
v1.3.0- First observed
get_global_stats - First observed
get_group_stats - First observed
list_groups
TDQS
Scored across 3 tools
Each tool serves a distinct purpose: list_groups for discovery, get_global_stats for network-wide metrics, and get_group_stats for a specific group. There is no overlap or ambiguity, as the descriptions explicitly clarify when to use each one.
All three tools follow a consistent verb_noun pattern (list_groups, get_global_stats, get_group_stats) with the same prefix structure and clear, readable naming. The convention is uniform and predictable.
With only 3 tools, the server is tightly scoped to its purpose of retrieving Limzo data: listing groups, global stats, and individual group stats. Each tool is essential and non-redundant, fitting comfortably within the typical 3-15 range.
The tool surface fully covers the domain of a read-only stats server: discovery via list_groups, network overview via get_global_stats, and detailed group analysis via get_group_stats. There are no missing operations needed for the server's stated purpose.
Maintenance
Related MCP Connectors
Live Telegram data: trending topics, channel profiles & metrics, post history incl. edits/deletions.
I use your linked Telegram MTProto session (Integrations → Telegram) to list groups, members, and s…
Search 100k+ auto-verified Telegram channels, bots and groups: full-text search and top rankings.
Search 408K+ MAX channels and 86M+ posts; metrics, reactions, forwards, webhooks and usage.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceRead-only MCP access to a personal Telegram account. Allows querying chats, reading and searching messages via Streamable HTTP.-
- AlicenseNot gradedqualityBmaintenanceRead public Telegram channels from AI agents — channel metadata, posts, comments, and search. No MTProto, no Telethon, no api_id.MIT
- AlicenseNot gradedqualityCmaintenancePublic Telegram catalog MCP server: search 1.4M+ channels, groups, bots, and posts, and browse marketplace listings, with no auth or API key.1MIT
- FlicenseNot gradedqualityCmaintenanceRead-only MCP server for Telegram channels. Provides access to posts, comments, reactions, and aggregated statistics via MTProto.35 npm-