MCTL
Privacy

Privacy and data handling

What this service stores, for how long, who can access it, and how to remove it. See /security for the threat model.

Claude, ChatGPT and other MCP users

When you connect MCTL to Claude, ChatGPT, or another MCP client, the following data flows apply:

AI use of your messages

Your chats contain messages written by other people, who have not agreed to anything with this service. Telegram's terms forbid using Telegram data to train AI models without consent, so the rules here are narrow:

Data inventory

WhereContentsWhyRetention
users table Telegram user id, display name, and username Resolves your identity for per-user storage isolation Account deletion clears the display name, username and last-seen time and removes related user-scoped rows by database cascade where configured. The Telegram user id, access tier and the time of the delete are kept, so a later sign-in is matched to the same row and an authorization code issued before the delete cannot be redeemed after it.
client_notification_prefs table One row per category you explicitly decided (product_updates, maintenance, security), with the state, the time you decided, and which surface you used. No row is written for a default you never changed. Records consent per category, so operational notices are never counted as marketing consent Removed by account deletion. A preference grants no Telegram or MCP access.
client_bot_reachability table Whether the login bot may currently start a chat with you (unknown, reachable, blocked, cannot_initiate), when that was observed and from which delivery. No message content and no Telegram API response body. Learned only from the outcome of a message actually sent to you; no message is ever sent merely to test reachability Removed by account deletion
telegram_accounts table AES-256-GCM ciphertext of your MTProto session blob using a per-user derived key, plus account metadata and feature/send flags Required to make Telegram API calls on your behalf Until disconnect/revocation or deletion; session TTLs and sweepers may revoke it earlier
incoming_events and conversation_messages Communication Agent event metadata and third-party Telegram message bodies. Message bodies are AES-256-GCM encrypted before storage. Durable ingestion, deduplication, queue recovery, conversation context, and owner takeover handling Encrypted bodies/context: AGENT_RETENTION_DAYS, default 30 days. Event metadata remains as a deduplication tombstone until account deletion. Setting retention to 0 keeps content indefinitely.
agent_actions Proposed reply/action payloads, policy decision and reasons, approval state, and execution metadata. Sensitive payload text is encrypted at rest. Server-side policy enforcement, human approval, and exactly-once-oriented execution bookkeeping Encrypted draft/send content and approval capabilities: AGENT_RETENTION_DAYS, default 30 days. Old inactive pre-send actions are denied before content is cleared; executing actions retain recovery data until terminal. Lifecycle metadata remains until account deletion.
audit_logs table Tool/action name, redacted peer reference, status, and a redacted error string. No message body, phone number, bearer token, or session bytes. Operational visibility, abuse detection, and user-visible audit history Default 90 days via AUDIT_RETENTION_DAYS; 0 keeps rows indefinitely
Process memory Plaintext Telegram messages, decrypted agent content, tool arguments, and tool results while a request, listener update, policy evaluation, or queue job is being processed Required to fulfil the request or agent workflow Released after processing; the running process/operator can access it while present
Process stdout (Loki) Structured JSON log lines from slog, with message/body/payload and credential keys redacted Operator debugging Per the platform's Loki retention (typically 14–30 days)

What is NOT stored in logs or audit history

Important: when Communication Agent is enabled, message content is stored in encrypted agent tables as described above. The previous “message text is never written to disk” guarantee applies only to ordinary read-tool responses and audit/logging paths, not to the durable agent workflow.

Website analytics

To learn how many people visit tg.mctl.ai and where they come from, the public content pages (home, docs, demo, security, privacy, terms, Local Bridge docs and product updates) load Umami, an open-source analytics tool that we host ourselves at stats.mctl.ai. No analytics data is sent to a third party. Umami sets no cookies. For each page view it records the page address (including campaign parameters such as utm_source), the referring site, browser, operating system, device type, screen size, language, and country, region and city derived from your IP address. Your IP address and user agent are used to compute an anonymous visitor identifier; the IP address itself is not stored.

The sign-in, consent, connect and account-management pages under /oauth, /telegram/connect and /local-bridge/activate do not load Umami, and no Telegram data, tool call, token or account identifier is ever sent to it. Page-view records are deleted automatically 2 years after they were recorded.

Communication Agent controls

Self-service controls

You can remove account access and inspect what was recorded without operator involvement. Disconnect and delete require a connection granted account:manage; read-only connections, worker tokens and Local Bridge device credentials are refused with 403, and the refusal is recorded in your audit log. On tg.mctl.ai, you can still disconnect from the manage page after signing in with Telegram.

POST   /api/account/disconnect   # end Telegram session; OAuth grant kept
DELETE /api/account              # delete account/session row and user-scoped data; revoke OAuth refresh tokens, worker tokens and Local Bridge devices
GET    /api/account              # connection status + feature/send flags
GET    /api/account/audit        # newest-first audit rows (limit, before)
GET    /api/account/audit/verify # recompute the audit hash chain

Notification preferences are part of the same self-service surface:

GET    /api/account/notifications   # resolved preference per category
PUT    /api/account/notifications   # change one or more categories

They can also be changed in the browser at /telegram/connect/manage after signing in with Telegram, which submits a plain HTML form and needs no JavaScript. Reading or changing them through the API, and turning one on in the browser, requires a connection granted account:manage; after signing in with Telegram you can always turn notifications off there. Product updates stay off until you turn them on; maintenance and security are classified as operational notices and are never treated as marketing consent.

Equivalent MCP tools include disconnect_telegram_account, delete_telegram_account, get_my_audit_log, get_my_notification_preferences, and set_my_notification_preferences. All of them except get_my_audit_log require account:manage and are listed only to connections granted it. Disconnect/delete also tear down the in-memory MTProto client so a concurrent request cannot continue using a revoked session.

Who can access your data

Third parties

Contact

General support: [email protected]. Privacy inquiries: [email protected]. For security or vulnerability reports, see /security. Code is open source at github.com/mctlhq/mctl-telegram.