Skip to main content
Glama

Limzo Telegram Group Stats

Get public stats for one Telegram group

get_group_stats
Read-only

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.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
slugYesThe group's public slug — the last part of its limzo.com/s/<slug> URL.
rangeNoStats window. Defaults to 7d. 30d/all require the group's paid plan; free groups silently fall back to 7d.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
okYes
docsNoHuman-readable API documentation.
groupYes
rangeYesThe range actually served — compare `key` with what you requested to detect the plan fallback.
statsYes
schemaYes
openapiNoMachine-readable OpenAPI document for the REST API.
generated_atYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedOutput schema / description
      Previous value: -"Curated, versioned public stats payload. Never includes verbatim member messages."New value: +"Curated, versioned public stats payload. 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."
    • addedOutput schema / properties / group / properties / description / description
      Added value: +"The group description. On a private group this is null unless an admin wrote a public description specifically for this page, in which case that text is served instead of the Telegram one."
    • changedOutput schema / properties / group / properties / is_private / description
      Previous value: -"True when the group has no public t.me address. Private groups expose aggregates and the leaderboard only."New value: +"True when the group has no public t.me address. Private groups expose aggregate stats and an anonymised leaderboard only: member identities, verbatim content, the group description and member_count are all withheld, and the group is not listed in the public directory."
    • addedOutput schema / properties / group / properties / member_count / description
      Added value: +"Telegram member count. Always null for a private group — Limzo only knows it because the bot is in the chat, so it is not ours to publish."
  2. Changed2 schema fields changed
    • addedOutput schema / properties / group / properties / bot_in_group
      Added value: +{
      +  "description": "False once Limzo has been removed from the chat. Every windowed figure then stops advancing and the page becomes a frozen archive; the data is kept for 90 days after removal, then the page returns 410.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / stats / properties / tracking_paused
      Added value: +{
      +  "description": "True when Limzo is no longer in the group, so nothing further will ever be counted. Unlike tracking_frozen (a monthly cap that lifts on the 1st) this only clears if the bot is re-added. Mirrors group.bot_in_group === false.",
      +  "type": "boolean"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / stats / properties / tracking_frozen
      Added value: +{
      +  "description": "True while tracking is paused because the group used up its plan's monthly message allowance (resets on the 1st, UTC). While true, windowed stats undercount real activity — the group is NOT quiet.",
      +  "type": "boolean"
      +}
  4. Changed2 schema fields changed
    • addedOutput schema / properties / stats / properties / league
      Added value: +{
      +  "description": "Weekly league standings (this ISO week, resets Monday). Only present when the group has the league enabled; null otherwise. Tiers are activity percentile bands: diamond top 10%, platinum next 15%, gold next 25%, silver next 25%, bronze rest.",
      +  "properties": {
      +    "members": {
      +      "items": {
      +        "properties": {
      +          "messages": {
      +            "description": "Messages this ISO week.",
      +            "type": "integer"
      +          },
      +          "movement": {
      +            "description": "1 promoted vs last week, -1 relegated, 0 unchanged, null = no baseline yet.",
      +            "type": [
      +              "integer",
      +              "null"
      +            ]
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "rank": {
      +            "description": "1-based position this week.",
      +            "type": "integer"
      +          },
      +          "tier": {
      +            "description": "bronze, silver, gold, platinum, or diamond.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "username": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "season": {
      +      "description": "ISO week key, e.g. \"2026-W30\".",
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / stats / properties / levels
      Added value: +{
      +  "description": "Limzo Levels — the group's lifetime-XP ladder (top 12 members). XP accrues from karma (helpful replies, reactions received, conversation starters), never from raw message volume alone. Tier names may be customised by the group.",
      +  "items": {
      +    "properties": {
      +      "level": {
      +        "description": "Current level (permanent, no decay).",
      +        "type": "integer"
      +      },
      +      "name": {
      +        "type": "string"
      +      },
      +      "rank": {
      +        "description": "1-based position.",
      +        "type": "integer"
      +      },
      +      "tier": {
      +        "description": "Badge tier key: newcomer, regular, familiar, veteran, elite, legend.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "tier_title": {
      +        "description": "Display title for the tier (may be a group-custom name).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "username": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "xp": {
      +        "description": "Lifetime XP (karma) in this group.",
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / stats / properties / languages
      Added value: +{
      +  "description": "How international the group is: its language mix, detected from the languages members actually write in (falling back to their app language for new or quiet groups). Null when there is not enough signal. Never derived from verbatim message text exposed over the API.",
      +  "properties": {
      +    "distinct": {
      +      "description": "Number of distinct languages detected.",
      +      "type": "integer"
      +    },
      +    "items": {
      +      "description": "Top languages by share, largest first; a trailing null-code \"other\" bucket may aggregate the long tail.",
      +      "items": {
      +        "properties": {
      +          "code": {
      +            "description": "ISO 639-1 language code, or null for the aggregated \"other\" bucket.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "name": {
      +            "description": "Language name in English.",
      +            "type": "string"
      +          },
      +          "pct": {
      +            "description": "Share of the group, 0–100.",
      +            "type": "number"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "primary": {
      +      "description": "Dominant language as an ISO 639-1 code (e.g. \"fa\", \"es\", \"en\").",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  6. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "description": "Curated, versioned public stats payload. Never includes verbatim member messages.",
      +  "properties": {
      +    "docs": {
      +      "description": "Human-readable API documentation.",
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    "generated_at": {
      +      "format": "date-time",
      +      "type": "string"
      +    },
      +    "group": {
      +      "properties": {
      +        "description": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "is_private": {
      +          "description": "True when the group has no public t.me address. Private groups expose aggregates and the leaderboard only.",
      +          "type": "boolean"
      +        },
      +        "member_count": {
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "plan": {
      +          "enum": [
      +            "free",
      +            "pro",
      +            "community"
      +          ],
      +          "type": "string"
      +        },
      +        "slug": {
      +          "type": "string"
      +        },
      +        "telegram_url": {
      +          "format": "uri",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "title": {
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "url": {
      +          "description": "The human stats page for this group.",
      +          "format": "uri",
      +          "type": "string"
      +        },
      +        "username": {
      +          "description": "Telegram username without @, when the group is public on t.me.",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "ok": {
      +      "const": true,
      +      "type": "boolean"
      +    },
      +    "openapi": {
      +      "description": "Machine-readable OpenAPI document for the REST API.",
      +      "format": "uri",
      +      "type": "string"
      +    },
      +    "range": {
      +      "description": "The range actually served — compare `key` with what you requested to detect the plan fallback.",
      +      "properties": {
      +        "days": {
      +          "description": "Length of the window in days.",
      +          "type": "integer"
      +        },
      +        "key": {
      +          "enum": [
      +            "7d",
      +            "30d",
      +            "all"
      +          ],
      +          "type": "string"
      +        },
      +        "label": {
      +          "type": "string"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "schema": {
      +      "const": "limzo.public_stats/v1",
      +      "type": "string"
      +    },
      +    "stats": {
      +      "properties": {
      +        "active_users": {
      +          "description": "Unique posting members in the selected range.",
      +          "type": "integer"
      +        },
      +        "active_users_today": {
      +          "description": "Unique posting members so far today (UTC).",
      +          "type": "integer"
      +        },
      +        "daily": {
      +          "description": "Per-day series over the selected range.",
      +          "items": {
      +            "properties": {
      +              "active_users": {
      +                "type": "integer"
      +              },
      +              "day": {
      +                "format": "date",
      +                "type": "string"
      +              },
      +              "messages": {
      +                "type": "integer"
      +              },
      +              "replies": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "lifetime_messages": {
      +          "description": "Messages since Limzo started tracking the group.",
      +          "type": "integer"
      +        },
      +        "messages": {
      +          "description": "Messages in the selected range.",
      +          "type": "integer"
      +        },
      +        "messages_today": {
      +          "description": "Messages so far today (UTC).",
      +          "type": "integer"
      +        },
      +        "mood": {
      +          "description": "Group mood derived from reactions. Null when there is not enough data.",
      +          "properties": {
      +            "emoji": {
      +              "type": "string"
      +            },
      +            "label": {
      +              "type": "string"
      +            },
      +            "positive_pct": {
      +              "description": "Share of positive reactions, 0–100.",
      +              "type": "number"
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "new_active_members": {
      +          "description": "Members who posted for the first time in the selected range.",
      +          "type": "integer"
      +        },
      +        "peak_hour_utc": {
      +          "description": "Busiest hour of day, UTC.",
      +          "maximum": 23,
      +          "minimum": 0,
      +          "type": [
      +            "integer",
      +            "null"
      +          ]
      +        },
      +        "reaction_magnet": {
      +          "description": "The member whose messages attracted the most reactions. Null when the range has no reaction data.",
      +          "properties": {
      +            "count": {
      +              "description": "Reactions in the selected range.",
      +              "type": "integer"
      +            },
      +            "name": {
      +              "description": "Display name as shown on the public page.",
      +              "type": "string"
      +            },
      +            "username": {
      +              "description": "Telegram username without @, when public.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "replies": {
      +          "description": "Replies in the selected range.",
      +          "type": "integer"
      +        },
      +        "stickers": {
      +          "description": "Stickers in the selected range.",
      +          "type": "integer"
      +        },
      +        "top_members": {
      +          "description": "Member leaderboard for the selected range.",
      +          "items": {
      +            "properties": {
      +              "messages": {
      +                "type": "integer"
      +              },
      +              "name": {
      +                "type": "string"
      +              },
      +              "rank": {
      +                "description": "1-based position.",
      +                "type": "integer"
      +              },
      +              "replies": {
      +                "type": "integer"
      +              },
      +              "username": {
      +                "type": [
      +                  "string",
      +                  "null"
      +                ]
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "type": "array"
      +        },
      +        "top_reactor": {
      +          "description": "A member singled out by reaction activity. Null when the range has no reaction data.",
      +          "properties": {
      +            "count": {
      +              "description": "Reactions in the selected range.",
      +              "type": "integer"
      +            },
      +            "name": {
      +              "description": "Display name as shown on the public page.",
      +              "type": "string"
      +            },
      +            "username": {
      +              "description": "Telegram username without @, when public.",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            }
      +          },
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "tracked_since_days": {
      +          "description": "Days since tracking started.",
      +          "type": "integer"
      +        }
      +      },
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "ok",
      +    "schema",
      +    "generated_at",
      +    "group",
      +    "range",
      +    "stats"
      +  ],
      +  "type": "object"
      +}
  7. First observed

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.