[ { "approval_risk": "unknown", "description": "Search 9,000+ apps to find actions you can enable. For authenticated services (Google Docs, Gmail, Sheets, Notion, Slack, Outlook, etc.), check here FIRST - generic web fetch tools cannot authenticate with these services. ALWAYS call this before saying 'I can't access X' or 'that app isn't available'. Use when user mentions ANY app not in inspect_zapier_actions. After finding what you need, use enable_zapier_action to add it.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "app": { "description": "Search for apps by name. Omit to see popular apps. Search 9,000+ available apps.", "type": "string" } }, "type": "object" }, "name": "discover_zapier_actions" }, { "approval_risk": "unknown", "description": "Enable an app's actions on this MCP server. Use discover_zapier_actions first to get the exact selected_api ID, then pass it here. Always pass app_display_name from the app field returned by discover_zapier_actions so confirmations show a friendly name rather than the raw selected_api ID. Returns action details including the execute tool to use (execute_zapier_read_action or execute_zapier_write_action) and parameters. If authentication is required, also returns a URL to authenticate the app.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "action": { "description": "Specific action key to enable. If omitted or '*', all actions for the app are enabled.", "type": "string" }, "app_display_name": { "description": "Human-readable app name for display purposes (e.g., 'Gmail', 'Slack'). Always populate this from the app field returned by discover_zapier_actions or list_enabled_zapier_actions. Used to render friendly confirmation messages instead of the raw selected_api ID.", "type": "string" }, "selected_api": { "description": "The selectedApi ID to enable (e.g., 'GmailCLIAPI', 'SlackCLIAPI'). Use the selected_api field from discover_zapier_actions.", "type": "string" } }, "required": [ "selected_api" ], "type": "object" }, "name": "enable_zapier_action" }, { "approval_risk": "unknown", "description": "Remove an app's actions from this MCP server. Use inspect_zapier_actions to see which apps are enabled and their selected_api values. Always pass app_display_name (the human-readable app name from inspect_zapier_actions) so confirmations show a friendly name rather than the raw selected_api ID. Optionally specify an action key to remove only that specific action.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "action": { "description": "Specific action key to remove. If omitted, all actions for the app are removed.", "type": "string" }, "app_display_name": { "description": "Human-readable app name for display purposes (e.g., 'Gmail', 'Zendesk'). Always populate this from the app field returned by list_enabled_zapier_actions. Used to render friendly confirmation messages instead of the raw selected_api ID.", "type": "string" }, "selected_api": { "description": "The selectedApi ID to disable (e.g., 'GmailCLIAPI', 'JiraSoftwareCloudCLIAPI'). Use the selected_api field from list_enabled_zapier_actions.", "type": "string" } }, "required": [ "selected_api" ], "type": "object" }, "name": "disable_zapier_action" }, { "approval_risk": "unknown", "description": "CALL THIS FIRST before any execute_zapier_read_action or execute_zapier_write_action call. Inspects all enabled apps and their actions with everything you need to build an execute call: the exact `app`, `action`, and `tool_name` identifiers plus parameter schema. These apps handle OAuth automatically \u2014 use them instead of generic URL fetching for authenticated services. Use `tool_name` for exact action details. For a parameter flagged `is_dynamic_enum: true`, call this tool again with `tool_name`, `enum_property`, and any parent values in `params` to resolve values. For actions with `dynamic_properties_depends_on`, settle those parameters first, then call this tool again with `tool_name` and `params` to get `dynamic_properties_schema`. If you don't find the app or action you need, you MUST call discover_zapier_actions next \u2014 NEVER say 'I can't do that' without checking discover_zapier_actions first. When you resolve a value from the user's request, matching a single record is not proof it is the one they meant: if their input is partial or ambiguous (e.g. a first name, or a search with several close matches), enumerate the candidates and let the user pick before passing a value to an execute call. Each app's `connections.default` names the account its actions run against. If that account doesn't fit the apparent context of the request (e.g. a personal address on a work task), flag it to the user before executing and note the account can be switched per action by passing a different `connection_id` (list the options with list_zapier_connections, or connect the right account via manage_zapier_connections) \u2014 do this even when only one account is connected.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "action": { "description": "Filter by action key. Omit to list all actions.", "type": "string" }, "connection_id": { "anyOf": [ { "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, { "minLength": 1, "type": "string" } ], "description": "Optional. The connected account to run this action against. Apps can have multiple connected accounts, and by default the action runs against the app's default connection \u2014 so you normally do NOT need to set this, and should not ask the user which account to use on every call. Set it only when the user's request implies or names a specific account, or asks to switch accounts: call `list_zapier_connections` for this app, pick the matching `connection_id`, and if more than one plausibly fits, confirm with the user before executing. If the user references an account that isn't connected yet, offer to connect it via manage_zapier_connections instead of refusing. Change the default connection anytime with manage_zapier_connections." }, "enum_cursor": { "description": "Pagination cursor from a previous dynamic enum response. Use with `enum_property`.", "type": "string" }, "enum_property": { "description": "The dynamic enum property to resolve or search. Required to get `dynamic_enum_values`; omit when you only need the action's parameter schema.", "type": "string" }, "enum_search": { "description": "Optional search text for `enum_property` when its dynamic enum has many values.", "type": "string" }, "params": { "additionalProperties": {}, "description": "Partial argument values for the action. Pass parent values here to resolve dynamic enum values and the `dynamic_properties` schema inline before executing.", "propertyNames": { "type": "string" }, "type": "object" }, "selected_api": { "description": "Filter by selectedApi (e.g., 'GoogleMailV2CLIAPI'). Use the `selected_api` from a previous list call or from discover_zapier_actions. Omit to list all apps.", "type": "string" }, "tool_name": { "description": "Filter by the `tool_name` returned for an action. Preferred when resolving an exact action schema because it is collision-safe.", "type": "string" } }, "type": "object" }, "name": "inspect_zapier_actions" }, { "approval_risk": "unknown", "description": "Execute a search or read action to get data from a connected app. REQUIRED: You MUST call inspect_zapier_actions first to get the exact action key, tool_name, and parameter schema. NEVER guess action names \u2014 they are NOT intuitive and WILL fail. If the app isn't enabled, use discover_zapier_actions then enable_zapier_action first. Pass exact argument values in `params`. For dynamic enum parameters, call inspect_zapier_actions again with `tool_name`, `enum_property`, and parent values in `params`. For actions with `dynamic_properties_depends_on`, call inspect_zapier_actions again with `tool_name` and settled parent params to learn `dynamic_properties_schema`. Before executing, be confident that every value in `params` correctly and uniquely identifies what the user asked for \u2014 especially fields naming a person, recipient, channel, account, record, or file. If the user gave only partial or ambiguous information (e.g. just a first name, or a term that could match several entities), do NOT assume a lookup that returns a single match is the right one: many lookups return one 'best' match even when others exist. Enumerate the candidates first \u2014 prefer a search or list action that can return multiple matches, or widen your query \u2014 and when more than one plausibly fits, present the options and let the user choose rather than guessing.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "action": { "description": "Action key to execute. Use inspect_zapier_actions to get exact keys.", "type": "string" }, "connection_id": { "anyOf": [ { "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, { "minLength": 1, "type": "string" } ], "description": "Optional. The connected account to run this action against. Apps can have multiple connected accounts, and by default the action runs against the app's default connection \u2014 so you normally do NOT need to set this, and should not ask the user which account to use on every call. Set it only when the user's request implies or names a specific account, or asks to switch accounts: call `list_zapier_connections` for this app, pick the matching `connection_id`, and if more than one plausibly fits, confirm with the user before executing. If the user references an account that isn't connected yet, offer to connect it via manage_zapier_connections instead of refusing. Change the default connection anytime with manage_zapier_connections." }, "params": { "additionalProperties": {}, "description": "Exact argument values for the action, keyed by parameter name. Use `inspect_zapier_actions` to learn the parameter schema. For a parameter flagged `is_dynamic_enum`, resolve its value first by calling `inspect_zapier_actions` again with `tool_name`, `enum_property`, and any known parent values in `params`. For actions with `dynamic_properties_depends_on`, settle those parameters then call `inspect_zapier_actions` again with `tool_name` and `params` to learn the `dynamic_properties_schema`, then nest the resolved keys under a `dynamic_properties` object inside `params`.", "propertyNames": { "type": "string" }, "type": "object" }, "selected_api": { "description": "The selectedApi ID of the app to execute against (e.g. 'SlackCLIAPI'). Use the `selected_api` from inspect_zapier_actions. Required so the action resolves to a single app when the same action key exists for more than one app.", "type": "string" }, "tool_name": { "description": "Collision-safe action identifier from inspect_zapier_actions. Pass it whenever available so actions that share the same key resolve correctly.", "type": "string" } }, "required": [ "selected_api", "action" ], "type": "object" }, "name": "execute_zapier_read_action" }, { "approval_risk": "unknown", "description": "Execute a write or create action in a connected app. REQUIRED: You MUST call inspect_zapier_actions first to get the exact action key, tool_name, and parameter schema. NEVER guess action names \u2014 they are NOT intuitive and WILL fail. If the app isn't enabled, use discover_zapier_actions then enable_zapier_action first. Pass exact argument values in `params`. For dynamic enum parameters, call inspect_zapier_actions again with `tool_name`, `enum_property`, and parent values in `params`. For actions with `dynamic_properties_depends_on`, call inspect_zapier_actions again with `tool_name` and settled parent params to learn `dynamic_properties_schema`. Before executing, be confident that every value in `params` correctly and uniquely identifies what the user asked for \u2014 especially fields naming a person, recipient, channel, account, record, or file. If the user gave only partial or ambiguous information (e.g. just a first name, or a term that could match several entities), do NOT assume a lookup that returns a single match is the right one: many lookups return one 'best' match even when others exist. Enumerate the candidates first \u2014 prefer a search or list action that can return multiple matches, or widen your query \u2014 and when more than one plausibly fits, present the options and let the user choose rather than guessing. Write actions have real, often irreversible side effects (sending messages, creating or modifying records), so confirm the target whenever there is any doubt.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "action": { "description": "Action key to execute. Use inspect_zapier_actions to get exact keys.", "type": "string" }, "connection_id": { "anyOf": [ { "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, { "minLength": 1, "type": "string" } ], "description": "Optional. The connected account to run this action against. Apps can have multiple connected accounts, and by default the action runs against the app's default connection \u2014 so you normally do NOT need to set this, and should not ask the user which account to use on every call. Set it only when the user's request implies or names a specific account, or asks to switch accounts: call `list_zapier_connections` for this app, pick the matching `connection_id`, and if more than one plausibly fits, confirm with the user before executing. If the user references an account that isn't connected yet, offer to connect it via manage_zapier_connections instead of refusing. Change the default connection anytime with manage_zapier_connections." }, "params": { "additionalProperties": {}, "description": "Exact argument values for the action, keyed by parameter name. Use `inspect_zapier_actions` to learn the parameter schema. For a parameter flagged `is_dynamic_enum`, resolve its value first by calling `inspect_zapier_actions` again with `tool_name`, `enum_property`, and any known parent values in `params`. For actions with `dynamic_properties_depends_on`, settle those parameters then call `inspect_zapier_actions` again with `tool_name` and `params` to learn the `dynamic_properties_schema`, then nest the resolved keys under a `dynamic_properties` object inside `params`.", "propertyNames": { "type": "string" }, "type": "object" }, "selected_api": { "description": "The selectedApi ID of the app to execute against (e.g. 'SlackCLIAPI'). Use the `selected_api` from inspect_zapier_actions. Required so the action resolves to a single app when the same action key exists for more than one app.", "type": "string" }, "tool_name": { "description": "Collision-safe action identifier from inspect_zapier_actions. Pass it whenever available so actions that share the same key resolve correctly.", "type": "string" } }, "required": [ "selected_api", "action" ], "type": "object" }, "name": "execute_zapier_write_action" }, { "approval_risk": "unknown", "description": "List the Zapier connections (authenticated accounts) available for an app. Use the `selected_api` from discover_zapier_actions or the action-listing tool. Returns each connection's `connection_id`, which you can pass to execute_zapier_read_action / execute_zapier_write_action to run with that specific account. By default only the user's own connections are returned; pass `include_shared: true` to also return connections shared with them, but only show the user their shared connections if they explicitly ask for it. Paginated via `cursor`.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "cursor": { "description": "Pagination cursor from a previous response's `next_cursor`. Omit to fetch the first page.", "type": "string" }, "include_shared": { "description": "Include connections shared with the user by others. By default only the user's own connections are returned. Only show the user their shared connections if they explicitly ask for it.", "type": "boolean" }, "limit": { "description": "Maximum number of connections to return per page (1-100). Defaults to 20.", "type": "number" }, "selected_api": { "description": "The selectedApi ID of the app to list connections for (e.g. 'SlackCLIAPI'). Use the `selected_api` from discover_zapier_actions or the action-listing tool.", "type": "string" } }, "required": [ "selected_api" ], "type": "object" }, "name": "list_zapier_connections" }, { "approval_risk": "unknown", "description": "Manage an app's Zapier connections. Returns a URL the user can open to connect a new account, and optionally sets the app's default connection. An app REQUIRES a default connection before any of its actions can run. If the user has no default connection for the app they want to use, share the returned `auth_url` with them and ask them to tell you once they have added the connection; after they confirm, call list_zapier_connections to find the new connection_id, then call this tool again with that connection_id as `default_connection_id` to set it as the default. `selected_api` MUST come verbatim from discover_zapier_actions or inspect_zapier_actions \u2014 never guess or construct it (e.g. Gmail is `GoogleMailV2CLIAPI`, not `GmailCLIAPI`). If you don't already have it, call discover_zapier_actions first. To set the default account every action for this app should use, pass `default_connection_id` (look it up with list_zapier_connections). Share the returned `auth_url` with the user; after they finish, call list_zapier_connections to see the new connection.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "app_display_name": { "description": "Optional human-readable app name (from discover_zapier_actions) used to make the response easier to read.", "type": "string" }, "default_connection_id": { "anyOf": [ { "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, { "minLength": 1, "type": "string" } ], "description": "Optional. Set this connection as the app's default so every action for the app runs against it without passing `connection_id` each time. Look up the id with list_zapier_connections. Omit to only get a URL for connecting a new account." }, "selected_api": { "description": "The exact selectedApi ID of the app (e.g. 'SlackCLIAPI'). Must come verbatim from discover_zapier_actions (or the action-listing tool) \u2014 do not guess or construct it (e.g. Gmail is 'GoogleMailV2CLIAPI', not 'GmailCLIAPI').", "type": "string" } }, "required": [ "selected_api" ], "type": "object" }, "name": "manage_zapier_connections" }, { "approval_risk": "unknown", "description": "Send feedback about your experience with Zapier MCP to the Zapier team.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "feedback": { "description": "Feedback message to send to the Zapier MCP team", "maxLength": 2000, "minLength": 1, "type": "string" }, "feedback_positive": { "description": "Whether this is positive feedback (true) or negative (false)", "type": "boolean" } }, "required": [ "feedback", "feedback_positive" ], "type": "object" }, "name": "send_feedback" }, { "approval_risk": "unknown", "description": "Automatically set up this MCP server based on the user's existing connected accounts. Finds apps the user has authenticated, enables their actions, and binds authentication \u2014 all in one call. Also returns the user's top Zap workflow titles so you can suggest relevant skills. Run this when the user has no tools enabled yet, or when they ask to set up their MCP server quickly.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": {}, "type": "object" }, "name": "auto_provision_mcp" }, { "approval_risk": "unknown", "description": "Lists the user's saved Zapier Skills with descriptions. Skills are reusable markdown instructions for tasks the user runs through their connected apps \u2014 useful when a request resembles a known workflow (e.g. 'onboard me'). The catalog is dynamic and may have changed since a previous call. Pair with get_zapier_skill to load a skill's full content, or create_zapier_skill to save a new workflow.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": {}, "type": "object" }, "name": "list_zapier_skills" }, { "approval_risk": "unknown", "description": "Returns the full markdown definition of a saved Zapier Skill by name, along with any appended execution instructions. Typically paired with list_zapier_skills, which surfaces available skill names. The catalog includes an \"zapier:onboarding\" skill that walks new users through setting up their Zapier MCP server.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "name": { "description": "The exact name of the skill to retrieve", "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "get_zapier_skill" }, { "approval_risk": "unknown", "description": "Saves a workflow as a reusable Zapier Skill \u2014 a good fit for multi-step workflows the user runs repeatedly or tool calls that always use the same parameters. For a high-quality skill: (1) action keys and parameter schemas should come from list_enabled_zapier_actions, (2) static values should be resolved up front (e.g. an email to a Slack user ID), (3) any ambiguity about targets, recipients, or scope should be resolved with the user before creation, (4) known parameter values are pre-filled; only runtime-computed parameters are left bare. Re-using results from earlier in the conversation avoids redundant calls.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "description": { "description": "One-sentence description of what this skill does", "maxLength": 500, "minLength": 1, "type": "string" }, "name": { "description": "Short, unique name for this skill (e.g. 'create jira ticket', 'daily standup'). Names are case-insensitive.", "maxLength": 200, "minLength": 1, "type": "string" }, "skillDefinition": { "description": "Full markdown skill definition.\n\nBEFORE writing this definition, ensure the following have been done (skip any step whose results are already available from earlier in this conversation):\n1. list_enabled_zapier_actions called for each app involved \u2014 to get exact action keys and parameter schemas.\n2. User-specific configuration gathered \u2014 project keys, channel names, default assignees, recurring values.\n3. Ambiguities resolved \u2014 if the workflow has unclear targets, recipients, or scope, ASK the user before proceeding. E.g. 'DM the user in the list, or DM you?', 'Which Jira project?', 'Send to the channel or to you directly?'\n4. Static values resolved and validated \u2014 e.g. email resolved to a Slack user ID via a lookup action.\n\nIf any of these were already done earlier in the conversation, reuse those results. Do NOT repeat calls you have already made.\n\nSTRUCTURE the skill definition with these sections:\n- Title and one-line description\n- '## Validated fixed values' \u2014 all static IDs, names, keys discovered or confirmed during creation\n- '## Actions' \u2014 each ZapierAction reference with the FULL parameter signature. Quote every param value that is known and fixed. Leave bare only params that must be computed at runtime.\n- '## Runtime instructions' \u2014 numbered steps for execution\n- '## Constraints' \u2014 what the agent must NOT do (e.g. do not re-resolve known IDs)\n\nReference each Zapier action inline with:\nZapierAction[app:action](param: \"locked_value\", dynamic_param)\n\nUse the exact `app` and `key` values from list_enabled_zapier_actions.\nQuoted param values are locked and forwarded directly at execution.\nBare param names are filled by skill logic at runtime.\n\nIMPORTANT: Maximize locked params. Every param that CAN be resolved at creation time MUST be quoted. The goal is zero unnecessary API calls at runtime. Leverage any action results, user IDs, or parameter values already obtained in this conversation.", "maxLength": 100000, "minLength": 1, "type": "string" } }, "required": [ "name", "description", "skillDefinition" ], "type": "object" }, "name": "create_zapier_skill" }, { "approval_risk": "unknown", "description": "Update an existing Zapier Skill's description or content. Use when the user wants to refine a skill, fix an issue, or add new instructions.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "description": { "description": "Updated one-sentence description (optional)", "maxLength": 500, "minLength": 1, "type": "string" }, "name": { "description": "The exact name of the skill to update", "minLength": 1, "type": "string" }, "skillDefinition": { "description": "Updated full markdown skill definition (optional). Use ZapierAction[app:action](params) format for action references.", "maxLength": 100000, "minLength": 1, "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "update_zapier_skill" }, { "approval_risk": "unknown", "description": "Permanently delete a Zapier Skill by name.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "name": { "description": "The exact name of the skill to delete", "minLength": 1, "type": "string" } }, "required": [ "name" ], "type": "object" }, "name": "delete_zapier_skill" }, { "approval_risk": "unknown", "description": "Create or update a custom code action for an app. Use this when inspect_zapier_actions does not have the action you need and the app's service API should support it. The code is generated from your requirements and executes in a secure sandbox with authenticated API access. IMPORTANT: Never include API keys, tokens, passwords, or other credentials in the requirements \u2014 code actions authenticate automatically through Zapier's connected accounts. If a code action with the same name already exists, it will be regenerated with the new requirements. After creation, the action is immediately available as a tool.", "input_schema": { "$schema": "http://json-schema.org/draft-07/schema#", "properties": { "code_action_name": { "description": "A short, descriptive name for the code action (e.g. 'list_channel_users', 'close_stale_issues'). Used as the tool name suffix.", "type": "string" }, "requirements": { "description": "Natural language description of what the code action should do. NEVER include API keys, tokens, or credentials \u2014 authentication is handled automatically via connected accounts. Be specific about the API endpoint, data format, and any filtering/pagination needs.", "type": "string" }, "selected_api": { "description": "The app's API identifier from discover_zapier_actions (e.g. 'GoogleMailV2CLIAPI', 'JiraSoftwareCloudCLIAPI')", "type": "string" } }, "required": [ "selected_api", "code_action_name", "requirements" ], "type": "object" }, "name": "write_code_action" }, { "approval_risk": "unknown", "description": "Returns the URL where users can configure this MCP server - adding, editing, or removing actions. Provide this URL to users who want to customize their available tools.", "input_schema": { "properties": {}, "type": "object" }, "name": "get_configuration_url" } ]