CLI tool to read Telegram messages from the terminal
Project description
tgcli — Telegram for your terminal and your AI agents.
Give AI agents (Claude Code, Codex, Cursor, etc.) direct access to your Telegram conversations. Structured JSONL output, minimal command surface, fuzzy name resolution. Works equally well for humans with --pretty.
Features
- JSONL by default — one JSON object per line; agents parse it natively, scripts pipe it freely
- Minimal surface — a handful of commands; easy for agents to discover and invoke
- Fuzzy resolution — chat and user names match by display name (no numeric IDs required)
--prettyfor humans — Rich tables when you want to read output yourself- Secure session storage — Telethon session key stored in macOS Keychain via
keyring
Installation
Requires Python 3.12+ and uv.
uv tool install pytgcli
Or install from source:
git clone https://github.com/tksohishi/tgcli.git
cd tgcli
uv tool install .
Quick Start
1. Get API Credentials
Create a Telegram API app at my.telegram.org/apps. You'll get an api_id and api_hash.
2. Authenticate
tg auth
This walks you through setup: saves your API credentials to ~/.config/tgcli/config.toml, then logs in with phone number + verification code.
3. Read Messages
tg read "Alice"
tg read "Finance Team" --limit 20
tg read "Finance Team" -q "budget"
tg read "Finance Team" -q "deadline" --from "Alice" --after 2025-01-01
4. View Context
tg context "Finance Team" 12345
Use with AI Agents
Once authenticated, any AI coding agent with shell access can use tgcli directly. A few examples:
Ask Claude Code to summarize a group chat:
"Read the last 30 messages from 'Engineering' and summarize the key decisions."
The agent runs tg read "Engineering" --limit 30, parses the JSONL, and responds.
Find a past conversation:
"What did I discuss with Alice last week about the deployment?"
The agent runs tg read "Alice" -q "deployment" --after 2025-02-14 and surfaces the relevant messages.
Pipe into scripts:
tg read "Alerts" --limit 100 | jq 'select(.text | test("ERROR"))'
No wrapper libraries or API adapters needed. The structured output and simple command surface mean agents can use tgcli out of the box.
Commands
tg auth
Smart entrypoint: creates config if missing, logs in if needed, shows status if already authenticated.
Explicit subcommands:
tg auth login- interactive login (phone + code/2FA)tg auth logout- remove session from Keychaintg auth status- show auth state
tg chats
List your Telegram chats. Returns JSONL by default.
| Flag | Description |
|---|---|
--filter |
Fuzzy filter by chat name |
--limit |
Max chats to list (default 100) |
--pretty |
Rich table output instead of JSONL |
tg read <chat>
Read recent messages from a chat. Returns JSONL by default, newest first.
| Flag | Description |
|---|---|
--query/-q |
Filter messages by text |
--from |
Filter by sender |
--limit |
Max messages (default 50) |
--head |
Oldest messages first |
--after |
Only messages after date (YYYY-MM-DD) |
--before |
Only messages before date (YYYY-MM-DD) |
--pretty |
Rich table output instead of JSONL |
tg context <chat> <message_id>
View a message with surrounding context. Returns JSONL by default.
| Flag | Description |
|---|---|
--context |
Messages before/after (default 5) |
--pretty |
Rich text output instead of JSONL |
Configuration
Config lives at ~/.config/tgcli/config.toml:
api_id = 123456
api_hash = "your_api_hash"
Alternatively, set TELEGRAM_API_ID and TELEGRAM_API_HASH environment variables.
Contributing
uv sync --group dev
uv run pytest
uv run ruff check
Tests mock Telethon entirely; no real API calls are made.
License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pytgcli-0.7.0.tar.gz.
File metadata
- Download URL: pytgcli-0.7.0.tar.gz
- Upload date:
- Size: 50.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1d942475342d2a8f7870881ca760de4a443918231926f9e76171b6dd6f5a2571
|
|
| MD5 |
7cb9e87107aa5be1cebf937a5c53582a
|
|
| BLAKE2b-256 |
e70482a314e9e5150885a3343a9112ba60a9566ec0b1e8b5a2db8328c0c8d16c
|
File details
Details for the file pytgcli-0.7.0-py3-none-any.whl.
File metadata
- Download URL: pytgcli-0.7.0-py3-none-any.whl
- Upload date:
- Size: 12.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.10.4 {"installer":{"name":"uv","version":"0.10.4","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34ca914857f41a3bf356e8aa12c79f6fa910a12126f90369280770f273a87e22
|
|
| MD5 |
c3a6b7a9f24ea023241ae98455a9355c
|
|
| BLAKE2b-256 |
46a5afdc2ae96e5bed4e2e8bbf00b6c1362290695696701b55b1c96e018851cc
|