Skip to main content

Telegram Managed Bot Factory

A local MCP control plane for creating owner-confirmed, isolated Telegram Managed Bots.

Status: v0.1.0 release candidate. The implementation and local acceptance suite are complete, but the package is not yet published to PyPI and the Registry entry is not yet live. See project status.

Configure one separate manager bot once. Afterwards Hermes can request a focused child bot, you confirm its creation in Telegram, and the persistent Factory worker retrieves the child credential directly from Telegram and starts an isolated built-in profile. Child credentials never need to be copied into Hermes or a chat.

Supported platform

  • Linux with systemd --user (Ubuntu and WSL2 are tested development environments)
  • Python 3.11–3.14
  • Hermes 0.18 legacy stdio, plus modern MCP 2026-07-28 clients
  • Telegram Bot API Managed Bots

Windows and macOS runtime installation are not supported in v0.1.

Built-in profiles

Profile Purpose
quick_faq Public welcome text and 3–8 local plain-text FAQ answers.
lead_inbox Privacy notice, optional name and message, owner notification, confirmed /export and /purge.
link_inbox Owner-only notes and URLs with /list and /done; URLs are never fetched.
owner_echo Owner-only /start, /help, /health, and echo isolation smoke test.

Profiles cannot supply code, executables, filesystem paths, HTML, or remote fetches.

Install after the PyPI release

Prerequisites: install uv and Hermes, create a dedicated manager bot in BotFather, and enable Bot Management Mode for it.

uvx --from telegram-managed-bot-factory==0.1.0 bot-factory install-hermes

The installer:

  1. installs the pinned Factory package as a user tool;
  2. asks for the manager token once through a hidden local getpass prompt;
  3. verifies getMe.can_manage_bots;
  4. asks you to send a one-time /claim command to the manager bot and locally confirm the detected account;
  5. installs a hardened bot-factory-manager.service user unit;
  6. registers bot-factory-mcp with Hermes and verifies all six tools.

The installer fails closed unless Hermes explicitly reports all six tools; it does not trust the Hermes process exit code by itself.

Installation creates no child bots. A test or useful child is created only after a separate explicit Factory request and the normal Telegram confirmation.

Do not paste the token into Hermes, this README, a command argument, an environment variable, or a YAML file. Re-running installation verifies a complete existing enrollment from the local secret store and does not ask for the manager token again.

Before PyPI publication, contributors can run the non-live suite from source:

uv sync --frozen --group dev
uv run ruff check .
uv run mypy src
uv run pytest -q

60–90 second quick_faq flow

After setup, ask Hermes:

Create a quick FAQ bot named “Studio FAQ” with username studio_faq_bot. Welcome text: “Choose a question.” FAQs: pricing, turnaround, and contact. Contact: “Message the owner here.”

Hermes calls factory_create_request and returns a Telegram confirmation URL. Open it and approve creation once. The worker receives the managed_bot update, retrieves the child credential, materializes its local runtime, and starts it. Open the child, select an FAQ, then send /health. Use factory_get_request or factory_list_instances if provisioning is still in progress.

Two other short scenarios:

  • Ask for a lead_inbox with a concise privacy notice; submit one test lead, then use owner-only /export and confirmed /purge.
  • Ask for a link_inbox; save a URL and note, inspect /list, then mark it with /done. The bot stores the URL but never opens it.

MCP contract

The default catalog is exactly:

  • factory_preflight
  • factory_create_request
  • factory_get_request
  • factory_list_instances
  • factory_start_instance
  • factory_stop_instance

All input models reject unknown fields. Results expose lifecycle status only; they do not contain credentials, raw Telegram updates, owner IDs, local paths, or internal hosts. request_id is durable across MCP process restarts.

Modern clients negotiate server/discover, stateless Streamable HTTP, strict schemas, trace propagation, and sealed single-use MRTR state. The experimental Tasks extension is deliberately not advertised. Hermes 0.18 uses the legacy stdio fallback against the same server.

Security boundaries

  • The manager identity is user-owned and separate from the Hermes gateway bot.
  • Telegram confirmation is mandatory for every child.
  • The persistent worker is the only Telegram update consumer and token retriever.
  • Secrets are stored under owner-only XDG directories (0700) and files (0600), outside SQLite and manifests.
  • A child receives only its credential through an inherited anonymous file descriptor, never CLI arguments or environment variables.
  • Duplicate updates are no-ops. Mismatched, late, or ambiguous external results enter reconciliation_required and are not blindly retried.

See specification, architecture, acceptance criteria, redacted Telegram spike evidence, and redacted TestPyPI live E2E evidence.

Troubleshooting

factory_preflight says the worker is unhealthy:

systemctl --user status bot-factory-manager.service
journalctl --user -u bot-factory-manager.service --since today

On WSL2, confirm that PID 1 is systemd before rerunning setup:

ps -p 1 -o comm=
systemctl --user is-system-running

WSL2 is a development environment: keep a WSL session or another WSL process running during a live bot test. Windows may stop an idle distribution, which also stops its systemd --user services. A continuously running Linux host is the supported production target.

Do not paste journal output into an issue until it has been reviewed for personal data. Factory errors are intentionally redacted.

If Hermes cannot connect:

hermes mcp test bot-factory
systemctl --user restart bot-factory-manager.service

If user services stop after logout, enable lingering only if that matches your host policy:

loginctl enable-linger "$USER"

Uninstall

systemctl --user disable --now bot-factory-manager.service
rm "$HOME/.config/systemd/user/bot-factory-manager.service"
systemctl --user daemon-reload
hermes mcp remove bot-factory
uv tool uninstall telegram-managed-bot-factory

Factory state and credentials are intentionally not deleted by those commands. Review the XDG bot-factory directories and remove them yourself only after deciding whether data must be retained. Uninstalling does not delete or revoke any Telegram bot account; use Telegram/BotFather controls separately.

Release and Registry

Releases use GitHub OIDC Trusted Publishing with no long-lived PyPI token. The Official MCP Registry hosts metadata, not the package, and its preview listing is not a security certification. No Hermes curated-catalog listing is promised.

See publication gates, changelog, security policy, and contributing guide.

Sources

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

telegram_managed_bot_factory-0.1.0.tar.gz (210.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

telegram_managed_bot_factory-0.1.0-py3-none-any.whl (38.3 kB view details)

Uploaded Python 3

File details

Details for the file telegram_managed_bot_factory-0.1.0.tar.gz.

File metadata

File hashes

Hashes for telegram_managed_bot_factory-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bcc0044cd90776716d901d197cd12e97092ebacc2aba179753e2f96f6aaa122d
MD5 44d239707444c7e4b72643c885ed8c8e
BLAKE2b-256 cb82bc034dd6ac5a2399c5abbbc781d1b9f641b14deaf8f76f04813a29a09580

See more details on using hashes here.

Provenance

The following attestation bundles were made for telegram_managed_bot_factory-0.1.0.tar.gz:

Publisher: release.yml on laser54/telegram-managed-bot-factory

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file telegram_managed_bot_factory-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for telegram_managed_bot_factory-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2cdde8b596ad3c5a48b2b8726750d35b4c0dea63de90dd5e1658e681733ce7a2
MD5 f334d40ab134caaa302a530e4bce61ae
BLAKE2b-256 960ee2a24b3e966ddcff4d12246b2aa0b8856e50471a7b8cdeb8e638138bcdb6

See more details on using hashes here.

Provenance

The following attestation bundles were made for telegram_managed_bot_factory-0.1.0-py3-none-any.whl:

Publisher: release.yml on laser54/telegram-managed-bot-factory

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page