{
    "notes": {
        "params": "The 'params' field is a compact comma-separated list of parameter names: '*' marks required parameters, and non-string types are shown after ':' (e.g. vars:object). Use get_method_schema for parameter descriptions and details.",
        "cursor": "Methods with '\"cursor\": true' return paginated results. They also accept sort, sort_dir, page_size (default 10, or 50 for API calls made from scripts; max 500), offset, and marker parameters. Filter parameters with modifiers support operators like {\"min\": value}, {\"prefix\": value}, etc. Use get_method_schema for details.",
        "fields": "All methods that return objects accept an optional 'fields' parameter (comma-separated field names) to limit which fields are returned. The 'id' field is always included.",
        "web_app": "If it doesn't seem possible do something via the API, try the get_web_app_urls tool to learn about web app functionality and look up the appropriate web app page URL to link the user to. "
    },
    "methods": [
        {
            "name": "API_getProjectById",
            "description": "Retrieves the Telerivet project with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "API_queryProjects",
            "description": "Queries projects accessible to the current user account.",
            "cursor": true,
            "params": "name"
        },
        {
            "name": "API_getOrganizationById",
            "description": "Retrieves the Telerivet organization with the given ID.",
            "params": "organization_id*, id*"
        },
        {
            "name": "API_queryOrganizations",
            "description": "Queries organizations accessible to the current user account.",
            "cursor": true,
            "params": "name"
        },
        {
            "name": "Message_addLabel",
            "description": "Adds a label to the given message.",
            "params": "project_id*, label_id*, message_id*, label*"
        },
        {
            "name": "Message_removeLabel",
            "description": "Removes a label from the given message.",
            "params": "project_id*, label_id*, message_id*, label*"
        },
        {
            "name": "Message_save",
            "description": "Updates writable fields on the given message",
            "params": "project_id*, id*, starred:boolean, vars:object, error_message"
        },
        {
            "name": "Message_resend",
            "description": "Resends a message, for example if the message failed to send or if it was not delivered.",
            "params": "project_id*, id*, route_id"
        },
        {
            "name": "Message_cancel",
            "description": "Cancels sending a message that has not yet been sent.",
            "params": "project_id*, id*"
        },
        {
            "name": "Message_sendReadReceipt",
            "description": "Sends a read receipt for this message.",
            "params": "project_id*, id*"
        },
        {
            "name": "Message_sendTypingIndicator",
            "description": "Sends a typing indicator for this message.",
            "params": "project_id*, id*"
        },
        {
            "name": "Message_delete",
            "description": "Deletes this message.",
            "params": "project_id*, id*"
        },
        {
            "name": "ScheduledMessage_save",
            "description": "Updates writable fields on the given scheduled message.",
            "params": "project_id*, id*, content, rrule, timezone_id, group_id, contact_id, to_number, route_id, service_id, audio_url, tts_lang, tts_voice, start_time, end_time, replace_variables:boolean, track_clicks:boolean, media:array, route_params:object, vars:object, label_ids"
        },
        {
            "name": "ScheduledMessage_approve",
            "description": "Approves a scheduled message that is pending review (see the `pending_review` property), on behalf of a user with permission to review messages.",
            "params": "project_id*, id*"
        },
        {
            "name": "ScheduledMessage_delete",
            "description": "Cancels this scheduled message.",
            "params": "project_id*, id*"
        },
        {
            "name": "RelativeScheduledMessage_save",
            "description": "Updates writable fields on the given relative scheduled message.",
            "params": "project_id*, id*, content, time_of_day, date_variable, offset_scale, offset_count:integer, rrule, end_time, timezone_id, group_id, contact_id, to_number, route_id, service_id, audio_url, tts_lang, tts_voice, replace_variables:boolean, track_clicks:boolean, media:array, route_params:object, vars:object, label_ids"
        },
        {
            "name": "RelativeScheduledMessage_delete",
            "description": "Deletes this relative scheduled message and any associated scheduled messages.",
            "params": "project_id*, id*"
        },
        {
            "name": "ScheduledService_save",
            "description": "Updates the given scheduled service.",
            "params": "project_id*, id*, rrule, timezone_id, start_time, end_time, vars:object"
        },
        {
            "name": "ScheduledService_delete",
            "description": "Cancels this scheduled service.",
            "params": "project_id*, id*"
        },
        {
            "name": "Contact_queryMessages",
            "description": "Queries messages sent or received by this contact.",
            "cursor": true,
            "params": "project_id*, id*, direction, message_type, source, starred:boolean, status, time_created[min], time_created[max], external_id, contact_id, phone_id, broadcast_id, scheduled_id, group_id"
        },
        {
            "name": "Contact_queryGroups",
            "description": "Queries groups for which this contact is a member.",
            "cursor": true,
            "params": "project_id*, id*, name, dynamic:boolean"
        },
        {
            "name": "Contact_queryScheduledMessages",
            "description": "Queries messages scheduled to this contact (not including messages scheduled to groups that this contact is a member of)",
            "cursor": true,
            "params": "project_id*, id*, message_type, time_created, next_time, relative_scheduled_id, pending_review:boolean"
        },
        {
            "name": "Contact_queryDataRows",
            "description": "Queries data rows associated with this contact (in any data table).",
            "cursor": true,
            "params": "project_id*, id*, time_created"
        },
        {
            "name": "Contact_queryServiceStates",
            "description": "Queries this contact's current states for any service",
            "cursor": true,
            "params": "project_id*, contact_id*, id, vars:object"
        },
        {
            "name": "Contact_addToGroup",
            "description": "Adds this contact to a group.",
            "params": "project_id*, group_id*, contact_id*, group*"
        },
        {
            "name": "Contact_removeFromGroup",
            "description": "Removes this contact from a group.",
            "params": "project_id*, group_id*, contact_id*, group*"
        },
        {
            "name": "Contact_save",
            "description": "Updates writable fields on the given contact",
            "params": "project_id*, id*, name, phone_number, send_blocked:boolean, conversation_status, default_route_id, vars:object"
        },
        {
            "name": "Contact_delete",
            "description": "Deletes this contact.",
            "params": "project_id*, id*"
        },
        {
            "name": "Broadcast_cancel",
            "description": "Cancels sending a broadcast that has not yet been completely sent.",
            "params": "project_id*, id*"
        },
        {
            "name": "Campaign_save",
            "description": "Updates writable fields on the given campaign.",
            "params": "project_id*, id*, name, group_id, exclude_group_id, route_id, respondent_group_id, clicked_group_id, label_ids, solution_id, schedule_mode, schedule_time, content, route_params:object, track_clicks:boolean, short_link_params:object, audio_url, tts_lang, tts_voice, date_variable, items:array, timezone_id, vars:object"
        },
        {
            "name": "Campaign_send",
            "description": "Sends or schedules this campaign.",
            "mcp_instructions": "Never call this method immediately after creating or configuring a campaign. Always ensure the user has seen a preview and has explicitly confirmed they want to proceed. Confirmation must come after the preview \u2014 do not treat the original send request as confirmation.",
            "params": "project_id*, id*"
        },
        {
            "name": "Campaign_unschedule",
            "description": "Cancels a scheduled campaign, reverting it to the `draft` status.",
            "params": "project_id*, id*"
        },
        {
            "name": "Campaign_delete",
            "description": "Deletes this campaign.",
            "params": "project_id*, id*"
        },
        {
            "name": "Task_cancel",
            "description": "Cancels a task that is not yet complete.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_sendMessage",
            "description": "Sends one message (SMS, MMS, chat app message, voice call, or USSD request).",
            "params": "project_id*, message_type, content, to_number, contact_id, route_id, status_url, status_secret, replace_variables:boolean, track_clicks:boolean, short_link_params:object, media:array, route_params:object, label_ids, vars:object, priority:integer, simulated:boolean, service_id, audio_url, tts_lang, tts_voice"
        },
        {
            "name": "Project_sendBroadcast",
            "description": "Sends a text message (optionally with mail-merge templates) or voice call to a group or a list of up to 500 phone numbers.",
            "mcp_instructions": "Before calling this method, ensure the user has seen a preview of the broadcast to be sent (including message content, recipient group and count, and route) and has explicitly confirmed they want to proceed \u2014 do not treat the original send request as confirmation. Prefer the draft_message tool when available: the user's Send click confirms the message and lets it send immediately (although Project_sendBroadcast may be needed for parameters that draft_message does not support). Some organizations require this application to obtain the user's in-session confirmation before sending: this method is then refused unless the send follows the draft_message card's Send button. Independently, a send exceeding the project's Message Review volume limits returns `status`=`pending_review` and is held for reviewer approval \u2014 expected behavior, not an error; tell the user what was submitted and share the approval URL from the response.",
            "params": "project_id*, message_type, content, group_id, to_numbers:array, route_id, title, status_url, status_secret, label_ids, exclude_contact_id, replace_variables:boolean, track_clicks:boolean, short_link_params:object, media:array, vars:object, route_params:object, service_id, audio_url, tts_lang, tts_voice"
        },
        {
            "name": "Project_sendMulti",
            "description": "Sends up to 100 different messages in a single API request.",
            "mcp_instructions": "Before calling this method, ensure the user has seen a preview of the messages to be sent (including message content, recipient numbers, and route) and has explicitly confirmed they want to proceed \u2014 do not treat the original send request as confirmation. Some organizations require this application to obtain the user's in-session confirmation before sending: this method is then refused unless the send follows the draft_message card's Send button. Independently, a send exceeding the project's Message Review volume limits returns `status`=`pending_review` and is held for reviewer approval \u2014 expected behavior, not an error; tell the user what was submitted and share the approval URL from the response.",
            "params": "project_id*, messages*:array, message_type, route_id, broadcast_id, broadcast_title, status_url, status_secret, label_ids, replace_variables:boolean, track_clicks:boolean, short_link_params:object, media:array, route_params:object, vars:object, priority:integer, simulated:boolean"
        },
        {
            "name": "Project_scheduleMessage",
            "description": "Schedules a message to a group or single contact.",
            "mcp_instructions": "Before calling this method with the group_id parameter or when scheduling a recurring message, always ensure the user has seen a preview of the messages to be sent (including message content, recipient numbers, route, schedule time, and recurrence) and has explicitly confirmed they want to proceed. Confirmation must come after the preview \u2014 do not treat the original send request as confirmation.",
            "params": "project_id*, message_type, content, group_id, to_number, contact_id, start_time, start_time_offset:integer, rrule, route_id, service_id, audio_url, tts_lang, tts_voice, track_clicks:boolean, short_link_params:object, replace_variables:boolean, media:array, route_params:object, label_ids, timezone_id, end_time, end_time_offset:integer, vars:object"
        },
        {
            "name": "Project_createRelativeScheduledMessage",
            "description": "Creates a relative scheduled message.",
            "params": "project_id*, message_type, content, group_id, to_number, contact_id, time_of_day*, timezone_id, date_variable*, offset_scale, offset_count:integer, rrule, route_id, service_id, audio_url, tts_lang, tts_voice, track_clicks:boolean, short_link_params:object, replace_variables:boolean, media:array, route_params:object, label_ids, end_time, end_time_offset:integer, vars:object"
        },
        {
            "name": "Project_receiveMessage",
            "description": "Add an incoming message to Telerivet.",
            "params": "project_id*, content, message_type, from_number*, phone_id*, to_number, simulated:boolean, starred:boolean, label_ids, vars:object"
        },
        {
            "name": "Project_getOrCreateContact",
            "description": "Retrieves OR creates and possibly updates a contact by name or phone number.",
            "params": "project_id*, name, phone_number, lookup_key, send_blocked:boolean, default_route_id, add_group_ids, id, remove_group_ids, vars:object"
        },
        {
            "name": "Project_importContacts",
            "description": "Creates and/or updates up to 200 contacts in a single API call.",
            "params": "project_id*, contacts*:array, lookup_key, add_group_ids, remove_group_ids, default_route_id"
        },
        {
            "name": "Project_queryContacts",
            "description": "Queries contacts within the given project.",
            "cursor": true,
            "params": "project_id*, group_id, name, phone_number, time_created, last_message_time, last_incoming_message_time, last_outgoing_message_time, incoming_message_count:integer, outgoing_message_count:integer, send_blocked:boolean, vars:object"
        },
        {
            "name": "Project_getContactById",
            "description": "Retrieves the contact with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryPhones",
            "description": "Queries basic routes within the given project.",
            "mcp_instructions": "For more information about these routes, use the get_route_options tool with the phone_type parameter set to the phone_type returned by this method.",
            "cursor": true,
            "params": "project_id*, name, phone_number, last_active_time"
        },
        {
            "name": "Project_getPhoneById",
            "description": "Retrieves the basic route with the given ID.",
            "mcp_instructions": "For more information about this route type, use the get_route_options tool with the phone_type parameter set to the phone_type returned by this method.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_createPhone",
            "description": "Creates a new basic route (phone) with external API credentials.",
            "params": "project_id*, name, phone_number*, phone_type*, external_account_id, external_id, external_secret, external_config:object, country, send_paused:boolean, timezone_id, validate_recipient_numbers:boolean, allowed_recipient_countries:array, send_delay:number, quiet_mode, quiet_start, quiet_end, vars:object"
        },
        {
            "name": "Project_queryMessages",
            "description": "Queries messages within the given project.",
            "cursor": true,
            "params": "project_id*, label_id, direction, message_type, source, starred:boolean, status, time_created[min], time_created[max], external_id, contact_id, phone_id, broadcast_id, scheduled_id, group_id"
        },
        {
            "name": "Project_getMessageById",
            "description": "Retrieves the message with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryBroadcasts",
            "description": "Queries broadcasts within the given project.",
            "cursor": true,
            "params": "project_id*, time_created[min], time_created[max], last_message_time[min], last_message_time[max]"
        },
        {
            "name": "Project_getBroadcastById",
            "description": "Retrieves the broadcast with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryCampaigns",
            "description": "Queries campaigns within the given project.",
            "cursor": true,
            "params": "project_id*, name, status, campaign_type, group_id, label_id, solution_id, time_created[min], time_created[max], schedule_time[min], schedule_time[max]"
        },
        {
            "name": "Project_getCampaignById",
            "description": "Retrieves the campaign with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_createCampaign",
            "description": "Creates a new draft campaign, without sending it.",
            "mcp_instructions": "After creating a draft campaign, always render a preview showing the campaign name, message content, recipient group and count, route, and schedule, and a link to edit the campaign in the web app, before taking any further action. Do not call Campaign_send until the user has explicitly confirmed after seeing the preview.",
            "params": "project_id*, campaign_type*, name, group_id, exclude_group_id, route_id, timezone_id, label_ids, solution_id, respondent_group_id, clicked_group_id, schedule_mode, schedule_time, content, media:array, route_params:object, track_clicks:boolean, short_link_params:object, audio_url, tts_lang, tts_voice, date_variable, items:array, vars:object"
        },
        {
            "name": "Project_createTask",
            "description": "Creates and starts an asynchronous task that is applied to all entities matching a filter (e.g.",
            "params": "project_id*, task_type*, task_params:object, filter_type*, filter_params*:object, table_id, vars:object"
        },
        {
            "name": "Project_queryTasks",
            "description": "Queries batch tasks within the given project.",
            "cursor": true,
            "params": "project_id*"
        },
        {
            "name": "Project_getTaskById",
            "description": "Retrieves the task with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryGroups",
            "description": "Queries groups within the given project.",
            "cursor": true,
            "params": "project_id*, name, dynamic:boolean, solution_id"
        },
        {
            "name": "Project_getOrCreateGroup",
            "description": "Retrieves or creates a group by name.",
            "mcp_instructions": "To create a new group that is part of a solution, use Project_createGroup with the solution_id parameter instead.",
            "params": "project_id*, name*"
        },
        {
            "name": "Project_createGroup",
            "description": "Creates a new group.",
            "params": "project_id*, name*, filters:object, allow_sending:boolean, add_time_variable, solution_id, vars:object"
        },
        {
            "name": "Project_getGroupById",
            "description": "Retrieves the group with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryLabels",
            "description": "Queries labels within the given project.",
            "cursor": true,
            "params": "project_id*, name"
        },
        {
            "name": "Project_getOrCreateLabel",
            "description": "Gets or creates a label by name.",
            "params": "project_id*, name*"
        },
        {
            "name": "Project_getLabelById",
            "description": "Retrieves the label with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryMessageTemplates",
            "description": "Queries message templates within the given project.",
            "cursor": true,
            "params": "project_id*, name, waba_id, solution_id"
        },
        {
            "name": "Project_createMessageTemplate",
            "description": "Creates a new message template that can be used when composing or scheduling messages.",
            "params": "project_id*, name*, content*, track_clicks:boolean, short_link_params:object, media:array, route_params:object, solution_id"
        },
        {
            "name": "Project_getMessageTemplateById",
            "description": "Retrieves the message template with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryFiles",
            "description": "Queries files stored within the given project.",
            "cursor": true,
            "params": "project_id*, filename, type, category, source, size:integer, time_created, message_id, sha256"
        },
        {
            "name": "Project_uploadFile",
            "description": "Uploads a file to be stored by Telerivet.",
            "params": "project_id*, data*, filename, type, description, vars:object"
        },
        {
            "name": "Project_getFileById",
            "description": "Retrieves the stored file with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_querySolutions",
            "description": "Queries solutions within the given project.",
            "cursor": true,
            "params": "project_id*, name, skillbook_slug, time_created[min], time_created[max]"
        },
        {
            "name": "Project_createSolution",
            "description": "Creates a new solution, which is a named group of related services, data tables, contact groups, campaigns, message templates, and dashboards that together implement a particular use case.",
            "mcp_instructions": "When implementing a use case that requires creating several related objects (services, data tables, groups, campaigns, message templates, dashboards), create a solution first and pass its ID as solution_id when creating each service, data table (via Project_createDataTable), group (via Project_createGroup), campaign, message template (via Project_createMessageTemplate), and dashboard (via Project_createDashboard), so that the related objects can easily be found later. If the solution is based on a Skillbook solution, set skillbook_slug to the slug of that Skillbook entry. Name the solution for the user's use case (e.g. \"Text to Win\").",
            "params": "project_id*, name*, description, skillbook_slug, vars:object"
        },
        {
            "name": "Project_getSolutionById",
            "description": "Retrieves the solution with the given ID, including summaries of up to 50 of each of the services, data tables, contact groups, campaigns, message templates, and dashboards that belong to it.",
            "mcp_instructions": "If the truncated property lists a member type, the solution has more members of that type than are shown; use the corresponding query method (Project_queryServices, Project_queryDataTables, Project_queryGroups, Project_queryCampaigns, Project_queryMessageTemplates, Project_queryDashboards) with the solution_id parameter to list them all.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryDashboards",
            "description": "Queries saved dashboards within the given project.",
            "cursor": true,
            "params": "project_id*, name, solution_id, time_created[min], time_created[max]"
        },
        {
            "name": "Project_createDashboard",
            "description": "Creates a new custom dashboard within the given project.",
            "mcp_instructions": "After creating a dashboard, add cards to it via Dashboard_createCard, then show the user the dashboard's url so they can view it in the Telerivet web app.",
            "params": "project_id*, name*, solution_id, vars:object"
        },
        {
            "name": "Project_getDashboardById",
            "description": "Retrieves the dashboard with the given ID, including summaries of the cards on the dashboard.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryDataTables",
            "description": "Queries data tables within the given project.",
            "cursor": true,
            "params": "project_id*, name, solution_id"
        },
        {
            "name": "Project_getOrCreateDataTable",
            "description": "Gets or creates a data table by name.",
            "mcp_instructions": "To create a new data table that is part of a solution, use Project_createDataTable with the solution_id parameter instead.",
            "params": "project_id*, name*"
        },
        {
            "name": "Project_createDataTable",
            "description": "Creates a new data table, which must have a unique name within the project.",
            "params": "project_id*, name*, show_add_row:boolean, show_stats:boolean, show_contact_columns:boolean, solution_id, vars:object"
        },
        {
            "name": "Project_getDataTableById",
            "description": "Retrieves the data table with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryScheduledMessages",
            "description": "Queries scheduled messages within the given project.",
            "cursor": true,
            "params": "project_id*, message_type, time_created, next_time, relative_scheduled_id, pending_review:boolean"
        },
        {
            "name": "Project_queryRelativeScheduledMessages",
            "description": "Queries relative scheduled messages within the given project.",
            "cursor": true,
            "params": "project_id*, message_type, time_created, group_id, contact_id"
        },
        {
            "name": "Project_getScheduledMessageById",
            "description": "Retrieves the scheduled message with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_getRelativeScheduledMessageById",
            "description": "Retrieves the scheduled message with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryScheduledServices",
            "description": "Queries scheduled services within the given project.",
            "cursor": true,
            "params": "project_id*, service_id, time_created, next_time"
        },
        {
            "name": "Project_scheduleService",
            "description": "Schedules a service to be triggered at a specified time.",
            "params": "project_id*, service_id*, start_time, start_time_offset:integer, rrule, timezone_id, end_time, end_time_offset:integer, vars:object"
        },
        {
            "name": "Project_getScheduledServiceById",
            "description": "Retrieves the scheduled service with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_createService",
            "description": "Creates a new automated service.",
            "mcp_instructions": "Always create services with active: false unless the user has already seen a preview and explicitly confirmed activation. After creating, always render a preview of the service config to the user (if possible), provide a link to the service in the web app, and prompt the user to confirm if the service should be activated. The original user request to create a service does not count as confirmation.",
            "params": "project_id*, name, service_type*, config*:object, vars:object, active:boolean, response_table_id, phone_ids, message_types:array, table_ids, message_statuses:array, tags:array, show_action:boolean, contact_number_filter, direction, priority:integer, apply_mode, solution_id"
        },
        {
            "name": "Project_queryServices",
            "description": "Queries services within the given project.",
            "cursor": true,
            "params": "project_id*, name, active:boolean, context, solution_id"
        },
        {
            "name": "Project_getServiceById",
            "description": "Retrieves the service with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_queryServiceLogs",
            "description": "Queries service log entries associated with this project.",
            "cursor": true,
            "params": "project_id*, service_id, message_id, contact_id, time_created, execution_stats:boolean"
        },
        {
            "name": "Project_queryRoutes",
            "description": "Queries custom routes that can be used to send messages (not including Phones).",
            "cursor": true,
            "params": "project_id*, name"
        },
        {
            "name": "Project_getRouteList",
            "description": "Returns a list of all available routes for sending messages in a project, including both basic routes (phones) and custom routes.",
            "params": "project_id*"
        },
        {
            "name": "Project_createRoute",
            "description": "Creates a new custom route that can be used to send messages via one or more basic routes (phones).",
            "params": "project_id*, name*, actions*:array, vars:object"
        },
        {
            "name": "Project_getRouteById",
            "description": "Gets a custom route by ID",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_getUsers",
            "description": "Returns an array of user accounts that have access to this project.",
            "params": "project_id*"
        },
        {
            "name": "Project_queryAirtimeTransactions",
            "description": "Returns information about each airtime transaction.",
            "cursor": true,
            "params": "project_id*, time_created[min], time_created[max], contact_id, to_number, service_id, status"
        },
        {
            "name": "Project_getAirtimeTransactionById",
            "description": "Gets an airtime transaction by ID",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_getContactFields",
            "description": "Gets a list of all custom fields defined for contacts in this project.",
            "params": "project_id*"
        },
        {
            "name": "Project_updateContactFields",
            "description": "Updates metadata for one or more custom contact fields.",
            "params": "project_id*, metadata*:array"
        },
        {
            "name": "Project_getMessageFields",
            "description": "Gets a list of all custom fields defined for messages in this project.",
            "params": "project_id*"
        },
        {
            "name": "Project_updateMessageFields",
            "description": "Updates metadata for one or more custom message fields.",
            "params": "project_id*, metadata*:array"
        },
        {
            "name": "Project_getMessageStats",
            "description": "Retrieves statistics about messages sent or received via Telerivet.",
            "params": "project_id*, start_date*, end_date*, rollup, properties, metrics*, filters:object"
        },
        {
            "name": "Project_getContactStats",
            "description": "Retrieves statistics about the number of contacts in the project (total or in particular groups) over a date range.",
            "params": "project_id*, start_date*, end_date*, rollup, cumulative:boolean, series"
        },
        {
            "name": "Project_getDataTableStats",
            "description": "Retrieves statistics about the number of rows in particular data tables or data table views over a date range.",
            "params": "project_id*, start_date*, end_date*, rollup, cumulative:boolean, series*"
        },
        {
            "name": "Project_getAirtimeStats",
            "description": "Retrieves statistics about airtime transactions sent via Telerivet.",
            "params": "project_id*, start_date*, end_date*, rollup, properties, metrics*, filters:object"
        },
        {
            "name": "Project_queryWebhooks",
            "description": "Queries webhooks within the given project.",
            "cursor": true,
            "params": "project_id*"
        },
        {
            "name": "Project_createWebhook",
            "description": "Creates a new webhook that will be triggered when specific events occur within the project.",
            "params": "project_id*, url*, secret, events:array, vars:object"
        },
        {
            "name": "Project_getWebhookById",
            "description": "Retrieves the webhook with the given ID.",
            "params": "project_id*, id*"
        },
        {
            "name": "Project_save",
            "description": "Updates writable fields on the given project.",
            "params": "project_id*, name, timezone_id, url_slug, default_route_id, primary_dashboard_id, auto_create_contacts:boolean, message_retention_days:integer, short_link_scheme:boolean, custom_contact_routing:boolean, vars:object"
        },
        {
            "name": "Label_queryMessages",
            "description": "Queries messages with the given label.",
            "cursor": true,
            "params": "project_id*, id*, direction, message_type, source, starred:boolean, status, time_created[min], time_created[max], external_id, contact_id, phone_id, broadcast_id, scheduled_id, group_id"
        },
        {
            "name": "Label_save",
            "description": "Updates writable fields on the given label.",
            "params": "project_id*, id*, name, vars:object"
        },
        {
            "name": "Label_delete",
            "description": "Deletes the given label (Note: no messages are deleted.)",
            "params": "project_id*, id*"
        },
        {
            "name": "Group_queryContacts",
            "description": "Queries contacts that are members of the given group.",
            "cursor": true,
            "params": "project_id*, id*, name, phone_number, time_created, last_message_time, last_incoming_message_time, last_outgoing_message_time, incoming_message_count:integer, outgoing_message_count:integer, send_blocked:boolean, vars:object"
        },
        {
            "name": "Group_queryScheduledMessages",
            "description": "Queries scheduled messages to the given group.",
            "cursor": true,
            "params": "project_id*, id*, message_type, time_created, next_time, relative_scheduled_id, pending_review:boolean"
        },
        {
            "name": "Group_save",
            "description": "Updates writable fields on the given group.",
            "params": "project_id*, id*, name, filters:object, allow_sending:boolean, add_time_variable, solution_id, vars:object"
        },
        {
            "name": "Group_delete",
            "description": "Deletes this group (Note: no contacts are deleted.)",
            "params": "project_id*, id*"
        },
        {
            "name": "Phone_queryMessages",
            "description": "Queries messages sent or received by this basic route.",
            "cursor": true,
            "params": "project_id*, id*, direction, message_type, source, starred:boolean, status, time_created[min], time_created[max], external_id, contact_id, phone_id, broadcast_id, scheduled_id, group_id"
        },
        {
            "name": "Phone_save",
            "description": "Saves any fields or custom variables that have changed for this basic route.",
            "params": "project_id*, id*, name, phone_number, send_paused:boolean, vars:object, validate_recipient_numbers:boolean, allowed_recipient_countries:array, sent_message_limit:integer, send_delay:number, timezone_id, quiet_mode, quiet_start, quiet_end, external_account_id, external_id, external_config:object, external_secret"
        },
        {
            "name": "Phone_resetSentMessageCount",
            "description": "Resets this route's sent_message_count to 0 and updates sent_message_epoch to the current time.",
            "params": "project_id*, id*"
        },
        {
            "name": "Route_save",
            "description": "Saves any fields, custom variables, or routing actions that have changed for this custom route.",
            "params": "project_id*, id*, name, vars:object, actions:array"
        },
        {
            "name": "Solution_save",
            "description": "Updates writable fields on the given solution.",
            "params": "project_id*, id*, name, description, skillbook_slug, vars:object"
        },
        {
            "name": "Solution_delete",
            "description": "Deletes the given solution.",
            "mcp_instructions": "Deleting a solution does not delete its services, data tables, groups, campaigns, or message templates. If the user wants to remove the entire solution, retrieve the solution to list its members, show the user what will be deleted, and only delete the member objects after the user has explicitly confirmed.",
            "params": "project_id*, id*"
        },
        {
            "name": "Dashboard_queryCards",
            "description": "Queries the cards on this dashboard, in display order, including each card's `config`.",
            "cursor": true,
            "params": "project_id*, id*"
        },
        {
            "name": "Dashboard_createCard",
            "description": "Adds a new card to this dashboard.",
            "params": "project_id*, id*, type*, title, width:integer, height:integer, config:object"
        },
        {
            "name": "Dashboard_getCardById",
            "description": "Retrieves the card on this dashboard with the given ID, including its configuration.",
            "params": "project_id*, id*, card_id*"
        },
        {
            "name": "Dashboard_save",
            "description": "Updates writable fields on the given dashboard.",
            "mcp_instructions": "To update or delete a card on an automatically generated dashboard (where the cards have null IDs), first call this method (no fields are required) to convert the dashboard to a custom dashboard; the response includes the new ID of each card.",
            "params": "project_id*, id*, name, solution_id, vars:object"
        },
        {
            "name": "Dashboard_delete",
            "description": "Deletes the given dashboard and all cards on it.",
            "params": "project_id*, id*"
        },
        {
            "name": "DashboardCard_save",
            "description": "Updates writable fields on the given dashboard card.",
            "params": "project_id*, dashboard_id*, id*, title, order:integer, width:integer, height:integer, config:object"
        },
        {
            "name": "DashboardCard_delete",
            "description": "Deletes the given card from its dashboard.",
            "params": "project_id*, dashboard_id*, id*"
        },
        {
            "name": "DataTable_queryRows",
            "description": "Queries rows in this data table.",
            "cursor": true,
            "params": "project_id*, id*, time_created, contact_id, vars:object"
        },
        {
            "name": "DataTable_createRow",
            "description": "Adds a new row to this data table.",
            "params": "project_id*, id*, contact_id, from_number, vars:object"
        },
        {
            "name": "DataTable_importRows",
            "description": "Creates and/or updates up to 200 rows in a single API call.",
            "params": "project_id*, id*, rows*:array, lookup_key"
        },
        {
            "name": "DataTable_getRowById",
            "description": "Retrieves the row in the given table with the given ID.",
            "params": "project_id*, id*, row_id*"
        },
        {
            "name": "DataTable_queryViews",
            "description": "Queries views of this data table.",
            "cursor": true,
            "params": "project_id*, id*, name"
        },
        {
            "name": "DataTable_createView",
            "description": "Creates a new view of this data table, defined by a filter on its rows.",
            "params": "project_id*, id*, name*, filters*:object, vars:object"
        },
        {
            "name": "DataTable_getViewById",
            "description": "Retrieves the view of the given table with the given ID.",
            "params": "project_id*, id*, view_id*"
        },
        {
            "name": "DataTable_getFields",
            "description": "Gets a list of all fields (columns) defined for this data table.",
            "params": "project_id*, id*"
        },
        {
            "name": "DataTable_updateFields",
            "description": "Updates metadata for one or more fields (columns) in the data table.",
            "params": "project_id*, id*, metadata*:array"
        },
        {
            "name": "DataTable_countRowsByValue",
            "description": "Returns the number of rows for each value of a given variable.",
            "params": "project_id*, id*, variable*"
        },
        {
            "name": "DataTable_save",
            "description": "Updates writable fields on the given data table.",
            "params": "project_id*, id*, name, show_add_row:boolean, show_stats:boolean, show_contact_columns:boolean, vars:object, solution_id"
        },
        {
            "name": "DataTable_delete",
            "description": "Permanently deletes the given data table, including all its rows",
            "params": "project_id*, id*"
        },
        {
            "name": "DataRow_save",
            "description": "Updates writable fields on the given data data row.",
            "params": "project_id*, table_id*, id*, contact_id, from_number, vars:object"
        },
        {
            "name": "DataRow_delete",
            "description": "Deletes this data row.",
            "params": "project_id*, table_id*, id*"
        },
        {
            "name": "DataView_queryRows",
            "description": "Queries rows matching this view's filter conditions.",
            "cursor": true,
            "params": "project_id*, table_id*, id*"
        },
        {
            "name": "DataView_save",
            "description": "Updates writable fields on the given data table view.",
            "params": "project_id*, table_id*, id*, name, vars:object"
        },
        {
            "name": "DataView_delete",
            "description": "Permanently deletes the given view of a data table (does not delete any rows in the table)",
            "params": "project_id*, table_id*, id*"
        },
        {
            "name": "Service_invoke",
            "description": "Manually invoke this service in a particular context.",
            "mcp_instructions": "Never call this method immediately after creating or configuring a service. Always ensure the user has seen a preview and has explicitly confirmed they want to proceed. Confirmation must come after the preview \u2014 do not treat the original send request as confirmation.",
            "params": "project_id*, id*, context*, event, message_id, contact_id, phone_number, row_id, variables:object, route_id, async:boolean"
        },
        {
            "name": "Service_queryContactStates",
            "description": "Query the current states of contacts for this service.",
            "cursor": true,
            "params": "project_id*, service_id*, id, vars:object"
        },
        {
            "name": "Service_getConfig",
            "description": "Gets configuration specific to the type of automated service.",
            "params": "project_id*, id*"
        },
        {
            "name": "Service_setConfig",
            "description": "Updates configuration specific to the type of automated service.",
            "params": "project_id*, id*, config*:object"
        },
        {
            "name": "Service_getContactState",
            "description": "Gets the current state for a particular contact for this service.",
            "params": "project_id*, id*, contact_id*, contact*"
        },
        {
            "name": "Service_setContactState",
            "description": "Initializes or updates the current state for a particular contact for the given service.",
            "params": "project_id*, service_id*, contact_id*, id*, vars:object"
        },
        {
            "name": "Service_resetContactState",
            "description": "Resets the current state for a particular contact for the given service.",
            "params": "project_id*, id*, contact_id*, contact*"
        },
        {
            "name": "Service_save",
            "description": "Updates writable fields on the given service.",
            "mcp_instructions": "When setting active: true on a service, always ensure the user has seen a preview of the service and explicitly confirmed activation. Do not activate a service in the same step as creating or configuring it.",
            "params": "project_id*, id*, name, active:boolean, priority:integer, vars:object, response_table_id, phone_ids, message_types:array, table_ids, message_statuses:array, tags:array, apply_mode, contact_number_filter, show_action:boolean, direction, solution_id"
        },
        {
            "name": "Service_delete",
            "description": "Deletes this service.",
            "params": "project_id*, id*"
        },
        {
            "name": "MessageTemplate_save",
            "description": "Updates writable fields on the given message template.",
            "params": "project_id*, id*, name, content, track_clicks:boolean, short_link_params:object, media:array, route_params:object, vars:object, solution_id"
        },
        {
            "name": "MessageTemplate_delete",
            "description": "Deletes the message template.",
            "params": "project_id*, id*"
        },
        {
            "name": "StoredFile_save",
            "description": "Updates writable fields on the given stored file.",
            "params": "project_id*, id*, filename, description, vars:object"
        },
        {
            "name": "StoredFile_delete",
            "description": "Deletes this stored file.",
            "params": "project_id*, id*"
        },
        {
            "name": "Organization_createProject",
            "description": "Creates a new project.",
            "params": "organization_id*, name*, timezone_id, url_slug, auto_create_contacts:boolean, message_retention_days:integer, short_link_scheme:boolean, custom_contact_routing:boolean, vars:object"
        },
        {
            "name": "Organization_save",
            "description": "Saves any fields that have changed for this organization.",
            "params": "organization_id*, name, timezone_id"
        },
        {
            "name": "Organization_getBillingDetails",
            "description": "Retrieves information about the organization's service plan, including pricing, billing period, current limits, enabled features, overage rates, and any minimum usage fees, as well as the current account balance and payment status.",
            "params": "organization_id*, usage:boolean"
        },
        {
            "name": "Organization_getAvailablePlans",
            "description": "Returns information about service plans that this organization can switch to via the Change Service Plan page in the web app, including limits, features, and pricing.",
            "params": "organization_id*, custom_limits:object, custom_features:object, custom_base_plan"
        },
        {
            "name": "Organization_getUsage",
            "description": "Retrieves the current usage count associated with a particular service plan limit.",
            "mcp_instructions": "If you need to retrieve usage for all service plan limits at once, call the Organization_getBillingDetails method with usage=true instead.",
            "params": "organization_id*, usage_type*"
        },
        {
            "name": "Organization_getUsageHistory",
            "description": "Retrieves the daily history of the usage count associated with a particular service plan limit.",
            "params": "organization_id*, usage_type*, start_date*, end_date*"
        },
        {
            "name": "Organization_queryBillingTransactions",
            "description": "Queries the billing transaction history for this organization \u2014 each posted charge, payment, credit, refund, and adjustment on the organization's account balance.",
            "cursor": true,
            "params": "organization_id*, time_posted, entry_type, usage_category, usage_country, usage_network, project_id, phone_id, include_pending:boolean"
        },
        {
            "name": "Organization_getBillingTransactionTotals",
            "description": "Retrieves aggregate totals of the organization's billing transactions over a date range, optionally grouped by transaction properties and/or rolled up into calendar periods.",
            "params": "organization_id*, start_date*, end_date*, rollup, group_by, entry_type, usage_category, usage_country, usage_network, project_id, phone_id"
        },
        {
            "name": "Organization_getMessageStats",
            "description": "Retrieves statistics about messages sent or received via Telerivet.",
            "params": "organization_id*, start_date*, end_date*, rollup, properties, metrics*, filters:object"
        },
        {
            "name": "Organization_queryProjects",
            "description": "Queries projects in this organization.",
            "cursor": true,
            "params": "organization_id*, name"
        },
        {
            "name": "Webhook_save",
            "description": "Updates the webhook configuration.",
            "params": "project_id*, id*, url, secret, events:array, vars:object"
        },
        {
            "name": "Webhook_delete",
            "description": "Deletes the webhook.",
            "params": "project_id*, id*"
        }
    ]
}