mcpField
T
tg-responder

tg-responder

github.com/glebisProductivity401141 installsUpdated 1d ago
Repository

About tg-responder

tg-responder is a Telegram communications skill for reviewing response drafts, checking queue status, and tracking unanswered messages. It supports approval, editing, or skipping drafts and configurable follow-up reminders.

Key features

  1. 01Review and approve response drafts
  2. 02View inbox and outbox statistics
  3. 03Track unanswered messages
  4. 04Configure reminder schedules
  5. 05Send approved drafts through Telegram

Use cases

  1. 01Approve or edit queued Telegram replies
  2. 02Check pending and failed message counts
  3. 03Remind contacts who have not replied

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/glebis/claude-skills --skill tg-responder

After installing, type/tg-responderin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

.gitignore
prompts/
classify.md
scripts/
backfill.py
classify.py
follow_ups.py
hook.py
lookup_chat.py
schema.py
seed_templates.py
tg_draft.py
worker.py

Details

From the project README

tg-responder — Telegram Communications Assistant

Review pending response drafts and manage the Telegram response queue.

Commands

review — Approve pending drafts

Read the responder queue and present drafts for approval:

python3 ~/.claude/skills/tg-responder/scripts/schema.py  # ensure DB exists

Then query the database:

-- Pending drafts needing approval
SELECT o.id, o.chat_id, o.draft_text, o.draft_reason, o.source,
       i.sender_name, i.text as original_text, i.urgency, i.category,
       datetime(i.received_at, 'unixepoch') as received
FROM outbox o
JOIN inbox i ON o.inbox_id = i.id
WHERE o.status = 'draft'
ORDER BY
  CASE i.urgency WHEN 'urgent' THEN 0 WHEN 'normal' THEN 1 ELSE 2 END,
  o.created_at ASC;

For each draft, present to the user:

  1. Original message — who sent it, when, what they said
  2. Draft response — the proposed reply
  3. Options: approve (send as-is), edit (modify then send), skip

To approve and send a draft:

  1. Update outbox: UPDATE outbox SET status = 'approved', final_text = draft_text, approved_at = strftime('%s','now') WHERE id = ?
  2. Send via telegram skill: python3 ~/.claude/skills/telegram/scripts/telegram_fetch.py send --chat-id CHAT_ID --text "THE_TEXT"
  3. Update outbox with sent status and message_id

To skip: UPDATE outbox SET status = 'skipped', updated_at = strftime('%s','now') WHERE id = ?

status — Queue statistics
-- Inbox stats
SELECT status, count(*) FROM inbox GROUP BY status;

-- Outbox stats
SELECT status, count(*) FROM outbox GROUP BY status;

-- Recent activity
SELECT sender_name, route, status, datetime(created_at, 'unixepoch')
FROM inbox ORDER BY created_at DESC LIMIT 10;

Report: pending count, drafts waiting, sent today, failed items.

follow-ups — Track unanswered outbound messages

Scan for people who haven't replied, send reminders with exponential backoff.

# Scan for new unanswered messages (needs Telethon session — stop daemon first)
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py scan

# Process due reminders (drafts to Telegram or outbox)
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py remind

# List active follow-ups
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py list

# Archive expired follow-ups
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py archive

# Run all (scan + check replies + remind + archive)
python3 ~/.claude/skills/tg-responder/scripts/follow_ups.py all

Also query directly:

SELECT sender_name, outbound_text, reminder_count, max_reminders,
       datetime(outbound_at, 'unixepoch') as sent,
       datetime(next_reminder_at, 'unixepoch') as next_ping,
       status
FROM follow_ups
WHERE status = 'active'
ORDER BY next_reminder_at;

Schedule: exponential (3d → 6d → 12d), fixed (every Nd), or custom per contact. After max_reminders → archived. If they reply → auto-resolved.

Database

Located at ~/Brains/data/telegram/responder.db.

Known Pitfalls

  • Auto-replies are not closers. Messages like "Отвечу в ближайшее время!" are auto-respond placeholders, not real responses. Exclude them from follow-up resolution — they should not mark a thread as closed.
  • My messages vs. other people's messages. The script can mistake the user's own auto-replies for the contact's messages, forming incorrect follow-up state. Always check sender ID, not just message content.

Config

Located at ~/.claude/skills/tg-responder/config.yaml. Edit contacts, modes, and ignore lists there.

Worker

Start: python3 ~/.claude/skills/tg-responder/scripts/worker.py One-shot: python3 ~/.claude/skills/tg-responder/scripts/worker.py --once

Comments

Markdown supported