Commit graph

82 commits

Author SHA1 Message Date
Daniil Svetlov
a718a2262d feat: add unread_only, unmuted_only filters and mute status to list_chats
Add filtering capabilities to the list_chats tool:
- unread_only: filter to show only chats with unread messages
- unmuted_only: filter to show only unmuted chats
- Display mute status in chat info output

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-19 02:20:47 +03:00
Eugene Evstafev
a39a7c99ae
Merge pull request #74 from mxl/feat/global-message-search
Add global message search
2026-03-17 09:29:45 +00:00
mxl
8273ade003 Add pagination to global message search 2026-03-16 19:17:10 -07:00
mxl
e7421759bd Add limit parameter to public chat search 2026-03-16 18:34:12 -07:00
Eugene Evstafev
49c912d6eb
Merge pull request #73 from mxl/fix/search-public-chats-include-chats
fix: include chats and channels in search_public_chats results
2026-03-16 08:28:02 +00:00
mxl
51b71f1dce fix: include chats and channels in search_public_chats results
contacts.SearchRequest returns both result.users and result.chats,
but only users were returned. Chats (channels, groups) are now
included, making search work by channel/group title as intended.
2026-03-16 09:48:42 +03:00
mxl
b0b568bf82 fix: add support for shared folders (DialogFilterChatlist) in folder operations
Shared folders in Telegram use DialogFilterChatlist type instead of
DialogFilter. Previously, all folder operations (list, get, create,
add/remove chat) silently ignored shared folders. This fix ensures
they are recognized and handled correctly alongside regular folders.
2026-03-16 06:50:02 +03:00
Andrey Kuznetsov
a53d807146
fix: redirect all print() to stderr to keep stdout clean for MCP stdio
MCP clients (e.g. ZeroClaw) communicate via JSON-RPC over stdin/stdout.
Startup messages and warnings written to stdout corrupt the protocol
stream, causing parse failures. Redirect all print() calls to stderr.
2026-03-04 23:16:23 +04:00
Eugene Evstafev
61924fb2a1
Merge pull request #67 from bunkerskyi/fix/delete-profile-photo
fix(delete_profile_photo): pass Photo object instead of int to DeletePhotosRequest
2026-02-26 09:18:40 +00:00
Ivan Kolodrivskyi
fb620cd670 feat(tools): expose parse_mode in send_message and reply_to_message 2026-02-26 08:52:28 +02:00
Ivan Kolodrivskyi
2e1bfc3d94 fix(delete_profile_photo): pass Photo object instead of int to DeletePhotosRequest
Telethon's DeletePhotosRequest requires InputPhoto objects, which it derives
from Photo objects via get_input_photo(). Passing photo.id (an int) causes:
  AttributeError: 'int' object has no attribute 'SUBCLASS_OF_ID'
  TypeError: Cannot cast int to any kind of InputPhoto.

Fix: pass the Photo object directly (photos.photos[0]) so Telethon can
convert it to InputPhoto internally.
2026-02-26 08:42:05 +02:00
vp
6ec5c95c91 fix: harden roots unsupported fallback and deny-all messaging 2026-02-24 23:02:38 +03:00
vp
172fedaf7a fix: treat empty MCP roots as explicit deny-all 2026-02-24 22:52:23 +03:00
vp
3b82062070 style: format main.py with black 2026-02-24 22:40:30 +03:00
vp
a7df9da9f5 fix: harden roots fallback semantics and docs 2026-02-24 22:35:30 +03:00
vp
fd9c90e53c feat: secure file-path tools with allowlisted roots
- implement server-side allowlist via CLI positional roots (fallback)\n- implement client MCP Roots override semantics (replace server roots when available)\n- add realpath + in-root validation, traversal/glob rejection, extension and size checks\n- make write path default to <first_root>/downloads when file_path is omitted\n- reintroduce upload_file tool with the same path security model\n- update README with security model and usage\n- add tests for root resolution, replacement semantics, traversal checks, and default write path\n- add pytest and pytest-asyncio to dev dependencies
2026-02-24 22:12:56 +03:00
yarreg
ad78563377 Fix supergroup type in get_folder and unify chat type mapping 2026-02-12 16:12:36 +03:00
Eugene Evstafev
95a0313b5c
Merge pull request #57 from artgas1/feature/add-contact-username-support
feat: Add support for adding contacts by username without phone number
2026-02-12 12:23:04 +00:00
artgas1
359b86315e style: Apply black formatting to add_contact function
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-12 15:21:25 +03:00
gvidonind-commits
382246d89e fix: use correct Telegram API for archive/unarchive chat
archive_chat and unarchive_chat were using ToggleDialogPinRequest which
pins/unpins dialogs instead of archiving them. Replace with
folders.EditPeerFoldersRequest using folder_id=1 (Archive) and
folder_id=0 (Main) which is the correct API for moving chats to/from
the Archive folder.
2026-02-09 06:36:27 +03:00
gvidonind-commits
afb02be510 refactor: Add separate username parameter to add_contact function
- Changed phone parameter to Optional[str] = None
- Added separate username parameter (Optional[str] = None)
- Improved function signature clarity - username is now explicit parameter
- Updated validation logic to check for either phone or username
- Maintains backward compatibility with phone-based contacts
- Better API design - no longer need to pass username via phone parameter
2026-02-09 06:34:21 +03:00
gvidonind-commits
4693719798 feat: Add support for adding contacts by username without phone number
- Modified add_contact function to support username-based contact addition
- If phone parameter is empty or starts with @, function resolves username first
- Uses contacts.AddContactRequest API for username-based contacts
- Maintains backward compatibility with phone-based contact addition
- Allows adding contacts as done in Telegram UI when searching by username
2026-02-09 06:34:21 +03:00
smixs
1206cf81d6 style: format code with black 2026-01-27 14:59:35 +05:00
smixs
b733d32467 feat(folders): add 7 tools for Telegram folder management
Add new MCP tools to manage Telegram dialog folders (filters):
- list_folders: get all folders with IDs, names, emoji
- get_folder: get folder details including all included chats
- create_folder: create new folder with filters and chat list
- add_chat_to_folder: add chat to existing folder (idempotent)
- remove_chat_from_folder: remove chat from folder (idempotent)
- delete_folder: delete folder (chats preserved)
- reorder_folders: change folder order

Handles Telegram API specifics:
- TextWithEntities for folder titles
- Max 10 folders limit
- System folder protection (ID < 2)
- title_noanimate and color attributes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 13:55:55 +05:00
Eugene Evstafev
d65fb8b74c
Merge pull request #48 from BayramAnnakov/feat/message-engagement-metrics
feat: add engagement metrics to message output
2026-01-11 20:02:05 +00:00
Eugene Evstafev
ff8d19b59c
Merge pull request #46 from BayramAnnakov/fix/unread-mark-detection
fix: detect manually marked unread chats in list_chats
2025-12-26 22:51:54 +00:00
Bayram Annakov
6a05d7a661 feat: add engagement metrics (views, forwards, reactions) to message output
Adds views, forwards, and reaction counts to message output for channel posts.
These metrics are available in Telegram's API for channel content.

Changes:
- get_messages: Include engagement info in output
- list_messages: Include engagement info in output

Example output: 'views:1234, forwards:56, reactions:78'

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 14:09:48 -08:00
Bayram Annakov
11bfca7083 style: apply black formatting to match project standards 2025-12-26 13:51:20 -08:00
Bayram Annakov
aabe9d8bc0 fix: correct syntax error from suggestion application
The individual line suggestions created invalid Python when applied
separately. Combined the ternary expression properly.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-26 13:48:36 -08:00
Bayram Annakov
182e3684dd
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:47:11 -08:00
Bayram Annakov
d504e5fa45
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:47:05 -08:00
Bayram Annakov
700c01b2d3
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:46:59 -08:00
Bayram Annakov
fe8dcb3797
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:46:53 -08:00
Bayram Annakov
adc6ef4c7c
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:46:46 -08:00
Bayram Annakov
041bf0dbec
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:46:38 -08:00
Bayram Annakov
78a21ef2d0
Update main.py
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:46:31 -08:00
Bayram Annakov
943f66a67c
Apply suggestions from code review
Co-authored-by: Eugene Evstafev <36392751+chigwell@users.noreply.github.com>
2025-12-26 13:45:28 -08:00
Bayram Annakov
6b1f4cda85 fix: detect manually marked unread chats in list_chats
Previously list_chats only checked dialog.unread_count, missing chats
that were manually marked as unread via Telegram's "mark as unread" feature.

Now also checks dialog.dialog.unread_mark flag:
- unread_count > 0: shows "Unread: N"
- unread_mark = True: shows "Unread: marked"

This matches the behavior of Telegram's "Unread" folder filter.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 19:17:22 -08:00
Bayram Annakov
37269e11ea feat: add draft management tools (save_draft, get_drafts, clear_draft)
Add three new tools for managing Telegram drafts:
- save_draft: Save a draft message to any chat/channel
- get_drafts: List all drafts across all chats
- clear_draft: Clear a draft from a specific chat

Uses Telethon's SaveDraftRequest and GetAllDraftsRequest APIs.
Drafts appear in Telegram's input field for review before sending.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-25 19:04:32 -08:00
Dmitrii Zolotukhin
7a9ee58c71 feat: add message reactions support
Add three new MCP tools for handling Telegram message reactions:
- send_reaction: Send emoji reaction to a message
- remove_reaction: Remove your reaction from a message
- get_message_reactions: Get list of reactions on a message

All tools include proper ToolAnnotations and follow existing code patterns.
2025-12-23 19:55:54 +03:00
triepod-ai
49d70795f0 feat: Add title annotations to all 78 tools for improved LLM display
Add human-readable title annotations to all MCP tools to help clients
display tool names in a user-friendly format.

Changes:
- Added title annotation to all 78 tools (e.g., "Get Chats", "Send Message")
- Formatted with Black for code style consistency

This improves the user experience when MCP clients display tool lists.

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-23 07:55:43 -06:00
Yurii Karabas
92a0dc31b5 fix lint errors 2025-12-18 23:47:12 +01:00
Yurii Karabas
603119073a Add scripts entrypoint to run telegram-mcp using uvx 2025-11-22 14:22:13 +01:00
Valeriy_Pavlovich
be12812c62 black: reformatted main.py 2025-11-14 01:08:37 +03:00
Valeriy_Pavlovich
1c71806082 feat: add comprehensive ToolAnnotations to all MCP tools
- Add openWorldHint=True to all 63+ @mcp.tool decorators
- Add readOnlyHint=True to read-only operations (get/list/search/export functions)
- Add destructiveHint=True to state-changing operations (send/create/delete/edit functions)
- Add idempotentHint=True to safely repeatable operations (block/unblock/pin/unpin/ban/unban/etc.)
- Fix syntax errors: openWorldHint(True) → openWorldHint=True
- Remove incorrect idempotentHint from non-idempotent operations (send_file, press_inline_button, import_contacts)

These annotations help MCP clients understand tool behavior:
- readOnlyHint: tool doesn't modify environment
- destructiveHint: tool performs destructive updates
- idempotentHint: repeated calls with same args have no additional effect
- openWorldHint: tool interacts with external entities (Telegram API)

Improves tool discoverability and helps AI agents make better decisions about tool usage.
2025-11-14 00:26:35 +03:00
latand
b5ac2c0445 Format main.py with black 2025-11-05 12:17:21 +02:00
latand
c3594795cd Add inline button helpers and channel subscription tool 2025-11-04 20:56:04 +02:00
Korzhavin Ivan
62a3fd68be fix: undefined variable _id in unarchive_chat function
Fixed undefined variable '_id' in unarchive_chat function by
changing it to 'chat_id' which is the correct parameter name.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-21 09:34:48 +02:00
Korzhavin Ivan
994a49faba style: format code with black 2025-10-20 01:06:06 +02:00
Korzhavin Ivan
80245bcdc9 fix: resolve stash conflict 2025-10-20 01:01:13 +02:00