feat(integrations): extend Telegram, Outlook, and Notion tool depth#5265
Conversation
…, reaction, chat-action, and chat-info tools
…d message-update tools
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
PR SummaryMedium Risk Overview Notion gains block-child CRUD ( Outlook adds search, reply/reply-all, folder list/create, attachment list/get (with file output), message metadata updates (categories, flag, importance), and reorders copy alongside the new operations in the block UI. Telegram adds edit/forward/copy, location/contact/poll/chat-action sends, pin/unpin/reactions, and Integration copy and usage instructions are updated to reflect the broader capability sets; Telegram docs add example templates for polls and pin/reaction flows. Reviewed by Cursor Bugbot for commit 628f5cd. Configure here. |
Greptile SummaryThis PR is Wave 2 of integration tool-depth, adding 36 new tools across Telegram (12), Outlook (8), and Notion (16 including v1/v2 pairs) — all reusing existing auth without new OAuth scopes. Prior review threads raised JSON-coercion and error-masking issues; all have been addressed in follow-up commits (
Confidence Score: 5/5Safe to merge — all 36 new tools reuse existing auth flows, JSON-coercion edge cases raised in prior reviews have been fixed, and the block routing changes are additive and isolated. The tool implementations follow established patterns throughout the codebase: No files require special attention. The Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
subgraph Telegram["Telegram Block (12 new tools)"]
TG_OP[operation param] --> TG_TOOL["tool = params.operation"]
TG_TOOL --> TG_EDIT[telegram_edit_message_text]
TG_TOOL --> TG_FWD[telegram_forward_message]
TG_TOOL --> TG_COPY[telegram_copy_message]
TG_TOOL --> TG_LOC[telegram_send_location]
TG_TOOL --> TG_CONTACT[telegram_send_contact]
TG_TOOL --> TG_POLL[telegram_send_poll
normalizePollOptions]
TG_TOOL --> TG_PIN[telegram_pin_message]
TG_TOOL --> TG_UNPIN[telegram_unpin_message]
TG_TOOL --> TG_REACT[telegram_set_message_reaction]
TG_TOOL --> TG_ACTION[telegram_send_chat_action]
TG_TOOL --> TG_CHAT[telegram_get_chat]
TG_TOOL --> TG_MEMBER[telegram_get_chat_member]
end
subgraph Outlook["Outlook Block (8 new tools)"]
OL_OP[operation param] --> OL_TOOL[tool switch]
OL_TOOL --> OL_REPLY[outlook_reply
outlook_reply_all]
OL_TOOL --> OL_SEARCH[outlook_search
$search param]
OL_TOOL --> OL_FOLDERS[outlook_list_folders
outlook_create_folder]
OL_TOOL --> OL_ATTACH[outlook_list_attachments
outlook_get_attachment]
OL_TOOL --> OL_UPDATE[outlook_update_message
normalizeCategories]
end
subgraph Notion["Notion Block (8 new tools × v1+v2)"]
NO_OP[operation param] --> NO_TOOL[tool switch]
NO_TOOL --> NO_BLOCK[append_blocks
retrieve_block_children
update_block
delete_block]
NO_TOOL --> NO_COMMENT[create_comment
list_comments]
NO_TOOL --> NO_USER[list_users
retrieve_user]
NO_BLOCK -->|JSON-typed params| PARSE["parseChildren / parseBlock
(coerce string → object/array)"]
end
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
subgraph Telegram["Telegram Block (12 new tools)"]
TG_OP[operation param] --> TG_TOOL["tool = params.operation"]
TG_TOOL --> TG_EDIT[telegram_edit_message_text]
TG_TOOL --> TG_FWD[telegram_forward_message]
TG_TOOL --> TG_COPY[telegram_copy_message]
TG_TOOL --> TG_LOC[telegram_send_location]
TG_TOOL --> TG_CONTACT[telegram_send_contact]
TG_TOOL --> TG_POLL[telegram_send_poll
normalizePollOptions]
TG_TOOL --> TG_PIN[telegram_pin_message]
TG_TOOL --> TG_UNPIN[telegram_unpin_message]
TG_TOOL --> TG_REACT[telegram_set_message_reaction]
TG_TOOL --> TG_ACTION[telegram_send_chat_action]
TG_TOOL --> TG_CHAT[telegram_get_chat]
TG_TOOL --> TG_MEMBER[telegram_get_chat_member]
end
subgraph Outlook["Outlook Block (8 new tools)"]
OL_OP[operation param] --> OL_TOOL[tool switch]
OL_TOOL --> OL_REPLY[outlook_reply
outlook_reply_all]
OL_TOOL --> OL_SEARCH[outlook_search
$search param]
OL_TOOL --> OL_FOLDERS[outlook_list_folders
outlook_create_folder]
OL_TOOL --> OL_ATTACH[outlook_list_attachments
outlook_get_attachment]
OL_TOOL --> OL_UPDATE[outlook_update_message
normalizeCategories]
end
subgraph Notion["Notion Block (8 new tools × v1+v2)"]
NO_OP[operation param] --> NO_TOOL[tool switch]
NO_TOOL --> NO_BLOCK[append_blocks
retrieve_block_children
update_block
delete_block]
NO_TOOL --> NO_COMMENT[create_comment
list_comments]
NO_TOOL --> NO_USER[list_users
retrieve_user]
NO_BLOCK -->|JSON-typed params| PARSE["parseChildren / parseBlock
(coerce string → object/array)"]
end
Reviews (10): Last reviewed commit: "fix(outlook): use consistent set/replace..." | Re-trigger Greptile |
…ric input isn't forwarded as NaN
|
@greptile review |
|
@cursor review |
…wlines) so json-typed input can't crash on .map
|
@greptile review |
|
@cursor review |
…ult, and telegram poll options - outlook: strip embedded double quotes from the $search term so they can't break the quoted KQL query - notion: default the update_block Archive dropdown to 'Leave unchanged' so updates don't send an unintended archived:false restore flag - telegram: pass raw poll options through to the tool's normalizePollOptions (handles array/JSON-string/newlines) so the block layer no longer mishandles JSON-string input
|
@greptile review |
|
@cursor review |
…n pageSize - outlook: normalize update_message categories (array, JSON string, or comma/newline) so a JSON-string value isn't silently dropped - notion: clamp pageSize to Notion's 1-100 range (truncated) so out-of-range values don't hit an API error
|
@greptile review |
|
@cursor review |
…o the block handles JSON-string input too
|
@greptile review |
|
@cursor review |
…rray An explicit empty array now sends categories:[] to clear all labels, a non-empty value replaces, and an absent/empty value leaves them untouched — matching the documented replace semantics.
|
@greptile review |
|
@cursor review |
… delimiter-only string A string that normalizes to no categories (e.g. just commas) is now a no-op rather than clearing all labels; clearing requires an explicit empty array.
|
@greptile review |
|
@cursor review |
…ents/users and block children Adds a shared clampNotionPageSize helper so the agent-direct path is bounded to Notion's range, not just the block path.
|
@greptile review |
|
@cursor review |
…ries Categories are replaced with the provided non-empty list and left unchanged when empty, consistent across the block and agent paths. Drops the ambiguous empty-array clear (clearing all categories isn't expressible unambiguously from the comma-separated field) and updates the description to match.
|
@greptile review |
|
@cursor review |
There was a problem hiding this comment.
✅ Bugbot reviewed your changes and found no new issues!
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 628f5cd. Configure here.
Summary
Wave 2 of integration tool-depth: deepens three high-adoption blocks that were shallow relative to their APIs. Every operation reuses the integration's existing auth — no new OAuth scopes, so connected users don't re-consent.
lib/oauth/oauth.tsis untouched.What's added (36 new tools)
Telegram (bot token, no scopes) — outbound was send-only; adds interactivity
telegram_edit_message_text,telegram_forward_message,telegram_copy_message,telegram_send_location,telegram_send_contact,telegram_send_poll,telegram_pin_message,telegram_unpin_message,telegram_set_message_reaction,telegram_send_chat_action,telegram_get_chat,telegram_get_chat_memberOutlook (reuses
Mail.ReadWrite+Mail.Send) — was much thinner than Gmailoutlook_reply,outlook_reply_all,outlook_list_folders,outlook_create_folder,outlook_list_attachments,outlook_get_attachment,outlook_search,outlook_update_message(categories/flag/importance)Notion (capability-based,
scopes: []) — could create pages but not edit page contentappend_blocks,retrieve_block_children,update_block,delete_block),create_comment,list_comments,list_users,retrieve_user— added to both thenotionandnotion_v2blocksNotes
tools.config.params(execution-time), never intools.config.tool.integrations.jsoncatalog regenerated from the block registry.Validation
bunx tsc --noEmit: clean across changed filesbunx biome check: clean (39 files)blocks/blocks.test.ts: 83/83 pass (incl. canonical-param test)bun run check:api-validation: passed