Re-adds Python action files for Iterable endpoints that were broken or missing in the toolkit per the recent Useful-Agents failure analysis (13 failing tool slugs). Each new action follows the conventions established in PR #23563 (Pydantic v2 + alias-based snake↔camel, model validators, structured 4xx pass-through, empty-body guards, URL-encoded path params).
cancel_sms — POST /api/sms/cancel. The previous auto-generated tool was rejected with "missing required field" because it didn't model scheduledMessageId as a valid alternative. Now mirrors cancel_in_app: either scheduledMessageId alone, or campaignId + (email | userId).| Action | Endpoint | Notes |
|---|---|---|
get_metadata_value | GET /api/metadata/{table}/{key} | Synchronous read; companion to the async PUT/DELETE on metadata. |
get_user_by_email | GET /api/users/getByEmail | Email-based-projects companion to get_user_by_id. |
get_user_events_by_email | GET /api/events/{email} | Email-based-projects companion to get_user_events. |
view_email_in_browser | GET /api/email/viewInBrowser | Fetch rendered HTML of a sent email. |
subscribe_to_double_opt_in | POST /api/subscriptions/subscribeToDoubleOptIn | Project must have double-opt-in message types configured. |
disable_device | POST /api/users/disableDevice | Typically needs JWT mobile key. |
begin_sms_verification | POST /api/verify/sms/begin | Pairs with existing verify_sms_code. Needs SMS sending platform. |
get_in_app_priority_message | GET /api/inApp/getPriorityMessage | Typically needs JWT mobile key. |
track_in_app_delivery | POST /api/events/trackInAppDelivery | Typically needs JWT mobile key. |
track_in_app_consume | POST /api/events/inAppConsume | Typically needs JWT mobile key. |
track_web_push_click | POST /api/events/trackWebPushClick | Typically needs Web API key. |
The endpoints whose previous failures were auth-config-related (JWT mobile/Web SDK key needed, or project-level SMS sending platform / non-unique email mode) carry explicit notes in their docstrings. The action schemas themselves are correct — those test failures came from the test environment's API-key type / project type / missing platform config, not from the request payloads.
tool.py wiring12 imports added in alphabetical order, 12 entries appended to actions() list.
ruff check/ruff format/py_compile all pass locallyITERABLE_CANCEL_SMS_CANCEL should pass with both call shapes (scheduledMessageId alone, and campaignId + email/userId)ITERABLE_GET_METADATA should pass (sync GET; the previous "async" failure was a test-framework propagation race against the PUT, not a code bug)🤖 Generated with Claude Code