@mira lives in chat, not code. mira-harness bridges the gap.
01 Concept
A CLI + MCP dev-tool for communicating with @mira
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 5 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()
27
built-in tests
4
categories — core / skills / generation / wallet
3
ways in — CLI / MCP / library
5
MCP tools
send
one test → full replyprints the full reply (buttons / links / media) as JSON
loop
run the testspaced, read-only; grades expect probes PASS/FAIL and exits non-zero on failure → drops into CI
report
JSONL → Markdownturns a run log into a table (summary / signals / time)