Skip to main content
Glama

ListMessages

Retrieve recent messages from Telegram chats, channels, or dialogs. Filter by unread messages or set a limit to view specific conversations.

Instructions

List messages in a given dialog, chat or channel. The messages are listed in order from newest to oldest. If `unread` is set to `True`, only unread messages will be listed. Once a message is read, it will not be listed again. If `limit` is set, only the last `limit` messages will be listed. If `unread` is set, the limit will be the minimum between the unread messages and the limit.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
dialog_idYes
unreadNo
limitNo

Implementation Reference

  • The main handler function for executing the ListMessages tool. It fetches messages from the specified Telegram dialog_id, optionally filtering by unread status and limiting the number, and returns text contents of messages.
    @tool_runner.register async def list_messages( args: ListMessages, ) -> t.Sequence[TextContent | ImageContent | EmbeddedResource]: client: TelegramClient logger.info("method[ListMessages] args[%s]", args) response: list[TextContent] = [] async with create_client() as client: result = await client(functions.messages.GetPeerDialogsRequest(peers=[args.dialog_id])) if not result: raise ValueError(f"Channel not found: {args.dialog_id}") if not isinstance(result, types.messages.PeerDialogs): raise TypeError(f"Unexpected result: {type(result)}") for dialog in result.dialogs: logger.debug("dialog: %s", dialog) for message in result.messages: logger.debug("message: %s", message) iter_messages_args: dict[str, t.Any] = { "entity": args.dialog_id, "reverse": False, } if args.unread: iter_messages_args["limit"] = min(dialog.unread_count, args.limit) else: iter_messages_args["limit"] = args.limit logger.debug("iter_messages_args: %s", iter_messages_args) async for message in client.iter_messages(**iter_messages_args): logger.debug("message: %s", type(message)) if isinstance(message, custom.Message) and message.text: logger.debug("message: %s", message.text) response.append(TextContent(type="text", text=message.text)) return response
  • Pydantic model defining the input parameters for the ListMessages tool: dialog_id (required int), unread (bool default False), limit (int default 100). The docstring provides the tool description.
    class ListMessages(ToolArgs): """ List messages in a given dialog, chat or channel. The messages are listed in order from newest to oldest. If `unread` is set to `True`, only unread messages will be listed. Once a message is read, it will not be listed again. If `limit` is set, only the last `limit` messages will be listed. If `unread` is set, the limit will be the minimum between the unread messages and the limit. """ dialog_id: int unread: bool = False limit: int = 100
  • Dynamic registration of tools by inspecting subclasses of ToolArgs in the tools module, including ListMessages, and creating the tool mapping used by list_tools and call_tool.
    def enumerate_available_tools() -> t.Generator[tuple[str, Tool], t.Any, None]: for _, tool_args in inspect.getmembers(tools, inspect.isclass): if issubclass(tool_args, tools.ToolArgs) and tool_args != tools.ToolArgs: logger.debug("Found tool: %s", tool_args) description = tools.tool_description(tool_args) yield description.name, description mapping: dict[str, Tool] = dict(enumerate_available_tools())
  • Helper function that generates the Tool object from a ToolArgs class, used for registration of ListMessages.
    def tool_description(args: type[ToolArgs]) -> Tool: return Tool( name=args.__name__, description=args.__doc__, inputSchema=args.model_json_schema(), )
  • MCP server handler for tool calls that dispatches to the specific tool_runner for ListMessages via the dynamic mapping.
    async def call_tool(name: str, arguments: t.Any) -> Sequence[TextContent | ImageContent | EmbeddedResource]: # noqa: ANN401 """Handle tool calls for command line run.""" if not isinstance(arguments, dict): raise TypeError("arguments must be dictionary") tool = mapping.get(name) if not tool: raise ValueError(f"Unknown tool: {name}") try: args = tools.tool_args(tool, **arguments) return await tools.tool_runner(args) except Exception as e: logger.exception("Error running tool: %s", name) raise RuntimeError(f"Caught Exception. Error: {e}") from e
Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/sparfenyuk/mcp-telegram'

If you have feedback or need assistance with the MCP directory API, please join our Discord server