Drive the @mira Telegram bot from a userbot, capture its full reply (buttons, links, media, edits), and run a self-driving experiment catalog β from the CLI, as a library, or via MCP.
One AI runs another by itself, and saves exactly how @mira works.
02 Problem
@mira is chat-native
@mira lives in Telegram chat, not behind a public API. And Telegram has a strict rule: a bot can't read another bot's messages. So a bot token won't work β the only way is a userbot (a real user account over MTProto).
Telegram blocks bot-to-bot reads and @mira is chat-only β so a GramJS userbot is the only way in.
03 Solution
Capture the whole reply, not just the text
A naive read grabs only the first message's text β but @mira's reply hides the useful parts elsewhere: buttons, deep links, images, and live edits. mira-harness waits for the reply to settle (a quiet pause; for a slow bot it also watches the "typingβ¦" sign β replies take 5β62s), then captures all of it.
Wait for the reply to settle, then capture all of it β the part a text-only client misses.
04 Features
One core, three frontends
Three ways to drive @mira β the CLI, an MCP server for agents, and a library to import. A built-in list of 27 tests lets it run on its own, safe by default.
One core, three ways in β by hand, from an agent, or from code.
CLI
What: commands in your terminal. Use it to try @mira by hand, fast. npx mira-harness
MCP
What: a server with 8 tools. Use it to let Claude drive @mira β hands-free, read-only.
Library
What: a TypeScript import. Use it to build @mira into your own code. sendAndCollect()