From 345a5c89f51df3b97f4ae115c980f92854bf6724 Mon Sep 17 00:00:00 2001 From: Pranesh Date: Thu, 21 May 2026 12:43:30 +0530 Subject: [PATCH 01/10] add Adobe Marketing Agent MCP connector docs --- ...dobemarketingagentmcp-common-workflows.mdx | 189 ++++++++++++++++ .../_setup-adobemarketingagentmcp.mdx | 21 ++ .../templates/agent-connectors/index.ts | 2 + .../connectors/adobemarketingagentmcp.mdx | 89 ++++++++ .../adobemarketingagentmcp.ts | 207 ++++++++++++++++++ src/data/agent-connectors/catalog.ts | 5 + 6 files changed, 513 insertions(+) create mode 100644 src/components/templates/agent-connectors/_section-after-setup-adobemarketingagentmcp-common-workflows.mdx create mode 100644 src/components/templates/agent-connectors/_setup-adobemarketingagentmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx create mode 100644 src/data/agent-connectors/adobemarketingagentmcp.ts diff --git a/src/components/templates/agent-connectors/_section-after-setup-adobemarketingagentmcp-common-workflows.mdx b/src/components/templates/agent-connectors/_section-after-setup-adobemarketingagentmcp-common-workflows.mdx new file mode 100644 index 000000000..1193145d8 --- /dev/null +++ b/src/components/templates/agent-connectors/_section-after-setup-adobemarketingagentmcp-common-workflows.mdx @@ -0,0 +1,189 @@ +export const sectionTitle = 'Common workflows' + +import { Tabs, TabItem, Aside } from '@astrojs/starlight/components' + +### Send a query to the Adobe Marketing AI assistant + +Use `adobemarketingagentmcp_adobe-marketing-agent-mcp-widget` to ask questions about your campaigns, audiences, journeys, and Analytics data in plain English. + + + + ```typescript + const result = await actions.executeTool({ + connectionName: 'adobemarketingagentmcp', + identifier: 'user_123', + toolName: 'adobemarketingagentmcp_adobe-marketing-agent-mcp-widget', + toolInput: { + query: 'What are my top performing audience segments this month?', + }, + }); + console.log(result); + ``` + + + ```python + result = actions.execute_tool( + connection_name="adobemarketingagentmcp", + identifier="user_123", + tool_name="adobemarketingagentmcp_adobe-marketing-agent-mcp-widget", + tool_input={ + "query": "What are my top performing audience segments this month?", + }, + ) + print(result) + ``` + + + +### Switch sandbox and dataview + +Use `adobemarketingagentmcp_core-switch_sandbox_dataview` to update the active Adobe Experience Platform sandbox and Customer Journey Analytics dataview in a single call. + + + + ```typescript + const result = await actions.executeTool({ + connectionName: 'adobemarketingagentmcp', + identifier: 'user_123', + toolName: 'adobemarketingagentmcp_core-switch_sandbox_dataview', + toolInput: { + sandboxName: 'prod', + dataviewName: 'My Analytics View', + }, + }); + console.log(result); + ``` + + + ```python + result = actions.execute_tool( + connection_name="adobemarketingagentmcp", + identifier="user_123", + tool_name="adobemarketingagentmcp_core-switch_sandbox_dataview", + tool_input={ + "sandboxName": "prod", + "dataviewName": "My Analytics View", + }, + ) + print(result) + ``` + + + +### Poll an async task + +Some Adobe Marketing operations run asynchronously. Submit a query with `execution_mode: "async"`, then poll with `adobemarketingagentmcp_core-get_task` until the task completes. + + + + ```typescript + // Step 1 — submit async query + const submitted = await actions.executeTool({ + connectionName: 'adobemarketingagentmcp', + identifier: 'user_123', + toolName: 'adobemarketingagentmcp_adobe-marketing-agent-mcp-widget', + toolInput: { + query: 'Generate a full audience overlap report', + execution_mode: 'async', + }, + }); + const taskId = submitted.data?.task_id; + + // Step 2 — poll until complete + let cursor = 0; + while (true) { + const status = await actions.executeTool({ + connectionName: 'adobemarketingagentmcp', + identifier: 'user_123', + toolName: 'adobemarketingagentmcp_core-get_task', + toolInput: { task_id: taskId, cursor }, + }); + cursor = status.data?.cursor ?? cursor; + if (status.data?.status === 'completed') { + console.log(status.data.result); + break; + } + await new Promise(r => setTimeout(r, 2000)); + } + ``` + + + ```python + import time + + # Step 1 — submit async query + submitted = actions.execute_tool( + connection_name="adobemarketingagentmcp", + identifier="user_123", + tool_name="adobemarketingagentmcp_adobe-marketing-agent-mcp-widget", + tool_input={ + "query": "Generate a full audience overlap report", + "execution_mode": "async", + }, + ) + task_id = submitted.data.get("task_id") + + # Step 2 — poll until complete + cursor = 0 + while True: + status = actions.execute_tool( + connection_name="adobemarketingagentmcp", + identifier="user_123", + tool_name="adobemarketingagentmcp_core-get_task", + tool_input={"task_id": task_id, "cursor": cursor}, + ) + cursor = status.data.get("cursor", cursor) + if status.data.get("status") == "completed": + print(status.data.get("result")) + break + time.sleep(2) + ``` + + + +### Read and clear user preferences + +User preferences (sandbox, dataview, org, region) persist for 90 days. Use `adobemarketingagentmcp_core-user_preferences` to read or clear them. + + + + ```typescript + // Read current preferences + const prefs = await actions.executeTool({ + connectionName: 'adobemarketingagentmcp', + identifier: 'user_123', + toolName: 'adobemarketingagentmcp_core-user_preferences', + toolInput: { action: 'get' }, + }); + console.log(prefs.data); + + // Clear all preferences + await actions.executeTool({ + connectionName: 'adobemarketingagentmcp', + identifier: 'user_123', + toolName: 'adobemarketingagentmcp_core-user_preferences', + toolInput: { action: 'clear' }, + }); + ``` + + + ```python + # Read current preferences + prefs = actions.execute_tool( + connection_name="adobemarketingagentmcp", + identifier="user_123", + tool_name="adobemarketingagentmcp_core-user_preferences", + tool_input={"action": "get"}, + ) + print(prefs.data) + + # Clear all preferences + actions.execute_tool( + connection_name="adobemarketingagentmcp", + identifier="user_123", + tool_name="adobemarketingagentmcp_core-user_preferences", + tool_input={"action": "clear"}, + ) + ``` + + diff --git a/src/components/templates/agent-connectors/_setup-adobemarketingagentmcp.mdx b/src/components/templates/agent-connectors/_setup-adobemarketingagentmcp.mdx new file mode 100644 index 000000000..144d9d3db --- /dev/null +++ b/src/components/templates/agent-connectors/_setup-adobemarketingagentmcp.mdx @@ -0,0 +1,21 @@ +import { Steps, Aside } from '@astrojs/starlight/components' + +Adobe Marketing Agent MCP uses Dynamic Client Registration (DCR) — no client ID or secret is required. The only step is creating a connection in Scalekit and authorizing your Adobe account. + + +1. ### Create a connection in Scalekit + + - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**. + - Search for **Adobe Marketing Agent MCP** and click **Create**. + - Note the **Connection name** — use this as `connection_name` in your code (e.g., `adobemarketingagentmcp`). + +2. ### Authorize your Adobe account + + Generate an authorization link and open it in a browser to complete the Adobe OAuth flow. + + The user is redirected to Adobe to sign in and grant access. Scalekit stores the token and injects it automatically into every tool call — no further configuration is needed. + + + diff --git a/src/components/templates/agent-connectors/index.ts b/src/components/templates/agent-connectors/index.ts index 24dee7366..5bce5fd2e 100644 --- a/src/components/templates/agent-connectors/index.ts +++ b/src/components/templates/agent-connectors/index.ts @@ -1,4 +1,5 @@ export { default as AgentKitCredentials } from './_agentkit-credentials.mdx' +export { default as SetupAdobemarketingagentmcpSection } from './_setup-adobemarketingagentmcp.mdx' export { default as SetupAirtableSection } from './_setup-airtable.mdx' export { default as SetupApifymcpSection } from './_setup-apifymcp.mdx' export { default as SetupApolloSection } from './_setup-apollo.mdx' @@ -72,6 +73,7 @@ export { default as SetupZendeskSection } from './_setup-zendesk.mdx' export { default as SetupZoomSection } from './_setup-zoom.mdx' export { default as ConnectedAccountBigqueryserviceaccountSection } from './_connected-account-bigqueryserviceaccount.mdx' export { default as SectionAfterAuthenticationGoogledwdAuth } from './_section-after-authentication-googledwd-auth.mdx' +export { default as SectionAfterSetupAdobemarketingagentmcpCommonWorkflows } from './_section-after-setup-adobemarketingagentmcp-common-workflows.mdx' export { default as SectionAfterSetupAirtableCommonWorkflows } from './_section-after-setup-airtable-common-workflows.mdx' export { default as SectionAfterSetupApifymcpCommonWorkflows } from './_section-after-setup-apifymcp-common-workflows.mdx' export { default as SectionAfterSetupApolloCommonWorkflows } from './_section-after-setup-apollo-common-workflows.mdx' diff --git a/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx b/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx new file mode 100644 index 000000000..f0640895b --- /dev/null +++ b/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx @@ -0,0 +1,89 @@ +--- +title: 'Adobe Marketing Agent MCP connector' +tableOfContents: true +description: 'Connect to Adobe Marketing Cloud. Manage campaigns, analytics, and journeys using a natural-language AI assistant.' +sidebar: + label: 'Adobe Marketing Agent MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg +connectorAuthType: OAuth 2.0 +connectorCategories: [marketing, analytics, ai] +tags: [agentkit, connector, adobe, marketing, analytics, journeys, mcp] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/adobemarketingagentmcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { SetupAdobemarketingagentmcpSection } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' +import { SectionAfterSetupAdobemarketingagentmcpCommonWorkflows } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Set up the connector + + Register your Adobe Marketing Agent MCP credentials with Scalekit so it handles the token lifecycle. You do this once per environment. + +
+ Dashboard setup steps + + + +
+ +4. ### Authorize and make your first call + + + +
+ +## What you can do + +Connect this agent connector to let your agent: + +- **Send natural-language queries** — ask about audiences, journeys, campaigns, and Analytics data in plain English; the AI assistant translates your query into Adobe API calls +- **Manage Adobe context** — switch organizations, Experience Platform sandboxes, and Customer Journey Analytics dataviews for your session +- **Track async tasks** — submit long-running operations and poll for results using task IDs and cursors +- **Configure session preferences** — persist your sandbox, dataview, and organization settings across sessions for up to 90 days +- **Submit and rate feedback** — send thumbs up/down ratings, flag harmful content, and submit free-text comments about AI responses + +## Common workflows + + + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/data/agent-connectors/adobemarketingagentmcp.ts b/src/data/agent-connectors/adobemarketingagentmcp.ts new file mode 100644 index 000000000..80c329e9d --- /dev/null +++ b/src/data/agent-connectors/adobemarketingagentmcp.ts @@ -0,0 +1,207 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'adobemarketingagentmcp_adobe-marketing-agent-mcp-widget', + description: `Send a natural-language query to the Adobe Marketing AI assistant to analyze audiences, troubleshoot journeys, and retrieve marketing insights.`, + params: [ + { + name: 'query', + type: 'string', + required: true, + description: `The natural-language request to send to the assistant (e.g. "What are my top audience segments this month?").`, + }, + { + name: 'execution_mode', + type: 'string', + required: false, + description: `Controls how the task runs. Use "async" for long-running operations; "sync" (default) for immediate responses. Accepted values: sync, async.`, + }, + { + name: 'chat_id', + type: 'string', + required: false, + description: `Optional identifier to correlate this request with a chat or conversation context.`, + }, + { + name: 'async', + type: 'boolean', + required: false, + description: `Compatibility flag; set to true to request async execution.`, + }, + { + name: 'long_running', + type: 'boolean', + required: false, + description: `Compatibility flag; set to true to request async execution for long-running tasks.`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-context-management-widget', + description: `Display and manage the current organization, sandbox, and dataview context, allowing the user to switch between them.`, + params: [ + { + name: 'query', + type: 'string', + required: false, + description: `Optional context for the widget, such as which sandbox or dataview to display.`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-feedback-widget', + description: `Show an interactive feedback form with thumbs up/down and rating categories; falls back to text-based feedback if widgets are not supported.`, + params: [ + { + name: 'query', + type: 'string', + required: false, + description: `Optional initial feedback message to pre-populate the feedback form.`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-get_task', + description: `Retrieve the status and events for an async task by ID; use the cursor to poll only for new events since the last fetch.`, + params: [ + { + name: 'task_id', + type: 'string', + required: true, + description: `The unique identifier of the async task to retrieve. Returned by tools that support async execution.`, + }, + { + name: 'cursor', + type: 'integer', + required: false, + description: `Offset cursor from the previous response; use 0 to fetch all events from the beginning.`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-list_tasks', + description: `List all async tasks associated with the current conversation context.`, + params: [], + }, + { + name: 'adobemarketingagentmcp_core-plan_completion_decision', + description: `Submit the user's approval or rejection for a pending plan before it is executed.`, + params: [ + { + name: 'decision', + type: 'string', + required: true, + description: `The user's approval decision. Accepted values: Approve (execute the proposed plan), Reject (cancel it).`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-provide_feedback', + description: `Submit user feedback about the AI assistant experience; automatically classifies sentiment and calls the feedback API.`, + params: [ + { + name: 'query', + type: 'string', + required: false, + description: `The user's feedback message; used in text mode when the feedback widget is not available.`, + }, + { + name: 'sentiment', + type: 'string', + required: false, + description: `The user's overall sentiment rating. Accepted values: like, dislike.`, + }, + { + name: 'comment', + type: 'string', + required: false, + description: `Optional free-text comment to accompany the feedback.`, + }, + { + name: 'flagged', + type: 'boolean', + required: false, + description: `Set to true if the feedback reports harmful content; triggers the flag API instead of sentiment feedback.`, + }, + { + name: 'flagCategories', + type: 'array', + required: false, + description: `Categories of harmful content being reported. Accepted values: biased, harm, offensive, trademark-violation, other.`, + }, + { + name: 'pickList', + type: 'array', + required: false, + description: `Selected feedback option labels chosen from the widget's predefined list (e.g. ["Incorrect info", "Not helpful"]).`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-set_dataview', + description: `Set the active Customer Journey Analytics dataview for the current session.`, + params: [ + { + name: 'dataviewName', + type: 'string', + required: true, + description: `The name of the Customer Journey Analytics dataview to set as the active context (e.g. "My Analytics View").`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-set_sandbox', + description: `Set the active Adobe Experience Platform sandbox for the current session.`, + params: [ + { + name: 'sandboxName', + type: 'string', + required: true, + description: `The technical name (one word) of the Adobe Experience Platform sandbox to activate (e.g. "prod").`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-switch_org', + description: `Switch to a different Adobe organization by exchanging the current IMS token.`, + params: [ + { + name: 'org_name', + type: 'string', + required: true, + description: `The display name or IMS Org ID of the Adobe organization to switch to (e.g. "CJM Stage" or "8D9582BC6A017FDB0A495E5F@AdobeOrg").`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-switch_sandbox_dataview', + description: `Update the active sandbox and/or dataview for the session in a single call.`, + params: [ + { + name: 'sandboxName', + type: 'string', + required: false, + description: `The technical name (one word) of the sandbox to activate. Omit to leave the sandbox unchanged.`, + }, + { + name: 'dataviewName', + type: 'string', + required: false, + description: `The name of the Customer Journey Analytics dataview to activate. Omit to leave the dataview unchanged.`, + }, + ], + }, + { + name: 'adobemarketingagentmcp_core-user_preferences', + description: `Read or clear the user's persisted preferences including sandbox, dataview, org, and region settings.`, + params: [ + { + name: 'action', + type: 'string', + required: false, + description: `Action to perform. Accepted values: get (returns current saved preferences), clear (deletes all saved preferences). Defaults to get.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/catalog.ts b/src/data/agent-connectors/catalog.ts index c020457bd..8669d432a 100644 --- a/src/data/agent-connectors/catalog.ts +++ b/src/data/agent-connectors/catalog.ts @@ -12,6 +12,11 @@ export const catalog: Record = { authType: 'API Key', categories: ['CRM & Sales', 'Analytics'], }, + adobemarketingagentmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg', + authType: 'OAuth 2.0', + categories: ['Marketing', 'Analytics', 'AI'], + }, adzvisermcp: { iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/adzviser.svg', authType: 'OAuth 2.0', From fef9327db6fb9db4c83c5b2ddb71ea70c8b6d5c7 Mon Sep 17 00:00:00 2001 From: Saif Ali Shaik Date: Thu, 21 May 2026 14:38:01 +0530 Subject: [PATCH 02/10] fix: use API display_name for connector auth types (OAuth 2.1/DCR for MCP connectors) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolveAuthType was hardcoding 'OAuth 2.0' for all OAUTH providers. The API already provides display_name ('OAuth 2.1/DCR' vs 'OAuth 2.0') and is_mcp flag — now used directly. Also updates generateAuthSection prose for MCP connectors to mention DCR and PKCE instead of generic OAuth 2.0 redirect description. Re-synced all connector pages to pick up the fix. --- scripts/sync-agent-connectors.js | 12 +- .../connectors/adobemarketingagentmcp.mdx | 18 +- .../docs/agentkit/connectors/adzvisermcp.mdx | 68 + .../docs/agentkit/connectors/affinity.mdx | 2 +- .../docs/agentkit/connectors/ahrefsmcp.mdx | 5 +- .../docs/agentkit/connectors/airtable.mdx | 2 +- .../docs/agentkit/connectors/apifymcp.mdx | 2 +- .../docs/agentkit/connectors/apollo.mdx | 2 +- .../docs/agentkit/connectors/asana.mdx | 2 +- .../docs/agentkit/connectors/atlassianmcp.mdx | 5 +- .../docs/agentkit/connectors/attention.mdx | 2 +- .../docs/agentkit/connectors/attio.mdx | 2 +- .../docs/agentkit/connectors/bigquery.mdx | 2 +- .../connectors/bigqueryserviceaccount.mdx | 2 +- .../docs/agentkit/connectors/bitbucket.mdx | 2 +- .../docs/agentkit/connectors/bitlymcp.mdx | 4 +- src/content/docs/agentkit/connectors/box.mdx | 2 +- .../docs/agentkit/connectors/brave.mdx | 2 +- .../docs/agentkit/connectors/calendly.mdx | 2 +- .../docs/agentkit/connectors/chorus.mdx | 2 +- .../agentkit/connectors/clari_copilot.mdx | 2 +- .../docs/agentkit/connectors/clarifymcp.mdx | 4 +- .../docs/agentkit/connectors/clickhouse.mdx | 8 +- .../docs/agentkit/connectors/clickup.mdx | 18 +- .../docs/agentkit/connectors/close.mdx | 2 +- .../agentkit/connectors/commonroommcp.mdx | 71 + .../docs/agentkit/connectors/confluence.mdx | 2 +- .../agentkit/connectors/customeriomcp.mdx | 72 + .../connectors/databricksworkspace.mdx | 2 +- .../docs/agentkit/connectors/datadog.mdx | 32 +- .../docs/agentkit/connectors/diarize.mdx | 2 +- .../docs/agentkit/connectors/discord.mdx | 2 +- .../docs/agentkit/connectors/dropbox.mdx | 2 +- .../docs/agentkit/connectors/dynamo.mdx | 2 +- .../docs/agentkit/connectors/evertrace.mdx | 2 +- src/content/docs/agentkit/connectors/exa.mdx | 2 +- .../docs/agentkit/connectors/fathom.mdx | 2 +- .../docs/agentkit/connectors/fellowaimcp.mdx | 69 + .../docs/agentkit/connectors/figma.mdx | 2 +- .../docs/agentkit/connectors/freshdesk.mdx | 2 +- .../docs/agentkit/connectors/github.mdx | 2 +- .../docs/agentkit/connectors/gitlab.mdx | 2 +- .../docs/agentkit/connectors/gmail.mdx | 2 +- src/content/docs/agentkit/connectors/gong.mdx | 2 +- .../docs/agentkit/connectors/google_ads.mdx | 2 +- .../agentkit/connectors/googlecalendar.mdx | 2 +- .../docs/agentkit/connectors/googledocs.mdx | 2 +- .../docs/agentkit/connectors/googledrive.mdx | 8 +- .../docs/agentkit/connectors/googledwd.mdx | 27 +- .../docs/agentkit/connectors/googleforms.mdx | 2 +- .../docs/agentkit/connectors/googlemeet.mdx | 22 +- .../docs/agentkit/connectors/googlesheets.mdx | 2 +- .../docs/agentkit/connectors/googleslides.mdx | 2 +- .../docs/agentkit/connectors/grainmcp.mdx | 73 + .../docs/agentkit/connectors/granola.mdx | 2 +- .../docs/agentkit/connectors/granolamcp.mdx | 4 +- .../docs/agentkit/connectors/harvestapi.mdx | 2 +- .../docs/agentkit/connectors/heyreach.mdx | 2 +- .../docs/agentkit/connectors/hubspot.mdx | 2 +- .../docs/agentkit/connectors/intercom.mdx | 2 +- .../docs/agentkit/connectors/jiminny.mdx | 2 +- src/content/docs/agentkit/connectors/jira.mdx | 2 +- .../docs/agentkit/connectors/klaviyomcp.mdx | 4 +- .../docs/agentkit/connectors/leadiq.mdx | 14 +- .../docs/agentkit/connectors/linear.mdx | 2 +- .../docs/agentkit/connectors/linkedin.mdx | 2 +- .../docs/agentkit/connectors/mailchimp.mdx | 23 +- .../agentkit/connectors/microsoftexcel.mdx | 2 +- .../agentkit/connectors/microsoftteams.mdx | 2 +- .../agentkit/connectors/microsoftword.mdx | 2 +- src/content/docs/agentkit/connectors/miro.mdx | 2 +- .../docs/agentkit/connectors/monday.mdx | 19 +- .../docs/agentkit/connectors/notion.mdx | 2 +- .../docs/agentkit/connectors/onedrive.mdx | 2 +- .../docs/agentkit/connectors/onenote.mdx | 2 +- .../docs/agentkit/connectors/outlook.mdx | 2 +- .../docs/agentkit/connectors/outreach.mdx | 2 +- .../docs/agentkit/connectors/pagerduty.mdx | 2 +- .../agentkit/connectors/parallelaitaskmcp.mdx | 2 +- .../agentkit/connectors/phantombuster.mdx | 2 +- .../docs/agentkit/connectors/pipedrive.mdx | 2 +- .../docs/agentkit/connectors/posthogmcp.mdx | 3 +- .../docs/agentkit/connectors/quickbooks.mdx | 22 +- .../docs/agentkit/connectors/salesforce.mdx | 2 +- .../docs/agentkit/connectors/servicenow.mdx | 2 +- .../docs/agentkit/connectors/sharepoint.mdx | 2 +- .../docs/agentkit/connectors/slack.mdx | 2 +- .../docs/agentkit/connectors/snowflake.mdx | 2 +- .../agentkit/connectors/snowflakekeyauth.mdx | 2 +- .../docs/agentkit/connectors/supadata.mdx | 2 +- .../agentkit/connectors/supermetricsmcp.mdx | 72 + .../docs/agentkit/connectors/tableau.mdx | 2 +- .../docs/agentkit/connectors/trello.mdx | 2 +- .../docs/agentkit/connectors/twitter.mdx | 2 +- .../docs/agentkit/connectors/vercel.mdx | 2 +- .../docs/agentkit/connectors/vimeo.mdx | 2 +- src/content/docs/agentkit/connectors/xero.mdx | 23 +- .../docs/agentkit/connectors/youtube.mdx | 2 +- .../docs/agentkit/connectors/zapiermcp.mdx | 2 +- .../docs/agentkit/connectors/zendesk.mdx | 2 +- src/content/docs/agentkit/connectors/zoom.mdx | 25 +- .../adobemarketingagentmcp.ts | 157 +- src/data/agent-connectors/adzvisermcp.ts | 300 + src/data/agent-connectors/ahrefsmcp.ts | 6444 +++-------------- src/data/agent-connectors/atlassianmcp.ts | 1560 +--- src/data/agent-connectors/bitlymcp.ts | 2254 +----- src/data/agent-connectors/catalog.ts | 993 +-- src/data/agent-connectors/clarifymcp.ts | 462 +- src/data/agent-connectors/clickhouse.ts | 171 +- src/data/agent-connectors/commonroommcp.ts | 90 + src/data/agent-connectors/customeriomcp.ts | 73 + src/data/agent-connectors/datadog.ts | 2168 ++---- src/data/agent-connectors/fellowaimcp.ts | 84 + src/data/agent-connectors/gmail.ts | 112 + src/data/agent-connectors/googledrive.ts | 75 + src/data/agent-connectors/googledwd.ts | 3367 ++------- src/data/agent-connectors/googlemeet.ts | 28 + src/data/agent-connectors/grainmcp.ts | 339 + src/data/agent-connectors/hubspot.ts | 1855 +---- src/data/agent-connectors/klaviyomcp.ts | 895 +-- src/data/agent-connectors/leadiq.ts | 70 +- src/data/agent-connectors/mailchimp.ts | 1412 +--- src/data/agent-connectors/quickbooks.ts | 2454 ++----- src/data/agent-connectors/supermetricsmcp.ts | 158 + src/data/agent-connectors/xero.ts | 1792 ++--- src/data/agent-connectors/zapiermcp.ts | 198 +- src/data/agent-connectors/zoom.ts | 263 + 127 files changed, 6909 insertions(+), 21738 deletions(-) create mode 100644 src/content/docs/agentkit/connectors/adzvisermcp.mdx create mode 100644 src/content/docs/agentkit/connectors/commonroommcp.mdx create mode 100644 src/content/docs/agentkit/connectors/customeriomcp.mdx create mode 100644 src/content/docs/agentkit/connectors/fellowaimcp.mdx create mode 100644 src/content/docs/agentkit/connectors/grainmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/supermetricsmcp.mdx create mode 100644 src/data/agent-connectors/adzvisermcp.ts create mode 100644 src/data/agent-connectors/commonroommcp.ts create mode 100644 src/data/agent-connectors/customeriomcp.ts create mode 100644 src/data/agent-connectors/fellowaimcp.ts create mode 100644 src/data/agent-connectors/grainmcp.ts create mode 100644 src/data/agent-connectors/supermetricsmcp.ts diff --git a/scripts/sync-agent-connectors.js b/scripts/sync-agent-connectors.js index a02be5c56..342e839a0 100644 --- a/scripts/sync-agent-connectors.js +++ b/scripts/sync-agent-connectors.js @@ -757,7 +757,7 @@ function resolveAuthType(authPatterns) { const first = (authPatterns || [])[0] if (!first) return 'OAuth 2.0' const type = first.type || '' - if (type === 'OAUTH') return 'OAuth 2.0' + if (type === 'OAUTH') return first.display_name || 'OAuth 2.0' if (type === 'API_KEY') return 'API Key' if (type === 'BEARER') return 'Bearer Token' return first.display_name || 'OAuth 2.0' @@ -916,8 +916,16 @@ function generateCapabilityBullets(tools, providerName) { function generateAuthSection(authPattern, providerName) { const type = authPattern.type || 'UNKNOWN' if (type === 'OAUTH') { + const authLabel = authPattern.display_name || 'OAuth 2.0' + const isMcp = authPattern.is_mcp === true + if (isMcp) { + return ( + `This connector uses **${authLabel}**. Scalekit handles dynamic client registration and PKCE-based authorization — ` + + `your agent code never handles tokens directly. You only pass a \`connectionName\` and a user \`identifier\`.` + ) + } return ( - `This connector uses **OAuth 2.0**. Scalekit acts as the OAuth client: it redirects your user to ${providerName}, ` + + `This connector uses **${authLabel}**. Scalekit acts as the OAuth client: it redirects your user to ${providerName}, ` + `obtains an access token, and automatically refreshes it before it expires. Your agent code never handles tokens directly — ` + `you only pass a \`connectionName\` and a user \`identifier\`.\n\n` + `You supply your ${providerName} **Connected App** credentials (Client ID + Secret) once per environment in the Scalekit dashboard.` diff --git a/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx b/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx index f0640895b..64d0536a0 100644 --- a/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx +++ b/src/content/docs/agentkit/connectors/adobemarketingagentmcp.mdx @@ -6,9 +6,8 @@ sidebar: label: 'Adobe Marketing Agent MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [marketing, analytics, ai] -tags: [agentkit, connector, adobe, marketing, analytics, journeys, mcp] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, Analytics, AI] head: - tag: style content: | @@ -64,7 +63,7 @@ import { SectionAfterSetupAdobemarketingagentmcpCommonWorkflows } from '@compone 4. ### Authorize and make your first call - + @@ -72,11 +71,12 @@ import { SectionAfterSetupAdobemarketingagentmcpCommonWorkflows } from '@compone Connect this agent connector to let your agent: -- **Send natural-language queries** — ask about audiences, journeys, campaigns, and Analytics data in plain English; the AI assistant translates your query into Adobe API calls -- **Manage Adobe context** — switch organizations, Experience Platform sandboxes, and Customer Journey Analytics dataviews for your session -- **Track async tasks** — submit long-running operations and poll for results using task IDs and cursors -- **Configure session preferences** — persist your sandbox, dataview, and organization settings across sessions for up to 90 days -- **Submit and rate feedback** — send thumbs up/down ratings, flag harmful content, and submit free-text comments about AI responses +- **Preferences core-user** — Read or clear the user's persisted preferences including sandbox, dataview, org, and region settings +- **Dataview core-switch sandbox, core-set** — Update the active sandbox and/or dataview for the session in a single call +- **Org core-switch** — Switch to a different Adobe organization by exchanging the current IMS token +- **Sandbox core-set** — Set the active Adobe Experience Platform sandbox for the current session +- **Feedback core-provide** — Submit user feedback about the AI assistant experience; automatically classifies sentiment and calls the feedback API +- **Decision core-plan completion** — Submit the user's approval or rejection for a pending plan before it is executed ## Common workflows diff --git a/src/content/docs/agentkit/connectors/adzvisermcp.mdx b/src/content/docs/agentkit/connectors/adzvisermcp.mdx new file mode 100644 index 000000000..8b3887965 --- /dev/null +++ b/src/content/docs/agentkit/connectors/adzvisermcp.mdx @@ -0,0 +1,68 @@ +--- +title: 'Adzviser MCP connector' +tableOfContents: true +description: 'Connect to Adzviser MCP to query real-time marketing analytics across 46+ platforms - Google Ads, Facebook Ads, GA4, TikTok, LinkedIn, and more - from a...' +sidebar: + label: 'Adzviser MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/adzviser.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, Analytics] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/adzvisermcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Data retrieve reporting** — Retrieve real-time reporting data from marketing channels like Google Ads, Facebook Ads and Google Analytics +- **List workspace, metrics fb page, metrics and breakdowns zoho** — Retrieve a list of workspaces that have been created by the user and their data sources, such as Google Ads, Facebook Ads accounts connected with each + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/affinity.mdx b/src/content/docs/agentkit/connectors/affinity.mdx index 43434f473..7787d5004 100644 --- a/src/content/docs/agentkit/connectors/affinity.mdx +++ b/src/content/docs/agentkit/connectors/affinity.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/affinity.svg connectorAuthType: Bearer Token -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/ahrefsmcp.mdx b/src/content/docs/agentkit/connectors/ahrefsmcp.mdx index 01581c4bd..5a3dafd7e 100644 --- a/src/content/docs/agentkit/connectors/ahrefsmcp.mdx +++ b/src/content/docs/agentkit/connectors/ahrefsmcp.mdx @@ -2,13 +2,12 @@ title: 'Ahrefs MCP connector' tableOfContents: true description: 'Connect to Ahrefs MCP to access SEO data including backlinks, keyword research, site audits, rank tracking, and web analytics directly from your AI...' -tags: [agentkit, connector, ahrefs, seo, backlinks, keyword-research, site-audit, rank-tracking, mcp] sidebar: label: 'Ahrefs MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/ahrefs.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [marketing, sales, crm] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/airtable.mdx b/src/content/docs/agentkit/connectors/airtable.mdx index 7be27891f..91c195fbc 100644 --- a/src/content/docs/agentkit/connectors/airtable.mdx +++ b/src/content/docs/agentkit/connectors/airtable.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/airtable.svg connectorAuthType: OAuth 2.0 -connectorCategories: [project_management, data, analytics] +connectorCategories: [Project Management, Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/apifymcp.mdx b/src/content/docs/agentkit/connectors/apifymcp.mdx index b60201bb0..2b5f2285b 100644 --- a/src/content/docs/agentkit/connectors/apifymcp.mdx +++ b/src/content/docs/agentkit/connectors/apifymcp.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/apify.svg connectorAuthType: Bearer Token -connectorCategories: [ai, automation, developer_tools] +connectorCategories: [AI, Automation, Developer Tools] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/apollo.mdx b/src/content/docs/agentkit/connectors/apollo.mdx index 1cf9d4131..01f50aeb2 100644 --- a/src/content/docs/agentkit/connectors/apollo.mdx +++ b/src/content/docs/agentkit/connectors/apollo.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/apollo.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/asana.mdx b/src/content/docs/agentkit/connectors/asana.mdx index eccba51f9..65e163291 100644 --- a/src/content/docs/agentkit/connectors/asana.mdx +++ b/src/content/docs/agentkit/connectors/asana.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/asana-n.svg connectorAuthType: OAuth 2.0 -connectorCategories: [project_management] +connectorCategories: [Project Management, Collaboration, Productivity] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/atlassianmcp.mdx b/src/content/docs/agentkit/connectors/atlassianmcp.mdx index 925d3873b..bebee5d75 100644 --- a/src/content/docs/agentkit/connectors/atlassianmcp.mdx +++ b/src/content/docs/agentkit/connectors/atlassianmcp.mdx @@ -6,9 +6,8 @@ sidebar: label: 'Atlassian Rovo MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/atlassian.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [project_management, productivity] -tags: [agentkit, connector, atlassian, jira, confluence, compass, project-management, mcp] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Project Management, Productivity, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/attention.mdx b/src/content/docs/agentkit/connectors/attention.mdx index 1790967ac..8b3cce35d 100644 --- a/src/content/docs/agentkit/connectors/attention.mdx +++ b/src/content/docs/agentkit/connectors/attention.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/attention.svg connectorAuthType: API Key -connectorCategories: [ai, automation, crm, sales] +connectorCategories: [AI, Automation, CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/attio.mdx b/src/content/docs/agentkit/connectors/attio.mdx index 80a4e3a58..bc82ab960 100644 --- a/src/content/docs/agentkit/connectors/attio.mdx +++ b/src/content/docs/agentkit/connectors/attio.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/attio.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/bigquery.mdx b/src/content/docs/agentkit/connectors/bigquery.mdx index aa92c4064..c1aba32a9 100644 --- a/src/content/docs/agentkit/connectors/bigquery.mdx +++ b/src/content/docs/agentkit/connectors/bigquery.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg connectorAuthType: OAuth 2.0 -connectorCategories: [data, analytics] +connectorCategories: [Analytics, Databases] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/bigqueryserviceaccount.mdx b/src/content/docs/agentkit/connectors/bigqueryserviceaccount.mdx index 039a9dd21..61abce84f 100644 --- a/src/content/docs/agentkit/connectors/bigqueryserviceaccount.mdx +++ b/src/content/docs/agentkit/connectors/bigqueryserviceaccount.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg connectorAuthType: Service Account -connectorCategories: [data, analytics] +connectorCategories: [Analytics, Databases] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/bitbucket.mdx b/src/content/docs/agentkit/connectors/bitbucket.mdx index d1652ace3..cb304455c 100644 --- a/src/content/docs/agentkit/connectors/bitbucket.mdx +++ b/src/content/docs/agentkit/connectors/bitbucket.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitbucket.svg connectorAuthType: OAuth 2.0 -connectorCategories: [development, version_control, collaboration, ci_cd] +connectorCategories: [Developer Tools, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/bitlymcp.mdx b/src/content/docs/agentkit/connectors/bitlymcp.mdx index ff05b3869..64c83f1bd 100644 --- a/src/content/docs/agentkit/connectors/bitlymcp.mdx +++ b/src/content/docs/agentkit/connectors/bitlymcp.mdx @@ -6,8 +6,8 @@ sidebar: label: 'Bitly MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitly.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [marketing, sales, crm] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/box.mdx b/src/content/docs/agentkit/connectors/box.mdx index 208250068..a2a5969e2 100644 --- a/src/content/docs/agentkit/connectors/box.mdx +++ b/src/content/docs/agentkit/connectors/box.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/box.svg connectorAuthType: OAuth 2.0 -connectorCategories: [productivity, storage] +connectorCategories: [Productivity, Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/brave.mdx b/src/content/docs/agentkit/connectors/brave.mdx index 6b07c605b..ec052cd00 100644 --- a/src/content/docs/agentkit/connectors/brave.mdx +++ b/src/content/docs/agentkit/connectors/brave.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/brave.svg connectorAuthType: API Key -connectorCategories: [data, analytics] +connectorCategories: [Analytics, Search] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/calendly.mdx b/src/content/docs/agentkit/connectors/calendly.mdx index e008b3c22..4a2793620 100644 --- a/src/content/docs/agentkit/connectors/calendly.mdx +++ b/src/content/docs/agentkit/connectors/calendly.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/calendly.svg connectorAuthType: OAuth 2.0 -connectorCategories: [productivity, calendar, scheduling] +connectorCategories: [Productivity, Calendar] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/chorus.mdx b/src/content/docs/agentkit/connectors/chorus.mdx index 4b5230bb9..9edd09ba1 100644 --- a/src/content/docs/agentkit/connectors/chorus.mdx +++ b/src/content/docs/agentkit/connectors/chorus.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/chorus.svg connectorAuthType: Basic Auth -connectorCategories: [crm, sales, ai, automation] +connectorCategories: [CRM & Sales, AI, Automation, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/clari_copilot.mdx b/src/content/docs/agentkit/connectors/clari_copilot.mdx index 8ae3ca902..1273c5aaf 100644 --- a/src/content/docs/agentkit/connectors/clari_copilot.mdx +++ b/src/content/docs/agentkit/connectors/clari_copilot.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/clari.svg connectorAuthType: API Key -connectorCategories: [crm, sales, ai, automation] +connectorCategories: [CRM & Sales, AI, Automation, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/clarifymcp.mdx b/src/content/docs/agentkit/connectors/clarifymcp.mdx index 9d82d2932..4abe4e0ab 100644 --- a/src/content/docs/agentkit/connectors/clarifymcp.mdx +++ b/src/content/docs/agentkit/connectors/clarifymcp.mdx @@ -6,8 +6,8 @@ sidebar: label: 'Clarify MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/clarify.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [crm, productivity, analytics, sales] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [CRM & Sales, Productivity, Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/clickhouse.mdx b/src/content/docs/agentkit/connectors/clickhouse.mdx index c5c17fcfd..383b0f1e3 100644 --- a/src/content/docs/agentkit/connectors/clickhouse.mdx +++ b/src/content/docs/agentkit/connectors/clickhouse.mdx @@ -1,12 +1,12 @@ --- -title: 'ClickHouse connector' +title: 'Clickhouse connector' tableOfContents: true description: 'Connect to ClickHouse MCP to query, analyze, and manage your ClickHouse databases directly from your AI workflows.' sidebar: - label: 'ClickHouse' + label: 'Clickhouse' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickhouse.svg -connectorAuthType: OAuth 2.0 +connectorAuthType: OAuth 2.1/DCR connectorCategories: [Analytics, Developer Tools, Databases] head: - tag: style @@ -51,7 +51,7 @@ import { SectionAfterSetupClickhouseCommonWorkflows } from '@components/template 3. ### Authorize and make your first call - + diff --git a/src/content/docs/agentkit/connectors/clickup.mdx b/src/content/docs/agentkit/connectors/clickup.mdx index b6c736385..3c9d55a16 100644 --- a/src/content/docs/agentkit/connectors/clickup.mdx +++ b/src/content/docs/agentkit/connectors/clickup.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickup.svg connectorAuthType: OAuth 2.0 -connectorCategories: [project_management] +connectorCategories: [Project Management, Collaboration, Productivity] head: - tag: style content: | @@ -71,12 +71,16 @@ import { SectionAfterSetupClickupCommonWorkflows } from '@components/templates' Connect this agent connector to let your agent: -- **Get comment, folder, space** — Retrieve comments on a ClickUp task -- **Delete space, space tag, comment** — Permanently delete a ClickUp space from your workspace -- **Create time entry, checklist item, webhook** — Log a time entry for a task in a ClickUp Workspace -- **Update task, goal, webhook** — Update an existing ClickUp task -- **List update, space views, view tasks** — Update an existing ClickUp list -- **Search task** — Search and filter tasks across an entire ClickUp workspace (team) +- **Manage tasks** — create, update, delete, and search tasks; set priorities, due dates, assignees, and statuses +- **Manage lists** — create, update, and delete lists in folders or as folderless lists; get members +- **Manage folders** — create, update, and delete folders; list all folders in a space +- **Manage spaces** — create, update, and delete spaces; manage space tags and views +- **Manage comments** — add, update, and delete comments on tasks and lists +- **Manage goals** — create, update, delete, and list goals and their key results +- **Track time** — list and create time entries for tasks +- **Manage checklists** — create task checklists and checklist items +- **Manage webhooks** — create, update, delete, and list workspace webhooks +- **Access workspace data** — get user info, list workspaces, spaces, and views ## Common workflows diff --git a/src/content/docs/agentkit/connectors/close.mdx b/src/content/docs/agentkit/connectors/close.mdx index 47e27b5f6..d7c2e0f18 100644 --- a/src/content/docs/agentkit/connectors/close.mdx +++ b/src/content/docs/agentkit/connectors/close.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/close.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales, communication] +connectorCategories: [CRM & Sales, Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/commonroommcp.mdx b/src/content/docs/agentkit/connectors/commonroommcp.mdx new file mode 100644 index 000000000..2f16065b2 --- /dev/null +++ b/src/content/docs/agentkit/connectors/commonroommcp.mdx @@ -0,0 +1,71 @@ +--- +title: 'Commonroom MCP connector' +tableOfContents: true +description: 'Connect to Common Room MCP to manage community members, objects, and feedback data directly from your AI workflows.' +sidebar: + label: 'Commonroom MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/commonroom.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, Analytics, CRM & Sales] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/commonroommcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Update commonroom** — Update fields on an existing Common Room object (contact, organization, etc.) by its ID +- **Feedback commonroom submit** — Submit feedback on the quality of a query result — use after presenting data to the user +- **List commonroom** — List Common Room objects (contacts, organizations, segments, etc.) with optional pagination, filtering, and sorting +- **Get commonroom** — Retrieve the catalog of available object types, their properties, and allowed sort fields in Common Room +- **Create commonroom** — Create a new object in Common Room — contact, organization, activity, or custom object type + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/confluence.mdx b/src/content/docs/agentkit/connectors/confluence.mdx index e4125afbb..cf73af58f 100644 --- a/src/content/docs/agentkit/connectors/confluence.mdx +++ b/src/content/docs/agentkit/connectors/confluence.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/confluence.svg connectorAuthType: OAuth 2.0 -connectorCategories: [project_management, files, documents] +connectorCategories: [Project Management, Files & Documents, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/customeriomcp.mdx b/src/content/docs/agentkit/connectors/customeriomcp.mdx new file mode 100644 index 000000000..b7c94ca22 --- /dev/null +++ b/src/content/docs/agentkit/connectors/customeriomcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Customer.io MCP connector' +tableOfContents: true +description: 'Connect to Customer.io MCP to manage customers, campaigns, and events' +sidebar: + label: 'Customer.io MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/customerio.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, Analytics, CRM & Sales] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/customeriomcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Api cio write** — Write to the Customer.io API (POST, PUT, or PATCH) +- **Read cio skills, cio** — Read the full content of a specific Customer.io agent skill by path +- **List cio skills** — List available Customer.io agent skills — task-specific instruction manuals covering campaigns, segments, deliveries, analytics, and more +- **Schema cio** — Introspect the Customer.io API schema to discover endpoints, parameters, and response shapes +- **Prime cio** — Print LLM-ready instructions for using the Customer.io API +- **Delete cio** — Delete a resource via the Customer.io API (DELETE only) + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/databricksworkspace.mdx b/src/content/docs/agentkit/connectors/databricksworkspace.mdx index fbcf85e6c..e201c99f8 100644 --- a/src/content/docs/agentkit/connectors/databricksworkspace.mdx +++ b/src/content/docs/agentkit/connectors/databricksworkspace.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/databricks-1.svg connectorAuthType: Service Principal (OAuth 2.0) -connectorCategories: [data, analytics, automation] +connectorCategories: [Analytics, Automation, Databases] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/datadog.mdx b/src/content/docs/agentkit/connectors/datadog.mdx index b0171538c..2f19f26c6 100644 --- a/src/content/docs/agentkit/connectors/datadog.mdx +++ b/src/content/docs/agentkit/connectors/datadog.mdx @@ -1,12 +1,13 @@ --- title: 'Datadog connector' tableOfContents: true -description: 'Connect to Datadog to monitor metrics, logs, dashboards, monitors, incidents, SLOs, and more across your infrastructure.' +description: 'Connect to Datadog to monitor metrics, logs, traces, dashboards, monitors, incidents, SLOs, synthetics, and security signals across your infrastructure.' sidebar: label: 'Datadog' +overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/datadog.svg connectorAuthType: API Key -connectorCategories: [monitoring, observability, devops, developer_tools] +connectorCategories: [Developer Tools, Monitoring] head: - tag: style content: | @@ -52,7 +53,7 @@ import { SectionBeforeToolListDatadogResourceIds } from '@components/templates' 3. ### Set up the connector - Register your Datadog API credentials with Scalekit so it stores them securely. You do this once per environment. + Register your Datadog credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment.
Dashboard setup steps @@ -61,9 +62,9 @@ import { SectionBeforeToolListDatadogResourceIds } from '@components/templates'
-4. ### Authorize and make your first call +4. ### Make your first call - + @@ -71,19 +72,12 @@ import { SectionBeforeToolListDatadogResourceIds } from '@components/templates' Connect this agent connector to let your agent: -- **Monitor infrastructure** — list, create, update, and delete monitors; mute and unmute alerts; manage downtime schedules -- **Query metrics** — fetch timeseries data, list metric metadata and tags, submit custom metrics -- **Search logs** — search and aggregate log events; list log indexes and pipelines -- **Manage incidents** — create and retrieve incidents for incident response workflows -- **Track SLOs** — create, update, delete, and get history for service level objectives -- **Build dashboards** — create, update, delete, and list dashboards; capture graph snapshots -- **Run Synthetics** — trigger and manage synthetic tests; get test results; manage locations and global variables -- **Manage RUM** — create and list Real User Monitoring applications -- **Manage notebooks** — create, retrieve, and delete collaborative notebooks -- **Manage users and roles** — create users, assign roles, list permissions -- **Monitor hosts and containers** — list hosts, mute/unmute hosts, manage host tags, list containers and processes -- **Post events** — create and retrieve events in the Datadog event stream -- **Run service checks** — submit custom service check results +- **Get synthetics browser test, monitor, event** — Get a specific Datadog Synthetics browser test by public ID +- **Create downtime, monitor, host tags** — Create a new Datadog downtime to suppress alerts +- **Trigger synthetics test** — Trigger one or more Datadog Synthetics tests to run immediately +- **Delete notebook, synthetics test, dashboard** — Delete a specific notebook by its ID +- **List processes, log indexes, permissions** — List live processes running on your infrastructure +- **Update slo, downtime, metric metadata** — Update an existing Datadog Service Level Objective ## Common workflows @@ -95,6 +89,6 @@ Connect this agent connector to let your agent: ## Tool list -Pass the exact tool name from the list below when you call `executeTool` (Node.js) or `execute_tool` (Python). +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. diff --git a/src/content/docs/agentkit/connectors/diarize.mdx b/src/content/docs/agentkit/connectors/diarize.mdx index 8e30de941..c539cdde1 100644 --- a/src/content/docs/agentkit/connectors/diarize.mdx +++ b/src/content/docs/agentkit/connectors/diarize.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/diarize.svg connectorAuthType: Bearer Token -connectorCategories: [transcription, media, productivity, analytics] +connectorCategories: [Transcription, Media, Productivity, Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/discord.mdx b/src/content/docs/agentkit/connectors/discord.mdx index 98a6788eb..2831b081d 100644 --- a/src/content/docs/agentkit/connectors/discord.mdx +++ b/src/content/docs/agentkit/connectors/discord.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/dropbox.mdx b/src/content/docs/agentkit/connectors/dropbox.mdx index 8b323206f..a4ad00ba4 100644 --- a/src/content/docs/agentkit/connectors/dropbox.mdx +++ b/src/content/docs/agentkit/connectors/dropbox.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/drop_box.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/dynamo.mdx b/src/content/docs/agentkit/connectors/dynamo.mdx index 5cc52bc52..58fe4395b 100644 --- a/src/content/docs/agentkit/connectors/dynamo.mdx +++ b/src/content/docs/agentkit/connectors/dynamo.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/dynamo.svg connectorAuthType: Bearer Token -connectorCategories: [finance, crm, data, sales] +connectorCategories: [Accounting & Finance, CRM & Sales, Databases] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/evertrace.mdx b/src/content/docs/agentkit/connectors/evertrace.mdx index 98b54d26d..5a51158a8 100644 --- a/src/content/docs/agentkit/connectors/evertrace.mdx +++ b/src/content/docs/agentkit/connectors/evertrace.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/evertrace.png connectorAuthType: Bearer Token -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/exa.mdx b/src/content/docs/agentkit/connectors/exa.mdx index c94b402e2..59e3ce551 100644 --- a/src/content/docs/agentkit/connectors/exa.mdx +++ b/src/content/docs/agentkit/connectors/exa.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/exa.svg connectorAuthType: API Key -connectorCategories: [data, analytics, ai, automation] +connectorCategories: [Analytics, AI, Automation, Search] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/fathom.mdx b/src/content/docs/agentkit/connectors/fathom.mdx index b343e9f42..b1a0147b7 100644 --- a/src/content/docs/agentkit/connectors/fathom.mdx +++ b/src/content/docs/agentkit/connectors/fathom.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/fathom.svg connectorAuthType: API Key -connectorCategories: [ai, automation, communication] +connectorCategories: [AI, Automation, Communication, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/fellowaimcp.mdx b/src/content/docs/agentkit/connectors/fellowaimcp.mdx new file mode 100644 index 000000000..3c8f81956 --- /dev/null +++ b/src/content/docs/agentkit/connectors/fellowaimcp.mdx @@ -0,0 +1,69 @@ +--- +title: 'FellowAI MCP connector' +tableOfContents: true +description: 'Connect to Fellow.ai MCP to manage meeting notes, action items, agendas, and team collaboration workflows directly from your AI agent.' +sidebar: + label: 'FellowAI MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/fellowai.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Productivity, Project Management] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/fellowaimcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Search meetings** — Search for meetings across calendar events and notes, with filters for participants, date range, content, and summary +- **List channels** — List all available channels in the workspace, optionally filtered by name or type +- **Get meeting transcript, meeting summary, meeting participants** — Retrieve the transcript of a meeting + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/figma.mdx b/src/content/docs/agentkit/connectors/figma.mdx index 3eb753a64..6fce8ebcf 100644 --- a/src/content/docs/agentkit/connectors/figma.mdx +++ b/src/content/docs/agentkit/connectors/figma.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/figma.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Design, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/freshdesk.mdx b/src/content/docs/agentkit/connectors/freshdesk.mdx index 359af8cb8..85587e62a 100644 --- a/src/content/docs/agentkit/connectors/freshdesk.mdx +++ b/src/content/docs/agentkit/connectors/freshdesk.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/freshdesk.png connectorAuthType: Basic Auth -connectorCategories: [customer_support] +connectorCategories: [Customer Support, Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/github.mdx b/src/content/docs/agentkit/connectors/github.mdx index 6b1154dbd..d03723901 100644 --- a/src/content/docs/agentkit/connectors/github.mdx +++ b/src/content/docs/agentkit/connectors/github.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/github.png connectorAuthType: OAuth 2.0 -connectorCategories: [developer_tools] +connectorCategories: [Developer Tools, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/gitlab.mdx b/src/content/docs/agentkit/connectors/gitlab.mdx index 50a39cb69..8b6eeb1ea 100644 --- a/src/content/docs/agentkit/connectors/gitlab.mdx +++ b/src/content/docs/agentkit/connectors/gitlab.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/gitlab.svg connectorAuthType: OAuth 2.0 -connectorCategories: [developer_tools] +connectorCategories: [Developer Tools, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/gmail.mdx b/src/content/docs/agentkit/connectors/gmail.mdx index 11121747b..c55416805 100644 --- a/src/content/docs/agentkit/connectors/gmail.mdx +++ b/src/content/docs/agentkit/connectors/gmail.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/gmail.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/gong.mdx b/src/content/docs/agentkit/connectors/gong.mdx index 909d18beb..ce923e12e 100644 --- a/src/content/docs/agentkit/connectors/gong.mdx +++ b/src/content/docs/agentkit/connectors/gong.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/gong.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales, ai, automation] +connectorCategories: [CRM & Sales, AI, Automation, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/google_ads.mdx b/src/content/docs/agentkit/connectors/google_ads.mdx index 3cae6ad42..71727562b 100644 --- a/src/content/docs/agentkit/connectors/google_ads.mdx +++ b/src/content/docs/agentkit/connectors/google_ads.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_ads.png connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [Marketing, CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/googlecalendar.mdx b/src/content/docs/agentkit/connectors/googlecalendar.mdx index 41d4d7539..9c04582cf 100644 --- a/src/content/docs/agentkit/connectors/googlecalendar.mdx +++ b/src/content/docs/agentkit/connectors/googlecalendar.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_calendar.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Calendar] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/googledocs.mdx b/src/content/docs/agentkit/connectors/googledocs.mdx index a268c805b..97ff7e70d 100644 --- a/src/content/docs/agentkit/connectors/googledocs.mdx +++ b/src/content/docs/agentkit/connectors/googledocs.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_docs.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/googledrive.mdx b/src/content/docs/agentkit/connectors/googledrive.mdx index cbe168e87..926b5b087 100644 --- a/src/content/docs/agentkit/connectors/googledrive.mdx +++ b/src/content/docs/agentkit/connectors/googledrive.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_drive.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | @@ -63,7 +63,7 @@ import { SectionAfterSetupGoogledriveCommonWorkflows } from '@components/templat 4. ### Authorize and make your first call - + @@ -71,6 +71,10 @@ import { SectionAfterSetupGoogledriveCommonWorkflows } from '@components/templat Connect this agent connector to let your agent: +- **File share, move, copy** — Share a file or folder in Google Drive by creating a new permission for a user, group, domain, or anyone +- **Query drive activity** — Query Google Drive activity to see who viewed, edited, moved, or shared files +- **Delete file** — Permanently delete a file or folder in Google Drive by its file ID +- **Create folder** — Create a new folder in Google Drive - **Search files, content** — Search for files and folders in Google Drive using query filters like name, type, owner, and parent folder - **Get file metadata** — Retrieve metadata for a specific file in Google Drive by its file ID diff --git a/src/content/docs/agentkit/connectors/googledwd.mdx b/src/content/docs/agentkit/connectors/googledwd.mdx index b1e887e10..9d2760a1a 100644 --- a/src/content/docs/agentkit/connectors/googledwd.mdx +++ b/src/content/docs/agentkit/connectors/googledwd.mdx @@ -1,18 +1,22 @@ --- title: 'Google Workspace (DWD) connector' tableOfContents: true -description: 'Set up Google Workspace Domain-Wide Delegation to let your agent impersonate users through a service account — no per-user OAuth required.' +description: 'Connect to Google Workspace APIs (Gmail, Drive, Docs, Sheets, Slides, Forms) using a GCP service account with Domain-Wide Delegation for server-to-server...' sidebar: label: 'Google Workspace (DWD)' +overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google.svg connectorAuthType: Service Account (DWD) -connectorCategories: [productivity, communication] +connectorCategories: [Productivity, Communication] head: - tag: style content: | .sl-markdown-content h2 { font-size: var(--sl-text-xl); } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } --- import ToolList from '@/components/ToolList.astro' @@ -21,6 +25,7 @@ import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' import { AgentKitCredentials } from '@components/templates' import { SetupGoogledwdSection } from '@components/templates' import { SectionAfterAuthenticationGoogledwdAuth } from '@components/templates' +import { SectionAfterSetupGoogledwdCommonWorkflows } from '@components/templates' import { SectionAfterSetupGoogledwdConnectedAccount } from '@components/templates' import { SectionBeforeToolListGoogledwdCommonWorkflows } from '@components/templates' @@ -49,7 +54,7 @@ import { SectionBeforeToolListGoogledwdCommonWorkflows } from '@components/templ 3. ### Set up the connector - Register your Google Workspace credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment. + Register your Google Workspace (DWD) credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment.
Dashboard setup steps @@ -64,17 +69,21 @@ import { SectionBeforeToolListGoogledwdCommonWorkflows } from '@components/templ Connect this agent connector to let your agent: -- **Read and search emails** — Fetch messages, threads, and attachments from any Gmail label or inbox -- **Send and manage emails** — Compose messages, manage drafts, and modify labels on Gmail messages -- **Manage Google Drive files** — Share, move, copy, and query activity on files and folders in Google Drive -- **Access Google Calendar** — Read, create, and manage calendar events across a user's calendars -- **Manage Google Vault** — List matters and manage legal holds in Google Vault -- **Administer user settings** — Update vacation auto-reply settings and other Gmail account configurations +- **Read and search emails** — fetch messages, threads, and attachments from any Gmail label or inbox +- **Send and manage emails** — compose messages, manage drafts, and modify labels on Gmail messages +- **Manage Google Drive files** — share, move, copy, and query activity on files and folders in Google Drive +- **Access Google Calendar** — read, create, and manage calendar events across a user's calendars +- **Manage Google Vault** — list matters and manage legal holds in Google Vault +- **Administer user settings** — update vacation auto-reply settings and other Gmail account configurations ## Authentication +## Common workflows + + + ## Create a connected account diff --git a/src/content/docs/agentkit/connectors/googleforms.mdx b/src/content/docs/agentkit/connectors/googleforms.mdx index bbdb55cb6..b4001da1d 100644 --- a/src/content/docs/agentkit/connectors/googleforms.mdx +++ b/src/content/docs/agentkit/connectors/googleforms.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_forms.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/googlemeet.mdx b/src/content/docs/agentkit/connectors/googlemeet.mdx index 186852df3..d8359e180 100644 --- a/src/content/docs/agentkit/connectors/googlemeet.mdx +++ b/src/content/docs/agentkit/connectors/googlemeet.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_meet.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Calendar] head: - tag: style content: | @@ -19,10 +19,12 @@ head: } --- +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/googlemeet' import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' import { AgentKitCredentials } from '@components/templates' import { SetupGoogleMeetsSection } from '@components/templates' -import { QuickstartGenericOauthNotoolsSection } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' import { SectionAfterSetupGooglemeetCommonWorkflows } from '@components/templates' @@ -61,10 +63,24 @@ import { SectionAfterSetupGooglemeetCommonWorkflows } from '@components/template 4. ### Authorize and make your first call - + +## What you can do + +Connect this agent connector to let your agent: + +- **Get meet space** — Retrieve details of a Google Meet meeting space by its resource name (e.g., 'spaces/abc123'), including its meeting URI and configuration +- **Conference end meet** — End the active conference in a Google Meet space, disconnecting all participants +- **Create meet space** — Create a new Google Meet meeting space + ## Common workflows + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/googlesheets.mdx b/src/content/docs/agentkit/connectors/googlesheets.mdx index 7865db087..3944c9c9e 100644 --- a/src/content/docs/agentkit/connectors/googlesheets.mdx +++ b/src/content/docs/agentkit/connectors/googlesheets.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_sheets.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents, data, analytics] +connectorCategories: [Files & Documents, Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/googleslides.mdx b/src/content/docs/agentkit/connectors/googleslides.mdx index c811080fe..289627eb2 100644 --- a/src/content/docs/agentkit/connectors/googleslides.mdx +++ b/src/content/docs/agentkit/connectors/googleslides.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_slides.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/grainmcp.mdx b/src/content/docs/agentkit/connectors/grainmcp.mdx new file mode 100644 index 000000000..416b40fe0 --- /dev/null +++ b/src/content/docs/agentkit/connectors/grainmcp.mdx @@ -0,0 +1,73 @@ +--- +title: 'Grain MCP connector' +tableOfContents: true +description: 'Grain is a meeting recording and intelligence platform. Use this connector to search and retrieve meeting recordings, transcripts, notes, action items...' +sidebar: + label: 'Grain MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/grain.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Transcription, Collaboration, AI] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/grainmcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Update project share state** — Changes the visibility of a project +- **Meetings tag** — Add or remove a tag from one or more meetings by recording ID +- **Search persons, in transcripts, companies** — Returns a filtered list of persons that were participants of Grain meetings you have +access to +- **Urls resolve** — Resolves canonical shareable URLs for Grain entities (meetings, clips, projects, stories) by ID +- **List workspace users, stories, projects** — Get information about all the users in the logged-in Grain user's workspace +- **Fetch user recording notes, story, project** — Fetches the current user's private notes for a single Grain meeting by ID + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/granola.mdx b/src/content/docs/agentkit/connectors/granola.mdx index 0a7a7c44e..2d1fd9e25 100644 --- a/src/content/docs/agentkit/connectors/granola.mdx +++ b/src/content/docs/agentkit/connectors/granola.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/granola.svg connectorAuthType: Bearer Token -connectorCategories: [ai, automation, communication] +connectorCategories: [AI, Automation, Communication, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/granolamcp.mdx b/src/content/docs/agentkit/connectors/granolamcp.mdx index 0971f8a9f..a404bd59b 100644 --- a/src/content/docs/agentkit/connectors/granolamcp.mdx +++ b/src/content/docs/agentkit/connectors/granolamcp.mdx @@ -6,8 +6,8 @@ sidebar: label: 'Granola MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/granola.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [ai, automation, communication] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [AI, Automation, Communication, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/harvestapi.mdx b/src/content/docs/agentkit/connectors/harvestapi.mdx index 0d208b3ea..d5e4ec70b 100644 --- a/src/content/docs/agentkit/connectors/harvestapi.mdx +++ b/src/content/docs/agentkit/connectors/harvestapi.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/harvestapi.svg connectorAuthType: API Key -connectorCategories: [crm, sales] +connectorCategories: [Marketing, Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/heyreach.mdx b/src/content/docs/agentkit/connectors/heyreach.mdx index bacca84ad..ce5894052 100644 --- a/src/content/docs/agentkit/connectors/heyreach.mdx +++ b/src/content/docs/agentkit/connectors/heyreach.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/heyreach.svg connectorAuthType: API Key -connectorCategories: [outreach, linkedin, sales, crm] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/hubspot.mdx b/src/content/docs/agentkit/connectors/hubspot.mdx index 4fe3419d9..4bd8f66c7 100644 --- a/src/content/docs/agentkit/connectors/hubspot.mdx +++ b/src/content/docs/agentkit/connectors/hubspot.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/hub_spot.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/intercom.mdx b/src/content/docs/agentkit/connectors/intercom.mdx index f44d6f326..6c8a2e5b0 100644 --- a/src/content/docs/agentkit/connectors/intercom.mdx +++ b/src/content/docs/agentkit/connectors/intercom.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/intercom.svg connectorAuthType: OAuth 2.0 -connectorCategories: [customer_support, communication] +connectorCategories: [Customer Support, Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/jiminny.mdx b/src/content/docs/agentkit/connectors/jiminny.mdx index 09c4c7480..c8d639961 100644 --- a/src/content/docs/agentkit/connectors/jiminny.mdx +++ b/src/content/docs/agentkit/connectors/jiminny.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/jiminny.svg connectorAuthType: Bearer Token -connectorCategories: [crm, sales, ai, automation] +connectorCategories: [CRM & Sales, AI, Automation, Transcription] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/jira.mdx b/src/content/docs/agentkit/connectors/jira.mdx index cfff75b72..8a8cf88bf 100644 --- a/src/content/docs/agentkit/connectors/jira.mdx +++ b/src/content/docs/agentkit/connectors/jira.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/jira.svg connectorAuthType: OAuth 2.0 -connectorCategories: [developer_tools, project_management] +connectorCategories: [Developer Tools, Project Management] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/klaviyomcp.mdx b/src/content/docs/agentkit/connectors/klaviyomcp.mdx index 049471d00..e9ad4a6cc 100644 --- a/src/content/docs/agentkit/connectors/klaviyomcp.mdx +++ b/src/content/docs/agentkit/connectors/klaviyomcp.mdx @@ -6,8 +6,8 @@ sidebar: label: 'Klaviyo MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/klaviyo.svg -connectorAuthType: OAuth 2.0 -connectorCategories: [marketing, sales, crm] +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/leadiq.mdx b/src/content/docs/agentkit/connectors/leadiq.mdx index 004cfd721..38b168a65 100644 --- a/src/content/docs/agentkit/connectors/leadiq.mdx +++ b/src/content/docs/agentkit/connectors/leadiq.mdx @@ -1,14 +1,13 @@ --- title: 'LeadIQ connector' tableOfContents: true -description: 'Connect to LeadIQ to enrich B2B contacts and companies with verified emails, direct dials, and mobile numbers.' +description: 'Connect to LeadIQ to search and enrich B2B contacts and companies with verified emails, direct dials, and mobile numbers. Build prospect lists and power...' sidebar: label: 'LeadIQ' overviewTitle: 'Quickstart' -tags: [crm, sales, analytics, prospecting, enrichment] connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/leadiq.svg connectorAuthType: API Key -connectorCategories: [crm, sales, analytics] +connectorCategories: [CRM & Sales, Analytics] head: - tag: style content: | @@ -25,7 +24,6 @@ import { tools } from '@/data/agent-connectors/leadiq' import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' import { AgentKitCredentials } from '@components/templates' import { SetupLeadiqSection } from '@components/templates' -import { QuickstartGenericApikeySection } from '@components/templates' import { SectionAfterSetupLeadiqCommonWorkflows } from '@components/templates' @@ -53,7 +51,7 @@ import { SectionAfterSetupLeadiqCommonWorkflows } from '@components/templates' 3. ### Set up the connector - Register your LeadIQ API key with Scalekit so it stores it securely. You do this once per environment. + Register your LeadIQ credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment.
Dashboard setup steps @@ -62,10 +60,6 @@ import { SectionAfterSetupLeadiqCommonWorkflows } from '@components/templates'
-4. ### Make your first call - - -
## What you can do @@ -85,6 +79,6 @@ Connect this agent connector to let your agent: ## Tool list -Pass the exact tool name from the list below when you call `executeTool` (Node.js) or `execute_tool` (Python). +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. diff --git a/src/content/docs/agentkit/connectors/linear.mdx b/src/content/docs/agentkit/connectors/linear.mdx index c47bd4b5f..245f8dd4c 100644 --- a/src/content/docs/agentkit/connectors/linear.mdx +++ b/src/content/docs/agentkit/connectors/linear.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/linear.svg connectorAuthType: OAuth 2.0 -connectorCategories: [developer_tools, project_management] +connectorCategories: [Developer Tools, Project Management] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/linkedin.mdx b/src/content/docs/agentkit/connectors/linkedin.mdx index 65deeb5a0..23b7ee377 100644 --- a/src/content/docs/agentkit/connectors/linkedin.mdx +++ b/src/content/docs/agentkit/connectors/linkedin.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/mailchimp.mdx b/src/content/docs/agentkit/connectors/mailchimp.mdx index b166d0818..24cf1e227 100644 --- a/src/content/docs/agentkit/connectors/mailchimp.mdx +++ b/src/content/docs/agentkit/connectors/mailchimp.mdx @@ -1,12 +1,13 @@ --- title: 'Mailchimp connector' tableOfContents: true -description: 'Connect your agent to Mailchimp to manage subscribers, campaigns, lists, and email reports using OAuth 2.0.' +description: 'Connect to Mailchimp to manage audiences, campaigns, templates, automations, and reports.' sidebar: label: 'Mailchimp' +overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/mailchimp.svg connectorAuthType: OAuth 2.0 -connectorCategories: [marketing, email, automation] +connectorCategories: [Marketing, Automation, Analytics] head: - tag: style content: | @@ -62,7 +63,7 @@ import { SectionAfterSetupMailchimpCommonWorkflows } from '@components/templates 4. ### Authorize and make your first call - + @@ -70,14 +71,12 @@ import { SectionAfterSetupMailchimpCommonWorkflows } from '@components/templates Connect this agent connector to let your agent: -- **Manage audiences** — create, update, and delete audiences; list all audiences and their settings -- **Manage members** — add, update, upsert, archive, and permanently delete subscribers; get membership and tag details -- **Manage segments** — create saved and static segments; list, update, and delete segments; list segment members -- **Manage campaigns** — create, update, and delete campaigns; set HTML content; send, schedule, and unschedule campaigns; send test emails -- **Manage templates** — create, update, delete, and list custom HTML email templates -- **Access reports** — retrieve campaign send reports including opens, clicks, email activity, and unsubscribes -- **Manage automations** — list, get, start, and pause classic automation workflows -- **Track batch operations** — check the status of asynchronous batch jobs +- **List templates, segments, segment members** — Return a list of templates in the Mailchimp account, including user-created and Mailchimp base templates +- **Update template, segment, campaign** — Update a user-defined template's name or HTML content in Mailchimp +- **Get template, segment, report** — Retrieve information about a specific template in the Mailchimp account +- **Delete template, segment, campaign** — Permanently delete a user-defined template from Mailchimp +- **Create template, segment, campaign** — Create a new user-defined HTML template in Mailchimp +- **Unsubscribes report** — Return a list of members who unsubscribed from a specific Mailchimp campaign ## Common workflows @@ -85,6 +84,6 @@ Connect this agent connector to let your agent: ## Tool list -Pass the exact tool name from the list below when you call `executeTool` (Node.js) or `execute_tool` (Python). +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. diff --git a/src/content/docs/agentkit/connectors/microsoftexcel.mdx b/src/content/docs/agentkit/connectors/microsoftexcel.mdx index 63859ffb0..8237e13be 100644 --- a/src/content/docs/agentkit/connectors/microsoftexcel.mdx +++ b/src/content/docs/agentkit/connectors/microsoftexcel.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/excel.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents, data, analytics] +connectorCategories: [Files & Documents, Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/microsoftteams.mdx b/src/content/docs/agentkit/connectors/microsoftteams.mdx index 688a7e300..d7caebe6c 100644 --- a/src/content/docs/agentkit/connectors/microsoftteams.mdx +++ b/src/content/docs/agentkit/connectors/microsoftteams.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/microsoft-teams.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/microsoftword.mdx b/src/content/docs/agentkit/connectors/microsoftword.mdx index d5099e6b7..e302170fb 100644 --- a/src/content/docs/agentkit/connectors/microsoftword.mdx +++ b/src/content/docs/agentkit/connectors/microsoftword.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/word.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/miro.mdx b/src/content/docs/agentkit/connectors/miro.mdx index 068b6d18e..287ccec0f 100644 --- a/src/content/docs/agentkit/connectors/miro.mdx +++ b/src/content/docs/agentkit/connectors/miro.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/Miro.svg connectorAuthType: OAuth 2.0 -connectorCategories: [productivity] +connectorCategories: [Productivity, Collaboration, Design] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/monday.mdx b/src/content/docs/agentkit/connectors/monday.mdx index 998aaf518..12b46e656 100644 --- a/src/content/docs/agentkit/connectors/monday.mdx +++ b/src/content/docs/agentkit/connectors/monday.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/monday.svg connectorAuthType: OAuth 2.0 -connectorCategories: [project_management] +connectorCategories: [Project Management, Collaboration, Productivity] head: - tag: style content: | @@ -26,6 +26,7 @@ import { AgentKitCredentials } from '@components/templates' import { SetupMondaySection } from '@components/templates' import { QuickstartMondaySection } from '@components/templates' import { SectionAfterSetupMondayCommonWorkflows } from '@components/templates' +import { SectionBeforeToolListMondayResourceIds } from '@components/templates' @@ -71,17 +72,21 @@ import { SectionAfterSetupMondayCommonWorkflows } from '@components/templates' Connect this agent connector to let your agent: -- **Create board, notification, item** — Create a new board in Monday.com -- **List docs, updates, workspaces** — List documents (monday Docs) in your account -- **Delete group, column, board** — Permanently delete a group from a board -- **Update edit, board, delete** — Edit the text of an existing update/comment -- **Duplicate item, group, board** — Create a copy of an item on the same board -- **Board item move to** — Transfer an item to a different board +- **Manage boards** — create, update, archive, duplicate, and delete boards across workspaces +- **Manage items** — create, update, move, duplicate, archive, and delete items (rows) on any board +- **Update column values** — set single or multiple column values including status, date, people, and custom types +- **Manage groups** — create, rename, reorder, duplicate, archive, and delete groups within a board +- **Post updates** — add, edit, and delete comments and activity updates on items +- **Manage structure** — create and delete columns, manage subitems, webhooks, workspaces, teams, and tags ## Common workflows +## Getting resource IDs + + + ## Tool list Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. diff --git a/src/content/docs/agentkit/connectors/notion.mdx b/src/content/docs/agentkit/connectors/notion.mdx index e25cca3d9..abe917056 100644 --- a/src/content/docs/agentkit/connectors/notion.mdx +++ b/src/content/docs/agentkit/connectors/notion.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/notion.svg connectorAuthType: OAuth 2.0 -connectorCategories: [project_management, files, documents] +connectorCategories: [Project Management, Files & Documents, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/onedrive.mdx b/src/content/docs/agentkit/connectors/onedrive.mdx index c9a388cb1..7c9e072ca 100644 --- a/src/content/docs/agentkit/connectors/onedrive.mdx +++ b/src/content/docs/agentkit/connectors/onedrive.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/onedrive.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/onenote.mdx b/src/content/docs/agentkit/connectors/onenote.mdx index 731d2e213..71fdd4264 100644 --- a/src/content/docs/agentkit/connectors/onenote.mdx +++ b/src/content/docs/agentkit/connectors/onenote.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/onenote.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/outlook.mdx b/src/content/docs/agentkit/connectors/outlook.mdx index 7bfd0fe39..0e4233538 100644 --- a/src/content/docs/agentkit/connectors/outlook.mdx +++ b/src/content/docs/agentkit/connectors/outlook.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/outlook.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Calendar] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/outreach.mdx b/src/content/docs/agentkit/connectors/outreach.mdx index efe341944..1cdea3ead 100644 --- a/src/content/docs/agentkit/connectors/outreach.mdx +++ b/src/content/docs/agentkit/connectors/outreach.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/outreach.png connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/pagerduty.mdx b/src/content/docs/agentkit/connectors/pagerduty.mdx index 101c4e1ec..c42c7b573 100644 --- a/src/content/docs/agentkit/connectors/pagerduty.mdx +++ b/src/content/docs/agentkit/connectors/pagerduty.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/pagerduty.svg connectorAuthType: OAuth 2.0 -connectorCategories: [developer_tools] +connectorCategories: [Developer Tools, Monitoring] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/parallelaitaskmcp.mdx b/src/content/docs/agentkit/connectors/parallelaitaskmcp.mdx index 5493bebe0..a4ccc3219 100644 --- a/src/content/docs/agentkit/connectors/parallelaitaskmcp.mdx +++ b/src/content/docs/agentkit/connectors/parallelaitaskmcp.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/parallel-ai.svg connectorAuthType: Bearer Token -connectorCategories: [productivity, ai, developer-tools, data] +connectorCategories: [Productivity, AI, Developer Tools] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/phantombuster.mdx b/src/content/docs/agentkit/connectors/phantombuster.mdx index f6ed4088e..7f7778387 100644 --- a/src/content/docs/agentkit/connectors/phantombuster.mdx +++ b/src/content/docs/agentkit/connectors/phantombuster.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/phantombuster.svg connectorAuthType: API Key -connectorCategories: [ai, automation] +connectorCategories: [AI, Automation] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/pipedrive.mdx b/src/content/docs/agentkit/connectors/pipedrive.mdx index d28177e51..cbf8d7cbc 100644 --- a/src/content/docs/agentkit/connectors/pipedrive.mdx +++ b/src/content/docs/agentkit/connectors/pipedrive.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/pipedrive.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/posthogmcp.mdx b/src/content/docs/agentkit/connectors/posthogmcp.mdx index 2054b7361..eda1962b5 100644 --- a/src/content/docs/agentkit/connectors/posthogmcp.mdx +++ b/src/content/docs/agentkit/connectors/posthogmcp.mdx @@ -6,7 +6,8 @@ sidebar: label: 'Posthog MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/posthog-1.svg -connectorAuthType: OAuth 2.0 +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Analytics] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/quickbooks.mdx b/src/content/docs/agentkit/connectors/quickbooks.mdx index 0c11702f7..1ddf30c27 100644 --- a/src/content/docs/agentkit/connectors/quickbooks.mdx +++ b/src/content/docs/agentkit/connectors/quickbooks.mdx @@ -1,12 +1,13 @@ --- title: 'QuickBooks connector' tableOfContents: true -description: 'Connect your agent to QuickBooks Online to manage customers, invoices, bills, payments, and financial reports.' +description: 'Connect to QuickBooks Online. Manage customers, vendors, invoices, bills, payments, and financial reports.' sidebar: label: 'QuickBooks' +overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/Quickbooks.svg connectorAuthType: OAuth 2.0 -connectorCategories: [accounting, finance] +connectorCategories: [Accounting & Finance] head: - tag: style content: | @@ -70,15 +71,12 @@ import { SectionAfterSetupQuickbooksCommonWorkflows } from '@components/template Connect this agent connector to let your agent: -- **Manage customers and vendors** — create, update, list, and retrieve customer and vendor records -- **Create and manage invoices** — create invoices, update line items, void or delete, and send by email -- **Track bills and payments** — create bills from vendors, record bill payments with check or credit card -- **Handle estimates and purchase orders** — create, update, and delete estimates; manage purchase orders -- **Record journal entries, deposits, and transfers** — post journal entries, create deposits, and transfer funds between accounts -- **Manage items and products** — create service and inventory items with pricing and account assignments -- **Access financial reports** — retrieve Profit & Loss, Balance Sheet, Cash Flow, Trial Balance, General Ledger, Aged Payables, and Aged Receivables reports -- **Manage classes and departments** — organize transactions with classes and departments -- **Work with tax codes** — list and retrieve tax codes for accurate tax application +- **List vendors, vendor credits, transfers** — List vendors from QuickBooks Online with optional filtering and pagination +- **Update vendor, payment, item** — Update an existing vendor in QuickBooks Online +- **Get vendor, vendor credit, transfer** — Retrieve a single QuickBooks Online vendor by ID +- **Create vendor credit, vendor, transfer** — Create a new vendor credit in QuickBooks Online +- **Delete sales receipt, purchase order, payment** — Delete a sales receipt in QuickBooks Online +- **Balance report trial** — Retrieve a Trial Balance report from QuickBooks Online ## Common workflows @@ -86,6 +84,6 @@ Connect this agent connector to let your agent: ## Tool list -Pass the exact tool name from the list below when you call `executeTool` (Node.js) or `execute_tool` (Python). +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. diff --git a/src/content/docs/agentkit/connectors/salesforce.mdx b/src/content/docs/agentkit/connectors/salesforce.mdx index 918a04fe5..8c98124f2 100644 --- a/src/content/docs/agentkit/connectors/salesforce.mdx +++ b/src/content/docs/agentkit/connectors/salesforce.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/sales_force.svg connectorAuthType: OAuth 2.0 -connectorCategories: [crm, sales] +connectorCategories: [CRM & Sales] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/servicenow.mdx b/src/content/docs/agentkit/connectors/servicenow.mdx index acc324bf5..a10888040 100644 --- a/src/content/docs/agentkit/connectors/servicenow.mdx +++ b/src/content/docs/agentkit/connectors/servicenow.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/servicenow.svg connectorAuthType: OAuth 2.0 -connectorCategories: [customer_support] +connectorCategories: [Customer Support, Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/sharepoint.mdx b/src/content/docs/agentkit/connectors/sharepoint.mdx index 5e58f5e94..e6a5d377c 100644 --- a/src/content/docs/agentkit/connectors/sharepoint.mdx +++ b/src/content/docs/agentkit/connectors/sharepoint.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/sharepoint.svg connectorAuthType: OAuth 2.0 -connectorCategories: [files, documents] +connectorCategories: [Files & Documents] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/slack.mdx b/src/content/docs/agentkit/connectors/slack.mdx index e2b7dd9d2..38bc7d92a 100644 --- a/src/content/docs/agentkit/connectors/slack.mdx +++ b/src/content/docs/agentkit/connectors/slack.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/slack.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Collaboration] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/snowflake.mdx b/src/content/docs/agentkit/connectors/snowflake.mdx index bfd56d564..8bb5ec07f 100644 --- a/src/content/docs/agentkit/connectors/snowflake.mdx +++ b/src/content/docs/agentkit/connectors/snowflake.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg connectorAuthType: OAuth 2.0 -connectorCategories: [data, analytics] +connectorCategories: [Analytics, Databases] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/snowflakekeyauth.mdx b/src/content/docs/agentkit/connectors/snowflakekeyauth.mdx index ac5b87f63..f6f0c5c6a 100644 --- a/src/content/docs/agentkit/connectors/snowflakekeyauth.mdx +++ b/src/content/docs/agentkit/connectors/snowflakekeyauth.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg connectorAuthType: Bearer Token -connectorCategories: [data, analytics] +connectorCategories: [Analytics, Databases] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/supadata.mdx b/src/content/docs/agentkit/connectors/supadata.mdx index 5a695755b..4a27d6e78 100644 --- a/src/content/docs/agentkit/connectors/supadata.mdx +++ b/src/content/docs/agentkit/connectors/supadata.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/supadata.svg connectorAuthType: API Key -connectorCategories: [data, analytics] +connectorCategories: [Analytics, Search] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/supermetricsmcp.mdx b/src/content/docs/agentkit/connectors/supermetricsmcp.mdx new file mode 100644 index 000000000..36ddd320c --- /dev/null +++ b/src/content/docs/agentkit/connectors/supermetricsmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Supermetrics MCP connector' +tableOfContents: true +description: 'Connect to Supermetrics MCP to query marketing data, discover data sources, manage campaigns, and run analytics across your connected ad and analytics...' +sidebar: + label: 'Supermetrics MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/supermetrics.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Marketing, Analytics, CRM & Sales] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/supermetricsmcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Info user** — Retrieve the authenticated Supermetrics user's profile information +- **Manage resources** — Open the visual media picker or manage ad creative assets for a supported platform +- **Get today, async query results, campaign and resource** — Get the current UTC date and time +- **Discovery field, data source, accounts** — List available metrics and dimensions for a specific data source +- **Query data** — Query marketing analytics data from any connected data source, with optional date ranges, field selection, and filters +- **Supermetrics contact** — Send product feedback, create a support ticket, or submit a sales enquiry to Supermetrics + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/tableau.mdx b/src/content/docs/agentkit/connectors/tableau.mdx index c212ca3cb..7aa219a03 100644 --- a/src/content/docs/agentkit/connectors/tableau.mdx +++ b/src/content/docs/agentkit/connectors/tableau.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/tableau.svg connectorAuthType: API Key -connectorCategories: [analytics, business_intelligence, data_visualization, productivity] +connectorCategories: [Analytics, Productivity] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/trello.mdx b/src/content/docs/agentkit/connectors/trello.mdx index e41d3bd28..259d277db 100644 --- a/src/content/docs/agentkit/connectors/trello.mdx +++ b/src/content/docs/agentkit/connectors/trello.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/trello_n.svg connectorAuthType: OAuth 1.0a -connectorCategories: [project_management] +connectorCategories: [Project Management, Collaboration, Productivity] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/twitter.mdx b/src/content/docs/agentkit/connectors/twitter.mdx index a02bf64bc..024c95c56 100644 --- a/src/content/docs/agentkit/connectors/twitter.mdx +++ b/src/content/docs/agentkit/connectors/twitter.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/X.svg connectorAuthType: Bearer Token -connectorCategories: [communication] +connectorCategories: [Communication, Marketing] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/vercel.mdx b/src/content/docs/agentkit/connectors/vercel.mdx index e92ec425f..03d5191b3 100644 --- a/src/content/docs/agentkit/connectors/vercel.mdx +++ b/src/content/docs/agentkit/connectors/vercel.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/vercel.svg connectorAuthType: OAuth 2.0 -connectorCategories: [developer_tools] +connectorCategories: [Developer Tools] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/vimeo.mdx b/src/content/docs/agentkit/connectors/vimeo.mdx index 62ffb5abb..bf4d8a77f 100644 --- a/src/content/docs/agentkit/connectors/vimeo.mdx +++ b/src/content/docs/agentkit/connectors/vimeo.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/vimeo.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Media] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/xero.mdx b/src/content/docs/agentkit/connectors/xero.mdx index 1a789d356..d0b15a306 100644 --- a/src/content/docs/agentkit/connectors/xero.mdx +++ b/src/content/docs/agentkit/connectors/xero.mdx @@ -1,12 +1,13 @@ --- title: 'Xero connector' tableOfContents: true -description: 'Connect to Xero to manage invoices, contacts, payments, accounts, and financial reports via OAuth 2.0.' +description: 'Connect to Xero. Manage accounting, invoices, contacts, payments, bank transactions, and financial workflows' sidebar: label: 'Xero' +overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/xero.svg connectorAuthType: OAuth 2.0 -connectorCategories: [accounting, finance, invoicing] +connectorCategories: [Accounting & Finance] head: - tag: style content: | @@ -71,16 +72,12 @@ import { SectionBeforeToolListXeroCommonPatterns } from '@components/templates' Connect this agent connector to let your agent: -- **Manage the chart of accounts** — list, create, update, and archive accounts -- **Work with contacts** — create and update customers and suppliers, manage contact groups -- **Create and manage invoices** — draft, authorise, update, and void invoices and bills -- **Handle payments and credit notes** — list payments, overpayments, prepayments, batch payments, and credit notes -- **Manage inventory** — create, update, and delete inventory items -- **Process purchase orders and quotes** — create, update, and track purchase orders and quotes -- **Record manual journals** — create and post manual journal entries -- **Manage employees** — create and update employee records -- **Run financial reports** — generate Balance Sheet, Profit & Loss, Trial Balance, Aged Payables/Receivables, Bank Summary, and Executive Summary reports -- **Access organisation settings** — list currencies, tax rates, tracking categories, and users +- **List users, tracking categories, tax rates** — Retrieve users of a Xero organisation +- **Get user, quote, purchase order** — Retrieve a single Xero organisation user by their UserID +- **Create tracking option, tax rate, quote** — Create a new option within a tracking category in Xero +- **Update tracking category, tax rate, quote** — Update a tracking category name or status in Xero +- **Delete tracking category, item, invoice** — Delete a tracking category from Xero +- **Balance report trial** — Retrieve the Trial Balance report for a Xero organisation ## Common workflows @@ -92,6 +89,6 @@ Connect this agent connector to let your agent: ## Tool list -Pass the exact tool name from the list below when you call `executeTool` (Node.js) or `execute_tool` (Python). +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. diff --git a/src/content/docs/agentkit/connectors/youtube.mdx b/src/content/docs/agentkit/connectors/youtube.mdx index 98acd9f45..b8b425415 100644 --- a/src/content/docs/agentkit/connectors/youtube.mdx +++ b/src/content/docs/agentkit/connectors/youtube.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/youtube.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Media, Marketing] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/zapiermcp.mdx b/src/content/docs/agentkit/connectors/zapiermcp.mdx index 44f99d9f7..b822bdc11 100644 --- a/src/content/docs/agentkit/connectors/zapiermcp.mdx +++ b/src/content/docs/agentkit/connectors/zapiermcp.mdx @@ -6,7 +6,7 @@ sidebar: label: 'Zapier MCP' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/zapier.svg -connectorAuthType: OAuth 2.0 +connectorAuthType: OAuth 2.1/DCR connectorCategories: [Automation, Productivity, Developer Tools] head: - tag: style diff --git a/src/content/docs/agentkit/connectors/zendesk.mdx b/src/content/docs/agentkit/connectors/zendesk.mdx index 44a2c2721..abde8c4df 100644 --- a/src/content/docs/agentkit/connectors/zendesk.mdx +++ b/src/content/docs/agentkit/connectors/zendesk.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/zendesk.svg connectorAuthType: API KEY -connectorCategories: [customer_support] +connectorCategories: [Customer Support, Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/zoom.mdx b/src/content/docs/agentkit/connectors/zoom.mdx index 29d924508..ec0b765da 100644 --- a/src/content/docs/agentkit/connectors/zoom.mdx +++ b/src/content/docs/agentkit/connectors/zoom.mdx @@ -7,7 +7,7 @@ sidebar: overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/zoom.svg connectorAuthType: OAuth 2.0 -connectorCategories: [communication] +connectorCategories: [Communication, Calendar] head: - tag: style content: | @@ -19,10 +19,12 @@ head: } --- +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/zoom' import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' import { AgentKitCredentials } from '@components/templates' import { SetupZoomSection } from '@components/templates' -import { QuickstartGenericOauthNotoolsSection } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' import { SectionAfterSetupZoomCommonWorkflows } from '@components/templates' @@ -61,10 +63,27 @@ import { SectionAfterSetupZoomCommonWorkflows } from '@components/templates' 4. ### Authorize and make your first call - + +## What you can do + +Connect this agent connector to let your agent: + +- **Add meeting registrant** — Register a participant for a Zoom meeting +- **Update meeting, chat channel, user** — Update an existing Zoom meeting's details +- **Delete meeting recordings, user, meeting** — Delete all cloud recordings for a specific meeting +- **List chat channel members, meeting registrants, chat channels** — List members of a Team Chat channel +- **Get meeting, user, chat channel** — Retrieve details of a specific Zoom meeting +- **Create meeting, chat channel** — Schedule a new Zoom meeting for a user + ## Common workflows + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/data/agent-connectors/adobemarketingagentmcp.ts b/src/data/agent-connectors/adobemarketingagentmcp.ts index 80c329e9d..506ed9548 100644 --- a/src/data/agent-connectors/adobemarketingagentmcp.ts +++ b/src/data/agent-connectors/adobemarketingagentmcp.ts @@ -5,203 +5,94 @@ export const tools: Tool[] = [ name: 'adobemarketingagentmcp_adobe-marketing-agent-mcp-widget', description: `Send a natural-language query to the Adobe Marketing AI assistant to analyze audiences, troubleshoot journeys, and retrieve marketing insights.`, params: [ - { - name: 'query', - type: 'string', - required: true, - description: `The natural-language request to send to the assistant (e.g. "What are my top audience segments this month?").`, - }, - { - name: 'execution_mode', - type: 'string', - required: false, - description: `Controls how the task runs. Use "async" for long-running operations; "sync" (default) for immediate responses. Accepted values: sync, async.`, - }, - { - name: 'chat_id', - type: 'string', - required: false, - description: `Optional identifier to correlate this request with a chat or conversation context.`, - }, - { - name: 'async', - type: 'boolean', - required: false, - description: `Compatibility flag; set to true to request async execution.`, - }, - { - name: 'long_running', - type: 'boolean', - required: false, - description: `Compatibility flag; set to true to request async execution for long-running tasks.`, - }, + { name: 'query', type: 'string', required: true, description: `The natural-language request or feedback message to send to the assistant.` }, + { name: 'async', type: 'boolean', required: false, description: `Compatibility flag; set to true to request async execution.` }, + { name: 'chat_id', type: 'string', required: false, description: `Optional identifier to correlate this request with a chat or conversation context.` }, + { name: 'execution_mode', type: 'string', required: false, description: `Controls how the task runs; use async for long-running polling-based tasks.` }, + { name: 'long_running', type: 'boolean', required: false, description: `Compatibility flag; set to true to request async execution for long-running tasks.` }, ], }, { name: 'adobemarketingagentmcp_core-context-management-widget', description: `Display and manage the current organization, sandbox, and dataview context, allowing the user to switch between them.`, params: [ - { - name: 'query', - type: 'string', - required: false, - description: `Optional context for the widget, such as which sandbox or dataview to display.`, - }, + { name: 'query', type: 'string', required: false, description: `The natural-language request or feedback message to send to the assistant.` }, ], }, { name: 'adobemarketingagentmcp_core-feedback-widget', description: `Show an interactive feedback form with thumbs up/down and rating categories; falls back to text-based feedback if widgets are not supported.`, params: [ - { - name: 'query', - type: 'string', - required: false, - description: `Optional initial feedback message to pre-populate the feedback form.`, - }, + { name: 'query', type: 'string', required: false, description: `The natural-language request or feedback message to send to the assistant.` }, ], }, { name: 'adobemarketingagentmcp_core-get_task', description: `Retrieve the status and events for an async task by ID; use the cursor to poll only for new events since the last fetch.`, params: [ - { - name: 'task_id', - type: 'string', - required: true, - description: `The unique identifier of the async task to retrieve. Returned by tools that support async execution.`, - }, - { - name: 'cursor', - type: 'integer', - required: false, - description: `Offset cursor from the previous response; use 0 to fetch all events from the beginning.`, - }, + { name: 'task_id', type: 'string', required: true, description: `The unique identifier of the async task to retrieve.` }, + { name: 'cursor', type: 'integer', required: false, description: `Offset cursor from the previous response; use 0 to fetch all events from the beginning.` }, ], }, { name: 'adobemarketingagentmcp_core-list_tasks', description: `List all async tasks associated with the current conversation context.`, - params: [], + params: [ + ], }, { name: 'adobemarketingagentmcp_core-plan_completion_decision', description: `Submit the user's approval or rejection for a pending plan before it is executed.`, params: [ - { - name: 'decision', - type: 'string', - required: true, - description: `The user's approval decision. Accepted values: Approve (execute the proposed plan), Reject (cancel it).`, - }, + { name: 'decision', type: 'string', required: true, description: `The user's approval decision for the pending plan.` }, ], }, { name: 'adobemarketingagentmcp_core-provide_feedback', description: `Submit user feedback about the AI assistant experience; automatically classifies sentiment and calls the feedback API.`, params: [ - { - name: 'query', - type: 'string', - required: false, - description: `The user's feedback message; used in text mode when the feedback widget is not available.`, - }, - { - name: 'sentiment', - type: 'string', - required: false, - description: `The user's overall sentiment rating. Accepted values: like, dislike.`, - }, - { - name: 'comment', - type: 'string', - required: false, - description: `Optional free-text comment to accompany the feedback.`, - }, - { - name: 'flagged', - type: 'boolean', - required: false, - description: `Set to true if the feedback reports harmful content; triggers the flag API instead of sentiment feedback.`, - }, - { - name: 'flagCategories', - type: 'array', - required: false, - description: `Categories of harmful content being reported. Accepted values: biased, harm, offensive, trademark-violation, other.`, - }, - { - name: 'pickList', - type: 'array', - required: false, - description: `Selected feedback option labels chosen from the widget's predefined list (e.g. ["Incorrect info", "Not helpful"]).`, - }, + { name: 'comment', type: 'string', required: false, description: `Optional free-text comment to accompany the feedback.` }, + { name: 'flagCategories', type: 'array', required: false, description: `Categories of harmful content being reported; required when flagged is true.` }, + { name: 'flagged', type: 'boolean', required: false, description: `Set to true if the feedback reports harmful content; triggers the flag API instead of sentiment feedback.` }, + { name: 'pickList', type: 'array', required: false, description: `Selected feedback option labels chosen from the widget's predefined list.` }, + { name: 'query', type: 'string', required: false, description: `The natural-language request or feedback message to send to the assistant.` }, + { name: 'sentiment', type: 'string', required: false, description: `The user's overall sentiment rating for the interaction.` }, ], }, { name: 'adobemarketingagentmcp_core-set_dataview', description: `Set the active Customer Journey Analytics dataview for the current session.`, params: [ - { - name: 'dataviewName', - type: 'string', - required: true, - description: `The name of the Customer Journey Analytics dataview to set as the active context (e.g. "My Analytics View").`, - }, + { name: 'dataviewName', type: 'string', required: true, description: `The name of the Customer Journey Analytics dataview to set as the active context.` }, ], }, { name: 'adobemarketingagentmcp_core-set_sandbox', description: `Set the active Adobe Experience Platform sandbox for the current session.`, params: [ - { - name: 'sandboxName', - type: 'string', - required: true, - description: `The technical name (one word) of the Adobe Experience Platform sandbox to activate (e.g. "prod").`, - }, + { name: 'sandboxName', type: 'string', required: true, description: `The technical name (one word) of the Adobe Experience Platform sandbox to set as the active context.` }, ], }, { name: 'adobemarketingagentmcp_core-switch_org', description: `Switch to a different Adobe organization by exchanging the current IMS token.`, params: [ - { - name: 'org_name', - type: 'string', - required: true, - description: `The display name or IMS Org ID of the Adobe organization to switch to (e.g. "CJM Stage" or "8D9582BC6A017FDB0A495E5F@AdobeOrg").`, - }, + { name: 'org_name', type: 'string', required: true, description: `The display name or IMS Org ID of the Adobe organization to switch to.` }, ], }, { name: 'adobemarketingagentmcp_core-switch_sandbox_dataview', description: `Update the active sandbox and/or dataview for the session in a single call.`, params: [ - { - name: 'sandboxName', - type: 'string', - required: false, - description: `The technical name (one word) of the sandbox to activate. Omit to leave the sandbox unchanged.`, - }, - { - name: 'dataviewName', - type: 'string', - required: false, - description: `The name of the Customer Journey Analytics dataview to activate. Omit to leave the dataview unchanged.`, - }, + { name: 'dataviewName', type: 'string', required: false, description: `The name of the Customer Journey Analytics dataview to set as the active context.` }, + { name: 'sandboxName', type: 'string', required: false, description: `The technical name (one word) of the Adobe Experience Platform sandbox to set as the active context.` }, ], }, { name: 'adobemarketingagentmcp_core-user_preferences', description: `Read or clear the user's persisted preferences including sandbox, dataview, org, and region settings.`, params: [ - { - name: 'action', - type: 'string', - required: false, - description: `Action to perform. Accepted values: get (returns current saved preferences), clear (deletes all saved preferences). Defaults to get.`, - }, + { name: 'action', type: 'string', required: false, description: `Action to perform on preferences; get returns current settings, clear removes all saved preferences.` }, ], }, ] diff --git a/src/data/agent-connectors/adzvisermcp.ts b/src/data/agent-connectors/adzvisermcp.ts new file mode 100644 index 000000000..c86d93666 --- /dev/null +++ b/src/data/agent-connectors/adzvisermcp.ts @@ -0,0 +1,300 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'adzvisermcp_list_metrics_and_breakdowns_activecampaign', + description: `Get the list of selectable ActiveCampaign metrics, such as Contacts, Sends, Opens, Clicks, and breakdowns like Campaign Name, List Name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_adroll', + description: `Get the list of selectable AdRoll metrics, such as Impressions, Clicks, Spend, Conversions, and breakdowns like Campaign Name, Ad Group, Creative etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_amazon_ads', + description: `Get the list of selectable Amazon Ads metrics like Purchases, Spend etc. and breakdowns like Campaign name, Keyword text, and ASIN etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_amazon_seller', + description: `Get the list of selectable Amazon Seller Central metrics like Item price, Orders shipped, etc. and breakdowns like ASIN, Order channel, and Product name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_apple_ads', + description: `Get the list of selectable Apple Ads (Apple Search Ads) metrics, such as Impressions, Taps, Installs, Spend, and breakdowns like Campaign Name, Ad Group, Keyword etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_bigcommerce', + description: `Get the list of selectable BigCommerce metrics like Orders, Revenue, Items sold, and breakdowns like Product name, Customer email, and Order status etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_bing_ads', + description: `Get the list of selectable Bing Ads metrics like Impressions, Cost, Clicks, etc. and breakdowns like Campaign name, Keyword, and Device type etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_bing_webmaster', + description: `Get the list of selectable Bing Webmaster metrics like Clicks, Impressions, CTR, and breakdowns like Query, Page URL, and Country etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_callrail', + description: `Get the list of selectable CallRail metrics like Total calls, Answered calls, Call duration, and breakdowns like Tracking number, Source, and Campaign etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_cm360', + description: `Get the list of selectable Campaign Manager 360 (CM360) metrics, such as Impressions, Clicks, Conversions, and breakdowns like Campaign Name, Site, Placement etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_dv360', + description: `Get the list of selectable Display & Video 360 (DV360) metrics, such as Impressions, Clicks, Revenue, and breakdowns like Campaign Name, Insertion Order, Line Item etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_fb_ads', + description: `Get the list of selectable Facebook Ads metrics, such as Spend, CPC, Clicks, and breakdowns such as Gender, Country, and Device etc. If workspace_name is provided, custom conversions for that workspace will be included in the metrics list.`, + params: [ + { name: 'workspace_name', type: 'string', required: false, description: `Optional workspace name to retrieve custom conversions for the Facebook Ads account in that workspace. If not provided, only standard metrics and breakdowns are returned.` }, + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_fb_post', + description: `Get the list of selectable Facebook Post/Video metrics like Post likes, Post total reactions, etc. and breakdowns like Post message, Post image URL, etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_ga4', + description: `Get the list of selectable Google Analytics metrics such as Active users, New users, Sessions, and breakdowns like Account name, Session medium, and Country etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_google_ads', + description: `Get the list of selectable Google Ads metrics, such as Cost, Roas, Impressions, and breakdowns like Device, Keyword Text, and Campaign Name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_google_my_business', + description: `Get the list of selectable Google My Business metrics, such as Total views, Phone calls, Bookings, and breakdowns like Location name, Website URL, and Address lines etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_hubspot', + description: `Get the list of selectable HubSpot metrics like Contacts, Leads, etc. and breakdowns like Company name, Contact email, and Deal ID etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_ig_post', + description: `Get the list of selectable Instagram Post metrics such as Post Comments, Post Follows, Post Likes, and breakdowns like Media URL, Media Caption, and Media Product Type etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_ig_profile', + description: `Get the list of selectable Instagram Profile metrics like Profile Follower, Profile Impressions, etc., and breakdowns like Profile ID, Profile Name, and Profile Website etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_klaviyo', + description: `Get the list of selectable Klaviyo metrics, such as Emails recipients, Received SMS, and breakdowns like Campaign name, Flow name, and Person first name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_linkedin_ads', + description: `Get the list of selectable LinkedIn Ads metrics, such as Impressions, Reach, Total spent, and breakdowns like Device, Placement, and Campaign name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_linkedin_company_page', + description: `Get the list of selectable LinkedIn Page metrics, such as Content comments, Lifetime followers, Page views, and breakdowns like Content text, and Content URL etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_mailchimp', + description: `Get the list of selectable Mailchimp metrics, such as Emails sent, Open rate (%), Total clicks, and breakdowns like Campaign name, List name, and Member email etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_marketo', + description: `Get the list of selectable Marketo metrics, such as Leads Created, Emails Sent, and breakdowns like Program Name, Campaign Name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_matomo', + description: `Get the list of selectable Matomo metrics, such as Visits, Pageviews, Bounce Rate, and breakdowns like Page URL, Referrer, Country etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_merchant_center', + description: `Get the list of selectable Merchant Center metrics, such as Impressions, Clicks, Conversions, and breakdowns like Title, Brand, and Availability etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_omnisend', + description: `Get the list of selectable Omnisend metrics, such as Emails Sent, Open Rate, Click Rate, and breakdowns like Campaign Name, Automation Name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_pinterest_ads', + description: `Get the list of selectable Pinterest Ads metrics, such as Impressions paid, Cost, Video views, and breakdowns like Ad group name, and Targeting location etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_pinterest_organic', + description: `Get the list of selectable Pinterest Organic metrics like Pin impressions, Saves, Clicks, and breakdowns like Pin title, Board name, and Pin URL etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_pipedrive', + description: `Get the list of selectable Pipedrive metrics, such as Deals Won, Revenue, Activities, and breakdowns like Pipeline, Deal Owner, Stage etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_reddit_ads', + description: `Get the list of selectable Reddit Ads metrics like Impressions, Clicks, Spend, and breakdowns like Campaign name, Ad group name, and Subreddit etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_sa360', + description: `Get the list of selectable Search Ads 360 (SA360) metrics, such as Impressions, Clicks, Cost, Conversions, and breakdowns like Campaign Name, Ad Group, Keyword etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_salesforce', + description: `Get the list of selectable Salesforce metrics like Opportunity count, Leads, etc. and breakdowns like Opportunity name, Campaign name, etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_search_console', + description: `Get the list of selectable Google Search Console metrics like Clicks, Positions, etc. and breakdowns like Landing page, and Search query etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_shopify', + description: `Get the list of selectable Shopify metrics, such as Gross sales, Returns, Shipping, and breakdowns like Customer first name, Product SKU, and Order ID etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_snapchat_ads', + description: `Get the list of selectable Snapchat Ads metrics such as Impressions, Cost, Leads, and breakdowns like DMA, Ad type, and Campaign name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_spotify_ads', + description: `Get the list of selectable Spotify Ads metrics, such as Impressions, Clicks, Spend, Listens, and breakdowns like Campaign Name, Ad Set, Ad Format etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_sprout_social', + description: `Get the list of selectable Sprout Social metrics, such as Impressions, Engagements, Followers, and breakdowns like Profile, Network, Post Type etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_threads_insights', + description: `Get the list of selectable Threads Insights metrics like Views, Likes, Replies, Reposts, and breakdowns like Post text, Post ID, and Media type etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_tiktok_ads', + description: `Get the list of selectable TikTok Ads metrics, such as Clicks, CPM, Cost, and breakdowns like Campaign name, Gender, and Age etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_tiktok_organic', + description: `Get the list of selectable TikTok Organic metrics like Video views, Likes, Comments, Shares, and breakdowns like Video title, Video ID, and Create time etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_trade_desk', + description: `Get the list of selectable Trade Desk metrics, such as Impressions, Clicks, Spend, Conversions, and breakdowns like Campaign Name, Ad Group, Creative etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_woo_commerce', + description: `Get the list of selectable WooCommerce metrics, such as Gross sales, Returns, Items sold, and breakdowns like Order number, Billing first name, and Shipping phone etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_x_ads', + description: `Get the list of selectable X Ads (Twitter Ads) metrics like Impressions, Clicks, Spend, and breakdowns like Campaign name, Ad group name, and Placement etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_youtube', + description: `Get the list of selectable YouTube metrics like Video views, Likes, Comments, etc. and breakdowns like Video ID, Video title, and Channel name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_and_breakdowns_zoho', + description: `Get the list of selectable Zoho CRM metrics like Leads, Deals, Contacts, and breakdowns like Lead source, Deal stage, and Account name etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_metrics_fb_page', + description: `Get the list of selectable Facebook Page Insights metrics, such as Total likes, Total reach, Total page views etc.`, + params: [ + ], + }, + { + name: 'adzvisermcp_list_workspace', + description: `Retrieve a list of workspaces that have been created by the user and their data sources, such as Google Ads, Facebook Ads accounts connected with each.`, + params: [ + ], + }, + { + name: 'adzvisermcp_retrieve_reporting_data', + description: `Retrieve real-time reporting data from marketing channels like Google Ads, Facebook Ads and Google Analytics. Returns structured data that you can analyze, compare, calculate, and summarize.`, + params: [ + { name: 'adzviser_request', type: 'object', required: false, description: `Optional structured request body specifying platforms, metrics, breakdowns, date ranges, and filters for the report.` }, + ], + }, +] diff --git a/src/data/agent-connectors/ahrefsmcp.ts b/src/data/agent-connectors/ahrefsmcp.ts index 7753aad57..2ec91e343 100644 --- a/src/data/agent-connectors/ahrefsmcp.ts +++ b/src/data/agent-connectors/ahrefsmcp.ts @@ -5,2334 +5,586 @@ export const tools: Tool[] = [ name: 'ahrefsmcp_batch_analysis', description: `Performs a batch analysis of multiple URLs, domains, or subdomains to retrieve selected SEO, backlink, organic, and paid traffic metrics.`, params: [ - { - name: 'select', - type: 'array', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, + { name: 'select', type: 'array', required: true, description: `Comma-separated list of fields to include in the response.` }, { name: 'targets', type: 'array', required: true, description: `No description.` }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'order_by', - type: 'array', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'order_by', type: 'array', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_brand_radar_ai_responses', description: `Retrieve questions asked to AI assistants and the AI-generated responses that mention your brand or competitors, including cited sources and search volume estimates.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_ai_responses_entities', description: `Retrieve questions asked to AI assistants and the AI-generated responses that mention your brand or competitors, with entity-based inputs for more precise brand matching.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'array', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'array', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_cited_domains', description: `Retrieve domains cited in AI-generated responses that mention your brand or competitors in a specified LLM, with response counts and estimated monthly search volume.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_cited_domains_entities', description: `Retrieve domains cited in AI-generated responses mentioning your brand or competitors in a specified LLM, using entity-based inputs for more precise brand matching.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'array', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'array', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_cited_pages', description: `Retrieve pages cited in AI-generated responses that mention your brand or competitors in a specified LLM, with response counts and estimated monthly search volume.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tracked_urls', type: 'string', required: false, description: `No description.` }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_cited_pages_entities', description: `Retrieve pages cited in AI-generated responses mentioning your brand or competitors in a specified LLM, using entity-based inputs for more precise brand matching.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'array', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'array', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, { name: 'tracked_urls', type: 'array', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_impressions_history', description: `Provides the historical number of impressions for your and competitors's brands in an LLM you specify. Prefer using the equivalent 'brand-radar-impressions-history-entities' tool since the inputs are more descriptive.`, params: [ - { - name: 'brand', - type: 'string', - required: true, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'brand', type: 'string', required: true, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_impressions_history_entities', description: `Retrieve the historical number of impressions for your and competitors’ brands in a specified LLM, using entity-based inputs for more precise brand matching.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_impressions_overview', description: `Retrieve the number of impressions for your and competitors’ brands in a specified LLM, with filters for location, query text, URL, and more.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_impressions_overview_entities', description: `Retrieve impression counts for your and competitors’ brands in a specified LLM, using entity-based inputs and filters for location, query text, and URL.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'array', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'array', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_mentions_history', description: `Provides the historical number of mentions for your and competitors's brands in an LLM you specify. Prefer using the equivalent 'brand-radar-mentions-history-entities' tool since the inputs are more descriptive.`, params: [ - { - name: 'brand', - type: 'string', - required: true, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'brand', type: 'string', required: true, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_mentions_history_entities', description: `Retrieve the historical number of mentions for your and competitors’ brands in a specified LLM, using entity-based inputs for more precise brand matching.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_mentions_overview', description: `Retrieve mention counts for your and competitors’ brands in a specified LLM, with filters for location, query text, URL, and more.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_mentions_overview_entities', description: `Retrieve mention counts for your and competitors’ brands in a specified LLM, using entity-based inputs and filters for location, query text, and URL.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'select', - type: 'array', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'select', type: 'array', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_sov_history', description: `Provides the historical share of voice for your and competitors's brands in an LLM you specify. Prefer using the equivalent 'brand-radar-sov-history-entities' tool since the inputs are more descriptive.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_sov_history_entities', description: `Retrieve the historical share of voice for your and competitors’ brands in a specified LLM, using entity-based inputs for more precise brand matching.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_sov_overview', description: `Provides the share of voice for your and competitors's brands in an LLM you specify, with filters for locations, query text, URL, and more. Prefer using the equivalent 'brand-radar-sov-overview-entities' tool since the inputs are more descriptive.`, params: [ - { - name: 'data_source', - type: 'string', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'brand', - type: 'string', - required: false, - description: `Your brand domain to track (e.g. \`ahrefs.com\`).`, - }, - { - name: 'competitors', - type: 'string', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'market', - type: 'string', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'data_source', type: 'string', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'brand', type: 'string', required: false, description: `Your brand domain to track (e.g. \`ahrefs.com\`).` }, + { name: 'competitors', type: 'string', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'market', type: 'string', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_brand_radar_sov_overview_entities', description: `Retrieve share of voice for your and competitors’ brands in a specified LLM, using entity-based inputs and filters for location, query text, and URL.`, params: [ - { - name: 'data_source', - type: 'array', - required: true, - description: `AI platform to pull data from (e.g. \`google_ai_overview\`).`, - }, - { - name: 'brands', - type: 'array', - required: false, - description: `Array of brand domains to track.`, - }, - { - name: 'competitors', - type: 'array', - required: false, - description: `Comma-separated list of competitor domains.`, - }, - { - name: 'country', - type: 'array', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'market', - type: 'array', - required: false, - description: `Market or country code for brand radar data.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'prompts', - type: 'string', - required: false, - description: `Search prompt or topic to track brand mentions for.`, - }, - { - name: 'report_id', - type: 'string', - required: false, - description: `ID of the brand radar report to query.`, - }, + { name: 'data_source', type: 'array', required: true, description: `AI platform to pull data from (e.g. \`google_ai_overview\`).` }, + { name: 'brands', type: 'array', required: false, description: `Array of brand domains to track.` }, + { name: 'competitors', type: 'array', required: false, description: `Comma-separated list of competitor domains.` }, + { name: 'country', type: 'array', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'market', type: 'array', required: false, description: `Market or country code for brand radar data.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'prompts', type: 'string', required: false, description: `Search prompt or topic to track brand mentions for.` }, + { name: 'report_id', type: 'string', required: false, description: `ID of the brand radar report to query.` }, { name: 'tags_filter', type: 'object', required: false, description: `No description.` }, - { - name: 'where', - type: 'object', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'object', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_doc', description: `Retrieve full OpenAPI documentation for Ahrefs API v3 and the corresponding MCP tools. Use this tool to get the input schema for any other Ahrefs tool.`, - params: [{ name: 'tool', type: 'string', required: true, description: `No description.` }], + params: [ + { name: 'tool', type: 'string', required: true, description: `No description.` }, + ], }, { name: 'ahrefsmcp_gsc_anonymous_queries', description: `Returns organic keywords that rank for the project but are not reported by Google Search Console (anonymized queries), with position, traffic, volume, and CPC data.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_ctr_by_position', description: `Returns Google Search Console CTR (click-through rate) data by keyword position, showing each keyword's average position, CTR percentage, and click count.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, ], }, { name: 'ahrefsmcp_gsc_keyword_history', description: `Returns Google Search Console performance history chart data (clicks, impressions, CTR, position) for specific keywords over time, grouped by daily, weekly, or monthly intervals.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'keywords', - type: 'string', - required: false, - description: `Comma-separated list of keywords to analyze.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'keywords', type: 'string', required: false, description: `Comma-separated list of keywords to analyze.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_keywords', description: `Returns Google Search Console keywords table data with metrics (clicks, impressions, CTR, position) and associated URLs for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'keyword_list_id', - type: 'integer', - required: false, - description: `ID of the saved keyword list to use.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'keyword_list_id', type: 'integer', required: false, description: `ID of the saved keyword list to use.` }, { name: 'keyword_lists', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_metrics_by_country', description: `Returns Google Search Console click metrics grouped by country for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_page_history', description: `Returns Google Search Console performance history chart data (clicks, impressions, CTR, position) for specific pages over time, grouped by daily, weekly, or monthly intervals.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'pages', type: 'string', required: false, description: `No description.` }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, ], }, { name: 'ahrefsmcp_gsc_pages', description: `Returns Google Search Console pages table data with metrics (clicks, impressions, CTR, position) and associated keywords for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_pages_history', description: `Returns Google Search Console pages chart data showing total indexed pages over time for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_performance_by_device', description: `Returns Google Search Console performance metrics (clicks, impressions, CTR, position) broken down by device type (desktop, mobile, tablet) for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_performance_by_position', description: `Returns Google Search Console performance metrics (clicks, impressions, keyword count) grouped by position ranges (1-3, 4-10, 11-20, 21-50, 51+) for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_performance_history', description: `Returns Google Search Console performance chart data (clicks, impressions, CTR, position) for a project over time, grouped by daily, weekly, or monthly intervals.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_gsc_positions_history', description: `Returns Google Search Console keyword count data grouped by position ranges (1-3, 4-10, 11-20, 21-50, 51+) over time for a project.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: false, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'portfolio_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs portfolio.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'search_type', - type: 'string', - required: false, - description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: false, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'portfolio_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs portfolio.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, + { name: 'search_type', type: 'string', required: false, description: `GSC search type: \`web\`, \`image\`, \`video\`, or \`news\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_keywords_explorer_matching_terms', description: `Retrieve keyword ideas and SEO metrics by matching input terms or phrases in a specified country, with support for filtering, sorting, and metric selection.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'keyword_list_id', - type: 'integer', - required: false, - description: `ID of the saved keyword list to use.`, - }, - { - name: 'keywords', - type: 'string', - required: false, - description: `Comma-separated list of keywords to analyze.`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'keyword_list_id', type: 'integer', required: false, description: `ID of the saved keyword list to use.` }, + { name: 'keywords', type: 'string', required: false, description: `Comma-separated list of keywords to analyze.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, { name: 'match_mode', type: 'string', required: false, description: `No description.` }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'terms', type: 'string', required: false, description: `No description.` }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_keywords_explorer_overview', description: `Retrieve an overview of keyword metrics—including search volume, CPC, ranking difficulty, traffic potential, and intent—for specified keywords, domains, or URLs.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'keyword_list_id', - type: 'integer', - required: false, - description: `ID of the saved keyword list to use.`, - }, - { - name: 'keywords', - type: 'string', - required: false, - description: `Comma-separated list of keywords to analyze.`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'target', - type: 'string', - required: false, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'target_mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'keyword_list_id', type: 'integer', required: false, description: `ID of the saved keyword list to use.` }, + { name: 'keywords', type: 'string', required: false, description: `Comma-separated list of keywords to analyze.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'target', type: 'string', required: false, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'target_mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, { name: 'target_position', type: 'string', required: false, description: `No description.` }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_monthly_date_from', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'volume_monthly_date_to', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_monthly_date_from', type: 'string', required: false, description: `No description.` }, + { name: 'volume_monthly_date_to', type: 'string', required: false, description: `No description.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_keywords_explorer_related_terms', description: `Retrieve keyword metrics and related terms ("also rank for" and "also talk about") for a given keyword or keyword list, with filtering and sorting options.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'keyword_list_id', - type: 'integer', - required: false, - description: `ID of the saved keyword list to use.`, - }, - { - name: 'keywords', - type: 'string', - required: false, - description: `Comma-separated list of keywords to analyze.`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'keyword_list_id', type: 'integer', required: false, description: `ID of the saved keyword list to use.` }, + { name: 'keywords', type: 'string', required: false, description: `Comma-separated list of keywords to analyze.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'terms', type: 'string', required: false, description: `No description.` }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, { name: 'view_for', type: 'string', required: false, description: `No description.` }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_keywords_explorer_search_suggestions', description: `Retrieve keyword search suggestions and metrics such as search volume, difficulty, and CPC for specified queries, with filtering and sorting options.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'keyword_list_id', - type: 'integer', - required: false, - description: `ID of the saved keyword list to use.`, - }, - { - name: 'keywords', - type: 'string', - required: false, - description: `Comma-separated list of keywords to analyze.`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'keyword_list_id', type: 'integer', required: false, description: `ID of the saved keyword list to use.` }, + { name: 'keywords', type: 'string', required: false, description: `Comma-separated list of keywords to analyze.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { @@ -2340,115 +592,50 @@ export const tools: Tool[] = [ description: `Retrieves search volume metrics for a specified keyword broken down by country. Requests will not consume API units if you use only "ahrefs" or "wordcount" in the \`keywords\` or \`keyword\` query parameter.`, params: [ { name: 'keyword', type: 'string', required: true, description: `Keyword to analyze.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_keywords_explorer_volume_history', description: `Retrieves historical search volume data for a specified keyword within a given country and date range. Requests will not consume API units if you use only "ahrefs" or "wordcount" in the \`keywords\` or \`keyword\` query parameter.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, { name: 'keyword', type: 'string', required: true, description: `Keyword to analyze.` }, - { - name: 'date_from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_management_brand_radar_prompts', description: `Retrieves custom prompts for a specific brand radar report. Requests to this endpoint are free and do not consume any API units.`, params: [ - { - name: 'report_id', - type: 'string', - required: true, - description: `ID of the brand radar report to query.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'report_id', type: 'string', required: true, description: `ID of the brand radar report to query.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_management_brand_radar_reports', description: `Retrieves the list of custom brand radar reports. Requests to this endpoint are free and do not consume any API units.`, params: [ - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_management_keyword_list_keywords', description: `Retrieves keywords from a keyword list. Requests to this endpoint are free and do not consume any API units.`, params: [ - { - name: 'keyword_list_id', - type: 'integer', - required: true, - description: `ID of the saved keyword list to use.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'keyword_list_id', type: 'integer', required: true, description: `ID of the saved keyword list to use.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_management_locations', description: `Retrieves a list of management locations filtered by country code and optionally by US state.`, params: [ - { - name: 'country_code', - type: 'string', - required: true, - description: `Two-letter ISO country code.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'country_code', type: 'string', required: true, description: `Two-letter ISO country code.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'us_state', type: 'string', required: false, description: `No description.` }, ], }, @@ -2456,36 +643,16 @@ export const tools: Tool[] = [ name: 'ahrefsmcp_management_project_competitors', description: `Retrieves the list of competitors associated with a specific Rank Tracker project in Ahrefs, using the project's unique identifier.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_management_project_keywords', description: `Returns all tracked keywords for a specific Rank Tracker project, including associated tracking metadata.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { @@ -2494,356 +661,101 @@ export const tools: Tool[] = [ params: [ { name: 'access', type: 'string', required: false, description: `No description.` }, { name: 'has_keywords', type: 'boolean', required: false, description: `No description.` }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'owned_by', type: 'string', required: false, description: `No description.` }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, ], }, { name: 'ahrefsmcp_public_crawler_ip_ranges', description: `Returns the IP ranges used by the Ahrefs public web crawler, typically for allowlisting or firewall configuration.`, params: [ - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_public_crawler_ips', description: `Returns the list of individual IP addresses currently used by the Ahrefs public web crawler.`, params: [ - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_rank_tracker_competitors_overview', description: `Provides an overview of competitor rankings and keyword metrics for a specified project and date in Ahrefs Rank Tracker, allowing comparison between current and previous data.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: true, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: true, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_rank_tracker_competitors_pages', description: `Provides an overview of competitor pages and keyword metrics for a specified project and date in Ahrefs Rank Tracker, allowing comparison between current and previous data.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: true, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'target_and_tracked_competitors_only', - type: 'boolean', - required: false, - description: `No description.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: true, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'target_and_tracked_competitors_only', type: 'boolean', required: false, description: `No description.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_rank_tracker_competitors_stats', description: `Provides an overview of competitor metrics for a specified project and date in Ahrefs Rank Tracker. Metrics include: share of voice, share of traffic value, average position, traffic, traffic value, and positions, and counts of SERP features.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: true, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: true, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_rank_tracker_overview', description: `Provides an overview of tracked keyword rankings and related search metrics for a specified project and date, with support for historical comparison, filtering, column selection, and device type.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'device', - type: 'string', - required: true, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'device', type: 'string', required: true, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_rank_tracker_serp_overview', description: `Returns SERP overview for a specified keyword in a Rank Tracker project, showing detailed information about each position including title, URL, type, backlink metrics, and traffic data.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'device', - type: 'string', - required: true, - description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'device', type: 'string', required: true, description: `Device type filter: \`desktop\`, \`mobile\`, or \`tablet\`.` }, { name: 'keyword', type: 'string', required: true, description: `Keyword to analyze.` }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'language_code', - type: 'string', - required: false, - description: `BCP-47 language code (e.g. \`en\`, \`fr\`).`, - }, - { - name: 'location_id', - type: 'integer', - required: false, - description: `Numeric ID of the target location.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'language_code', type: 'string', required: false, description: `BCP-47 language code (e.g. \`en\`, \`fr\`).` }, + { name: 'location_id', type: 'integer', required: false, description: `Numeric ID of the target location.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'top_positions', type: 'integer', required: false, description: `No description.` }, ], }, @@ -2880,31 +792,11 @@ export const tools: Tool[] = [ name: 'ahrefsmcp_serp_overview', description: `Retrieve an overview of the top search results for a specified keyword and country, including position, backlinks, traffic, domain rating, and related keywords.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, { name: 'keyword', type: 'string', required: true, description: `Keyword to analyze.` }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'top_positions', type: 'integer', required: false, description: `No description.` }, ], }, @@ -2912,152 +804,47 @@ export const tools: Tool[] = [ name: 'ahrefsmcp_site_audit_issues', description: `Returns all issues from your Site Audit crawl. By default, it provides data from the latest available crawl, but you can also specify a crawl date and time to retrieve historical metrics.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_site_audit_page_content', description: `Returns the HTML and extracted text content of a page from your Site Audit crawl. By default, it provides the latest available snapshot, but you can also specify a crawl date and time to retrieve historical snapshots.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target_url', - type: 'string', - required: true, - description: `Full URL to analyze (e.g. \`https://ahrefs.com/blog/\`).`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target_url', type: 'string', required: true, description: `Full URL to analyze (e.g. \`https://ahrefs.com/blog/\`).` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_site_audit_page_explorer', description: `Returns detailed information about pages discovered in a Site Audit project, including URLs, crawl metadata, and selected on-page metrics.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, { name: 'filter_mode', type: 'string', required: false, description: `No description.` }, { name: 'issue_id', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'select', - type: 'string', - required: false, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'select', type: 'string', required: false, description: `Comma-separated list of fields to include in the response.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_audit_projects', description: `Returns Site Audit project summaries (all projects or a specific project), including health scores, issue counts, and crawled page counts for the latest crawl or a specified historical point in time.`, params: [ - { - name: 'date', - type: 'string', - required: false, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: false, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'date', type: 'string', required: false, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'project_id', type: 'integer', required: false, description: `Numeric ID of the Ahrefs project.` }, { name: 'project_name', type: 'string', required: false, description: `No description.` }, { name: 'project_url', type: 'string', required: false, description: `No description.` }, ], @@ -3066,1532 +853,397 @@ export const tools: Tool[] = [ name: 'ahrefsmcp_site_explorer_all_backlinks', description: `Retrieves detailed information about all backlinks pointing to a specified URL or domain, with extensive filtering, sorting, selection, and aggregation options.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, { name: 'aggregation', type: 'string', required: false, description: `No description.` }, { name: 'history', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_anchors', description: `Retrieves anchor text and associated backlink metrics for a specified domain or URL, with filtering and selection options.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, { name: 'history', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_backlinks_stats', description: `Provides backlink statistics for a specified URL or domain as of a given date, with options to control protocol and scope.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_broken_backlinks', description: `Retrieves a list of broken backlinks (i.e., links pointing to non-functioning pages) for a specified domain or URL, with customizable filtering, field selection, and aggregation options.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, { name: 'aggregation', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_crawled_pages', description: `Returns a list of pages crawled by Ahrefs for a specified domain or URL, including the page URLs.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_domain_rating', description: `Retrieve the domain rating and related metrics for a specified domain or URL as of a specific date.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_domain_rating_history', description: `Retrieve historical domain rating data for a specified domain or URL over a defined date range and grouping interval.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_keywords_history', description: `Retrieves historical data on the number of organic keywords a specified website or URL has ranked for, segmented by various search position ranges and grouped by a chosen time interval.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'select', - type: 'string', - required: false, - description: `Comma-separated list of fields to include in the response.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'select', type: 'string', required: false, description: `Comma-separated list of fields to include in the response.` }, ], }, { name: 'ahrefsmcp_site_explorer_linked_anchors_external', description: `Retrieves data about external anchor text (the clickable words in outbound links) used on a specified domain, subdomain, or URL, including metrics like dofollow link counts, distinct linked domains, and other attributes about the links.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_linked_anchors_internal', description: `Retrieves internal anchor text data for a given website or URL, detailing how anchor texts are used in links between pages on the same site.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_linked_domains', description: `Retrieves information about external domains that are linked from a specified target domain or URL, allowing for filtering, field selection, and various scopes of analysis.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_metrics', description: `Provides SEO performance metrics for a specified domain, URL, or site section as of a given date, with options to customize search scope, protocol, country, and search volume mode.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_metrics_by_country', description: `Provides organic and paid search performance metrics for a specified website, broken down by country, for a specific date.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'select', - type: 'string', - required: false, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'select', type: 'string', required: false, description: `Comma-separated list of fields to include in the response.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_metrics_history', description: `Retrieves historical data on key organic and paid search traffic and cost metrics for a specified domain, URL, or path over a selectable date range and grouping interval.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'select', - type: 'string', - required: false, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'select', type: 'string', required: false, description: `Comma-separated list of fields to include in the response.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_organic_competitors', description: `Retrieves a list of organic search competitors for a specified website or URL, providing comparative SEO metrics such as common keywords, traffic estimations, and domain strength for a chosen country and date.`, params: [ - { - name: 'country', - type: 'string', - required: true, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'country', type: 'string', required: true, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_organic_keywords', description: `Retrieves detailed organic keyword data for a given domain, URL, or path, including rankings, search intent, SERP features, traffic and CPC metrics, with the ability to filter, sort, and compare metrics across dates and regions.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_outlinks_stats', description: `Retrieves statistical data about the outbound links (outlinks) from a specified URL, domain, or site section.`, params: [ - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_pages_by_backlinks', description: `Returns a list of a site's or URL's best-performing pages, ranked by the number of referring external links, with flexible filtering and sorting options.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, { name: 'history', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_pages_by_internal_links', description: `Retrieves a site's or page's internal link metrics, allowing analysis of how pages within the given domain or URL are interconnected and which pages receive the most internal links.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_pages_by_traffic', description: `Returns the distribution of pages by estimated organic traffic buckets for a specified domain or URL, across all locations or for a specified country.`, params: [ - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_pages_history', description: `Retrieves historical data about pages from a specified domain, URL, or section of a site, grouped by a chosen time interval.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'page_positions', type: 'string', required: false, description: `No description.` }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_paid_pages', description: `Returns detailed metrics about pages on a specified site or URL that are ranking in paid search results, including traffic, keyword data, ad presence, and changes over time, with powerful filtering and comparison capabilities.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_refdomains_history', description: `Provides historical data on referring domains linking to a specified target (domain or URL) over a defined date range, with customizable grouping and analysis scope.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_referring_domains', description: `Retrieves detailed information about referring domains that link to a specified target domain or URL, with flexible filtering, selection, and sorting of backlink-related metrics.`, params: [ - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, { name: 'history', type: 'string', required: false, description: `No description.` }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_top_pages', description: `Returns a list of the top-performing pages for a specified website or URL, including detailed SEO metrics (such as organic rankings, traffic, top keyword, and changes over time), with support for comparison between two dates and flexible filtering.`, params: [ - { - name: 'date', - type: 'string', - required: true, - description: `Target date for the snapshot (YYYY-MM-DD).`, - }, - { - name: 'select', - type: 'string', - required: true, - description: `Comma-separated list of fields to include in the response.`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_compared', - type: 'string', - required: false, - description: `Comparison date for period-over-period analysis (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, - { - name: 'timeout', - type: 'integer', - required: false, - description: `Request timeout in seconds.`, - }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'date', type: 'string', required: true, description: `Target date for the snapshot (YYYY-MM-DD).` }, + { name: 'select', type: 'string', required: true, description: `Comma-separated list of fields to include in the response.` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_compared', type: 'string', required: false, description: `Comparison date for period-over-period analysis (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, + { name: 'timeout', type: 'integer', required: false, description: `Request timeout in seconds.` }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_site_explorer_total_search_volume_history', description: `Returns historical totals of search volume for keywords that the specified domain or URL ranks for in the top 10 or top 100 results, across all countries or for a specified country.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'mode', - type: 'string', - required: false, - description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'protocol', - type: 'string', - required: false, - description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'country', type: 'string', required: false, description: `Two-letter ISO country code to filter data (e.g. \`us\`, \`gb\`, \`de\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'mode', type: 'string', required: false, description: `Scope of analysis: \`exact\`, \`prefix\`, \`domain\`, or \`subdomains\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'protocol', type: 'string', required: false, description: `URL protocol to include: \`http\`, \`https\`, or \`both\`.` }, { name: 'top_positions', type: 'string', required: false, description: `No description.` }, - { - name: 'volume_mode', - type: 'string', - required: false, - description: `How to calculate search volume: \`monthly\` or \`average\`.`, - }, + { name: 'volume_mode', type: 'string', required: false, description: `How to calculate search volume: \`monthly\` or \`average\`.` }, ], }, { name: 'ahrefsmcp_site_explorer_url_rating_history', description: `Retrieve historical URL rating data for a specified domain or URL over a defined date range, grouped by a chosen time interval.`, params: [ - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'target', - type: 'string', - required: true, - description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'history_grouping', - type: 'string', - required: false, - description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'target', type: 'string', required: true, description: `Domain, URL, or path to analyze (e.g. \`ahrefs.com\`).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'history_grouping', type: 'string', required: false, description: `How to group historical data: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { @@ -4599,24 +1251,14 @@ export const tools: Tool[] = [ description: `Get the activity history log for posts (published, scheduled, failed, etc.).`, params: [ { name: 'post_id', type: 'integer', required: true, description: `No description.` }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_social_media_authors', description: `List users who have created posts in the account.`, params: [ - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { @@ -4624,36 +1266,16 @@ export const tools: Tool[] = [ description: `Get historical follower count data for connected channels.`, params: [ { name: 'channel_id', type: 'string', required: true, description: `No description.` }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_social_media_channels', description: `List social media channels with their connection status and metadata.`, params: [ - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { @@ -4661,76 +1283,26 @@ export const tools: Tool[] = [ description: `Get engagement metrics (views, likes, etc.) for a specific post.`, params: [ { name: 'channel_id', type: 'string', required: true, description: `No description.` }, - { - name: 'date_from', - type: 'string', - required: true, - description: `Start date for the data range (YYYY-MM-DD).`, - }, + { name: 'date_from', type: 'string', required: true, description: `Start date for the data range (YYYY-MM-DD).` }, { name: 'external_post_id', type: 'string', required: true, description: `No description.` }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_social_media_posts', description: `List social media posts with filtering by channel, status, and author.`, params: [ - { - name: 'status', - type: 'string', - required: true, - description: `Status filter for the resource.`, - }, + { name: 'status', type: 'string', required: true, description: `Status filter for the resource.` }, { name: 'author_ids', type: 'string', required: false, description: `No description.` }, { name: 'channel_ids', type: 'string', required: false, description: `No description.` }, - { - name: 'date_from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'date_to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'offset', - type: 'integer', - required: false, - description: `Number of results to skip for pagination.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, + { name: 'date_from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'date_to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of results to skip for pagination.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, { name: 'order_direction', type: 'string', required: false, description: `No description.` }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'search_query', type: 'string', required: false, description: `No description.` }, ], }, @@ -4738,1620 +1310,450 @@ export const tools: Tool[] = [ name: 'ahrefsmcp_subscription_info_limits_and_usage', description: `Retrieves subscription information including limits and usage statistics for API units, workspace quotas, and API key details. This endpoint is free and does not consume any API units.`, params: [ - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, ], }, { name: 'ahrefsmcp_web_analytics_browser_versions', description: `Returns browser version statistics for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by browser version.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_browser_versions_chart', description: `Returns time-series chart data grouped by browser version for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'browser_version_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'browser_version_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_browsers', description: `Returns browser statistics for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by browser.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_browsers_chart', description: `Returns time-series chart data grouped by browser for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, { name: 'browser_to_chart', type: 'string', required: false, description: `No description.` }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_chart', description: `Returns time-series chart data for aggregate statistics of a Web Analytics project, with metrics like pageviews, visitors, visits, bounce rate, and session duration at the specified granularity.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_cities', description: `Returns visitor data grouped by city for a Web Analytics project, showing visitor counts for each location.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_cities_chart', description: `Returns time-series chart data grouped by city for a Web Analytics project, showing visitor counts over time for each location.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, { name: 'cities_to_chart', type: 'string', required: false, description: `No description.` }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_continents', description: `Returns visitor data grouped by continent for a Web Analytics project, showing visitor counts for each region.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_continents_chart', description: `Returns time-series chart data grouped by continent for a Web Analytics project, showing visitor counts over time for each region.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'continents_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'continents_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_countries', description: `Returns visitor data grouped by country for a Web Analytics project, showing visitor counts for each location.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_countries_chart', description: `Returns time-series chart data grouped by country for a Web Analytics project, showing visitor counts over time for each location.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'countries_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'countries_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_devices', description: `Returns device type statistics for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by device type.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_devices_chart', description: `Returns time-series chart data grouped by device type for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, { name: 'devices_to_chart', type: 'string', required: false, description: `No description.` }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_entry_pages', description: `Returns entry page statistics for a Web Analytics project, showing which pages visitors land on first, including visitor counts and entry rates.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_entry_pages_chart', description: `Returns time-series chart data for entry pages of a Web Analytics project, showing visitor counts and entry rates over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'entry_pages_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'entry_pages_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_exit_pages', description: `Returns exit page statistics for a Web Analytics project, showing which pages visitors leave from, including visitor counts and exit rates.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_exit_pages_chart', description: `Returns time-series chart data for exit pages of a Web Analytics project, showing visitor counts and exit rates over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'exit_pages_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'exit_pages_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_languages', description: `Returns visitor data grouped by browser language for a Web Analytics project, showing visitor counts for each language.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_languages_chart', description: `Returns time-series chart data grouped by browser language for a Web Analytics project, showing visitor counts over time for each language.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'browser_language_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'browser_language_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_operating_systems', description: `Returns operating system statistics for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by OS.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_operating_systems_chart', description: `Returns time-series chart data grouped by operating system for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, { name: 'os_to_chart', type: 'string', required: false, description: `No description.` }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_operating_systems_versions', description: `Returns OS version statistics for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by OS version.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_operating_systems_versions_chart', description: `Returns time-series chart data grouped by OS version for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'os_versions_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'os_versions_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_referrers', description: `Returns referrer statistics for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by referrer URL.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_referrers_chart', description: `Returns time-series chart data grouped by referrer for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'source_referers_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'source_referers_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_source_channels', description: `Returns traffic grouped by source channel (e.g., organic, paid, social, direct) for a Web Analytics project, including visitor counts, bounce rates, and session durations.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_source_channels_chart', description: `Returns time-series chart data grouped by source channel (e.g., organic, paid, social, direct) for a Web Analytics project, showing metrics over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'source_channels_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'source_channels_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_sources', description: `Returns traffic source breakdown for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by referral source.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_sources_chart', description: `Returns time-series chart data for traffic sources of a Web Analytics project, showing how visitor counts, bounce rates, and session durations change over time for each referral source.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'sources_to_chart', type: 'string', required: false, description: `No description.` }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_stats', description: `Returns aggregate statistics for a Web Analytics project, including total visitors, bounce rate, and average session duration without any dimension grouping.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_top_pages', description: `Returns the most visited pages for a Web Analytics project, including pageview counts, visitor counts, bounce rates, and average page visit durations.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_top_pages_chart', description: `Returns time-series chart data for the most visited pages of a Web Analytics project, showing how pageviews, visitors, and other metrics change over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, { name: 'pages_to_chart', type: 'string', required: false, description: `No description.` }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_utm_params', description: `Returns statistics for a specified UTM paramater for a Web Analytics project, showing visitor counts, bounce rates, and session durations grouped by utm_source.`, params: [ - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'utm_param', - type: 'string', - required: true, - description: `UTM parameter name to group web analytics by (e.g. \`utm_campaign\`).`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Maximum number of results to return.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'utm_param', type: 'string', required: true, description: `UTM parameter name to group web analytics by (e.g. \`utm_campaign\`).` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order as an array of \`field:asc\` or \`field:desc\` strings.` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, { name: 'ahrefsmcp_web_analytics_utm_params_chart', description: `Returns time-series chart data grouped by a specified UTM param for a Web Analytics project, showing visitor counts, bounce rates, and session durations over time.`, params: [ - { - name: 'granularity', - type: 'string', - required: true, - description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.`, - }, - { - name: 'project_id', - type: 'integer', - required: true, - description: `Numeric ID of the Ahrefs project.`, - }, - { - name: 'utm_param', - type: 'string', - required: true, - description: `UTM parameter name to group web analytics by (e.g. \`utm_campaign\`).`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Start date for the data range (YYYY-MM-DD).`, - }, - { - name: 'output', - type: 'string', - required: false, - description: `Response format. Use \`json\` (default) or \`csv\`.`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `End date for the data range (YYYY-MM-DD).`, - }, - { - name: 'utm_params_to_chart', - type: 'string', - required: false, - description: `No description.`, - }, - { - name: 'where', - type: 'string', - required: false, - description: `Filter expression in Ahrefs API filter syntax.`, - }, + { name: 'granularity', type: 'string', required: true, description: `Time granularity for aggregation: \`daily\`, \`weekly\`, or \`monthly\`.` }, + { name: 'project_id', type: 'integer', required: true, description: `Numeric ID of the Ahrefs project.` }, + { name: 'utm_param', type: 'string', required: true, description: `UTM parameter name to group web analytics by (e.g. \`utm_campaign\`).` }, + { name: 'from', type: 'string', required: false, description: `Start date for the data range (YYYY-MM-DD).` }, + { name: 'output', type: 'string', required: false, description: `Response format. Use \`json\` (default) or \`csv\`.` }, + { name: 'to', type: 'string', required: false, description: `End date for the data range (YYYY-MM-DD).` }, + { name: 'utm_params_to_chart', type: 'string', required: false, description: `No description.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression in Ahrefs API filter syntax.` }, ], }, ] diff --git a/src/data/agent-connectors/atlassianmcp.ts b/src/data/agent-connectors/atlassianmcp.ts index 60c30c341..ce507e8e6 100644 --- a/src/data/agent-connectors/atlassianmcp.ts +++ b/src/data/agent-connectors/atlassianmcp.ts @@ -5,1408 +5,415 @@ export const tools: Tool[] = [ name: 'atlassianmcp_addcommenttojiraissue', description: `Add a comment to an existing Jira issue.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'commentBody', - type: 'string', - required: true, - description: `The text content of the comment to add.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'commentVisibility', - type: 'object', - required: false, - description: `Restrict comment visibility as JSON (e.g. {"type": "role", "value": "Dev Team"}).`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'responseContentFormat', - type: 'string', - required: false, - description: `Format to return content in — markdown (default) or adf.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'commentBody', type: 'string', required: true, description: `The text content of the comment to add.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'commentVisibility', type: 'object', required: false, description: `Restrict comment visibility as JSON (e.g. {"type": "role", "value": "Dev Team"}).` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'responseContentFormat', type: 'string', required: false, description: `Format to return content in — markdown (default) or adf.` }, ], }, { name: 'atlassianmcp_addworklogtojiraissue', description: `Log time spent on a Jira issue by adding a worklog entry.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'timeSpent', - type: 'string', - required: true, - description: `Time spent on the issue, in Jira duration format (e.g. 1h, 2h 30m, 1d).`, - }, - { - name: 'commentBody', - type: 'string', - required: false, - description: `The text content of the comment to add.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'started', - type: 'string', - required: false, - description: `The date and time the work started, in ISO 8601 format (e.g. 2026-05-15T10:00:00.000+0000).`, - }, - { - name: 'visibility', - type: 'object', - required: false, - description: `Restrict worklog visibility as JSON (e.g. {"type": "role", "value": "Dev Team"}).`, - }, - { - name: 'worklogId', - type: 'string', - required: false, - description: `The ID of an existing worklog entry to update.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'timeSpent', type: 'string', required: true, description: `Time spent on the issue, in Jira duration format (e.g. 1h, 2h 30m, 1d).` }, + { name: 'commentBody', type: 'string', required: false, description: `The text content of the comment to add.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'started', type: 'string', required: false, description: `The date and time the work started, in ISO 8601 format (e.g. 2026-05-15T10:00:00.000+0000).` }, + { name: 'visibility', type: 'object', required: false, description: `Restrict worklog visibility as JSON (e.g. {"type": "role", "value": "Dev Team"}).` }, + { name: 'worklogId', type: 'string', required: false, description: `The ID of an existing worklog entry to update.` }, ], }, { name: 'atlassianmcp_atlassianuserinfo', description: `Retrieve the profile information for the currently authenticated Atlassian user.`, - params: [], + params: [ + ], }, { name: 'atlassianmcp_createcompasscomponent', description: `Create a new component in Atlassian Compass (e.g. a service, library, or application).`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'name', - type: 'string', - required: true, - description: `Name of the Compass component.`, - }, - { - name: 'typeId', - type: 'string', - required: true, - description: `Type ID of the Compass component (e.g. SERVICE, LIBRARY, APPLICATION).`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `A human-readable description of this Compass component.`, - }, - { - name: 'labels', - type: 'array', - required: false, - description: `Labels to attach to this Compass component.`, - }, - { - name: 'ownerId', - type: 'string', - required: false, - description: `Atlassian account ID of the component owner.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'name', type: 'string', required: true, description: `Name of the Compass component.` }, + { name: 'typeId', type: 'string', required: true, description: `Type ID of the Compass component (e.g. SERVICE, LIBRARY, APPLICATION).` }, + { name: 'description', type: 'string', required: false, description: `The full description of the Jira issue.` }, + { name: 'labels', type: 'array', required: false, description: `List of space labels to filter by.` }, + { name: 'ownerId', type: 'string', required: false, description: `Atlassian account ID of the component owner.` }, ], }, { name: 'atlassianmcp_createcompasscomponentrelationship', description: `Create a dependency or relationship between two Compass components.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'fromComponentId', - type: 'string', - required: true, - description: `The ID of the source Compass component in the relationship.`, - }, - { - name: 'relationshipType', - type: 'string', - required: true, - description: `The type of relationship between components (e.g. DEPENDS_ON).`, - }, - { - name: 'toComponentId', - type: 'string', - required: true, - description: `The ID of the target Compass component in the relationship.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'fromComponentId', type: 'string', required: true, description: `The ID of the source Compass component in the relationship.` }, + { name: 'relationshipType', type: 'string', required: true, description: `The type of relationship between components (e.g. DEPENDS_ON).` }, + { name: 'toComponentId', type: 'string', required: true, description: `The ID of the target Compass component in the relationship.` }, ], }, { name: 'atlassianmcp_createcompasscustomfielddefinition', description: `Define a new custom field for Compass components in your workspace.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'input', - type: 'object', - required: true, - description: `Custom field definition as JSON (fields: name, type, description).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'input', type: 'object', required: true, description: `Custom field definition as JSON (fields: name, type, description).` }, ], }, { name: 'atlassianmcp_createconfluencefootercomment', description: `Add a footer comment to a Confluence page, blog post, or other content.`, params: [ - { - name: 'body', - type: 'string', - required: true, - description: `The body content of the Confluence page or comment, in the format specified by contentFormat.`, - }, - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'attachmentId', - type: 'string', - required: false, - description: `The ID of the attachment to comment on.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'customContentId', - type: 'string', - required: false, - description: `The ID of the custom content to comment on.`, - }, - { - name: 'pageId', - type: 'string', - required: false, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'parentCommentId', - type: 'string', - required: false, - description: `Optional ID of the parent comment, for creating a reply.`, - }, + { name: 'body', type: 'string', required: true, description: `The body content of the Confluence page or comment, in the format specified by contentFormat.` }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'attachmentId', type: 'string', required: false, description: `The ID of the attachment to comment on.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'customContentId', type: 'string', required: false, description: `The ID of the custom content to comment on.` }, + { name: 'pageId', type: 'string', required: false, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'parentCommentId', type: 'string', required: false, description: `Optional ID of the parent comment, for creating a reply.` }, ], }, { name: 'atlassianmcp_createconfluenceinlinecomment', description: `Add an inline comment anchored to selected text on a Confluence page.`, params: [ - { - name: 'body', - type: 'string', - required: true, - description: `The body content of the Confluence page or comment, in the format specified by contentFormat.`, - }, - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'inlineCommentProperties', - type: 'object', - required: false, - description: `Inline comment anchor as JSON: {"textSelection": "", "textSelectionMatchCount": N, "textSelectionMatchIndex": N}.`, - }, - { - name: 'pageId', - type: 'string', - required: false, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'parentCommentId', - type: 'string', - required: false, - description: `Optional ID of the parent comment, for creating a reply.`, - }, + { name: 'body', type: 'string', required: true, description: `The body content of the Confluence page or comment, in the format specified by contentFormat.` }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'inlineCommentProperties', type: 'object', required: false, description: `Inline comment anchor as JSON: {"textSelection": "", "textSelectionMatchCount": N, "textSelectionMatchIndex": N}.` }, + { name: 'pageId', type: 'string', required: false, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'parentCommentId', type: 'string', required: false, description: `Optional ID of the parent comment, for creating a reply.` }, ], }, { name: 'atlassianmcp_createconfluencepage', description: `Create a new Confluence page in a space, optionally nested under a parent page.`, params: [ - { - name: 'body', - type: 'string', - required: true, - description: `The body content of the Confluence page or comment, in the format specified by contentFormat.`, - }, - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'spaceId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence space. Use getConfluenceSpaces to list available spaces.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'isPrivate', - type: 'boolean', - required: false, - description: `Set to true to create the page as private (only visible to the creator).`, - }, - { - name: 'parentId', - type: 'string', - required: false, - description: `The ID of the parent page under which to create or move this page.`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by content status (e.g. current, archived, trashed).`, - }, - { - name: 'subtype', - type: 'string', - required: false, - description: `Confluence page subtype (e.g. live for live pages).`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `The title of the Confluence page.`, - }, + { name: 'body', type: 'string', required: true, description: `The body content of the Confluence page or comment, in the format specified by contentFormat.` }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'spaceId', type: 'string', required: true, description: `The numeric ID of the Confluence space. Use getConfluenceSpaces to list available spaces.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'isPrivate', type: 'boolean', required: false, description: `Set to true to create the page as private (only visible to the creator).` }, + { name: 'parentId', type: 'string', required: false, description: `The ID of the parent page under which to create or move this page.` }, + { name: 'status', type: 'string', required: false, description: `Filter by content status (e.g. current, archived, trashed).` }, + { name: 'subtype', type: 'string', required: false, description: `Confluence page subtype (e.g. live for live pages).` }, + { name: 'title', type: 'string', required: false, description: `The title of the Confluence page.` }, ], }, { name: 'atlassianmcp_createissuelink', description: `Link two Jira issues together with a relationship type (e.g. Relates, Blocks, Duplicate).`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'inwardIssue', - type: 'string', - required: true, - description: `The key of the inward issue in the link (e.g. KAN-1).`, - }, - { - name: 'outwardIssue', - type: 'string', - required: true, - description: `The key of the outward issue in the link (e.g. KAN-2).`, - }, - { - name: 'type', - type: 'string', - required: true, - description: `Space type filter (e.g. global or personal).`, - }, - { - name: 'comment', - type: 'string', - required: false, - description: `An optional comment to attach to the issue link.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'inwardIssue', type: 'string', required: true, description: `The key of the inward issue in the link (e.g. KAN-1).` }, + { name: 'outwardIssue', type: 'string', required: true, description: `The key of the outward issue in the link (e.g. KAN-2).` }, + { name: 'type', type: 'string', required: true, description: `Space type filter (e.g. global or personal).` }, + { name: 'comment', type: 'string', required: false, description: `An optional comment to attach to the issue link.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, ], }, { name: 'atlassianmcp_createjiraissue', description: `Create a new Jira issue in a project with the specified summary, type, and optional fields.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueTypeName', - type: 'string', - required: true, - description: `The name of the Jira issue type (e.g. Task, Story, Bug, Epic).`, - }, - { - name: 'projectKey', - type: 'string', - required: true, - description: `The Jira project key (e.g. KAN). Use getVisibleJiraProjects to list available projects.`, - }, - { - name: 'summary', - type: 'string', - required: true, - description: `A short summary of the Jira issue (the issue title).`, - }, - { - name: 'additional_fields', - type: 'object', - required: false, - description: `Additional Jira fields to set on creation, as a JSON object (e.g. priority, labels).`, - }, - { - name: 'assignee_account_id', - type: 'string', - required: false, - description: `Atlassian account ID of the user to assign. Use lookupJiraAccountId to find account IDs.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `The full description of the Jira issue.`, - }, - { - name: 'parent', - type: 'string', - required: false, - description: `The parent issue key (e.g. KAN-1) for creating subtasks or child issues.`, - }, - { - name: 'responseContentFormat', - type: 'string', - required: false, - description: `Format to return content in — markdown (default) or adf.`, - }, - { - name: 'transition', - type: 'object', - required: false, - description: `The transition to perform, as JSON: {"id": ""}. Use getTransitionsForJiraIssue to list valid transitions.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueTypeName', type: 'string', required: true, description: `The name of the Jira issue type (e.g. Task, Story, Bug, Epic).` }, + { name: 'projectKey', type: 'string', required: true, description: `The Jira project key (e.g. KAN). Use getVisibleJiraProjects to list available projects.` }, + { name: 'summary', type: 'string', required: true, description: `A short summary of the Jira issue (the issue title).` }, + { name: 'additional_fields', type: 'object', required: false, description: `Additional Jira fields to set on creation, as a JSON object (e.g. priority, labels).` }, + { name: 'assignee_account_id', type: 'string', required: false, description: `Atlassian account ID of the user to assign. Use lookupJiraAccountId to find account IDs.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'description', type: 'string', required: false, description: `The full description of the Jira issue.` }, + { name: 'parent', type: 'string', required: false, description: `The parent issue key (e.g. KAN-1) for creating subtasks or child issues.` }, + { name: 'responseContentFormat', type: 'string', required: false, description: `Format to return content in — markdown (default) or adf.` }, + { name: 'transition', type: 'object', required: false, description: `The transition to perform, as JSON: {"id": ""}. Use getTransitionsForJiraIssue to list valid transitions.` }, ], }, { name: 'atlassianmcp_editjiraissue', description: `Update fields on an existing Jira issue, such as summary, priority, or description.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'fields', - type: 'object', - required: true, - description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'responseContentFormat', - type: 'string', - required: false, - description: `Format to return content in — markdown (default) or adf.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'fields', type: 'object', required: true, description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'responseContentFormat', type: 'string', required: false, description: `Format to return content in — markdown (default) or adf.` }, ], }, { name: 'atlassianmcp_fetch', description: `Fetch details about any Atlassian object by its ARI (Atlassian Resource Identifier) or URL.`, params: [ - { - name: 'id', - type: 'string', - required: true, - description: `An ARI or URL identifying the object (e.g. ari:cloud:jira:...:issue/10059 or https://site.atlassian.net/browse/KAN-1).`, - }, - { - name: 'cloudId', - type: 'string', - required: false, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, + { name: 'id', type: 'string', required: true, description: `An ARI or URL identifying the object (e.g. ari:cloud:jira:...:issue/10059 or https://site.atlassian.net/browse/KAN-1).` }, + { name: 'cloudId', type: 'string', required: false, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, ], }, { name: 'atlassianmcp_getaccessibleatlassianresources', description: `List all Atlassian cloud sites accessible to the authenticated user, including their cloud IDs.`, - params: [], + params: [ + ], }, { name: 'atlassianmcp_getcompasscomponent', description: `Retrieve details of a specific Compass component by its ID.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'componentId', - type: 'string', - required: true, - description: `The ID of the component to get`, - }, - { - name: 'includeCustomFieldsInResponse', - type: 'boolean', - required: false, - description: `Set to true to include custom field values in the component response.`, - }, - { - name: 'includeRelatedComponentsAndDependenciesInResponse', - type: 'boolean', - required: false, - description: `Set to true to include related components and dependencies.`, - }, - { - name: 'includeRelatedLinksInResponse', - type: 'boolean', - required: false, - description: `Set to true to include related links in the component response.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'componentId', type: 'string', required: true, description: `The ID of the component to get` }, + { name: 'includeCustomFieldsInResponse', type: 'boolean', required: false, description: `Set to true to include custom field values in the component response.` }, + { name: 'includeRelatedComponentsAndDependenciesInResponse', type: 'boolean', required: false, description: `Set to true to include related components and dependencies.` }, + { name: 'includeRelatedLinksInResponse', type: 'boolean', required: false, description: `Set to true to include related links in the component response.` }, ], }, { name: 'atlassianmcp_getcompasscomponents', description: `Search and list Compass components in a workspace, with optional filters.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'after', - type: 'string', - required: false, - description: `Cursor for fetching the next page of results.`, - }, - { - name: 'filters', - type: 'object', - required: false, - description: `Filter criteria for Compass components as JSON (e.g. {"typeIds": ["SERVICE"]}).`, - }, - { - name: 'maxResults', - type: 'number', - required: false, - description: `Maximum number of results to return per page.`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search query to find Atlassian content across Jira and Confluence.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'after', type: 'string', required: false, description: `Cursor for fetching the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Filter criteria for Compass components as JSON (e.g. {"typeIds": ["SERVICE"]}).` }, + { name: 'maxResults', type: 'number', required: false, description: `Maximum number of results to return per page.` }, + { name: 'query', type: 'string', required: false, description: `Search query to find Atlassian content across Jira and Confluence.` }, ], }, { name: 'atlassianmcp_getcompasscustomfielddefinitions', description: `List all custom field definitions configured in a Compass workspace.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, ], }, { name: 'atlassianmcp_getconfluencecommentchildren', description: `Retrieve replies to a specific Confluence comment.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'commentId', - type: 'string', - required: true, - description: `The ID of the Confluence comment to retrieve children for.`, - }, - { - name: 'commentType', - type: 'string', - required: true, - description: `Type of comment to retrieve children for: footer or inline.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'cursor', - type: 'string', - required: false, - description: `Cursor string for paginating through results.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, - { - name: 'sort', - type: 'string', - required: false, - description: `Sort order for results (e.g. created-date, -modified, title).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'commentId', type: 'string', required: true, description: `The ID of the Confluence comment to retrieve children for.` }, + { name: 'commentType', type: 'string', required: true, description: `Type of comment to retrieve children for: footer or inline.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'cursor', type: 'string', required: false, description: `Cursor string for paginating through results.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, + { name: 'sort', type: 'string', required: false, description: `Sort order for results (e.g. created-date, -modified, title).` }, ], }, { name: 'atlassianmcp_getconfluencepage', description: `Retrieve the content and metadata of a specific Confluence page by its ID.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'pageId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'pageId', type: 'string', required: true, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, ], }, { name: 'atlassianmcp_getconfluencepagedescendants', description: `List all pages nested under a Confluence page, up to a specified depth.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'pageId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'cursor', - type: 'string', - required: false, - description: `Cursor string for paginating through results.`, - }, - { - name: 'depth', - type: 'number', - required: false, - description: `How deep to fetch descendants — all for the full tree or 1 for direct children only.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'pageId', type: 'string', required: true, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'cursor', type: 'string', required: false, description: `Cursor string for paginating through results.` }, + { name: 'depth', type: 'number', required: false, description: `How deep to fetch descendants — all for the full tree or 1 for direct children only.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, ], }, { name: 'atlassianmcp_getconfluencepagefootercomments', description: `List footer comments on a Confluence page, optionally including replies.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'pageId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'cursor', - type: 'string', - required: false, - description: `Cursor string for paginating through results.`, - }, - { - name: 'includeReplies', - type: 'boolean', - required: false, - description: `Whether to include comment replies in the response (true or false).`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, - { - name: 'repliesPerComment', - type: 'integer', - required: false, - description: `Maximum number of replies to include per comment.`, - }, - { - name: 'sort', - type: 'string', - required: false, - description: `Sort order for results (e.g. created-date, -modified, title).`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by content status (e.g. current, archived, trashed).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'pageId', type: 'string', required: true, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'cursor', type: 'string', required: false, description: `Cursor string for paginating through results.` }, + { name: 'includeReplies', type: 'boolean', required: false, description: `Whether to include comment replies in the response (true or false).` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, + { name: 'repliesPerComment', type: 'integer', required: false, description: `Maximum number of replies to include per comment.` }, + { name: 'sort', type: 'string', required: false, description: `Sort order for results (e.g. created-date, -modified, title).` }, + { name: 'status', type: 'string', required: false, description: `Filter by content status (e.g. current, archived, trashed).` }, ], }, { name: 'atlassianmcp_getconfluencepageinlinecomments', description: `List inline comments on a Confluence page, optionally filtered by resolution status.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'pageId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'cursor', - type: 'string', - required: false, - description: `Cursor string for paginating through results.`, - }, - { - name: 'includeReplies', - type: 'boolean', - required: false, - description: `Whether to include comment replies in the response (true or false).`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, - { - name: 'repliesPerComment', - type: 'integer', - required: false, - description: `Maximum number of replies to include per comment.`, - }, - { - name: 'resolutionStatus', - type: 'string', - required: false, - description: `Filter inline comments by resolution status (open or resolved).`, - }, - { - name: 'sort', - type: 'string', - required: false, - description: `Sort order for results (e.g. created-date, -modified, title).`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by content status (e.g. current, archived, trashed).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'pageId', type: 'string', required: true, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'cursor', type: 'string', required: false, description: `Cursor string for paginating through results.` }, + { name: 'includeReplies', type: 'boolean', required: false, description: `Whether to include comment replies in the response (true or false).` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, + { name: 'repliesPerComment', type: 'integer', required: false, description: `Maximum number of replies to include per comment.` }, + { name: 'resolutionStatus', type: 'string', required: false, description: `Filter inline comments by resolution status (open or resolved).` }, + { name: 'sort', type: 'string', required: false, description: `Sort order for results (e.g. created-date, -modified, title).` }, + { name: 'status', type: 'string', required: false, description: `Filter by content status (e.g. current, archived, trashed).` }, ], }, { name: 'atlassianmcp_getconfluencespaces', description: `List Confluence spaces accessible to the authenticated user, with optional filters.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'expand', - type: 'string', - required: false, - description: `Comma-separated list of fields to expand in the response.`, - }, - { - name: 'favoritedBy', - type: 'string', - required: false, - description: `Return spaces favourited by this user account ID.`, - }, - { - name: 'favourite', - type: 'boolean', - required: false, - description: `Set to true to return only spaces marked as favourite.`, - }, - { - name: 'ids', - type: 'string', - required: false, - description: `List of space IDs to filter by.`, - }, - { - name: 'keys', - type: 'string', - required: false, - description: `List of space keys to filter by.`, - }, - { - name: 'labels', - type: 'array', - required: false, - description: `List of space labels to filter by.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, - { - name: 'start', - type: 'number', - required: false, - description: `Index of the first result for pagination (defaults to 0).`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by content status (e.g. current, archived, trashed).`, - }, - { - name: 'type', - type: 'string', - required: false, - description: `Space type filter (e.g. global or personal).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'expand', type: 'string', required: false, description: `Comma-separated list of fields to expand in the response.` }, + { name: 'favoritedBy', type: 'string', required: false, description: `Return spaces favourited by this user account ID.` }, + { name: 'favourite', type: 'boolean', required: false, description: `Set to true to return only spaces marked as favourite.` }, + { name: 'ids', type: 'string', required: false, description: `List of space IDs to filter by.` }, + { name: 'keys', type: 'string', required: false, description: `List of space keys to filter by.` }, + { name: 'labels', type: 'string', required: false, description: `List of space labels to filter by.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, + { name: 'start', type: 'number', required: false, description: `Index of the first result for pagination (defaults to 0).` }, + { name: 'status', type: 'string', required: false, description: `Filter by content status (e.g. current, archived, trashed).` }, + { name: 'type', type: 'string', required: false, description: `Space type filter (e.g. global or personal).` }, ], }, { name: 'atlassianmcp_getissuelinktypes', description: `List all available issue link types in a Jira instance (e.g. Blocks, Relates, Duplicate).`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, ], }, { name: 'atlassianmcp_getjiraissue', description: `Retrieve the details of a specific Jira issue by its ID or key.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'expand', - type: 'string', - required: false, - description: `Comma-separated list of fields to expand in the response.`, - }, - { - name: 'failFast', - type: 'boolean', - required: false, - description: `Set to true to fail fast if any fields cannot be found.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.`, - }, - { - name: 'fieldsByKeys', - type: 'boolean', - required: false, - description: `Set to true to reference custom fields by their keys instead of IDs.`, - }, - { - name: 'properties', - type: 'array', - required: false, - description: `List of issue properties to include in the response.`, - }, - { - name: 'responseContentFormat', - type: 'string', - required: false, - description: `Format to return content in — markdown (default) or adf.`, - }, - { - name: 'updateHistory', - type: 'boolean', - required: false, - description: `Set to true to record that the issue was viewed in the user's history.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'expand', type: 'string', required: false, description: `Comma-separated list of fields to expand in the response.` }, + { name: 'failFast', type: 'boolean', required: false, description: `Set to true to fail fast if any fields cannot be found.` }, + { name: 'fields', type: 'array', required: false, description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.` }, + { name: 'fieldsByKeys', type: 'boolean', required: false, description: `Set to true to reference custom fields by their keys instead of IDs.` }, + { name: 'properties', type: 'array', required: false, description: `List of issue properties to include in the response.` }, + { name: 'responseContentFormat', type: 'string', required: false, description: `Format to return content in — markdown (default) or adf.` }, + { name: 'updateHistory', type: 'boolean', required: false, description: `Set to true to record that the issue was viewed in the user's history.` }, ], }, { name: 'atlassianmcp_getjiraissueremoteissuelinks', description: `List remote links (external resources) attached to a Jira issue.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'globalId', - type: 'string', - required: false, - description: `Optional global ID to filter remote issue links.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'globalId', type: 'string', required: false, description: `Optional global ID to filter remote issue links.` }, ], }, { name: 'atlassianmcp_getjiraissuetypemetawithfields', description: `Retrieve field metadata for a specific Jira issue type in a project.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueTypeId', - type: 'string', - required: true, - description: `The ID of the Jira issue type. Use getJiraProjectIssueTypesMetadata to list available types.`, - }, - { - name: 'projectIdOrKey', - type: 'string', - required: true, - description: `The Jira project ID or key (e.g. KAN or 10000). Use getVisibleJiraProjects to find it.`, - }, - { - name: 'maxResults', - type: 'number', - required: false, - description: `Maximum number of results to return per page.`, - }, - { - name: 'startAt', - type: 'number', - required: false, - description: `Index of the first result to return (for pagination, defaults to 0).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueTypeId', type: 'string', required: true, description: `The ID of the Jira issue type. Use getJiraProjectIssueTypesMetadata to list available types.` }, + { name: 'projectIdOrKey', type: 'string', required: true, description: `The Jira project ID or key (e.g. KAN or 10000). Use getVisibleJiraProjects to find it.` }, + { name: 'maxResults', type: 'number', required: false, description: `Maximum number of results to return per page.` }, + { name: 'startAt', type: 'number', required: false, description: `Index of the first result to return (for pagination, defaults to 0).` }, ], }, { name: 'atlassianmcp_getjiraprojectissuetypesmetadata', description: `List all issue types and their field metadata for a Jira project.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'projectIdOrKey', - type: 'string', - required: true, - description: `The Jira project ID or key (e.g. KAN or 10000). Use getVisibleJiraProjects to find it.`, - }, - { - name: 'maxResults', - type: 'number', - required: false, - description: `Maximum number of results to return per page.`, - }, - { - name: 'startAt', - type: 'number', - required: false, - description: `Index of the first result to return (for pagination, defaults to 0).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'projectIdOrKey', type: 'string', required: true, description: `The Jira project ID or key (e.g. KAN or 10000). Use getVisibleJiraProjects to find it.` }, + { name: 'maxResults', type: 'number', required: false, description: `Maximum number of results to return per page.` }, + { name: 'startAt', type: 'number', required: false, description: `Index of the first result to return (for pagination, defaults to 0).` }, ], }, { name: 'atlassianmcp_getpagesinconfluencespace', description: `List all pages in a Confluence space, optionally filtered by title or status.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'spaceId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence space. Use getConfluenceSpaces to list available spaces.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'cursor', - type: 'string', - required: false, - description: `Cursor string for paginating through results.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, - { - name: 'sort', - type: 'string', - required: false, - description: `Sort order for results (e.g. created-date, -modified, title).`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by content status (e.g. current, archived, trashed).`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `The title of the Confluence page.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'spaceId', type: 'string', required: true, description: `The numeric ID of the Confluence space. Use getConfluenceSpaces to list available spaces.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'cursor', type: 'string', required: false, description: `Cursor string for paginating through results.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, + { name: 'sort', type: 'string', required: false, description: `Sort order for results (e.g. created-date, -modified, title).` }, + { name: 'status', type: 'string', required: false, description: `Filter by content status (e.g. current, archived, trashed).` }, + { name: 'title', type: 'string', required: false, description: `The title of the Confluence page.` }, ], }, { name: 'atlassianmcp_getteamworkgraphcontext', description: `Retrieve the teamwork graph context for an Atlassian object, showing related work across Jira, Confluence, and Compass.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'objectIdentifier', - type: 'string', - required: true, - description: `Identifier for the object — an issue key (e.g. KAN-4), ARI, or URL.`, - }, - { - name: 'objectType', - type: 'string', - required: true, - description: `Type of the Atlassian object (e.g. JiraWorkItem, ConfluencePage, ConfluenceSpace, AtlassianUser, CompassComponent).`, - }, - { - name: 'after', - type: 'string', - required: false, - description: `Cursor for fetching the next page of results.`, - }, - { - name: 'detailLevel', - type: 'string', - required: false, - description: `Level of detail to return for related objects (FULL or MINIMAL).`, - }, - { - name: 'first', - type: 'integer', - required: false, - description: `Number of items to return in this page.`, - }, - { - name: 'relationshipTypes', - type: 'array', - required: false, - description: `Filter by specific relationship types (e.g. DEPENDS_ON, BLOCKED_BY).`, - }, - { - name: 'targetObjectTypes', - type: 'array', - required: false, - description: `Filter related objects by type (e.g. JiraWorkItem, ConfluencePage).`, - }, - { - name: 'timeRange', - type: 'object', - required: false, - description: `Optional time range filter as JSON: {"from": "", "to": ""}.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'objectIdentifier', type: 'string', required: true, description: `Identifier for the object — an issue key (e.g. KAN-4), ARI, or URL.` }, + { name: 'objectType', type: 'string', required: true, description: `Type of the Atlassian object (e.g. JiraWorkItem, ConfluencePage, ConfluenceSpace, AtlassianUser, CompassComponent).` }, + { name: 'after', type: 'string', required: false, description: `Cursor for fetching the next page of results.` }, + { name: 'detailLevel', type: 'string', required: false, description: `Level of detail to return for related objects (FULL or MINIMAL).` }, + { name: 'first', type: 'integer', required: false, description: `Number of items to return in this page.` }, + { name: 'relationshipTypes', type: 'array', required: false, description: `Filter by specific relationship types (e.g. DEPENDS_ON, BLOCKED_BY).` }, + { name: 'targetObjectTypes', type: 'array', required: false, description: `Filter related objects by type (e.g. JiraWorkItem, ConfluencePage).` }, + { name: 'timeRange', type: 'object', required: false, description: `Optional time range filter as JSON: {"from": "", "to": ""}.` }, ], }, { name: 'atlassianmcp_getteamworkgraphobject', description: `Hydrate one or more Atlassian objects from their URLs or ARIs to get their current state.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'objects', - type: 'array', - required: true, - description: `List of object URLs or ARIs to hydrate (e.g. https://site.atlassian.net/browse/KAN-1).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'objects', type: 'array', required: true, description: `List of object URLs or ARIs to hydrate (e.g. https://site.atlassian.net/browse/KAN-1).` }, ], }, { name: 'atlassianmcp_gettransitionsforjiraissue', description: `List all available workflow transitions for a Jira issue, used before calling transitionJiraIssue.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'expand', - type: 'string', - required: false, - description: `Comma-separated list of fields to expand in the response.`, - }, - { - name: 'includeUnavailableTransitions', - type: 'boolean', - required: false, - description: `Set to true to include transitions that are not currently available.`, - }, - { - name: 'skipRemoteOnlyCondition', - type: 'boolean', - required: false, - description: `Set to true to skip conditions that only apply to remote calls.`, - }, - { - name: 'sortByOpsBarAndStatus', - type: 'boolean', - required: false, - description: `Set to true to sort transitions by the ops bar and status.`, - }, - { - name: 'transitionId', - type: 'string', - required: false, - description: `The ID of a specific transition to retrieve. Use getTransitionsForJiraIssue to list transitions.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'expand', type: 'string', required: false, description: `Comma-separated list of fields to expand in the response.` }, + { name: 'includeUnavailableTransitions', type: 'boolean', required: false, description: `Set to true to include transitions that are not currently available.` }, + { name: 'skipRemoteOnlyCondition', type: 'boolean', required: false, description: `Set to true to skip conditions that only apply to remote calls.` }, + { name: 'sortByOpsBarAndStatus', type: 'boolean', required: false, description: `Set to true to sort transitions by the ops bar and status.` }, + { name: 'transitionId', type: 'string', required: false, description: `The ID of a specific transition to retrieve. Use getTransitionsForJiraIssue to list transitions.` }, ], }, { name: 'atlassianmcp_getvisiblejiraprojects', description: `List Jira projects visible to the authenticated user, with optional search filtering.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'action', - type: 'string', - required: false, - description: `The action to filter projects by (e.g. browse, create).`, - }, - { - name: 'expandIssueTypes', - type: 'boolean', - required: false, - description: `Set to true to include issue type details in the project list response.`, - }, - { - name: 'maxResults', - type: 'number', - required: false, - description: `Maximum number of results to return per page.`, - }, - { - name: 'searchString', - type: 'string', - required: false, - description: `Text to search for when looking up Jira users.`, - }, - { - name: 'startAt', - type: 'number', - required: false, - description: `Index of the first result to return (for pagination, defaults to 0).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'action', type: 'string', required: false, description: `The action to filter projects by (e.g. browse, create).` }, + { name: 'expandIssueTypes', type: 'boolean', required: false, description: `Set to true to include issue type details in the project list response.` }, + { name: 'maxResults', type: 'number', required: false, description: `Maximum number of results to return per page.` }, + { name: 'searchString', type: 'string', required: false, description: `Text to search for when looking up Jira users.` }, + { name: 'startAt', type: 'number', required: false, description: `Index of the first result to return (for pagination, defaults to 0).` }, ], }, { name: 'atlassianmcp_lookupjiraaccountid', description: `Search for Atlassian user accounts by name or email to find their account IDs.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'searchString', - type: 'string', - required: true, - description: `Text to search for when looking up Jira users.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'searchString', type: 'string', required: true, description: `Text to search for when looking up Jira users.` }, ], }, { name: 'atlassianmcp_search', description: `Search across all Atlassian products (Jira and Confluence) using a keyword query.`, params: [ - { - name: 'query', - type: 'string', - required: true, - description: `Search query to find Atlassian content across Jira and Confluence.`, - }, - { - name: 'cloudId', - type: 'string', - required: false, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, + { name: 'query', type: 'string', required: true, description: `Search query to find Atlassian content across Jira and Confluence.` }, + { name: 'cloudId', type: 'string', required: false, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, ], }, { name: 'atlassianmcp_searchconfluenceusingcql', description: `Search Confluence content using Confluence Query Language (CQL).`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'cql', - type: 'string', - required: true, - description: `Confluence Query Language string (e.g. type = page AND space = SD AND title ~ "meeting").`, - }, - { - name: 'cqlcontext', - type: 'string', - required: false, - description: `Optional JSON object to restrict CQL scope (e.g. {"spaceKey": "SD"}).`, - }, - { - name: 'cursor', - type: 'string', - required: false, - description: `Cursor string for paginating through results.`, - }, - { - name: 'expand', - type: 'string', - required: false, - description: `Comma-separated list of fields to expand in the response.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of items to return.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'cql', type: 'string', required: true, description: `Confluence Query Language string (e.g. type = page AND space = SD AND title ~ "meeting").` }, + { name: 'cqlcontext', type: 'string', required: false, description: `Optional JSON object to restrict CQL scope (e.g. {"spaceKey": "SD"}).` }, + { name: 'cursor', type: 'string', required: false, description: `Cursor string for paginating through results.` }, + { name: 'expand', type: 'string', required: false, description: `Comma-separated list of fields to expand in the response.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of items to return.` }, { name: 'next', type: 'boolean', required: false, description: `Include next page link` }, { name: 'prev', type: 'boolean', required: false, description: `Include previous page link` }, ], @@ -1415,156 +422,41 @@ export const tools: Tool[] = [ name: 'atlassianmcp_searchjiraissuesusingjql', description: `Search for Jira issues using Jira Query Language (JQL).`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'jql', - type: 'string', - required: true, - description: `Jira Query Language string to filter issues (e.g. project = KAN AND status = "In Progress").`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.`, - }, - { - name: 'maxResults', - type: 'number', - required: false, - description: `Maximum number of results to return per page.`, - }, - { - name: 'nextPageToken', - type: 'string', - required: false, - description: `Token for fetching the next page of results.`, - }, - { - name: 'responseContentFormat', - type: 'string', - required: false, - description: `Format to return content in — markdown (default) or adf.`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'jql', type: 'string', required: true, description: `Jira Query Language string to filter issues (e.g. project = KAN AND status = "In Progress").` }, + { name: 'fields', type: 'array', required: false, description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.` }, + { name: 'maxResults', type: 'number', required: false, description: `Maximum number of results to return per page.` }, + { name: 'nextPageToken', type: 'string', required: false, description: `Token for fetching the next page of results.` }, + { name: 'responseContentFormat', type: 'string', required: false, description: `Format to return content in — markdown (default) or adf.` }, ], }, { name: 'atlassianmcp_transitionjiraissue', description: `Move a Jira issue to a new workflow status using a transition ID.`, params: [ - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'issueIdOrKey', - type: 'string', - required: true, - description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).`, - }, - { - name: 'transition', - type: 'object', - required: true, - description: `The transition to perform, as JSON: {"id": ""}. Use getTransitionsForJiraIssue to list valid transitions.`, - }, - { - name: 'fields', - type: 'object', - required: false, - description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.`, - }, - { - name: 'historyMetadata', - type: 'object', - required: false, - description: `Optional metadata to record in the issue history (e.g. {"activityDescription": "Updated via API"}).`, - }, - { - name: 'update', - type: 'object', - required: false, - description: `Issue update operations as a JSON object (e.g. adding comment).`, - }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'issueIdOrKey', type: 'string', required: true, description: `The Jira issue ID (e.g. 10001) or key (e.g. KAN-1).` }, + { name: 'transition', type: 'object', required: true, description: `The transition to perform, as JSON: {"id": ""}. Use getTransitionsForJiraIssue to list valid transitions.` }, + { name: 'fields', type: 'object', required: false, description: `Fields to update as a JSON object, e.g. {"summary": "New title", "priority": {"name": "High"}}.` }, + { name: 'historyMetadata', type: 'object', required: false, description: `Optional metadata to record in the issue history (e.g. {"activityDescription": "Updated via API"}).` }, + { name: 'update', type: 'object', required: false, description: `Issue update operations as a JSON object (e.g. adding comment).` }, ], }, { name: 'atlassianmcp_updateconfluencepage', description: `Update the title, body, or other properties of an existing Confluence page.`, params: [ - { - name: 'body', - type: 'string', - required: true, - description: `The body content of the Confluence page or comment, in the format specified by contentFormat.`, - }, - { - name: 'cloudId', - type: 'string', - required: true, - description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.`, - }, - { - name: 'pageId', - type: 'string', - required: true, - description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.`, - }, - { - name: 'contentFormat', - type: 'string', - required: false, - description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).`, - }, - { - name: 'contentType', - type: 'string', - required: false, - description: `Type of Confluence content: page, blogpost, or custom.`, - }, - { - name: 'includeBody', - type: 'boolean', - required: false, - description: `Set to true to include the page body in the update response.`, - }, - { - name: 'parentId', - type: 'string', - required: false, - description: `The ID of the parent page under which to create or move this page.`, - }, - { - name: 'spaceId', - type: 'string', - required: false, - description: `The numeric ID of the Confluence space. Use getConfluenceSpaces to list available spaces.`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by content status (e.g. current, archived, trashed).`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `The title of the Confluence page.`, - }, - { - name: 'versionMessage', - type: 'string', - required: false, - description: `Optional message describing what changed in this version of the page.`, - }, + { name: 'body', type: 'string', required: true, description: `The body content of the Confluence page or comment, in the format specified by contentFormat.` }, + { name: 'cloudId', type: 'string', required: true, description: `The cloud site ID (UUID) of your Atlassian instance. Use getAccessibleAtlassianResources to retrieve it.` }, + { name: 'pageId', type: 'string', required: true, description: `The numeric ID of the Confluence page. Use getConfluenceSpaces or search to find page IDs.` }, + { name: 'contentFormat', type: 'string', required: false, description: `Format of the content body — use markdown for plain text or adf for Atlassian Document Format (JSON).` }, + { name: 'contentType', type: 'string', required: false, description: `Type of Confluence content: page, blogpost, or custom.` }, + { name: 'includeBody', type: 'boolean', required: false, description: `Set to true to include the page body in the update response.` }, + { name: 'parentId', type: 'string', required: false, description: `The ID of the parent page under which to create or move this page.` }, + { name: 'spaceId', type: 'string', required: false, description: `The numeric ID of the Confluence space. Use getConfluenceSpaces to list available spaces.` }, + { name: 'status', type: 'string', required: false, description: `Filter by content status (e.g. current, archived, trashed).` }, + { name: 'title', type: 'string', required: false, description: `The title of the Confluence page.` }, + { name: 'versionMessage', type: 'string', required: false, description: `Optional message describing what changed in this version of the page.` }, ], }, ] diff --git a/src/data/agent-connectors/bitlymcp.ts b/src/data/agent-connectors/bitlymcp.ts index 907761038..2108cf2fa 100644 --- a/src/data/agent-connectors/bitlymcp.ts +++ b/src/data/agent-connectors/bitlymcp.ts @@ -5,138 +5,38 @@ export const tools: Tool[] = [ name: 'bitlymcp_bulk_upload_file', description: `Upload a CSV or XLSX file to the signed URL returned by bulk_upload_validate. Pass the upload_url, headers, and file_content from the validate response. Requires an enterprise plan.`, params: [ - { - name: 'file_content', - type: 'string', - required: true, - description: `The actual file content (CSV or XLSX file bytes as a string) from the conversation context.`, - }, - { - name: 'headers', - type: 'object', - required: true, - description: `The headers map returned from bulk_upload_validate (as a JSON object with string keys and string values).`, - }, - { - name: 'upload_url', - type: 'string', - required: true, - description: `The signed upload URL returned from bulk_upload_validate.`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'content_type', - type: 'string', - required: false, - description: `MIME type for the upload. e.g. text/csv for CSV files or application/vnd.openxmlformats-officedocument.spreadsheetml.sheet for XLSX.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'file_content', type: 'string', required: true, description: `The actual file content (CSV or XLSX file bytes as a string) from the conversation context.` }, + { name: 'headers', type: 'object', required: true, description: `The headers map returned from bulk_upload_validate (as a JSON object with string keys and string values).` }, + { name: 'upload_url', type: 'string', required: true, description: `The signed upload URL returned from bulk_upload_validate.` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'content_type', type: 'string', required: false, description: `MIME type for the upload. e.g. text/csv for CSV files or application/vnd.openxmlformats-officedocument.spreadsheetml.sheet for XLSX.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_bulk_upload_validate', description: `Validate a bulk upload request and get a signed upload URL. upload_type: 'link' (links only), 'qr_code' (QR codes, requires template_id), 'coupled_link' (both, requires template_id). Template IDs: 'QTDTmplWLogo' (with Bitly logo), 'QTDTmplNLogo' (without). Returns upload_url and headers for use with bulk_upload_file. Requires an enterprise plan.`, params: [ - { - name: 'filename', - type: 'string', - required: true, - description: `Logical filename for the bulk upload (for example, "contacts.csv" or "links.xlsx").`, - }, - { - name: 'upload_type', - type: 'string', - required: true, - description: `Type of bulk upload. Must be exactly one of: "link", "qr_code", or "coupled_link".`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'domain', - type: 'string', - required: false, - description: `Optional short domain to use for created links. If omitted, backend defaults and validation apply.`, - }, - { - name: 'group_guid', - type: 'string', - required: false, - description: `Optional group GUID to associate with this bulk upload. If omitted, the default group may be used.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'template_id', - type: 'string', - required: false, - description: `QR code template ID. Required for qr_code and coupled_link uploads. Use 'QTDTmplWLogo' to include Bitly logo, 'QTDTmplNLogo' to exclude it.`, - }, + { name: 'filename', type: 'string', required: true, description: `Logical filename for the bulk upload (for example, "contacts.csv" or "links.xlsx").` }, + { name: 'upload_type', type: 'string', required: true, description: `Type of bulk upload. Must be exactly one of: "link", "qr_code", or "coupled_link".` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'domain', type: 'string', required: false, description: `Optional short domain to use for created links. If omitted, backend defaults and validation apply.` }, + { name: 'group_guid', type: 'string', required: false, description: `Optional group GUID to associate with this bulk upload. If omitted, the default group may be used.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'template_id', type: 'string', required: false, description: `QR code template ID. Required for qr_code and coupled_link uploads. Use 'QTDTmplWLogo' to include Bitly logo, 'QTDTmplNLogo' to exclude it.` }, ], }, { name: 'bitlymcp_create_qr_code', description: `Create a QR code linked to a URL. Supports visual customizations (colors, patterns). Use create_short_link_with_qr to create both a short link and QR code in one step.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The GUID of the group to create the QR code in`, - }, - { - name: 'long_url', - type: 'string', - required: false, - description: `The destination URL for the QR code. Required if bitlink_id is not provided.`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'archived', - type: 'boolean', - required: false, - description: `Whether the QR code should be archived (default: false)`, - }, - { - name: 'bitlink_id', - type: 'string', - required: false, - description: `Existing short link ID to use as destination`, - }, - { - name: 'render_customizations', - type: 'object', - required: false, - description: `Visual customizations for the QR code as a JSON object. e.g. {"dot_pattern_color": "#EF8000", "dot_pattern_type": "rounded", "background_color": "#ffffff"}. Supports corner colors, gradient, and logo configuration.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The GUID of the group to create the QR code in` }, + { name: 'long_url', type: 'string', required: true, description: `The destination URL for the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'archived', type: 'boolean', required: false, description: `Whether the QR code should be archived (default: false)` }, + { name: 'bitlink_id', type: 'string', required: false, description: `Existing short link ID to use as destination` }, + { name: 'render_customizations', type: 'object', required: false, description: `Visual customizations for the QR code as a JSON object. e.g. {"dot_pattern_color": "#EF8000", "dot_pattern_type": "rounded", "background_color": "#ffffff"}. Supports corner colors, gradient, and logo configuration.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, { name: 'title', type: 'string', required: false, description: `The title of the QR code` }, ], }, @@ -144,126 +44,31 @@ export const tools: Tool[] = [ name: 'bitlymcp_create_short_link', description: `Create a Bitly short link from a long URL. Optionally set a custom back-half (keyword), title, tags, domain, or group. Returns the short link ID for use with other tools.`, params: [ - { - name: 'long_url', - type: 'string', - required: false, - description: `The URL to be shortened. Must be a valid HTTP or HTTPS URL. Required if bitlink_id is not provided.`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'bitlink_id', - type: 'string', - required: false, - description: `An existing Bitly link to add a custom back-half to. Use with keyword parameter. Required if long_url is not provided.`, - }, - { - name: 'domain', - type: 'string', - required: false, - description: `Custom short domain to use (e.g., 'bit.ly', 'custom-domain.com'). Uses group default if not specified.`, - }, - { - name: 'group_guid', - type: 'string', - required: false, - description: `GUID of the group to create the short link in. Uses user's default group if not specified.`, - }, - { - name: 'keyword', - type: 'string', - required: false, - description: `Custom back-half for the short link (e.g. 'summer-sale' creates 'bit.ly/summer-sale'). Must be unique. Omit for a random hash.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'tags', - type: 'array', - required: false, - description: `Array of strings to tag the short link for organization (e.g., ['campaign', 'social-media'])`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `Custom title for the short link to help with organization and identification.`, - }, + { name: 'long_url', type: 'string', required: true, description: `The URL to be shortened. Must be a valid HTTP or HTTPS URL. Required if bitlink_id is not provided.` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'bitlink_id', type: 'string', required: false, description: `An existing Bitly link to add a custom back-half to. Use with keyword parameter. Required if long_url is not provided.` }, + { name: 'domain', type: 'string', required: false, description: `Custom short domain to use (e.g., 'bit.ly', 'custom-domain.com'). Uses group default if not specified.` }, + { name: 'group_guid', type: 'string', required: false, description: `GUID of the group to create the short link in. Uses user's default group if not specified.` }, + { name: 'keyword', type: 'string', required: false, description: `Custom back-half for the short link (e.g. 'summer-sale' creates 'bit.ly/summer-sale'). Must be unique. Omit for a random hash.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'tags', type: 'array', required: false, description: `Array of strings to tag the short link for organization (e.g., ['campaign', 'social-media'])` }, + { name: 'title', type: 'string', required: false, description: `Custom title for the short link to help with organization and identification.` }, ], }, { name: 'bitlymcp_create_short_link_with_qr', description: `Create a short link and a QR code for the same URL in one step. The QR code is tied to the new short link.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: 'long_url', - type: 'string', - required: false, - description: `URL to shorten. Required unless bitlink_id is provided (same rules as create_short_link).`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'archived', - type: 'boolean', - required: false, - description: `Whether the QR code should be archived (default: false).`, - }, - { - name: 'bitlink_id', - type: 'string', - required: false, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: 'domain', - type: 'string', - required: false, - description: `Custom short domain (e.g. bit.ly).`, - }, - { - name: 'keyword', - type: 'string', - required: false, - description: `Custom back-half for the short link.`, - }, - { - name: 'qr_title', - type: 'string', - required: false, - description: `Title for the QR code; defaults to the link title when omitted.`, - }, - { - name: 'render_customizations', - type: 'object', - required: false, - description: `Visual customizations for the QR code as a JSON object. e.g. {"dot_pattern_color": "#EF8000", "dot_pattern_type": "rounded", "background_color": "#ffffff"}. Supports corner colors, gradient, and logo configuration.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: 'long_url', type: 'string', required: true, description: `URL to shorten. Required unless bitlink_id is provided (same rules as create_short_link).` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'archived', type: 'boolean', required: false, description: `Whether the QR code should be archived (default: false).` }, + { name: 'bitlink_id', type: 'string', required: false, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: 'domain', type: 'string', required: false, description: `Custom short domain (e.g. bit.ly).` }, + { name: 'keyword', type: 'string', required: false, description: `Custom back-half for the short link.` }, + { name: 'qr_title', type: 'string', required: false, description: `Title for the QR code; defaults to the link title when omitted.` }, + { name: 'render_customizations', type: 'object', required: false, description: `Visual customizations for the QR code as a JSON object. e.g. {"dot_pattern_color": "#EF8000", "dot_pattern_type": "rounded", "background_color": "#ffffff"}. Supports corner colors, gradient, and logo configuration.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, { name: 'tags', type: 'array', required: false, description: `Tags for the short link.` }, { name: 'title', type: 'string', required: false, description: `Title for the short link.` }, ], @@ -272,1986 +77,571 @@ export const tools: Tool[] = [ name: 'bitlymcp_delete_short_link', description: `Permanently delete a non-customized short link. Cannot be undone. Analytics data is preserved.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_expand', description: `Look up the original long URL behind any Bitly short link. Returns destination URL and creation timestamp.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_custom_domains', description: `List all custom domains (branded short domains) available to the user. These can be used instead of 'bit.ly' when creating links.`, params: [ - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_custom_link_details', description: `Get metadata and override history for a custom link (vanity URL). Use the custom_bitlink field (e.g. yourdomain.com/path).`, params: [ - { - name: 'custom_bitlink', - type: 'string', - required: true, - description: `The short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'custom_bitlink', type: 'string', required: true, description: `The short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_group_details', description: `Get metadata for a specific group by GUID, including name, organization, creation date, and BSDs.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_group_engagements_cities', description: `Get engagement metrics (clicks + scans) for all links in a group, broken down by city. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_engagements_countries', description: `Get engagement metrics (clicks + scans) for all links in a group, broken down by country. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_engagements_devices', description: `Get engagement metrics (clicks + scans) for all links in a group, broken down by device type. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_engagements_over_time', description: `Get engagement metrics (clicks + scans) for all links in a group as a time series. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_engagements_referrers', description: `Get engagement metrics for all links in a group broken down by referrer source (Facebook, Google, direct, etc.). Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_engagements_referring_networks', description: `Get engagement metrics for all links in a group broken down by referring network category. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_engagements_top', description: `Get top-performing links in a group ranked by total engagements. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_clicks_cities', description: `Get click metrics for all links in a group, broken down by city. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_clicks_countries', description: `Get click metrics for all links in a group, broken down by country. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_clicks_devices', description: `Get click metrics for all links in a group, broken down by device OS (iOS, Android, Windows, etc.). Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_clicks_over_time', description: `Get click metrics for all links in a group as a time series. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_clicks_referrers', description: `Get click metrics for all links in a group broken down by referrer source. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_clicks_top', description: `Get top-performing links in a group ranked by total clicks. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_scans_cities', description: `Get QR scan metrics for all links in a group, broken down by city. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_scans_countries', description: `Get QR scan metrics for all links in a group, broken down by country. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_scans_over_time', description: `Get QR scan metrics for all links in a group as a time series. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_links_scans_top', description: `Get top-performing links in a group ranked by total QR scans. Requires a paid Bitly plan.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_group_qr_codes', description: `List QR codes in a group with optional search and pagination.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'archived', - type: 'string', - required: false, - description: `Filter by archived status: 'on' (archived only), 'off' (non-archived only), 'both' (all)`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search term to filter QR codes by title or destination URL`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'search_after', - type: 'string', - required: false, - description: `Pagination cursor for retrieving next page of results`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Number of QR codes to return (default: 50, max: 100)`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'archived', type: 'string', required: false, description: `Filter by archived status: 'on' (archived only), 'off' (non-archived only), 'both' (all)` }, + { name: 'query', type: 'string', required: false, description: `Search term to filter QR codes by title or destination URL` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'search_after', type: 'string', required: false, description: `Pagination cursor for retrieving next page of results` }, + { name: 'size', type: 'string', required: false, description: `Number of QR codes to return (default: 50, max: 100)` }, ], }, { name: 'bitlymcp_get_group_short_links', description: `List links in a group with optional filtering by query or date range, and pagination.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'archived', - type: 'string', - required: false, - description: `Filter by archived status: 'on' (archived only), 'off' (non-archived only), 'both' (all)`, - }, - { - name: 'created_after', - type: 'string', - required: false, - description: `Filter links created after this timestamp (ISO 8601 format)`, - }, - { - name: 'created_before', - type: 'string', - required: false, - description: `Filter links created before this timestamp (ISO 8601 format)`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search term to filter links by title, destination URL, or short URL`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'search_after', - type: 'string', - required: false, - description: `Pagination cursor for retrieving next page of results`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Number of links to return (default: 50, max: 100)`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'archived', type: 'string', required: false, description: `Filter by archived status: 'on' (archived only), 'off' (non-archived only), 'both' (all)` }, + { name: 'created_after', type: 'string', required: false, description: `Filter links created after this timestamp (ISO 8601 format)` }, + { name: 'created_before', type: 'string', required: false, description: `Filter links created before this timestamp (ISO 8601 format)` }, + { name: 'query', type: 'string', required: false, description: `Search term to filter links by title, destination URL, or short URL` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'search_after', type: 'string', required: false, description: `Pagination cursor for retrieving next page of results` }, + { name: 'size', type: 'string', required: false, description: `Number of links to return (default: 50, max: 100)` }, ], }, { name: 'bitlymcp_get_group_short_links_sorted', description: `List links in a group ranked by click performance. Requires sort='clicks'. Supports time-range filtering.`, params: [ - { - name: 'group_guid', - type: 'string', - required: true, - description: `The unique identifier of the group (workspace)`, - }, - { - name: 'sort', - type: 'string', - required: true, - description: `Sort method for the results. Currently supported: 'clicks' (rank by click performance)`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'group_guid', type: 'string', required: true, description: `The unique identifier of the group (workspace)` }, + { name: 'sort', type: 'string', required: true, description: `Sort method for the results. Currently supported: 'clicks' (rank by click performance)` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_groups', description: `List all groups (workspaces) the authenticated user has access to. Groups contain links and QR codes. Use the returned group_guid with other tools.`, params: [ - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'organization_guid', - type: 'string', - required: false, - description: `Optional organization GUID to filter groups by specific organization. If provided, only groups belonging to this organization will be returned.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'organization_guid', type: 'string', required: false, description: `Optional organization GUID to filter groups by specific organization. If provided, only groups belonging to this organization will be returned.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_organizations', description: `List all organizations the authenticated user belongs to, including org GUIDs, names, tier, and associated custom domains.`, params: [ - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_qr_code', description: `Get metadata for a QR code by qrcode_id: destination URL, type, customizations, and creation date.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_qr_code_image', description: `Get the QR code image as a base64 data URI in SVG (default) or PNG format. Note: most AI UIs cannot render raw image data.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'format', - type: 'string', - required: false, - description: `Image format: 'svg' or 'png' (default: svg)`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'format', type: 'string', required: false, description: `Image format: 'svg' or 'png' (default: svg)` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_qr_scan_metrics', description: `Get QR scan metrics as a time series for a specific QR code. Requires a paid Bitly plan.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_qr_scan_summary', description: `Get total scan count for a specific QR code over a time range. Requires a paid Bitly plan.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_qr_scans_by_browser', description: `Get QR scan metrics for a specific QR code broken down by browser. Requires a paid Bitly plan.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_qr_scans_by_city', description: `Get QR scan metrics for a specific QR code broken down by city. Requires a paid Bitly plan.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_qr_scans_by_country', description: `Get QR scan metrics for a specific QR code broken down by country. Requires a paid Bitly plan.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_qr_scans_by_device', description: `Get QR scan metrics for a specific QR code broken down by device OS. Requires a paid Bitly plan.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The unique identifier of the QR code`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The unique identifier of the QR code` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_get_short_link_details', description: `Get full details for a short link: destination URL, title, tags, creation date, and archived status.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_get_user', description: `Get the authenticated user's profile including email addresses, 2FA status, and default group GUID.`, params: [ - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, ], }, { name: 'bitlymcp_link_cities', description: `Get click metrics for a specific short link broken down by city.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_clicks_summary', description: `Get total click count for a specific short link over a time range. Returns aggregate clicks only, no time-series breakdown.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_countries', description: `Get click metrics for a specific short link broken down by country.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_devices', description: `Get click metrics for a specific short link broken down by device type (mobile, desktop, tablet).`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_engagements', description: `Get engagement metrics (clicks + QR scans) as a time series for a specific short link.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_engagements_summary', description: `Get total engagement count (clicks + QR scans) for a specific short link. Returns aggregate only, no time-series breakdown.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_metrics', description: `Get click metrics and time-series data for a specific short link. Returns total clicks and per-period breakdown.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_referrers', description: `Get click metrics for a specific short link broken down by referrer source.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_link_referring_domains', description: `Get click metrics for a specific short link broken down by referring domain.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'size', - type: 'string', - required: false, - description: `Maximum number of results to return (default varies)`, - }, - { - name: 'unit', - type: 'string', - required: false, - description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day`, - }, - { - name: 'unit_reference', - type: 'string', - required: false, - description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000`, - }, - { - name: 'units', - type: 'string', - required: false, - description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'size', type: 'string', required: false, description: `Maximum number of results to return (default varies)` }, + { name: 'unit', type: 'string', required: false, description: `Time granularity for metrics data: 'minute', 'hour', 'day', 'week', or 'month'. Determines how metrics are grouped by time. default: day` }, + { name: 'unit_reference', type: 'string', required: false, description: `ISO 8601 end timestamp for the time range. The range covers the last 'units' periods ending on this date. e.g. 2024-01-31T00:00:00+0000` }, + { name: 'units', type: 'string', required: false, description: `Number of time periods to include (e.g., '7' with unit='day' returns 7 days of data). Defaults to 30 when not specified.` }, ], }, { name: 'bitlymcp_update_qr_code', description: `Update a QR code's title, visual customizations, or archived status.`, params: [ - { - name: 'qrcode_id', - type: 'string', - required: true, - description: `The QR code ID to update`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'archived', - type: 'boolean', - required: false, - description: `Whether the QR code should be archived`, - }, - { - name: 'render_customizations', - type: 'object', - required: false, - description: `Visual customizations for the QR code as a JSON object. e.g. {"dot_pattern_color": "#EF8000", "dot_pattern_type": "rounded", "background_color": "#ffffff"}. Supports corner colors, gradient, and logo configuration.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `The new title for the QR code`, - }, + { name: 'qrcode_id', type: 'string', required: true, description: `The QR code ID to update` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'archived', type: 'boolean', required: false, description: `Whether the QR code should be archived` }, + { name: 'render_customizations', type: 'object', required: false, description: `Visual customizations for the QR code as a JSON object. e.g. {"dot_pattern_color": "#EF8000", "dot_pattern_type": "rounded", "background_color": "#ffffff"}. Supports corner colors, gradient, and logo configuration.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'title', type: 'string', required: false, description: `The new title for the QR code` }, ], }, { name: 'bitlymcp_update_short_link', description: `Update a short link's title, tags, or archived status. Changing the destination URL requires a paid plan.`, params: [ - { - name: 'bitlink_id', - type: 'string', - required: true, - description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')`, - }, - { - name: '_meta', - type: 'object', - required: false, - description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.`, - }, - { - name: 'archived', - type: 'boolean', - required: false, - description: `Set to true to archive the short link, false to unarchive it. Archived links are hidden from most views but still work.`, - }, - { - name: 'long_url', - type: 'string', - required: false, - description: `New destination URL to redirect the short link to. Use this to change where the short link points.`, - }, - { - name: 'response_format', - type: 'string', - required: false, - description: `'text' (default) or 'json'`, - }, - { - name: 'tags', - type: 'array', - required: false, - description: `Array of strings to replace the current tags. Pass empty array to remove all tags. Leave undefined to keep current tags.`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `New title for the short link. Leave empty to keep current title unchanged.`, - }, + { name: 'bitlink_id', type: 'string', required: true, description: `The complete short link in 'domain/hash' format (e.g., 'bit.ly/ABC123' or 'custom-domain.com/keyword')` }, + { name: '_meta', type: 'object', required: false, description: `Optional metadata about this request. Include user_prompt, caller_agent (e.g. claude), intent_classification, conversation_id.` }, + { name: 'archived', type: 'boolean', required: false, description: `Set to true to archive the short link, false to unarchive it. Archived links are hidden from most views but still work.` }, + { name: 'long_url', type: 'string', required: false, description: `New destination URL to redirect the short link to. Use this to change where the short link points.` }, + { name: 'response_format', type: 'string', required: false, description: `'text' (default) or 'json'` }, + { name: 'tags', type: 'array', required: false, description: `Array of strings to replace the current tags. Pass empty array to remove all tags. Leave undefined to keep current tags.` }, + { name: 'title', type: 'string', required: false, description: `New title for the short link. Leave empty to keep current title unchanged.` }, ], }, ] diff --git a/src/data/agent-connectors/catalog.ts b/src/data/agent-connectors/catalog.ts index 8669d432a..c74da4fa6 100644 --- a/src/data/agent-connectors/catalog.ts +++ b/src/data/agent-connectors/catalog.ts @@ -7,499 +7,504 @@ export interface ProviderMeta { } export const catalog: Record = { - leadiq: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/leadiq.svg', - authType: 'API Key', - categories: ['CRM & Sales', 'Analytics'], - }, - adobemarketingagentmcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'Analytics', 'AI'], - }, - adzvisermcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/adzviser.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'Analytics'], - }, - commonroommcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/commonroom.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'Analytics', 'CRM & Sales'], - }, - fellowaimcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fellowai.svg', - authType: 'OAuth 2.0', - categories: ['Productivity', 'Project Management'], - }, - supermetricsmcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/supermetrics.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'Analytics', 'CRM & Sales'], - }, - customeriomcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/customerio.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'Analytics', 'CRM & Sales'], - }, - zapiermcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zapier.svg', - authType: 'OAuth 2.0', - categories: ['Automation', 'Productivity', 'Developer Tools'], - }, - clickhouse: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickhouse.svg', - authType: 'OAuth 2.0', - categories: ['Analytics', 'Developer Tools', 'Databases'], - }, - atlassianmcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/atlassian.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Productivity', 'Collaboration'], - }, - ahrefsmcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/ahrefs.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'CRM & Sales'], - }, - clarifymcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clarify.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales', 'Productivity', 'Analytics'], - }, - bitlymcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitly.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'CRM & Sales'], - }, - klaviyomcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/klaviyo.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'CRM & Sales'], - }, - googledwd: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google.svg', - authType: 'Service Account (DWD)', - categories: ['Productivity', 'Communication'], - }, - xero: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/xero.svg', - authType: 'OAuth 2.0', - categories: ['Accounting & Finance'], - }, - mailchimp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mailchimp.svg', - authType: 'OAuth 2.0', - categories: ['Marketing', 'Automation', 'Analytics'], - }, - datadog: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/datadog.svg', - authType: 'API Key', - categories: ['Developer Tools', 'Monitoring'], - }, - quickbooks: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/Quickbooks.svg', - authType: 'OAuth 2.0', - categories: ['Accounting & Finance'], - }, - tableau: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/tableau.svg', - authType: 'API Key', - categories: ['Analytics', 'Productivity'], - }, - heyreach: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/heyreach.svg', - authType: 'API Key', - categories: ['CRM & Sales'], - }, - posthogmcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/posthog-1.svg', - authType: 'OAuth 2.0', - categories: ['Analytics'], - }, - box: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/box.svg', - authType: 'OAuth 2.0', - categories: ['Productivity', 'Files & Documents'], - }, - bigqueryserviceaccount: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg', - authType: 'Service Account', - categories: ['Analytics', 'Databases'], - }, - close: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/close.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales', 'Communication'], - }, - miro: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/Miro.svg', - authType: 'OAuth 2.0', - categories: ['Productivity', 'Collaboration', 'Design'], - }, - bitbucket: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitbucket.svg', - authType: 'OAuth 2.0', - categories: ['Developer Tools', 'Collaboration'], - }, - dynamo: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/dynamo.svg', - authType: 'Bearer Token', - categories: ['Accounting & Finance', 'CRM & Sales', 'Databases'], - }, - databricksworkspace: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/databricks-1.svg', - authType: 'Service Principal (OAuth 2.0)', - categories: ['Analytics', 'Automation', 'Databases'], - }, - diarize: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/diarize.svg', - authType: 'Bearer Token', - categories: ['Transcription', 'Media', 'Productivity', 'Analytics'], - }, - parallelaitaskmcp: { - iconUrl: 'https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/parallel-ai.svg', - authType: 'Bearer Token', - categories: ['Productivity', 'AI', 'Developer Tools'], - }, - calendly: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/calendly.svg', - authType: 'OAuth 2.0', - categories: ['Productivity', 'Calendar'], - }, - apifymcp: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/apify.svg', - authType: 'Bearer Token', - categories: ['AI', 'Automation', 'Developer Tools'], - }, - evertrace: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/evertrace.png', - authType: 'Bearer Token', - categories: ['CRM & Sales'], - }, - figma: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/figma.svg', - authType: 'OAuth 2.0', - categories: ['Design', 'Collaboration'], - }, - jiminny: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/jiminny.svg', - authType: 'Bearer Token', - categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], - }, - pagerduty: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/pagerduty.svg', - authType: 'OAuth 2.0', - categories: ['Developer Tools', 'Monitoring'], - }, - vercel: { - iconUrl: 'https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/vercel.svg', - authType: 'OAuth 2.0', - categories: ['Developer Tools'], - }, - gitlab: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gitlab.svg', - authType: 'OAuth 2.0', - categories: ['Developer Tools', 'Collaboration'], - }, - pipedrive: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/pipedrive.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - linkedin: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - outreach: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/outreach.png', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - granolamcp: { - iconUrl: 'https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/granola.svg', - authType: 'OAuth 2.0', - categories: ['AI', 'Automation', 'Communication', 'Transcription'], - }, - twitter: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/X.svg', - authType: 'Bearer Token', - categories: ['Communication', 'Marketing'], - }, - discord: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Collaboration'], - }, - phantombuster: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/phantombuster.svg', - authType: 'API Key', - categories: ['AI', 'Automation'], - }, - affinity: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/affinity.svg', - authType: 'Bearer Token', - categories: ['CRM & Sales'], - }, - supadata: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/supadata.svg', - authType: 'API Key', - categories: ['Analytics', 'Search'], - }, - granola: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/granola.svg', - authType: 'Bearer Token', - categories: ['AI', 'Automation', 'Communication', 'Transcription'], - }, - brave: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/brave.svg', - authType: 'API Key', - categories: ['Analytics', 'Search'], - }, - harvestapi: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/harvestapi.svg', - authType: 'API Key', - categories: ['Marketing', 'Analytics'], - }, - exa: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/exa.svg', - authType: 'API Key', - categories: ['Analytics', 'AI', 'Automation', 'Search'], - }, - snowflakekeyauth: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg', - authType: 'Bearer Token', - categories: ['Analytics', 'Databases'], - }, - attio: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/attio.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - apollo: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/apollo.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - vimeo: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/vimeo.svg', - authType: 'OAuth 2.0', - categories: ['Media'], - }, - youtube: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/youtube.svg', - authType: 'OAuth 2.0', - categories: ['Media', 'Marketing'], - }, - googleslides: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_slides.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - attention: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/attention.svg', - authType: 'API Key', - categories: ['AI', 'Automation', 'CRM & Sales'], - }, - clari_copilot: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clari.svg', - authType: 'API Key', - categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], - }, - chorus: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/chorus.svg', - authType: 'Basic Auth', - categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], - }, - google_ads: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_ads.png', - authType: 'OAuth 2.0', - categories: ['Marketing', 'CRM & Sales'], - }, - servicenow: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/servicenow.svg', - authType: 'OAuth 2.0', - categories: ['Customer Support', 'Communication'], - }, - zendesk: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zendesk.svg', - authType: 'API Key', - categories: ['Customer Support', 'Communication'], - }, - googleforms: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_forms.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - microsoftword: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/word.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - microsoftexcel: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/excel.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents', 'Analytics'], - }, - onenote: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/onenote.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - snowflake: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg', - authType: 'OAuth 2.0', - categories: ['Analytics', 'Databases'], - }, - onedrive: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/onedrive.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - bigquery: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg', - authType: 'OAuth 2.0', - categories: ['Analytics', 'Databases'], - }, - airtable: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/airtable.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Analytics'], - }, - clickup: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickup.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Collaboration', 'Productivity'], - }, - fathom: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fathom.svg', - authType: 'API Key', - categories: ['AI', 'Automation', 'Communication', 'Transcription'], - }, - googlemeet: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_meet.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Calendar'], - }, - googlesheets: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_sheets.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents', 'Analytics'], - }, - intercom: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/intercom.svg', - authType: 'OAuth 2.0', - categories: ['Customer Support', 'Communication'], - }, - monday: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/monday.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Collaboration', 'Productivity'], - }, - sharepoint: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/sharepoint.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - outlook: { - iconUrl: 'https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/outlook.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Calendar'], - }, - confluence: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/confluence.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Files & Documents', 'Collaboration'], - }, - gong: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gong.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], - }, - slack: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/slack.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Collaboration'], - }, - hubspot: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/hub_spot.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - salesforce: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/sales_force.svg', - authType: 'OAuth 2.0', - categories: ['CRM & Sales'], - }, - googledocs: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_docs.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - googledrive: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_drive.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - microsoftteams: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/microsoft-teams.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Collaboration'], - }, - zoom: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zoom.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Calendar'], - }, - linear: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/linear.svg', - authType: 'OAuth 2.0', - categories: ['Developer Tools', 'Project Management'], - }, - jira: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/jira.svg', - authType: 'OAuth 2.0', - categories: ['Developer Tools', 'Project Management'], - }, - dropbox: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/drop_box.svg', - authType: 'OAuth 2.0', - categories: ['Files & Documents'], - }, - asana: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/asana-n.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Collaboration', 'Productivity'], - }, - trello: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/trello_n.svg', - authType: 'OAuth 1.0a', - categories: ['Project Management', 'Collaboration', 'Productivity'], - }, - github: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/github.png', - authType: 'OAuth 2.0', - categories: ['Developer Tools', 'Collaboration'], - }, - notion: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/notion.svg', - authType: 'OAuth 2.0', - categories: ['Project Management', 'Files & Documents', 'Collaboration'], - }, - freshdesk: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/freshdesk.png', - authType: 'Basic Auth', - categories: ['Customer Support', 'Communication'], - }, - googlecalendar: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_calendar.svg', - authType: 'OAuth 2.0', - categories: ['Communication', 'Calendar'], - }, - gmail: { - iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gmail.svg', - authType: 'OAuth 2.0', - categories: ['Communication'], + 'adobemarketingagentmcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","Analytics","AI"], + }, + 'grainmcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/grain.svg", + authType: "OAuth 2.1/DCR", + categories: ["Transcription","Collaboration","AI"], + }, + 'leadiq': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/leadiq.svg", + authType: "API Key", + categories: ["CRM & Sales","Analytics"], + }, + 'adzvisermcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/adzviser.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","Analytics"], + }, + 'commonroommcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/commonroom.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","Analytics","CRM & Sales"], + }, + 'fellowaimcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/fellowai.svg", + authType: "OAuth 2.1/DCR", + categories: ["Productivity","Project Management"], + }, + 'supermetricsmcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/supermetrics.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","Analytics","CRM & Sales"], + }, + 'customeriomcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/customerio.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","Analytics","CRM & Sales"], + }, + 'zapiermcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/zapier.svg", + authType: "OAuth 2.1/DCR", + categories: ["Automation","Productivity","Developer Tools"], + }, + 'clickhouse': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickhouse.svg", + authType: "OAuth 2.1/DCR", + categories: ["Analytics","Developer Tools","Databases"], + }, + 'atlassianmcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/atlassian.svg", + authType: "OAuth 2.1/DCR", + categories: ["Project Management","Productivity","Collaboration"], + }, + 'ahrefsmcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/ahrefs.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","CRM & Sales"], + }, + 'clarifymcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clarify.svg", + authType: "OAuth 2.1/DCR", + categories: ["CRM & Sales","Productivity","Analytics"], + }, + 'bitlymcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitly.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","CRM & Sales"], + }, + 'klaviyomcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/klaviyo.svg", + authType: "OAuth 2.1/DCR", + categories: ["Marketing","CRM & Sales"], + }, + 'googledwd': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google.svg", + authType: "Service Account (DWD)", + categories: ["Productivity","Communication"], + }, + 'xero': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/xero.svg", + authType: "OAuth 2.0", + categories: ["Accounting & Finance"], + }, + 'mailchimp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/mailchimp.svg", + authType: "OAuth 2.0", + categories: ["Marketing","Automation","Analytics"], + }, + 'datadog': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/datadog.svg", + authType: "API Key", + categories: ["Developer Tools","Monitoring"], + }, + 'quickbooks': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/Quickbooks.svg", + authType: "OAuth 2.0", + categories: ["Accounting & Finance"], + }, + 'tableau': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/tableau.svg", + authType: "API Key", + categories: ["Analytics","Productivity"], + }, + 'heyreach': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/heyreach.svg", + authType: "API Key", + categories: ["CRM & Sales"], + }, + 'posthogmcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/posthog-1.svg", + authType: "OAuth 2.1/DCR", + categories: ["Analytics"], + }, + 'box': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/box.svg", + authType: "OAuth 2.0", + categories: ["Productivity","Files & Documents"], + }, + 'bigqueryserviceaccount': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg", + authType: "Service Account", + categories: ["Analytics","Databases"], + }, + 'close': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/close.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales","Communication"], + }, + 'miro': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/Miro.svg", + authType: "OAuth 2.0", + categories: ["Productivity","Collaboration","Design"], + }, + 'bitbucket': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitbucket.svg", + authType: "OAuth 2.0", + categories: ["Developer Tools","Collaboration"], + }, + 'dynamo': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/dynamo.svg", + authType: "Bearer Token", + categories: ["Accounting & Finance","CRM & Sales","Databases"], + }, + 'databricksworkspace': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/databricks-1.svg", + authType: "Service Principal (OAuth 2.0)", + categories: ["Analytics","Automation","Databases"], + }, + 'diarize': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/diarize.svg", + authType: "Bearer Token", + categories: ["Transcription","Media","Productivity","Analytics"], + }, + 'parallelaitaskmcp': { + iconUrl: "https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/parallel-ai.svg", + authType: "Bearer Token", + categories: ["Productivity","AI","Developer Tools"], + }, + 'calendly': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/calendly.svg", + authType: "OAuth 2.0", + categories: ["Productivity","Calendar"], + }, + 'apifymcp': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/apify.svg", + authType: "Bearer Token", + categories: ["AI","Automation","Developer Tools"], + }, + 'evertrace': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/evertrace.png", + authType: "Bearer Token", + categories: ["CRM & Sales"], + }, + 'figma': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/figma.svg", + authType: "OAuth 2.0", + categories: ["Design","Collaboration"], + }, + 'jiminny': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/jiminny.svg", + authType: "Bearer Token", + categories: ["CRM & Sales","AI","Automation","Transcription"], + }, + 'pagerduty': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/pagerduty.svg", + authType: "OAuth 2.0", + categories: ["Developer Tools","Monitoring"], + }, + 'vercel': { + iconUrl: "https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/vercel.svg", + authType: "OAuth 2.0", + categories: ["Developer Tools"], + }, + 'gitlab': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/gitlab.svg", + authType: "OAuth 2.0", + categories: ["Developer Tools","Collaboration"], + }, + 'pipedrive': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/pipedrive.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'linkedin': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'outreach': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/outreach.png", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'granolamcp': { + iconUrl: "https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/granola.svg", + authType: "OAuth 2.1/DCR", + categories: ["AI","Automation","Communication","Transcription"], + }, + 'twitter': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/X.svg", + authType: "Bearer Token", + categories: ["Communication","Marketing"], + }, + 'discord': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg", + authType: "OAuth 2.0", + categories: ["Communication","Collaboration"], + }, + 'phantombuster': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/phantombuster.svg", + authType: "API Key", + categories: ["AI","Automation"], + }, + 'affinity': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/affinity.svg", + authType: "Bearer Token", + categories: ["CRM & Sales"], + }, + 'supadata': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/supadata.svg", + authType: "API Key", + categories: ["Analytics","Search"], + }, + 'granola': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/granola.svg", + authType: "Bearer Token", + categories: ["AI","Automation","Communication","Transcription"], + }, + 'brave': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/brave.svg", + authType: "API Key", + categories: ["Analytics","Search"], + }, + 'harvestapi': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/harvestapi.svg", + authType: "API Key", + categories: ["Marketing","Analytics"], + }, + 'exa': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/exa.svg", + authType: "API Key", + categories: ["Analytics","AI","Automation","Search"], + }, + 'snowflakekeyauth': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg", + authType: "Bearer Token", + categories: ["Analytics","Databases"], + }, + 'attio': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/attio.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'apollo': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/apollo.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'vimeo': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/vimeo.svg", + authType: "OAuth 2.0", + categories: ["Media"], + }, + 'youtube': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/youtube.svg", + authType: "OAuth 2.0", + categories: ["Media","Marketing"], + }, + 'googleslides': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_slides.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'attention': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/attention.svg", + authType: "API Key", + categories: ["AI","Automation","CRM & Sales"], + }, + 'clari_copilot': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clari.svg", + authType: "API Key", + categories: ["CRM & Sales","AI","Automation","Transcription"], + }, + 'chorus': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/chorus.svg", + authType: "Basic Auth", + categories: ["CRM & Sales","AI","Automation","Transcription"], + }, + 'google_ads': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_ads.png", + authType: "OAuth 2.0", + categories: ["Marketing","CRM & Sales"], + }, + 'servicenow': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/servicenow.svg", + authType: "OAuth 2.0", + categories: ["Customer Support","Communication"], + }, + 'zendesk': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/zendesk.svg", + authType: "API KEY", + categories: ["Customer Support","Communication"], + }, + 'googleforms': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_forms.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'microsoftword': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/word.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'microsoftexcel': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/excel.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents","Analytics"], + }, + 'onenote': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/onenote.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'snowflake': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg", + authType: "OAuth 2.0", + categories: ["Analytics","Databases"], + }, + 'onedrive': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/onedrive.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'bigquery': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg", + authType: "OAuth 2.0", + categories: ["Analytics","Databases"], + }, + 'airtable': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/airtable.svg", + authType: "OAuth 2.0", + categories: ["Project Management","Analytics"], + }, + 'clickup': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickup.svg", + authType: "OAuth 2.0", + categories: ["Project Management","Collaboration","Productivity"], + }, + 'fathom': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/fathom.svg", + authType: "API Key", + categories: ["AI","Automation","Communication","Transcription"], + }, + 'googlemeet': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_meet.svg", + authType: "OAuth 2.0", + categories: ["Communication","Calendar"], + }, + 'googlesheets': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_sheets.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents","Analytics"], + }, + 'intercom': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/intercom.svg", + authType: "OAuth 2.0", + categories: ["Customer Support","Communication"], + }, + 'monday': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/monday.svg", + authType: "OAuth 2.0", + categories: ["Project Management","Collaboration","Productivity"], + }, + 'sharepoint': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/sharepoint.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'outlook': { + iconUrl: "https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/outlook.svg", + authType: "OAuth 2.0", + categories: ["Communication","Calendar"], + }, + 'confluence': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/confluence.svg", + authType: "OAuth 2.0", + categories: ["Project Management","Files & Documents","Collaboration"], + }, + 'gong': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/gong.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales","AI","Automation","Transcription"], + }, + 'slack': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/slack.svg", + authType: "OAuth 2.0", + categories: ["Communication","Collaboration"], + }, + 'hubspot': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/hub_spot.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'salesforce': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/sales_force.svg", + authType: "OAuth 2.0", + categories: ["CRM & Sales"], + }, + 'googledocs': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_docs.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'googledrive': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_drive.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'microsoftteams': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/microsoft-teams.svg", + authType: "OAuth 2.0", + categories: ["Communication","Collaboration"], + }, + 'zoom': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/zoom.svg", + authType: "OAuth 2.0", + categories: ["Communication","Calendar"], + }, + 'linear': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/linear.svg", + authType: "OAuth 2.0", + categories: ["Developer Tools","Project Management"], + }, + 'jira': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/jira.svg", + authType: "OAuth 2.0", + categories: ["Developer Tools","Project Management"], + }, + 'dropbox': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/drop_box.svg", + authType: "OAuth 2.0", + categories: ["Files & Documents"], + }, + 'asana': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/asana-n.svg", + authType: "OAuth 2.0", + categories: ["Project Management","Collaboration","Productivity"], + }, + 'trello': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/trello_n.svg", + authType: "OAuth 1.0a", + categories: ["Project Management","Collaboration","Productivity"], + }, + 'github': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/github.png", + authType: "OAuth 2.0", + categories: ["Developer Tools","Collaboration"], + }, + 'notion': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/notion.svg", + authType: "OAuth 2.0", + categories: ["Project Management","Files & Documents","Collaboration"], + }, + 'freshdesk': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/freshdesk.png", + authType: "Basic Auth", + categories: ["Customer Support","Communication"], + }, + 'googlecalendar': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_calendar.svg", + authType: "OAuth 2.0", + categories: ["Communication","Calendar"], + }, + 'gmail': { + iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/gmail.svg", + authType: "OAuth 2.0", + categories: ["Communication"], }, } diff --git a/src/data/agent-connectors/clarifymcp.ts b/src/data/agent-connectors/clarifymcp.ts index aa143331c..ad90a4d57 100644 --- a/src/data/agent-connectors/clarifymcp.ts +++ b/src/data/agent-connectors/clarifymcp.ts @@ -5,528 +5,198 @@ export const tools: Tool[] = [ name: 'clarifymcp_add_comment', description: `Add a Markdown comment to a supported Clarify entity (deal, person, company, etc.).`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'id', - type: 'string', - required: true, - description: `The unique ID of the record (e.g. per_01ABCDE for a person, cmp_01ABCDE for a company).`, - }, - { - name: 'message', - type: 'string', - required: true, - description: `The comment text in Markdown format. Supports **bold**, *italic*, and bullet lists.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'id', type: 'string', required: true, description: `The unique ID of the record (e.g. per_01ABCDE for a person, cmp_01ABCDE for a company).` }, + { name: 'message', type: 'string', required: true, description: `The comment text in Markdown format. Supports **bold**, *italic*, and bullet lists.` }, ], }, { name: 'clarifymcp_create_or_update_campaign', description: `Create a new email campaign or update an existing one by its ID.`, params: [ - { - name: 'campaign_name', - type: 'string', - required: true, - description: `Name of the campaign. Required when creating a new campaign.`, - }, - { - name: 'email_steps', - type: 'array', - required: true, - description: `Array of email step definitions for the campaign sequence.`, - }, - { - name: 'campaign_id', - type: 'string', - required: false, - description: `ID of an existing campaign to update. Omit to create a new campaign.`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Campaign status — draft (default) or active.`, - }, + { name: 'campaign_name', type: 'string', required: true, description: `Name of the campaign. Required when creating a new campaign.` }, + { name: 'email_steps', type: 'array', required: true, description: `Array of email step definitions for the campaign sequence.` }, + { name: 'campaign_id', type: 'string', required: false, description: `ID of an existing campaign to update. Omit to create a new campaign.` }, + { name: 'status', type: 'string', required: false, description: `Campaign status — draft (default) or active.` }, ], }, { name: 'clarifymcp_create_or_update_custom_object', description: `Create a new custom object type or update an existing one in the Clarify workspace.`, params: [ - { - name: 'description', - type: 'string', - required: false, - description: `AI context description for this object type — helps the AI understand when to use it.`, - }, - { - name: 'entity', - type: 'string', - required: false, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'name', - type: 'string', - required: false, - description: `Display name for the custom object type. Will be normalized to a slug for the entity identifier.`, - }, - { - name: 'plural', - type: 'string', - required: false, - description: `Plural label for the custom object type (e.g. Partnerships for a singular Partnership).`, - }, + { name: 'description', type: 'string', required: false, description: `AI context description for this object type — helps the AI understand when to use it.` }, + { name: 'entity', type: 'string', required: false, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'name', type: 'string', required: false, description: `Display name for the custom object type. Will be normalized to a slug for the entity identifier.` }, + { name: 'plural', type: 'string', required: false, description: `Plural label for the custom object type (e.g. Partnerships for a singular Partnership).` }, ], }, { name: 'clarifymcp_create_or_update_fields', description: `Create new custom fields or update existing fields on any Clarify entity (person, company, deal, or custom object).`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'fields', - type: 'array', - required: true, - description: `Array of field definitions to create or update on the entity.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'fields', type: 'array', required: true, description: `Array of field definitions to create or update on the entity.` }, ], }, { name: 'clarifymcp_create_or_update_list', description: `Create or update a dynamic list — a saved view whose membership is defined by a SQL query.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `AI context description for this list — helps the AI understand when to use it.`, - }, - { - name: 'emoji', - type: 'string', - required: false, - description: `A single emoji to display alongside the list name.`, - }, - { - name: 'list_id', - type: 'string', - required: false, - description: `The ID of an existing list (saved view). Use get_lists to find available list IDs.`, - }, - { - name: 'sql', - type: 'string', - required: false, - description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `The display name of the list.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'description', type: 'string', required: false, description: `AI context description for this object type — helps the AI understand when to use it.` }, + { name: 'emoji', type: 'string', required: false, description: `A single emoji to display alongside the list name.` }, + { name: 'list_id', type: 'string', required: false, description: `The ID of an existing list (saved view). Use get_lists to find available list IDs.` }, + { name: 'sql', type: 'string', required: false, description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.` }, + { name: 'title', type: 'string', required: false, description: `The display name of the list.` }, ], }, { name: 'clarifymcp_create_or_update_records', description: `Create new records or update existing ones in Clarify. Supports bulk operations of up to 25 records per call.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'records', - type: 'array', - required: true, - description: `Array of records to create or update. Each item contains an attributes object with field values.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'records', type: 'array', required: true, description: `Array of records to create or update. Each item contains an attributes object with field values.` }, ], }, { name: 'clarifymcp_delete_campaign', description: `Permanently delete an email campaign by its ID.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: `The ID of the campaign. Use get_campaigns to list available campaigns and their IDs.`, - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Use get_campaigns to list available campaigns and their IDs.` }, ], }, { name: 'clarifymcp_delete_custom_object', description: `Permanently delete a custom object type from the Clarify workspace by its entity identifier.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, ], }, { name: 'clarifymcp_delete_fields', description: `Permanently delete one or more custom fields from a Clarify entity by their field slugs.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'fieldNames', - type: 'array', - required: true, - description: `Array of field slugs (snake_case) to delete from the entity.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'fieldNames', type: 'array', required: true, description: `Array of field slugs (snake_case) to delete from the entity.` }, ], }, { name: 'clarifymcp_delete_list', description: `Permanently delete a saved list (dynamic view) by its ID.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'list_id', - type: 'string', - required: true, - description: `The ID of an existing list (saved view). Use get_lists to find available list IDs.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'list_id', type: 'string', required: true, description: `The ID of an existing list (saved view). Use get_lists to find available list IDs.` }, ], }, { name: 'clarifymcp_delete_records', description: `Permanently delete one or more records by their IDs. Supports bulk deletion of up to 25 records per call.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'record_ids', - type: 'array', - required: true, - description: `Array of record IDs to delete. All must belong to the same entity type.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'record_ids', type: 'array', required: true, description: `Array of record IDs to delete. All must belong to the same entity type.` }, ], }, { name: 'clarifymcp_find_leads', description: `Search Clarify's built-in prospect database of 28M+ companies and 175M+ people to find new leads.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'search_label', - type: 'string', - required: true, - description: `A descriptive label for this lead search (e.g. SF SaaS Companies 50+ employees).`, - }, - { - name: 'sql', - type: 'string', - required: true, - description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.`, - }, - { - name: 'search_identifiers', - type: 'string', - required: false, - description: `Optional: provide a prior searchId and versionId to operate on an existing search.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'search_label', type: 'string', required: true, description: `A descriptive label for this lead search (e.g. SF SaaS Companies 50+ employees).` }, + { name: 'sql', type: 'string', required: true, description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.` }, + { name: 'search_identifiers', type: 'string', required: false, description: `Optional: provide a prior searchId and versionId to operate on an existing search.` }, ], }, { name: 'clarifymcp_get_campaigns', description: `List email campaigns in the workspace, or fetch a single campaign by ID with full details.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: false, - description: `The ID of the campaign. Use get_campaigns to list available campaigns and their IDs.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of records to return per page.`, - }, - { - name: 'offset', - type: 'number', - required: false, - description: `Number of records to skip for pagination (use with limit).`, - }, - { - name: 'search', - type: 'string', - required: false, - description: `Case-insensitive substring search to filter results by name or title.`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Filter by campaign status — draft (unpublished) or active (live campaigns).`, - }, + { name: 'campaign_id', type: 'string', required: false, description: `The ID of the campaign. Use get_campaigns to list available campaigns and their IDs.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of records to return per page.` }, + { name: 'offset', type: 'number', required: false, description: `Number of records to skip for pagination (use with limit).` }, + { name: 'search', type: 'string', required: false, description: `Case-insensitive substring search to filter results by name or title.` }, + { name: 'status', type: 'string', required: false, description: `Filter by campaign status — draft (unpublished) or active (live campaigns).` }, ], }, { name: 'clarifymcp_get_current_user', description: `Retrieve information about the currently authenticated Clarify user, including timezone and workspace details.`, params: [ - { - name: 'mcp_client_timezone', - type: 'string', - required: false, - description: `Your IANA timezone string (e.g. America/New_York). Helps Clarify show times in your local timezone.`, - }, + { name: 'mcp_client_timezone', type: 'string', required: false, description: `Your IANA timezone string (e.g. America/New_York). Helps Clarify show times in your local timezone.` }, ], }, { name: 'clarifymcp_get_lists', description: `List saved views (dynamic lists) for an entity type, or fetch a single list by ID.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of records to return per page.`, - }, - { - name: 'list_id', - type: 'string', - required: false, - description: `The ID of an existing list (saved view). Use get_lists to find available list IDs.`, - }, - { - name: 'offset', - type: 'number', - required: false, - description: `Number of records to skip for pagination (use with limit).`, - }, - { - name: 'search', - type: 'string', - required: false, - description: `Case-insensitive substring search to filter results by name or title.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of records to return per page.` }, + { name: 'list_id', type: 'string', required: false, description: `The ID of an existing list (saved view). Use get_lists to find available list IDs.` }, + { name: 'offset', type: 'number', required: false, description: `Number of records to skip for pagination (use with limit).` }, + { name: 'search', type: 'string', required: false, description: `Case-insensitive substring search to filter results by name or title.` }, ], }, { name: 'clarifymcp_get_records', description: `Retrieve full details for one or more Clarify records by their IDs.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'ids', - type: 'array', - required: true, - description: `Array of record IDs to retrieve. Use query_data to find IDs first.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'ids', type: 'array', required: true, description: `Array of record IDs to retrieve. Use query_data to find IDs first.` }, ], }, { name: 'clarifymcp_get_schema', description: `Retrieve the schema for Clarify entities, including field definitions and relationship metadata.`, params: [ - { - name: 'entities', - type: 'array', - required: false, - description: `List of entity types to get schema for. Omit to return the schema for all entities.`, - }, - { - name: 'format', - type: 'string', - required: false, - description: `Schema format — use read for querying data or write for creating/updating records.`, - }, + { name: 'entities', type: 'array', required: false, description: `List of entity types to get schema for. Omit to return the schema for all entities.` }, + { name: 'format', type: 'string', required: false, description: `Schema format — use read for querying data or write for creating/updating records.` }, ], }, { name: 'clarifymcp_import_leads', description: `Import leads from a find_leads search result into your Clarify workspace.`, params: [ - { - name: 'searchEmoji', - type: 'string', - required: true, - description: `A single emoji representing the theme of the search.`, - }, - { - name: 'searchId', - type: 'string', - required: true, - description: `The ID of the lead search returned by find_leads.`, - }, - { - name: 'searchTitle', - type: 'string', - required: true, - description: `A descriptive title for the search based on its filters.`, - }, - { - name: 'sourceEntity', - type: 'string', - required: true, - description: `The lead entity type to import from — tam_company or tam_person.`, - }, - { - name: 'count', - type: 'integer', - required: false, - description: `Number of leads to import. Omit to import all leads in the search.`, - }, - { - name: 'extraFields', - type: 'array', - required: false, - description: `Additional TAM field names to import beyond the default fields.`, - }, - { - name: 'versionId', - type: 'string', - required: false, - description: `The version ID of the search. Use the versionId from a prior find_leads result when available.`, - }, + { name: 'searchEmoji', type: 'string', required: true, description: `A single emoji representing the theme of the search.` }, + { name: 'searchId', type: 'string', required: true, description: `The ID of the lead search returned by find_leads.` }, + { name: 'searchTitle', type: 'string', required: true, description: `A descriptive title for the search based on its filters.` }, + { name: 'sourceEntity', type: 'string', required: true, description: `The lead entity type to import from — tam_company or tam_person.` }, + { name: 'count', type: 'integer', required: false, description: `Number of leads to import. Omit to import all leads in the search.` }, + { name: 'extraFields', type: 'array', required: false, description: `Additional TAM field names to import beyond the default fields.` }, + { name: 'versionId', type: 'string', required: false, description: `The version ID of the search. Use the versionId from a prior find_leads result when available.` }, ], }, { name: 'clarifymcp_merge_records', description: `Merge two or more duplicate records into a single primary record, combining all data.`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'primaryRecordId', - type: 'string', - required: true, - description: `The ID of the record to keep after the merge — all data is merged into this record.`, - }, - { - name: 'sourceRecordIds', - type: 'array', - required: true, - description: `IDs of records to merge into the primary record. These records are deleted after merging.`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'primaryRecordId', type: 'string', required: true, description: `The ID of the record to keep after the merge — all data is merged into this record.` }, + { name: 'sourceRecordIds', type: 'array', required: true, description: `IDs of records to merge into the primary record. These records are deleted after merging.` }, ], }, { name: 'clarifymcp_query_analytics', description: `Execute a read-only ClickHouse SQL query against the Clarify analytics event log.`, params: [ - { - name: 'sql', - type: 'string', - required: true, - description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of records to return per page.`, - }, + { name: 'sql', type: 'string', required: true, description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of records to return per page.` }, ], }, { name: 'clarifymcp_query_data', description: `Execute a read-only PostgreSQL query against Clarify CRM data (contacts, companies, deals, etc.).`, params: [ - { - name: 'entity', - type: 'string', - required: true, - description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).`, - }, - { - name: 'sql', - type: 'string', - required: true, - description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Maximum number of records to return per page.`, - }, - { - name: 'offset', - type: 'number', - required: false, - description: `Number of records to skip for pagination (use with limit).`, - }, + { name: 'entity', type: 'string', required: true, description: `The entity type to operate on (e.g. person, company, deal, or a custom object identifier like c_my_object).` }, + { name: 'sql', type: 'string', required: true, description: `SQL query to execute. For query_data use PostgreSQL syntax; for query_analytics use ClickHouse SQL.` }, + { name: 'limit', type: 'number', required: false, description: `Maximum number of records to return per page.` }, + { name: 'offset', type: 'number', required: false, description: `Number of records to skip for pagination (use with limit).` }, ], }, { name: 'clarifymcp_submit_feedback', description: `Submit a feature request or bug report about Clarify MCP tools.`, params: [ - { - name: 'feedback', - type: 'string', - required: true, - description: `The feature request or feedback message describing what is missing or broken.`, - }, - { - name: 'category', - type: 'string', - required: false, - description: `Category for your feedback. Accepted values: missing_tool, bug, improvement, other.`, - }, + { name: 'feedback', type: 'string', required: true, description: `The feature request or feedback message describing what is missing or broken.` }, + { name: 'category', type: 'string', required: false, description: `Category for your feedback. Accepted values: missing_tool, bug, improvement, other.` }, ], }, ] diff --git a/src/data/agent-connectors/clickhouse.ts b/src/data/agent-connectors/clickhouse.ts index b499bba11..5e591941b 100644 --- a/src/data/agent-connectors/clickhouse.ts +++ b/src/data/agent-connectors/clickhouse.ts @@ -5,77 +5,38 @@ export const tools: Tool[] = [ name: 'clickhouse_get_clickpipe', description: `Get configuration and status for a specific ClickPipe by ID.`, params: [ - { - name: 'clickPipeId', - type: 'string', - required: true, - description: `ID of the requested ClickPipe`, - }, - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization that owns the service`, - }, - { - name: 'serviceId', - type: 'string', - required: true, - description: `ID of the service that owns the ClickPipe`, - }, + { name: 'clickPipeId', type: 'string', required: true, description: `ID of the requested ClickPipe` }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization that owns the service` }, + { name: 'serviceId', type: 'string', required: true, description: `ID of the service that owns the ClickPipe` }, ], }, { name: 'clickhouse_get_organization_cost', description: `Get billing and usage cost data for an organization over a date range (max 31 days). Returns a grand total and daily per-entity cost breakdown.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `The unique identifier of the organization`, - }, - { - name: 'from_date', - type: 'string', - required: false, - description: `Start date for the report, e.g. 2024-12-19 (YYYY-MM-DD)`, - }, - { - name: 'to_date', - type: 'string', - required: false, - description: `End date (inclusive) for the report, e.g. 2024-12-20 (YYYY-MM-DD). Cannot be more than 30 days after from_date.`, - }, + { name: 'organizationId', type: 'string', required: true, description: `The unique identifier of the organization` }, + { name: 'from_date', type: 'string', required: false, description: `Start date for the report, e.g. 2024-12-19 (YYYY-MM-DD)` }, + { name: 'to_date', type: 'string', required: false, description: `End date (inclusive) for the report, e.g. 2024-12-20 (YYYY-MM-DD). Cannot be more than 30 days after from_date.` }, ], }, { name: 'clickhouse_get_organization_details', description: `Get details for a specific ClickHouse Cloud organization: name, tier, status, and settings. Use get_organizations to find the organizationId.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization to retrieve`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization to retrieve` }, ], }, { name: 'clickhouse_get_organizations', description: `List all ClickHouse Cloud organizations accessible with the current API key. Returns organization IDs and names. Use the returned organizationId with all other tools.`, - params: [], + params: [ + ], }, { name: 'clickhouse_get_service_backup_configuration', description: `Get the backup schedule and retention configuration for a service.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization that owns the service`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization that owns the service` }, { name: 'serviceId', type: 'string', required: true, description: `ID of the service` }, ], }, @@ -84,12 +45,7 @@ export const tools: Tool[] = [ description: `Get details for a specific backup: status, size, duration, and creation time.`, params: [ { name: 'backupId', type: 'string', required: true, description: `ID of the backup` }, - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization that owns the service`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization that owns the service` }, { name: 'serviceId', type: 'string', required: true, description: `ID of the service` }, ], }, @@ -97,132 +53,57 @@ export const tools: Tool[] = [ name: 'clickhouse_get_service_details', description: `Get full details for a specific service: status, region, tier, endpoints, and scaling configuration.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization`, - }, - { - name: 'serviceId', - type: 'string', - required: true, - description: `ID of the service to retrieve`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization` }, + { name: 'serviceId', type: 'string', required: true, description: `ID of the service to retrieve` }, ], }, { name: 'clickhouse_get_services_list', description: `List all services (clusters) in a ClickHouse Cloud organization. Returns service IDs, names, status, region, and tier. Use the returned serviceId with other tools.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization whose services are to be listed`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization whose services are to be listed` }, ], }, { name: 'clickhouse_list_clickpipes', description: `List all ClickPipes (managed data ingestion pipelines) configured for a service.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization`, - }, - { - name: 'serviceId', - type: 'string', - required: true, - description: `ID of the service to list ClickPipes for`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization` }, + { name: 'serviceId', type: 'string', required: true, description: `ID of the service to list ClickPipes for` }, ], }, { name: 'clickhouse_list_databases', description: `List all databases in a ClickHouse service. Use the returned database names with list_tables and run_select_query.`, params: [ - { - name: 'serviceId', - type: 'string', - required: true, - description: `The unique identifier of the ClickHouse service`, - }, + { name: 'serviceId', type: 'string', required: true, description: `No description.` }, ], }, { name: 'clickhouse_list_service_backups', description: `List all backups for a service, most recent first. Returns backup IDs, status, size, and timestamps.`, params: [ - { - name: 'organizationId', - type: 'string', - required: true, - description: `ID of the organization`, - }, - { - name: 'serviceId', - type: 'string', - required: true, - description: `ID of the service to list backups for`, - }, + { name: 'organizationId', type: 'string', required: true, description: `ID of the organization` }, + { name: 'serviceId', type: 'string', required: true, description: `ID of the service to list backups for` }, ], }, { name: 'clickhouse_list_tables', description: `List all tables in a database, including column names and types. Supports LIKE pattern filtering.`, params: [ - { - name: 'database', - type: 'string', - required: true, - description: `Name of the database to list tables from`, - }, - { - name: 'serviceId', - type: 'string', - required: true, - description: `The unique identifier of the ClickHouse service`, - }, - { - name: 'like', - type: 'string', - required: false, - description: `Optional SQL LIKE pattern to filter tables by name (e.g., "events_%")`, - }, - { - name: 'notLike', - type: 'string', - required: false, - description: `Optional SQL LIKE pattern to exclude tables by name`, - }, + { name: 'database', type: 'string', required: true, description: `Name of the database to list tables from` }, + { name: 'serviceId', type: 'string', required: true, description: `The unique identifier of the ClickHouse service` }, + { name: 'like', type: 'string', required: false, description: `Optional SQL LIKE pattern to filter tables by name (e.g., "events_%")` }, + { name: 'notLike', type: 'string', required: false, description: `Optional SQL LIKE pattern to exclude tables by name` }, ], }, { name: 'clickhouse_run_select_query', description: `Execute a read-only SELECT query against a ClickHouse service. Only SELECT statements are permitted.`, params: [ - { - name: 'query', - type: 'string', - required: true, - description: `A valid ClickHouse SELECT query. Only read-only SELECT statements are permitted. e.g. SELECT * FROM my_table LIMIT 10`, - }, - { - name: 'serviceId', - type: 'string', - required: true, - description: `The unique identifier of the ClickHouse service`, - }, - { - name: 'timeoutSeconds', - type: 'integer', - required: false, - description: `Query timeout in seconds. Default: 300 (5 min), max: 3600 (1 hour). Use lower values for simple queries.`, - }, + { name: 'query', type: 'string', required: true, description: `A valid ClickHouse SELECT query. Only read-only SELECT statements are permitted. e.g. SELECT * FROM my_table LIMIT 10` }, + { name: 'serviceId', type: 'string', required: true, description: `The unique identifier of the ClickHouse service` }, + { name: 'timeoutSeconds', type: 'integer', required: false, description: `Query timeout in seconds. Default: 300 (5 min), max: 3600 (1 hour). Use lower values for simple queries.` }, ], }, ] diff --git a/src/data/agent-connectors/commonroommcp.ts b/src/data/agent-connectors/commonroommcp.ts new file mode 100644 index 000000000..39d3c4525 --- /dev/null +++ b/src/data/agent-connectors/commonroommcp.ts @@ -0,0 +1,90 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'commonroommcp_commonroom_create_object', + description: `Create a new object in Common Room — contact, organization, activity, or custom object type.`, + params: [ + { name: 'objectType', type: 'string', required: true, description: `The Common Room object type to operate on. Use get_catalog to discover all available types.` }, + { name: 'activityBody', type: 'string', required: false, description: `Body text content of the activity being recorded.` }, + { name: 'activityType', type: 'string', required: false, description: `Activity type identifier for this engagement signal. Use get_catalog with objectType=ActivityType to see all valid types.` }, + { name: 'communityId', type: 'string', required: false, description: `ID of the Common Room community to operate on.` }, + { name: 'companyDomain', type: 'string', required: false, description: `Domain of the company (e.g. acme.com). Used to link contacts to organizations.` }, + { name: 'companyName', type: 'string', required: false, description: `Name of the company the contact belongs to.` }, + { name: 'contactId', type: 'string', required: false, description: `The unique ID of an existing Contact in Common Room.` }, + { name: 'customFields', type: 'array', required: false, description: `Custom field values to set on the object.` }, + { name: 'description', type: 'string', required: false, description: `Optional description or notes about the object.` }, + { name: 'domain', type: 'string', required: false, description: `Domain of the organization (e.g. acme.com).` }, + { name: 'email', type: 'string', required: false, description: `Email address of the contact. Used as the unique identifier for Contact objects.` }, + { name: 'entityType', type: 'string', required: false, description: `The entity type associated with the activity.` }, + { name: 'fullName', type: 'string', required: false, description: `Full name of the contact.` }, + { name: 'githubUsername', type: 'string', required: false, description: `GitHub username of the contact.` }, + { name: 'linkedInUrl', type: 'string', required: false, description: `Full LinkedIn profile URL of the contact.` }, + { name: 'name', type: 'string', required: false, description: `Name of the organization or custom object.` }, + { name: 'note', type: 'string', required: false, description: `A note to attach to this contact or organization.` }, + { name: 'occurredAt', type: 'string', required: false, description: `ISO 8601 timestamp for when the activity occurred.` }, + { name: 'organizationId', type: 'string', required: false, description: `The unique ID of an existing Organization in Common Room.` }, + { name: 'prospectorCompanyId', type: 'string', required: false, description: `The Prospector company ID to associate with this record.` }, + { name: 'prospectorContactId', type: 'string', required: false, description: `The Prospector contact ID to associate with this record.` }, + { name: 'segmentId', type: 'string', required: false, description: `The ID of a Segment to assign this contact or organization to.` }, + { name: 'title', type: 'string', required: false, description: `Job title of the contact.` }, + { name: 'twitterHandle', type: 'string', required: false, description: `Twitter/X handle of the contact (without @).` }, + ], + }, + { + name: 'commonroommcp_commonroom_get_catalog', + description: `Retrieve the catalog of available object types, their properties, and allowed sort fields in Common Room.`, + params: [ + { name: 'communityId', type: 'string', required: false, description: `ID of the Common Room community to operate on.` }, + ], + }, + { + name: 'commonroommcp_commonroom_list_objects', + description: `List Common Room objects (contacts, organizations, segments, etc.) with optional pagination, filtering, and sorting.`, + params: [ + { name: 'objectType', type: 'string', required: true, description: `The Common Room object type to operate on. Use get_catalog to discover all available types.` }, + { name: 'communityId', type: 'string', required: false, description: `ID of the Common Room community to operate on.` }, + { name: 'cursor', type: 'string', required: false, description: `Pagination cursor returned by a previous response.` }, + { name: 'direction', type: 'string', required: false, description: `Sort direction for the results.` }, + { name: 'filter', type: 'object', required: false, description: `Filter criteria as a JSON object to narrow results.` }, + { name: 'id', type: 'string', required: false, description: `The unique ID of the object to retrieve.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of objects to return per page.` }, + { name: 'objectTypeId', type: 'string', required: false, description: `The ID of a custom object type to query.` }, + { name: 'properties', type: 'array', required: false, description: `List of property names to include in the response.` }, + { name: 'sort', type: 'string', required: false, description: `Field name to sort results by.` }, + ], + }, + { + name: 'commonroommcp_commonroom_submit_feedback', + description: `Submit feedback on the quality of a query result — use after presenting data to the user.`, + params: [ + { name: 'rating', type: 'string', required: true, description: `Your rating for the quality of the query result.` }, + { name: 'communityId', type: 'string', required: false, description: `ID of the Common Room community to operate on.` }, + { name: 'feedbackText', type: 'string', required: false, description: `Optional text explaining your feedback.` }, + { name: 'objectType', type: 'string', required: false, description: `The Common Room object type to operate on. Use get_catalog to discover all available types.` }, + { name: 'queryDescription', type: 'string', required: false, description: `Description of the query you are rating.` }, + ], + }, + { + name: 'commonroommcp_commonroom_update_object', + description: `Update fields on an existing Common Room object (contact, organization, etc.) by its ID.`, + params: [ + { name: 'objectType', type: 'string', required: true, description: `The Common Room object type to operate on. Use get_catalog to discover all available types.` }, + { name: 'communityId', type: 'string', required: false, description: `ID of the Common Room community to operate on.` }, + { name: 'companyDomain', type: 'string', required: false, description: `Domain of the company (e.g. acme.com). Used to link contacts to organizations.` }, + { name: 'companyName', type: 'string', required: false, description: `Name of the company the contact belongs to.` }, + { name: 'contactId', type: 'string', required: false, description: `The unique ID of an existing Contact in Common Room.` }, + { name: 'customFields', type: 'array', required: false, description: `Custom field values to set on the object.` }, + { name: 'email', type: 'string', required: false, description: `Email address of the contact. Used as the unique identifier for Contact objects.` }, + { name: 'fullName', type: 'string', required: false, description: `Full name of the contact.` }, + { name: 'githubUsername', type: 'string', required: false, description: `GitHub username of the contact.` }, + { name: 'linkedInUrl', type: 'string', required: false, description: `Full LinkedIn profile URL of the contact.` }, + { name: 'organizationId', type: 'string', required: false, description: `The unique ID of an existing Organization in Common Room.` }, + { name: 'prospectorCompanyId', type: 'string', required: false, description: `The Prospector company ID to associate with this record.` }, + { name: 'prospectorContactId', type: 'string', required: false, description: `The Prospector contact ID to associate with this record.` }, + { name: 'segmentId', type: 'string', required: false, description: `The ID of a Segment to assign this contact or organization to.` }, + { name: 'title', type: 'string', required: false, description: `Job title of the contact.` }, + { name: 'twitterHandle', type: 'string', required: false, description: `Twitter/X handle of the contact (without @).` }, + ], + }, +] diff --git a/src/data/agent-connectors/customeriomcp.ts b/src/data/agent-connectors/customeriomcp.ts new file mode 100644 index 000000000..482e2cd77 --- /dev/null +++ b/src/data/agent-connectors/customeriomcp.ts @@ -0,0 +1,73 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'customeriomcp_cio_auth_status', + description: `Show the active authentication state — authenticated user, account, and accessible workspaces. Call this to verify which Customer.io account is connected.`, + params: [ + ], + }, + { + name: 'customeriomcp_cio_delete_api', + description: `Delete a resource via the Customer.io API (DELETE only). Always run with dry_run=true first to preview before executing.`, + params: [ + { name: 'path', type: 'string', required: true, description: `API path including placeholders, e.g. '/v1/environments/{environment_id}/campaigns/{campaign_id}'. Placeholders are substituted from params.` }, + { name: 'dry_run', type: 'boolean', required: false, description: `Validate and return the request without executing it.` }, + { name: 'jq', type: 'string', required: false, description: `gojq expression to filter the response before returning.` }, + { name: 'params', type: 'object', required: false, description: `Parameters object. Keys matching path placeholders are substituted; remaining keys become the query string.` }, + ], + }, + { + name: 'customeriomcp_cio_prime', + description: `Print LLM-ready instructions for using the Customer.io API. Call this first in a new task to load context about available endpoints and best practices.`, + params: [ + ], + }, + { + name: 'customeriomcp_cio_read_api', + description: `Read from the Customer.io API (GET only). Use cio_schema first to find the correct path. Supports pagination, jq filtering, and dry_run preview.`, + params: [ + { name: 'path', type: 'string', required: true, description: `API path including placeholders, e.g. '/v1/environments/{environment_id}/campaigns'. Placeholders are substituted from params.` }, + { name: 'dry_run', type: 'boolean', required: false, description: `Validate and return the request without executing it.` }, + { name: 'jq', type: 'string', required: false, description: `gojq expression to filter the response before returning. Use to trim large responses.` }, + { name: 'limit', type: 'number', required: false, description: `Page size.` }, + { name: 'page', type: 'number', required: false, description: `Page number (1-indexed).` }, + { name: 'page_all', type: 'boolean', required: false, description: `Auto-paginate and return NDJSON for the full dataset.` }, + { name: 'params', type: 'object', required: false, description: `Parameters object. Keys matching path placeholders are substituted; remaining keys become the query string.` }, + ], + }, + { + name: 'customeriomcp_cio_schema', + description: `Introspect the Customer.io API schema to discover endpoints, parameters, and response shapes. Use this before calling cio_read_api or cio_write_api to find the correct path and placeholders.`, + params: [ + { name: 'query', type: 'string', required: false, description: `One of: '' (list resources), 'campaigns' (resource), 'campaigns.list' (resource.method), 'GET /v1/...' (method + path), or '/v1/...' (all methods for a path).` }, + { name: 'refresh', type: 'boolean', required: false, description: `Force re-download of API specs.` }, + ], + }, + { + name: 'customeriomcp_cio_skills_list', + description: `List available Customer.io agent skills — task-specific instruction manuals covering campaigns, segments, deliveries, analytics, and more.`, + params: [ + { name: 'refresh', type: 'boolean', required: false, description: `Force re-download of skills.` }, + ], + }, + { + name: 'customeriomcp_cio_skills_read', + description: `Read the full content of a specific Customer.io agent skill by path. Use cio_skills_list to find available paths (e.g. 'campaigns', 'fly-api/campaigns.md').`, + params: [ + { name: 'path', type: 'string', required: true, description: `Skill path, e.g. 'campaigns' or 'campaigns/examples'. See cio_skills_list for available paths.` }, + ], + }, + { + name: 'customeriomcp_cio_write_api', + description: `Write to the Customer.io API (POST, PUT, or PATCH). Always run with dry_run=true first to preview the request before executing.`, + params: [ + { name: 'path', type: 'string', required: true, description: `API path including placeholders, e.g. '/v1/environments/{environment_id}/campaigns'. Placeholders are substituted from params.` }, + { name: 'body', type: 'object', required: false, description: `JSON request body.` }, + { name: 'dry_run', type: 'boolean', required: false, description: `Validate and return the request without executing it.` }, + { name: 'jq', type: 'string', required: false, description: `gojq expression to filter the response before returning.` }, + { name: 'method', type: 'string', required: false, description: `HTTP method: POST, PUT, or PATCH. Defaults to POST.` }, + { name: 'params', type: 'object', required: false, description: `Parameters object. Keys matching path placeholders are substituted; remaining keys become the query string.` }, + ], + }, +] diff --git a/src/data/agent-connectors/datadog.ts b/src/data/agent-connectors/datadog.ts index daec0676b..3ad6af887 100644 --- a/src/data/agent-connectors/datadog.ts +++ b/src/data/agent-connectors/datadog.ts @@ -1,1960 +1,750 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ - // Account { name: 'datadog_api_key_validate', - description: 'Validate the current Datadog API key.', - params: [], + description: `Validate the current Datadog API key.`, + params: [ + ], }, { - name: 'datadog_current_user_get', - description: 'Get the current authenticated Datadog user.', - params: [], + name: 'datadog_audit_logs_search', + description: `Search audit log events in Datadog for a given time window.`, + params: [ + { name: 'from', type: 'string', required: true, description: `Start of the time window in ISO 8601 format, e.g. 'now-1h' or '2023-01-01T00:00:00Z'.` }, + { name: 'to', type: 'string', required: true, description: `End of the time window in ISO 8601 format, e.g. 'now' or '2023-01-02T00:00:00Z'.` }, + { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from a previous response to fetch the next page.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of audit events to return (max 1000).` }, + { name: 'query', type: 'string', required: false, description: `Filter query for the audit log search.` }, + { name: 'sort', type: 'string', required: false, description: `Sort order: 'timestamp' for ascending, '-timestamp' for descending.` }, + ], }, { - name: 'datadog_permissions_list', - description: 'List all available Datadog permissions.', - params: [], + name: 'datadog_containers_list', + description: `List all containers running on your infrastructure.`, + params: [ + { name: 'filter_tags', type: 'string', required: false, description: `Filter containers by tag.` }, + { name: 'page_cursor', type: 'string', required: false, description: `Cursor for pagination to get the next page of results.` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of containers to return per page.` }, + ], }, { - name: 'datadog_ip_ranges_list', - description: 'Get all IP ranges used by Datadog agents and services.', - params: [], + name: 'datadog_current_user_get', + description: `Get the current authenticated Datadog user.`, + params: [ + ], }, - // Dashboards { - name: 'datadog_dashboards_list', - description: 'List all Datadog dashboards.', - params: [ - { - name: 'count', - type: 'integer', - required: false, - description: '50', - }, - { - name: 'filter_deleted', - type: 'string', - required: false, - description: 'false', - }, - { - name: 'filter_shared', - type: 'string', - required: false, - description: 'true', - }, - { - name: 'start', - type: 'integer', - required: false, - description: '0', - }, + name: 'datadog_dashboard_create', + description: `Create a new Datadog dashboard.`, + params: [ + { name: 'layout_type', type: 'string', required: true, description: `Layout type for the dashboard (ordered or free).` }, + { name: 'title', type: 'string', required: true, description: `Title of the dashboard.` }, + { name: 'description', type: 'string', required: false, description: `Description of the dashboard.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tags for the dashboard.` }, + { name: 'template_variables', type: 'string', required: false, description: `JSON array of template variable objects.` }, + { name: 'widgets', type: 'string', required: false, description: `JSON array of widget objects for the dashboard.` }, ], }, { - name: 'datadog_dashboard_get', - description: 'Get a specific Datadog dashboard by ID.', + name: 'datadog_dashboard_delete', + description: `Delete a Datadog dashboard by ID.`, params: [ - { - name: 'dashboard_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, + { name: 'dashboard_id', type: 'string', required: true, description: `ID of the dashboard to delete.` }, ], }, { - name: 'datadog_dashboard_create', - description: 'Create a new Datadog dashboard.', - params: [ - { - name: 'description', - type: 'string', - required: false, - description: 'Overview of my service metrics', - }, - { - name: 'layout_type', - type: 'string', - required: true, - description: 'ordered', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["team:ops"]', - }, - { - name: 'template_variables', - type: 'string', - required: false, - description: '[]', - }, - { - name: 'title', - type: 'string', - required: true, - description: 'My Service Dashboard', - }, - { - name: 'widgets', - type: 'string', - required: false, - description: '[]', - }, + name: 'datadog_dashboard_get', + description: `Get a specific Datadog dashboard by ID.`, + params: [ + { name: 'dashboard_id', type: 'string', required: true, description: `ID of the dashboard to retrieve.` }, ], }, { name: 'datadog_dashboard_update', - description: 'Update an existing Datadog dashboard.', - params: [ - { - name: 'dashboard_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, - { - name: 'description', - type: 'string', - required: false, - description: 'Overview of my service metrics', - }, - { - name: 'layout_type', - type: 'string', - required: true, - description: 'ordered', - }, - { - name: 'title', - type: 'string', - required: true, - description: 'My Service Dashboard', - }, - { - name: 'widgets', - type: 'string', - required: false, - description: '[]', - }, + description: `Update an existing Datadog dashboard.`, + params: [ + { name: 'dashboard_id', type: 'string', required: true, description: `ID of the dashboard to update.` }, + { name: 'layout_type', type: 'string', required: true, description: `Layout type for the dashboard (ordered or free).` }, + { name: 'title', type: 'string', required: true, description: `Title of the dashboard.` }, + { name: 'description', type: 'string', required: false, description: `Description of the dashboard.` }, + { name: 'widgets', type: 'string', required: false, description: `JSON array of widget objects for the dashboard.` }, ], }, { - name: 'datadog_dashboard_delete', - description: 'Delete a Datadog dashboard by ID.', + name: 'datadog_dashboards_list', + description: `List all Datadog dashboards.`, params: [ - { - name: 'dashboard_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, + { name: 'count', type: 'integer', required: false, description: `Maximum number of dashboards to return.` }, + { name: 'filter_deleted', type: 'string', required: false, description: `Filter deleted dashboards (true/false).` }, + { name: 'filter_shared', type: 'string', required: false, description: `Filter shared dashboards (true/false).` }, + { name: 'start', type: 'integer', required: false, description: `Start index for pagination.` }, ], }, { - name: 'datadog_graph_snapshot', - description: 'Take a snapshot of a metric graph in Datadog.', - params: [ - { - name: 'end', - type: 'integer', - required: true, - description: '1672617600', - }, - { - name: 'event_query', - type: 'string', - required: false, - description: 'tags:deploy', - }, - { - name: 'metric_query', - type: 'string', - required: true, - description: 'avg:system.cpu.user{*}', - }, - { - name: 'start', - type: 'integer', - required: true, - description: '1672531200', - }, - { - name: 'title', - type: 'string', - required: false, - description: 'CPU Usage Over Time', - }, - ], - }, - // Monitors & downtimes + name: 'datadog_downtime_cancel', + description: `Cancel a Datadog downtime by ID.`, + params: [ + { name: 'downtime_id', type: 'string', required: true, description: `ID of the downtime to cancel.` }, + ], + }, { - name: 'datadog_monitors_list', - description: 'List all Datadog monitors with optional filtering.', - params: [ - { - name: 'group_states', - type: 'string', - required: false, - description: 'alert,warn', - }, - { - name: 'monitor_tags', - type: 'string', - required: false, - description: 'team:backend', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'CPU monitor', - }, - { - name: 'page', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: '100', - }, - { - name: 'tags', - type: 'string', - required: false, - description: 'env:prod', - }, - { - name: 'with_downtimes', - type: 'string', - required: false, - description: 'true', - }, + name: 'datadog_downtime_create', + description: `Create a new Datadog downtime to suppress alerts.`, + params: [ + { name: 'scope', type: 'string', required: true, description: `Scope of the downtime, e.g. * or env:prod.` }, + { name: 'end', type: 'string', required: false, description: `ISO-8601 UTC datetime when the downtime ends, e.g. 2026-04-28T12:00:00+00:00.` }, + { name: 'message', type: 'string', required: false, description: `Message to include with the downtime.` }, + { name: 'monitor_id', type: 'integer', required: false, description: `Monitor ID to apply the downtime to. Omit to apply to all monitors.` }, + { name: 'monitor_tags', type: 'string', required: false, description: `JSON array of monitor tags to match for the downtime, e.g. ["*"] for all monitors.` }, + { name: 'start', type: 'string', required: false, description: `ISO-8601 UTC datetime when the downtime starts, e.g. 2026-04-28T10:00:00+00:00.` }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for the downtime schedule (IANA format).` }, ], }, { - name: 'datadog_monitor_get', - description: 'Get a specific Datadog monitor by ID.', + name: 'datadog_downtime_get', + description: `Get a specific Datadog downtime by ID.`, params: [ - { - name: 'monitor_id', - type: 'integer', - required: true, - description: '123456', - }, + { name: 'downtime_id', type: 'string', required: true, description: `ID of the downtime to retrieve.` }, ], }, { - name: 'datadog_monitor_create', - description: 'Create a new Datadog monitor.', - params: [ - { - name: 'message', - type: 'string', - required: false, - description: 'CPU usage is high on {{host.name}}', - }, - { - name: 'name', - type: 'string', - required: true, - description: 'High CPU Usage', - }, - { - name: 'no_data_timeframe', - type: 'integer', - required: false, - description: '10', - }, - { - name: 'notify_no_data', - type: 'string', - required: false, - description: 'true', - }, - { - name: 'priority', - type: 'integer', - required: false, - description: '3', - }, - { - name: 'query', - type: 'string', - required: true, - description: 'avg(last_5m):avg:system.cpu.user{*} > 90', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod"]', - }, - { - name: 'type', - type: 'string', - required: true, - description: 'metric alert', - }, + name: 'datadog_downtime_update', + description: `Update an existing Datadog downtime.`, + params: [ + { name: 'downtime_id', type: 'string', required: true, description: `ID of the downtime to update.` }, + { name: 'message', type: 'string', required: false, description: `Updated message for the downtime.` }, + { name: 'scope', type: 'string', required: false, description: `Updated scope of the downtime.` }, ], }, { - name: 'datadog_monitor_update', - description: 'Update an existing Datadog monitor.', - params: [ - { - name: 'message', - type: 'string', - required: false, - description: 'CPU usage is high on {{host.name}}', - }, - { - name: 'monitor_id', - type: 'integer', - required: true, - description: '123456', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'High CPU Usage', - }, - { - name: 'priority', - type: 'integer', - required: false, - description: '3', - }, - { - name: 'query', - type: 'string', - required: false, - description: 'avg(last_5m):avg:system.cpu.user{*} > 90', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod"]', - }, + name: 'datadog_downtimes_list', + description: `List all Datadog downtimes.`, + params: [ + { name: 'filter_monitor_id', type: 'integer', required: false, description: `Filter downtimes by monitor ID.` }, + { name: 'page_limit', type: 'integer', required: false, description: `Number of items to return per page.` }, + { name: 'page_offset', type: 'integer', required: false, description: `Offset for pagination.` }, ], }, { - name: 'datadog_monitor_delete', - description: 'Delete a Datadog monitor by ID.', + name: 'datadog_event_create', + description: `Create a new event in Datadog.`, params: [ - { - name: 'monitor_id', - type: 'integer', - required: true, - description: '123456', - }, + { name: 'text', type: 'string', required: true, description: `Body text of the event.` }, + { name: 'title', type: 'string', required: true, description: `Title of the event.` }, + { name: 'aggregation_key', type: 'string', required: false, description: `Key to aggregate related events.` }, + { name: 'alert_type', type: 'string', required: false, description: `Alert type: info, error, warning, success, user_update, recommendation, snapshot.` }, + { name: 'date_happened', type: 'integer', required: false, description: `Unix timestamp when the event occurred.` }, + { name: 'host', type: 'string', required: false, description: `Host name to associate with the event.` }, + { name: 'priority', type: 'string', required: false, description: `Priority of the event: normal or low.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tags for the event.` }, ], }, { - name: 'datadog_monitor_search', - description: 'Search Datadog monitors using a query string.', - params: [ - { - name: 'page', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'per_page', - type: 'integer', - required: false, - description: '30', - }, - { - name: 'query', - type: 'string', - required: false, - description: 'cpu', - }, - { - name: 'sort', - type: 'string', - required: false, - description: 'name,asc', - }, + name: 'datadog_event_get', + description: `Get a specific Datadog event by ID.`, + params: [ + { name: 'event_id', type: 'string', required: true, description: `ID of the event to retrieve. Use the id_str value from event_create or events_list_v2 to avoid float precision loss.` }, ], }, { - name: 'datadog_monitor_mute', - description: 'Mute a Datadog monitor, optionally with a scope and end time.', - params: [ - { - name: 'end', - type: 'integer', - required: false, - description: '1609545600', - }, - { - name: 'monitor_id', - type: 'integer', - required: true, - description: '123456', - }, - { - name: 'scope', - type: 'string', - required: false, - description: 'role:db', - }, + name: 'datadog_events_list_v2', + description: `List Datadog events using the v2 API with filtering and pagination.`, + params: [ + { name: 'filter_from', type: 'string', required: false, description: `ISO 8601 datetime for start of the filter range.` }, + { name: 'filter_query', type: 'string', required: false, description: `Search query to filter events.` }, + { name: 'filter_to', type: 'string', required: false, description: `ISO 8601 datetime for end of the filter range.` }, + { name: 'page_cursor', type: 'string', required: false, description: `Cursor for pagination.` }, + { name: 'page_limit', type: 'integer', required: false, description: `Maximum number of events to return.` }, + { name: 'sort', type: 'string', required: false, description: `Sort order for events (timestamp or asc).` }, ], }, { - name: 'datadog_monitor_unmute', - description: 'Unmute a Datadog monitor.', + name: 'datadog_events_query', + description: `Query Datadog events within a time range.`, params: [ - { - name: 'monitor_id', - type: 'integer', - required: true, - description: '123456', - }, + { name: 'end', type: 'integer', required: true, description: `Unix timestamp for end of query window.` }, + { name: 'start', type: 'integer', required: true, description: `Unix timestamp for start of query window.` }, + { name: 'count', type: 'integer', required: false, description: `Maximum number of events to return.` }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination.` }, + { name: 'priority', type: 'string', required: false, description: `Priority filter: normal or low.` }, + { name: 'sources', type: 'string', required: false, description: `Comma-separated event sources to filter by.` }, + { name: 'tags', type: 'string', required: false, description: `Comma-separated tags to filter events by.` }, + { name: 'unaggregated', type: 'string', required: false, description: `Whether to return unaggregated events (true/false).` }, ], }, { - name: 'datadog_downtimes_list', - description: 'List all Datadog downtimes.', - params: [ - { - name: 'filter_monitor_id', - type: 'integer', - required: false, - description: '123456', - }, - { - name: 'page_limit', - type: 'integer', - required: false, - description: '25', - }, - { - name: 'page_offset', - type: 'integer', - required: false, - description: '0', - }, + name: 'datadog_graph_snapshot', + description: `Take a snapshot of a metric graph in Datadog.`, + params: [ + { name: 'end', type: 'integer', required: true, description: `End of the time window as a Unix timestamp (seconds).` }, + { name: 'metric_query', type: 'string', required: true, description: `The Datadog metric query for the graph snapshot.` }, + { name: 'start', type: 'integer', required: true, description: `Start of the time window as a Unix timestamp (seconds).` }, + { name: 'event_query', type: 'string', required: false, description: `Query string to add event bands to the snapshot graph.` }, + { name: 'title', type: 'string', required: false, description: `Title for the snapshot graph.` }, ], }, { - name: 'datadog_downtime_get', - description: 'Get a specific Datadog downtime by ID.', + name: 'datadog_host_mute', + description: `Mute a Datadog host to suppress alerts.`, params: [ - { - name: 'downtime_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'host_name', type: 'string', required: true, description: `Name of the host to mute.` }, + { name: 'end', type: 'integer', required: false, description: `Unix timestamp when the mute ends.` }, + { name: 'message', type: 'string', required: false, description: `Message describing why the host is being muted.` }, + { name: 'override', type: 'string', required: false, description: `Whether to override an existing mute (true/false).` }, ], }, { - name: 'datadog_downtime_create', - description: 'Create a new Datadog downtime to suppress alerts.', - params: [ - { - name: 'end', - type: 'string', - required: false, - description: '2026-04-28T12:00:00+00:00', - }, - { - name: 'message', - type: 'string', - required: false, - description: 'Scheduled maintenance', - }, - { - name: 'monitor_id', - type: 'integer', - required: false, - description: '123456', - }, - { - name: 'monitor_tags', - type: 'string', - required: false, - description: '["*"]', - }, - { - name: 'scope', - type: 'string', - required: true, - description: 'env:prod', - }, - { - name: 'start', - type: 'string', - required: false, - description: '2026-04-28T10:00:00+00:00', - }, - { - name: 'timezone', - type: 'string', - required: false, - description: 'UTC', - }, + name: 'datadog_host_tags_create', + description: `Add tags to a specific host in Datadog.`, + params: [ + { name: 'host_name', type: 'string', required: true, description: `The hostname to add tags to.` }, + { name: 'tags', type: 'string', required: true, description: `JSON array of tag strings to add to the host. E.g. ["env:prod","role:db"].` }, + { name: 'source', type: 'string', required: false, description: `The source of the tags (optional). Used to filter tags by source.` }, ], }, { - name: 'datadog_downtime_update', - description: 'Update an existing Datadog downtime.', - params: [ - { - name: 'downtime_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, - { - name: 'message', - type: 'string', - required: false, - description: 'Extended maintenance window', - }, - { - name: 'scope', - type: 'string', - required: false, - description: 'env:prod', - }, + name: 'datadog_host_tags_delete', + description: `Remove all tags from a specific host in Datadog.`, + params: [ + { name: 'host_name', type: 'string', required: true, description: `The hostname to remove all tags from.` }, + { name: 'source', type: 'string', required: false, description: `The source of the tags to remove (optional).` }, ], }, { - name: 'datadog_downtime_cancel', - description: 'Cancel a Datadog downtime by ID.', + name: 'datadog_host_tags_get', + description: `Get all tags for a specific host.`, params: [ - { - name: 'downtime_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'host_name', type: 'string', required: true, description: `The hostname to retrieve tags for.` }, ], }, - // Incidents { - name: 'datadog_incidents_list', - description: 'List Datadog incidents with optional filtering.', - params: [ - { - name: 'filter', - type: 'string', - required: false, - description: 'service:payment', - }, - { - name: 'page_offset', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: '10', - }, - { - name: 'sort', - type: 'string', - required: false, - description: 'created', - }, + name: 'datadog_host_tags_update', + description: `Replace all tags for a specific host in Datadog.`, + params: [ + { name: 'host_name', type: 'string', required: true, description: `The hostname whose tags will be replaced.` }, + { name: 'tags', type: 'string', required: true, description: `JSON array of tag strings to set on the host. Replaces all existing tags. E.g. ["env:prod","role:db"].` }, + { name: 'source', type: 'string', required: false, description: `The source of the tags (optional).` }, ], }, { - name: 'datadog_incident_get', - description: 'Get a specific Datadog incident by ID.', + name: 'datadog_host_unmute', + description: `Unmute a Datadog host.`, params: [ - { - name: 'incident_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'host_name', type: 'string', required: true, description: `Name of the host to unmute.` }, ], }, { - name: 'datadog_incident_create', - description: 'Create a new Datadog incident.', - params: [ - { - name: 'customer_impacted', - type: 'boolean', - required: true, - description: 'true', - }, - { - name: 'severity', - type: 'string', - required: false, - description: 'SEV-2', - }, - { - name: 'state', - type: 'string', - required: false, - description: 'active', - }, - { - name: 'title', - type: 'string', - required: true, - description: 'Database connection failures', - }, - ], - }, - // SLOs + name: 'datadog_hosts_list', + description: `List Datadog hosts with optional filtering and sorting.`, + params: [ + { name: 'count', type: 'integer', required: false, description: `Maximum number of hosts to return.` }, + { name: 'filter', type: 'string', required: false, description: `Filter string to search hosts.` }, + { name: 'include_muted_hosts_data', type: 'string', required: false, description: `Whether to include muted hosts data (true/false).` }, + { name: 'sort_dir', type: 'string', required: false, description: `Sort direction: asc or desc.` }, + { name: 'sort_field', type: 'string', required: false, description: `Field to sort hosts by.` }, + { name: 'start', type: 'integer', required: false, description: `Starting offset for pagination.` }, + ], + }, { - name: 'datadog_slos_list', - description: 'List Service Level Objectives (SLOs) in Datadog.', - params: [ - { - name: 'ids', - type: 'string', - required: false, - description: 'id1,id2,id3', - }, - { - name: 'limit', - type: 'integer', - required: false, - description: '25', - }, - { - name: 'offset', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'query', - type: 'string', - required: false, - description: 'my service', - }, - { - name: 'tags_query', - type: 'string', - required: false, - description: 'env:prod', - }, + name: 'datadog_hosts_totals', + description: `Get the total number of active and up Datadog hosts.`, + params: [ ], }, { - name: 'datadog_slo_get', - description: 'Get a specific Datadog Service Level Objective by ID.', + name: 'datadog_incident_create', + description: `Create a new Datadog incident.`, params: [ - { - name: 'slo_id', - type: 'string', - required: true, - description: 'abc123def456', - }, + { name: 'customer_impacted', type: 'string', required: true, description: `Whether customers are impacted (true/false).` }, + { name: 'title', type: 'string', required: true, description: `Title of the incident.` }, + { name: 'severity', type: 'string', required: false, description: `Severity level: SEV-1, SEV-2, SEV-3, SEV-4, SEV-5, or UNKNOWN.` }, + { name: 'state', type: 'string', required: false, description: `Initial state: active, stable, or resolved.` }, ], }, { - name: 'datadog_slo_create', - description: 'Create a new Service Level Objective (SLO) in Datadog.', - params: [ - { - name: 'description', - type: 'string', - required: false, - description: 'Tracks API availability over 7 days', - }, - { - name: 'monitor_ids', - type: 'string', - required: false, - description: '[123456, 789012]', - }, - { - name: 'name', - type: 'string', - required: true, - description: 'API Uptime SLO', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod"]', - }, - { - name: 'thresholds', - type: 'string', - required: true, - description: '[{"timeframe":"7d","target":99.9}]', - }, - { - name: 'query', - type: 'string', - required: false, - description: - '{"numerator":"sum:requests.success{*}.as_count()","denominator":"sum:requests.total{*}.as_count()"}', - }, - { - name: 'type', - type: 'string', - required: true, - description: 'metric', - }, + name: 'datadog_incident_get', + description: `Get a specific Datadog incident by ID.`, + params: [ + { name: 'incident_id', type: 'string', required: true, description: `ID of the incident to retrieve.` }, ], }, { - name: 'datadog_slo_update', - description: 'Update an existing Datadog Service Level Objective.', - params: [ - { - name: 'description', - type: 'string', - required: false, - description: 'Updated description', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'API Uptime SLO', - }, - { - name: 'slo_id', - type: 'string', - required: true, - description: 'abc123def456', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod"]', - }, - { - name: 'thresholds', - type: 'string', - required: false, - description: '[{"timeframe":"30d","target":99.5}]', - }, - { - name: 'type', - type: 'string', - required: true, - description: 'monitor', - }, + name: 'datadog_incidents_list', + description: `List Datadog incidents with optional filtering.`, + params: [ + { name: 'filter', type: 'string', required: false, description: `Search query to filter incidents.` }, + { name: 'page_offset', type: 'integer', required: false, description: `Offset for pagination.` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of incidents per page.` }, + { name: 'sort', type: 'string', required: false, description: `Sort field: created or modified.` }, ], }, { - name: 'datadog_slo_delete', - description: 'Delete a Datadog Service Level Objective by ID.', + name: 'datadog_ip_ranges_list', + description: `Get all IP ranges used by Datadog agents and services.`, params: [ - { - name: 'slo_id', - type: 'string', - required: true, - description: 'abc123def456', - }, ], }, { - name: 'datadog_slo_history', - description: 'Get historical data for a specific Datadog SLO.', - params: [ - { - name: 'from_ts', - type: 'integer', - required: true, - description: '1609459200', - }, - { - name: 'slo_id', - type: 'string', - required: true, - description: 'abc123def456', - }, - { - name: 'target', - type: 'string', - required: false, - description: '99.9', - }, - { - name: 'to_ts', - type: 'integer', - required: true, - description: '1609545600', - }, - ], - }, - // Metrics + name: 'datadog_log_indexes_list', + description: `List all Datadog log indexes.`, + params: [ + ], + }, { - name: 'datadog_metrics_list', - description: 'List active metrics reported from a given Unix timestamp.', - params: [ - { - name: 'from', - type: 'integer', - required: true, - description: '1609459200', - }, - { - name: 'host', - type: 'string', - required: false, - description: 'my-host.example.com', - }, - { - name: 'tag_filter', - type: 'string', - required: false, - description: 'env:prod', - }, + name: 'datadog_log_pipeline_get', + description: `Get a specific Datadog log processing pipeline by ID.`, + params: [ + { name: 'pipeline_id', type: 'string', required: true, description: `ID of the log pipeline to retrieve.` }, ], }, { - name: 'datadog_metrics_query', - description: 'Query timeseries metric data from Datadog.', - params: [ - { - name: 'from', - type: 'integer', - required: true, - description: '1609459200', - }, - { - name: 'query', - type: 'string', - required: true, - description: 'avg:system.cpu.user{*}', - }, - { - name: 'to', - type: 'integer', - required: true, - description: '1609545600', - }, + name: 'datadog_log_pipelines_list', + description: `List all Datadog log processing pipelines.`, + params: [ ], }, { - name: 'datadog_metrics_submit', - description: 'Submit metric data points to Datadog.', - params: [ - { - name: 'host', - type: 'string', - required: false, - description: 'my-host.example.com', - }, - { - name: 'metric_name', - type: 'string', - required: true, - description: 'my.custom.metric', - }, - { - name: 'metric_type', - type: 'integer', - required: true, - description: '3', - }, - { - name: 'points_timestamps', - type: 'string', - required: true, - description: '[1609459200]', - }, - { - name: 'points_values', - type: 'string', - required: true, - description: '[42.5]', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod"]', - }, + name: 'datadog_logs_aggregate', + description: `Aggregate Datadog log events with grouping and compute operations.`, + params: [ + { name: 'compute', type: 'string', required: true, description: `JSON array of compute objects defining aggregations.` }, + { name: 'from', type: 'string', required: true, description: `ISO 8601 start time for log aggregation.` }, + { name: 'to', type: 'string', required: true, description: `ISO 8601 end time for log aggregation.` }, + { name: 'group_by', type: 'string', required: false, description: `JSON array of group_by objects.` }, + { name: 'query', type: 'string', required: false, description: `Log filter query string.` }, + ], + }, + { + name: 'datadog_logs_search', + description: `Search and filter Datadog log events.`, + params: [ + { name: 'from', type: 'string', required: true, description: `ISO 8601 start time for the log search.` }, + { name: 'to', type: 'string', required: true, description: `ISO 8601 end time for the log search.` }, + { name: 'cursor', type: 'string', required: false, description: `Pagination cursor for fetching next page.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of log events to return (max 1000).` }, + { name: 'query', type: 'string', required: false, description: `Log search query string.` }, + { name: 'sort', type: 'string', required: false, description: `Sort order: timestamp (newest first) or asc (oldest first).` }, ], }, { name: 'datadog_metric_metadata_get', - description: 'Get metadata for a specific Datadog metric.', + description: `Get metadata for a specific Datadog metric.`, params: [ - { - name: 'metric_name', - type: 'string', - required: true, - description: 'system.cpu.user', - }, + { name: 'metric_name', type: 'string', required: true, description: `Name of the metric to retrieve metadata for.` }, ], }, { name: 'datadog_metric_metadata_update', - description: 'Update metadata for a specific Datadog metric.', - params: [ - { - name: 'description', - type: 'string', - required: false, - description: 'CPU usage percentage', - }, - { - name: 'metric_name', - type: 'string', - required: true, - description: 'system.cpu.user', - }, - { - name: 'short_name', - type: 'string', - required: false, - description: 'cpu user', - }, - { - name: 'type', - type: 'string', - required: false, - description: 'gauge', - }, - { - name: 'unit', - type: 'string', - required: false, - description: 'percent', - }, + description: `Update metadata for a specific Datadog metric.`, + params: [ + { name: 'metric_name', type: 'string', required: true, description: `Name of the metric to update metadata for.` }, + { name: 'description', type: 'string', required: false, description: `Description of the metric.` }, + { name: 'short_name', type: 'string', required: false, description: `Short name for the metric.` }, + { name: 'type', type: 'string', required: false, description: `Metric type: gauge, rate, or count.` }, + { name: 'unit', type: 'string', required: false, description: `Unit of the metric.` }, ], }, { name: 'datadog_metric_tags_list', - description: 'List all tags for a specific Datadog metric.', + description: `List all tags for a specific Datadog metric.`, params: [ - { - name: 'metric_name', - type: 'string', - required: true, - description: 'system.cpu.user', - }, + { name: 'metric_name', type: 'string', required: true, description: `Name of the metric to list tags for.` }, ], }, - // Logs { - name: 'datadog_logs_search', - description: 'Search and filter Datadog log events.', - params: [ - { - name: 'cursor', - type: 'string', - required: false, - description: 'eyJzdGFydEF0IjoiMjAyMS0wMS0wMVQwMDowMDowMFoifQ==', - }, - { - name: 'from', - type: 'string', - required: true, - description: '2021-01-01T00:00:00Z', - }, - { - name: 'limit', - type: 'integer', - required: false, - description: '100', - }, - { - name: 'query', - type: 'string', - required: false, - description: 'service:web status:error', - }, - { - name: 'sort', - type: 'string', - required: false, - description: 'timestamp', - }, - { - name: 'to', - type: 'string', - required: true, - description: '2021-01-02T00:00:00Z', - }, + name: 'datadog_metrics_list', + description: `List active metrics reported from a given Unix timestamp.`, + params: [ + { name: 'from', type: 'integer', required: true, description: `Unix timestamp from which to start the search.` }, + { name: 'host', type: 'string', required: false, description: `Hostname to filter the list of metrics to those active on this host.` }, + { name: 'tag_filter', type: 'string', required: false, description: `Filter metrics by tag.` }, ], }, { - name: 'datadog_logs_aggregate', - description: 'Aggregate Datadog log events with grouping and compute operations.', - params: [ - { - name: 'compute', - type: 'string', - required: true, - description: '[{"aggregation":"count","type":"total"}]', - }, - { - name: 'from', - type: 'string', - required: true, - description: '2021-01-01T00:00:00Z', - }, - { - name: 'group_by', - type: 'string', - required: false, - description: '[{"facet":"service"}]', - }, - { - name: 'query', - type: 'string', - required: false, - description: 'service:web', - }, - { - name: 'to', - type: 'string', - required: true, - description: '2021-01-02T00:00:00Z', - }, + name: 'datadog_metrics_query', + description: `Query timeseries metric data from Datadog.`, + params: [ + { name: 'from', type: 'integer', required: true, description: `Unix timestamp for start of query window.` }, + { name: 'query', type: 'string', required: true, description: `Datadog metric query string.` }, + { name: 'to', type: 'integer', required: true, description: `Unix timestamp for end of query window.` }, ], }, { - name: 'datadog_log_indexes_list', - description: 'List all Datadog log indexes.', - params: [], + name: 'datadog_metrics_submit', + description: `Submit metric data points to Datadog.`, + params: [ + { name: 'metric_name', type: 'string', required: true, description: `Name of the metric to submit.` }, + { name: 'metric_type', type: 'integer', required: true, description: `Metric type: 0=unspecified, 1=count, 2=rate, 3=gauge.` }, + { name: 'points_timestamps', type: 'string', required: true, description: `JSON array of Unix timestamps for the data points.` }, + { name: 'points_values', type: 'string', required: true, description: `JSON array of float values corresponding to each timestamp.` }, + { name: 'host', type: 'string', required: false, description: `Host name to associate with the metric.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tag strings to associate with the metric.` }, + ], }, { - name: 'datadog_log_pipeline_get', - description: 'Get a specific Datadog log processing pipeline by ID.', + name: 'datadog_monitor_create', + description: `Create a new Datadog monitor.`, params: [ - { - name: 'pipeline_id', - type: 'string', - required: true, - description: 'my-pipeline-id', - }, + { name: 'name', type: 'string', required: true, description: `Name of the monitor.` }, + { name: 'query', type: 'string', required: true, description: `The monitor query string.` }, + { name: 'type', type: 'string', required: true, description: `Type of the monitor (e.g. metric alert, service check, event alert, query alert).` }, + { name: 'message', type: 'string', required: false, description: `Notification message for the monitor.` }, + { name: 'no_data_timeframe', type: 'integer', required: false, description: `Number of minutes before notifying on missing data.` }, + { name: 'notify_no_data', type: 'string', required: false, description: `Whether to notify when no data is received (true/false).` }, + { name: 'priority', type: 'integer', required: false, description: `Monitor priority from 1 (highest) to 5 (lowest).` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tags to associate with the monitor.` }, ], }, { - name: 'datadog_log_pipelines_list', - description: 'List all Datadog log processing pipelines.', - params: [], + name: 'datadog_monitor_delete', + description: `Delete a Datadog monitor by ID.`, + params: [ + { name: 'monitor_id', type: 'integer', required: true, description: `ID of the monitor to delete.` }, + ], }, { - name: 'datadog_audit_logs_search', - description: 'Search audit log events in Datadog for a given time window.', - params: [ - { - name: 'cursor', - type: 'string', - required: false, - description: 'eyJzdGFydEF0IjoiMjAy...', - }, - { - name: 'from', - type: 'string', - required: true, - description: 'now-1h', - }, - { - name: 'limit', - type: 'integer', - required: false, - description: '25', - }, - { - name: 'query', - type: 'string', - required: false, - description: '@action:login', - }, - { - name: 'sort', - type: 'string', - required: false, - description: '-timestamp', - }, - { - name: 'to', - type: 'string', - required: true, - description: 'now', - }, - ], - }, - // Events - { - name: 'datadog_events_query', - description: 'Query Datadog events within a time range.', - params: [ - { - name: 'count', - type: 'integer', - required: false, - description: '100', - }, - { - name: 'end', - type: 'integer', - required: true, - description: '1609545600', - }, - { - name: 'page', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'priority', - type: 'string', - required: false, - description: 'normal', - }, - { - name: 'sources', - type: 'string', - required: false, - description: 'my-app', - }, - { - name: 'start', - type: 'integer', - required: true, - description: '1609459200', - }, - { - name: 'tags', - type: 'string', - required: false, - description: 'env:prod', - }, - { - name: 'unaggregated', - type: 'string', - required: false, - description: 'false', - }, + name: 'datadog_monitor_get', + description: `Get a specific Datadog monitor by ID.`, + params: [ + { name: 'monitor_id', type: 'integer', required: true, description: `ID of the monitor to retrieve.` }, ], }, { - name: 'datadog_events_list_v2', - description: 'List Datadog events using the v2 API with filtering and pagination.', - params: [ - { - name: 'filter_from', - type: 'string', - required: false, - description: '2021-01-01T00:00:00Z', - }, - { - name: 'filter_query', - type: 'string', - required: false, - description: 'source:my-app', - }, - { - name: 'filter_to', - type: 'string', - required: false, - description: '2021-01-02T00:00:00Z', - }, - { - name: 'page_cursor', - type: 'string', - required: false, - description: 'eyJzdGFydEF0IjoiMjAyMS0wMS0wMVQwMDowMDowMFoifQ==', - }, - { - name: 'page_limit', - type: 'integer', - required: false, - description: '25', - }, - { - name: 'sort', - type: 'string', - required: false, - description: 'timestamp', - }, + name: 'datadog_monitor_mute', + description: `Mute a Datadog monitor, optionally with a scope and end time.`, + params: [ + { name: 'monitor_id', type: 'integer', required: true, description: `ID of the monitor to mute.` }, + { name: 'end', type: 'integer', required: false, description: `Unix timestamp when the mute should end.` }, + { name: 'scope', type: 'string', required: false, description: `Scope to apply the mute to, e.g. role:db.` }, ], }, { - name: 'datadog_event_get', - description: 'Get a specific Datadog event by ID.', + name: 'datadog_monitor_search', + description: `Search Datadog monitors using a query string.`, params: [ - { - name: 'event_id', - type: 'string', - required: true, - description: '1234567890', - }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination.` }, + { name: 'per_page', type: 'integer', required: false, description: `Number of results per page.` }, + { name: 'query', type: 'string', required: false, description: `Search query string.` }, + { name: 'sort', type: 'string', required: false, description: `Sort field and direction.` }, ], }, { - name: 'datadog_event_create', - description: 'Create a new event in Datadog.', - params: [ - { - name: 'aggregation_key', - type: 'string', - required: false, - description: 'my-deployment', - }, - { - name: 'alert_type', - type: 'string', - required: false, - description: 'info', - }, - { - name: 'date_happened', - type: 'integer', - required: false, - description: '1609459200', - }, - { - name: 'host', - type: 'string', - required: false, - description: 'web-01.example.com', - }, - { - name: 'priority', - type: 'string', - required: false, - description: 'normal', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod"]', - }, - { - name: 'text', - type: 'string', - required: true, - description: 'Service v2.1.0 deployed successfully.', - }, - { - name: 'title', - type: 'string', - required: true, - description: 'Deployment completed', - }, - ], - }, - // Infrastructure + name: 'datadog_monitor_unmute', + description: `Unmute a Datadog monitor.`, + params: [ + { name: 'monitor_id', type: 'integer', required: true, description: `ID of the monitor to unmute.` }, + ], + }, { - name: 'datadog_hosts_list', - description: 'List Datadog hosts with optional filtering and sorting.', - params: [ - { - name: 'count', - type: 'integer', - required: false, - description: '100', - }, - { - name: 'filter', - type: 'string', - required: false, - description: 'env:prod', - }, - { - name: 'include_muted_hosts_data', - type: 'string', - required: false, - description: 'true', - }, - { - name: 'sort_dir', - type: 'string', - required: false, - description: 'desc', - }, - { - name: 'sort_field', - type: 'string', - required: false, - description: 'cpu', - }, - { - name: 'start', - type: 'integer', - required: false, - description: '0', - }, + name: 'datadog_monitor_update', + description: `Update an existing Datadog monitor.`, + params: [ + { name: 'monitor_id', type: 'integer', required: true, description: `ID of the monitor to update.` }, + { name: 'message', type: 'string', required: false, description: `Updated notification message for the monitor.` }, + { name: 'name', type: 'string', required: false, description: `New name for the monitor.` }, + { name: 'priority', type: 'integer', required: false, description: `Monitor priority from 1 (highest) to 5 (lowest).` }, + { name: 'query', type: 'string', required: false, description: `Updated query string for the monitor.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tags to associate with the monitor.` }, ], }, { - name: 'datadog_hosts_totals', - description: 'Get the total number of active and up Datadog hosts.', - params: [], + name: 'datadog_monitors_list', + description: `List all Datadog monitors with optional filtering.`, + params: [ + { name: 'group_states', type: 'string', required: false, description: `Comma-separated list of group states to filter by (e.g. alert,warn).` }, + { name: 'monitor_tags', type: 'string', required: false, description: `Comma-separated list of monitor tags.` }, + { name: 'name', type: 'string', required: false, description: `Filter monitors by name.` }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination.` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of monitors to return per page.` }, + { name: 'tags', type: 'string', required: false, description: `Comma-separated list of tags to filter monitors.` }, + { name: 'with_downtimes', type: 'string', required: false, description: `Whether to include downtime information (true/false).` }, + ], }, { - name: 'datadog_host_mute', - description: 'Mute a Datadog host to suppress alerts.', - params: [ - { - name: 'end', - type: 'integer', - required: false, - description: '1609545600', - }, - { - name: 'host_name', - type: 'string', - required: true, - description: 'web-01.example.com', - }, - { - name: 'message', - type: 'string', - required: false, - description: 'Scheduled maintenance', - }, - { - name: 'override', - type: 'string', - required: false, - description: 'false', - }, + name: 'datadog_notebook_create', + description: `Create a new notebook in Datadog.`, + params: [ + { name: 'name', type: 'string', required: true, description: `The name of the notebook.` }, + { name: 'cells', type: 'string', required: false, description: `JSON array of notebook cell objects to include in the notebook.` }, ], }, { - name: 'datadog_host_unmute', - description: 'Unmute a Datadog host.', + name: 'datadog_notebook_delete', + description: `Delete a specific notebook by its ID.`, params: [ - { - name: 'host_name', - type: 'string', - required: true, - description: 'web-01.example.com', - }, + { name: 'notebook_id', type: 'integer', required: true, description: `The ID of the notebook to delete.` }, ], }, { - name: 'datadog_host_tags_get', - description: 'Get all tags for a specific host.', + name: 'datadog_notebook_get', + description: `Get a specific Datadog notebook by its ID.`, params: [ - { - name: 'host_name', - type: 'string', - required: true, - description: 'my-host.example.com', - }, + { name: 'notebook_id', type: 'integer', required: true, description: `The ID of the notebook to retrieve.` }, ], }, { - name: 'datadog_host_tags_create', - description: 'Add tags to a specific host in Datadog.', - params: [ - { - name: 'host_name', - type: 'string', - required: true, - description: 'my-host.example.com', - }, - { - name: 'source', - type: 'string', - required: false, - description: 'users', - }, - { - name: 'tags', - type: 'string', - required: true, - description: '["env:prod","role:db"]', - }, + name: 'datadog_notebooks_list', + description: `List all notebooks available in your Datadog account.`, + params: [ + { name: 'author_handle', type: 'string', required: false, description: `Filter notebooks by the author's handle.` }, + { name: 'count', type: 'integer', required: false, description: `The number of notebooks to return per page.` }, + { name: 'include_cells', type: 'string', required: false, description: `Whether to include notebook cells in the response. Use 'true' or 'false'.` }, + { name: 'query', type: 'string', required: false, description: `Filter notebooks by a text query string.` }, + { name: 'start', type: 'integer', required: false, description: `The offset for pagination (number of notebooks to skip).` }, ], }, { - name: 'datadog_host_tags_update', - description: 'Replace all tags for a specific host in Datadog.', - params: [ - { - name: 'host_name', - type: 'string', - required: true, - description: 'my-host.example.com', - }, - { - name: 'source', - type: 'string', - required: false, - description: 'users', - }, - { - name: 'tags', - type: 'string', - required: true, - description: '["env:prod","role:db"]', - }, + name: 'datadog_permissions_list', + description: `List all available Datadog permissions.`, + params: [ ], }, { - name: 'datadog_host_tags_delete', - description: 'Remove all tags from a specific host in Datadog.', + name: 'datadog_processes_list', + description: `List live processes running on your infrastructure.`, params: [ - { - name: 'host_name', - type: 'string', - required: true, - description: 'my-host.example.com', - }, - { - name: 'source', - type: 'string', - required: false, - description: 'users', - }, + { name: 'from', type: 'integer', required: false, description: `Start of the time window as a Unix timestamp (seconds).` }, + { name: 'page_cursor', type: 'string', required: false, description: `Cursor for pagination to get the next page of results.` }, + { name: 'page_limit', type: 'integer', required: false, description: `Maximum number of processes to return (max 1000).` }, + { name: 'search', type: 'string', required: false, description: `Filter processes by name or command.` }, + { name: 'tags', type: 'string', required: false, description: `Comma-separated list of tags to filter processes.` }, + { name: 'to', type: 'integer', required: false, description: `End of the time window as a Unix timestamp (seconds).` }, ], }, { - name: 'datadog_containers_list', - description: 'List all containers running on your infrastructure.', - params: [ - { - name: 'filter_tags', - type: 'string', - required: false, - description: 'env:prod', - }, - { - name: 'page_cursor', - type: 'string', - required: false, - description: 'eyJzdGFydEF0IjoiMjAy...', - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: '1000', - }, + name: 'datadog_role_create', + description: `Create a new Datadog role.`, + params: [ + { name: 'name', type: 'string', required: true, description: `Name for the new role.` }, + { name: 'permissions', type: 'string', required: false, description: `JSON array of permission objects to assign to the role.` }, ], }, { - name: 'datadog_processes_list', - description: 'List live processes running on your infrastructure.', - params: [ - { - name: 'from', - type: 'integer', - required: false, - description: '1672531200', - }, - { - name: 'page_cursor', - type: 'string', - required: false, - description: 'eyJzdGFydEF0IjoiMjAy...', - }, - { - name: 'page_limit', - type: 'integer', - required: false, - description: '25', - }, - { - name: 'search', - type: 'string', - required: false, - description: 'nginx', - }, - { - name: 'tags', - type: 'string', - required: false, - description: 'env:prod,host:web-01', - }, - { - name: 'to', - type: 'integer', - required: false, - description: '1672617600', - }, - ], - }, - // Synthetics + name: 'datadog_role_get', + description: `Get a specific Datadog role by ID.`, + params: [ + { name: 'role_id', type: 'string', required: true, description: `UUID of the role to retrieve.` }, + ], + }, { - name: 'datadog_synthetics_tests_list', - description: 'List all Datadog Synthetics tests.', + name: 'datadog_roles_list', + description: `List all Datadog roles.`, params: [ - { - name: 'page_number', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: '25', - }, + { name: 'filter', type: 'string', required: false, description: `Filter roles by name.` }, + { name: 'page_number', type: 'integer', required: false, description: `Page number for pagination.` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of roles per page.` }, + { name: 'sort', type: 'string', required: false, description: `Field to sort roles by.` }, ], }, { - name: 'datadog_synthetics_api_test_get', - description: 'Get a specific Datadog Synthetics API test by public ID.', + name: 'datadog_rum_application_create', + description: `Create a new Datadog RUM application.`, params: [ - { - name: 'public_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, + { name: 'name', type: 'string', required: true, description: `Name of the RUM application.` }, + { name: 'type', type: 'string', required: true, description: `Type of the RUM application: browser, ios, android, react-native, flutter, or roku.` }, ], }, { - name: 'datadog_synthetics_browser_test_get', - description: 'Get a specific Datadog Synthetics browser test by public ID.', + name: 'datadog_rum_application_get', + description: `Get a specific RUM application by its ID.`, params: [ - { - name: 'public_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, + { name: 'id', type: 'string', required: true, description: `The ID of the RUM application to retrieve.` }, ], }, { - name: 'datadog_synthetics_test_results_get', - description: 'Get the latest results for a specific Datadog Synthetics test.', - params: [ - { - name: 'from_ts', - type: 'integer', - required: false, - description: '1609459200', - }, - { - name: 'public_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, - { - name: 'to_ts', - type: 'integer', - required: false, - description: '1609545600', - }, + name: 'datadog_rum_applications_list', + description: `List all Datadog RUM applications.`, + params: [ ], }, { - name: 'datadog_synthetics_test_trigger', - description: 'Trigger one or more Datadog Synthetics tests to run immediately.', + name: 'datadog_service_check_submit', + description: `Submit a service check result to Datadog.`, params: [ - { - name: 'tests', - type: 'string', - required: true, - description: '[{"public_id":"abc-def-ghi"}]', - }, + { name: 'check', type: 'string', required: true, description: `The name of the service check, e.g. 'app.is_ok'.` }, + { name: 'host_name', type: 'string', required: true, description: `The hostname associated with this service check.` }, + { name: 'status', type: 'integer', required: true, description: `The status of the service check. 0=OK, 1=WARNING, 2=CRITICAL, 3=UNKNOWN.` }, + { name: 'message', type: 'string', required: false, description: `A message describing the current state of the service check.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tag strings to associate with the service check. E.g. ["env:prod","role:db"].` }, ], }, { - name: 'datadog_synthetics_test_pause_resume', - description: 'Pause or resume a Datadog Synthetics test.', + name: 'datadog_slo_create', + description: `Create a new Service Level Objective (SLO) in Datadog.`, params: [ - { - name: 'new_status', - type: 'string', - required: true, - description: 'paused', - }, - { - name: 'public_id', - type: 'string', - required: true, - description: 'abc-def-ghi', - }, + { name: 'name', type: 'string', required: true, description: `Name of the SLO.` }, + { name: 'thresholds', type: 'string', required: true, description: `JSON array of threshold objects, e.g. [{"timeframe":"7d","target":99.9}].` }, + { name: 'type', type: 'string', required: true, description: `Type of SLO: metric or monitor.` }, + { name: 'description', type: 'string', required: false, description: `Description of the SLO.` }, + { name: 'monitor_ids', type: 'string', required: false, description: `JSON array of monitor IDs for a monitor-based SLO.` }, + { name: 'query', type: 'string', required: false, description: `JSON object with numerator and denominator for metric-based SLOs.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tags for the SLO.` }, ], }, { - name: 'datadog_synthetics_test_delete', - description: 'Delete one or more Datadog Synthetics tests by public ID.', + name: 'datadog_slo_delete', + description: `Delete a Datadog Service Level Objective by ID.`, params: [ - { - name: 'public_ids', - type: 'string', - required: true, - description: '["abc-def-ghi"]', - }, + { name: 'slo_id', type: 'string', required: true, description: `ID of the SLO to delete.` }, ], }, { - name: 'datadog_synthetics_locations_list', - description: 'List all Datadog Synthetics locations (public and private).', - params: [], + name: 'datadog_slo_get', + description: `Get a specific Datadog Service Level Objective by ID.`, + params: [ + { name: 'slo_id', type: 'string', required: true, description: `ID of the SLO to retrieve.` }, + ], }, { - name: 'datadog_synthetics_global_variables_list', - description: 'List all Datadog Synthetics global variables.', - params: [], + name: 'datadog_slo_history', + description: `Get historical data for a specific Datadog SLO.`, + params: [ + { name: 'from_ts', type: 'integer', required: true, description: `Unix timestamp for start of the history range.` }, + { name: 'slo_id', type: 'string', required: true, description: `ID of the SLO.` }, + { name: 'to_ts', type: 'integer', required: true, description: `Unix timestamp for end of the history range.` }, + { name: 'target', type: 'string', required: false, description: `Custom target value for the history calculation.` }, + ], }, - // RUM { - name: 'datadog_rum_applications_list', - description: 'List all Datadog RUM applications.', - params: [], + name: 'datadog_slo_update', + description: `Update an existing Datadog Service Level Objective.`, + params: [ + { name: 'slo_id', type: 'string', required: true, description: `ID of the SLO to update.` }, + { name: 'type', type: 'string', required: true, description: `Type of SLO: metric or monitor. Required by the Datadog API on update.` }, + { name: 'description', type: 'string', required: false, description: `Updated description for the SLO.` }, + { name: 'name', type: 'string', required: false, description: `Updated name for the SLO.` }, + { name: 'query', type: 'string', required: false, description: `JSON object with numerator and denominator for metric-type SLOs.` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of updated tags.` }, + { name: 'thresholds', type: 'string', required: false, description: `JSON array of updated threshold objects.` }, + ], }, { - name: 'datadog_rum_application_get', - description: 'Get a specific RUM application by its ID.', + name: 'datadog_slos_list', + description: `List Service Level Objectives (SLOs) in Datadog.`, params: [ - { - name: 'id', - type: 'string', - required: true, - description: 'abc123', - }, + { name: 'ids', type: 'string', required: false, description: `Comma-separated list of SLO IDs to retrieve.` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of SLOs to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Offset for pagination.` }, + { name: 'query', type: 'string', required: false, description: `Search query to filter SLOs by name.` }, + { name: 'tags_query', type: 'string', required: false, description: `Filter SLOs by tags.` }, ], }, { - name: 'datadog_rum_application_create', - description: 'Create a new Datadog RUM application.', + name: 'datadog_synthetics_api_test_get', + description: `Get a specific Datadog Synthetics API test by public ID.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: 'My Web App', - }, - { - name: 'type', - type: 'string', - required: true, - description: 'browser', - }, + { name: 'public_id', type: 'string', required: true, description: `Public ID of the Synthetics API test.` }, ], }, - // Notebooks { - name: 'datadog_notebooks_list', - description: 'List all notebooks available in your Datadog account.', - params: [ - { - name: 'author_handle', - type: 'string', - required: false, - description: 'user@example.com', - }, - { - name: 'count', - type: 'integer', - required: false, - description: '100', - }, - { - name: 'include_cells', - type: 'string', - required: false, - description: 'false', - }, - { - name: 'query', - type: 'string', - required: false, - description: 'my notebook', - }, - { - name: 'start', - type: 'integer', - required: false, - description: '0', - }, + name: 'datadog_synthetics_browser_test_get', + description: `Get a specific Datadog Synthetics browser test by public ID.`, + params: [ + { name: 'public_id', type: 'string', required: true, description: `Public ID of the Synthetics browser test.` }, ], }, { - name: 'datadog_notebook_get', - description: 'Get a specific Datadog notebook by its ID.', + name: 'datadog_synthetics_global_variables_list', + description: `List all Datadog Synthetics global variables.`, params: [ - { - name: 'notebook_id', - type: 'integer', - required: true, - description: '12345', - }, ], }, { - name: 'datadog_notebook_create', - description: 'Create a new notebook in Datadog.', + name: 'datadog_synthetics_locations_list', + description: `List all Datadog Synthetics locations (public and private).`, params: [ - { - name: 'cells', - type: 'string', - required: false, - description: - '[{"type": "notebook_cells", "attributes": {"definition": {"type": "markdown", "text": "# Hello"}}}]', - }, - { - name: 'name', - type: 'string', - required: true, - description: 'My Notebook', - }, ], }, { - name: 'datadog_notebook_delete', - description: 'Delete a specific notebook by its ID.', + name: 'datadog_synthetics_test_delete', + description: `Delete one or more Datadog Synthetics tests by public ID.`, params: [ - { - name: 'notebook_id', - type: 'integer', - required: true, - description: '12345', - }, + { name: 'public_ids', type: 'string', required: true, description: `JSON array of public IDs of Synthetics tests to delete.` }, ], }, - // Users & roles { - name: 'datadog_users_list', - description: 'List Datadog users with optional filtering.', - params: [ - { - name: 'filter', - type: 'string', - required: false, - description: 'john@example.com', - }, - { - name: 'page_number', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: '10', - }, - { - name: 'sort', - type: 'string', - required: false, - description: 'name', - }, - { - name: 'sort_dir', - type: 'string', - required: false, - description: 'asc', - }, + name: 'datadog_synthetics_test_pause_resume', + description: `Pause or resume a Datadog Synthetics test.`, + params: [ + { name: 'new_status', type: 'string', required: true, description: `New status for the test: live or paused.` }, + { name: 'public_id', type: 'string', required: true, description: `Public ID of the Synthetics test.` }, ], }, { - name: 'datadog_user_get', - description: 'Get a specific Datadog user by UUID.', + name: 'datadog_synthetics_test_results_get', + description: `Get the latest results for a specific Datadog Synthetics test.`, params: [ - { - name: 'user_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'public_id', type: 'string', required: true, description: `Public ID of the Synthetics test.` }, + { name: 'from_ts', type: 'integer', required: false, description: `Unix timestamp for start of results range.` }, + { name: 'to_ts', type: 'integer', required: false, description: `Unix timestamp for end of results range.` }, ], }, { - name: 'datadog_user_create', - description: 'Create a new Datadog user.', - params: [ - { - name: 'email', - type: 'string', - required: true, - description: 'user@example.com', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'John Doe', - }, - { - name: 'roles', - type: 'string', - required: false, - description: '["00000000-0000-0000-0000-000000000000"]', - }, - { - name: 'title', - type: 'string', - required: false, - description: 'Software Engineer', - }, + name: 'datadog_synthetics_test_trigger', + description: `Trigger one or more Datadog Synthetics tests to run immediately.`, + params: [ + { name: 'tests', type: 'string', required: true, description: `JSON array of test objects with public_id.` }, ], }, { - name: 'datadog_user_update', - description: 'Update an existing Datadog user.', - params: [ - { - name: 'disabled', - type: 'string', - required: false, - description: 'false', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'John Doe', - }, - { - name: 'title', - type: 'string', - required: false, - description: 'Senior Engineer', - }, - { - name: 'user_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + name: 'datadog_synthetics_tests_list', + description: `List all Datadog Synthetics tests.`, + params: [ + { name: 'page_number', type: 'integer', required: false, description: `Page number for pagination.` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of tests to return per page.` }, ], }, { - name: 'datadog_user_disable', - description: 'Disable a Datadog user account by UUID.', + name: 'datadog_user_create', + description: `Create a new Datadog user.`, params: [ - { - name: 'user_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'email', type: 'string', required: true, description: `Email address of the new user.` }, + { name: 'name', type: 'string', required: false, description: `Display name of the user.` }, + { name: 'roles', type: 'string', required: false, description: `JSON array of role IDs to assign to the user.` }, + { name: 'title', type: 'string', required: false, description: `Job title of the user.` }, ], }, { - name: 'datadog_user_roles_list', - description: 'Get all roles assigned to a specific Datadog user.', + name: 'datadog_user_disable', + description: `Disable a Datadog user account by UUID.`, params: [ - { - name: 'user_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'user_id', type: 'string', required: true, description: `UUID of the user to disable.` }, ], }, { - name: 'datadog_roles_list', - description: 'List all Datadog roles.', - params: [ - { - name: 'filter', - type: 'string', - required: false, - description: 'admin', - }, - { - name: 'page_number', - type: 'integer', - required: false, - description: '0', - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: '10', - }, - { - name: 'sort', - type: 'string', - required: false, - description: 'name', - }, + name: 'datadog_user_get', + description: `Get a specific Datadog user by UUID.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `UUID of the user to retrieve.` }, ], }, { - name: 'datadog_role_get', - description: 'Get a specific Datadog role by ID.', + name: 'datadog_user_roles_list', + description: `Get all roles assigned to a specific Datadog user.`, params: [ - { - name: 'role_id', - type: 'string', - required: true, - description: '00000000-0000-0000-0000-000000000000', - }, + { name: 'user_id', type: 'string', required: true, description: `UUID of the user.` }, ], }, { - name: 'datadog_role_create', - description: 'Create a new Datadog role.', + name: 'datadog_user_update', + description: `Update an existing Datadog user.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: 'Custom Admin Role', - }, - { - name: 'permissions', - type: 'string', - required: false, - description: '[{"type":"permissions","id":"00000000-0000-0000-0000-000000000000"}]', - }, + { name: 'user_id', type: 'string', required: true, description: `UUID of the user to update.` }, + { name: 'disabled', type: 'string', required: false, description: `Whether to disable the user (true/false).` }, + { name: 'name', type: 'string', required: false, description: `Updated display name for the user.` }, + { name: 'title', type: 'string', required: false, description: `Updated job title for the user.` }, ], }, - // Service checks { - name: 'datadog_service_check_submit', - description: 'Submit a service check result to Datadog.', - params: [ - { - name: 'check', - type: 'string', - required: true, - description: 'app.is_ok', - }, - { - name: 'host_name', - type: 'string', - required: true, - description: 'my-host.example.com', - }, - { - name: 'message', - type: 'string', - required: false, - description: 'Service is running normally.', - }, - { - name: 'status', - type: 'integer', - required: true, - description: '0', - }, - { - name: 'tags', - type: 'string', - required: false, - description: '["env:prod","role:db"]', - }, + name: 'datadog_users_list', + description: `List Datadog users with optional filtering.`, + params: [ + { name: 'filter', type: 'string', required: false, description: `Filter string to search users by name or email.` }, + { name: 'page_number', type: 'integer', required: false, description: `Page number for pagination.` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of users per page.` }, + { name: 'sort', type: 'string', required: false, description: `Field to sort users by.` }, + { name: 'sort_dir', type: 'string', required: false, description: `Sort direction: asc or desc.` }, ], }, ] diff --git a/src/data/agent-connectors/fellowaimcp.ts b/src/data/agent-connectors/fellowaimcp.ts new file mode 100644 index 000000000..137790e86 --- /dev/null +++ b/src/data/agent-connectors/fellowaimcp.ts @@ -0,0 +1,84 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'fellowaimcp_get_action_items', + description: `Fetch action items assigned to the user, filtered by date range or status (overdue, completed, or ongoing).`, + params: [ + { name: 'check_for_team_action_items', type: 'string', required: false, description: `Set this value to true if user wants to check for action items assigned to the user's team. Only works if user is a manager. Optional` }, + { name: 'from_date', type: 'string', required: false, description: `The start date of the range to get the action items from. Must be a valid ISO 8601 date string. Optional Field, if not provided, it will be ignored.` }, + { name: 'is_overdue', type: 'string', required: false, description: `Set this value to true if user wants only overdue action items. Optional` }, + { name: 'meeting_ids', type: 'string', required: false, description: `List of meeting IDs to filter action items by. Must be provided as an array/list, for example: ['meeting_id_1', 'meeting_id_2']. Optional.` }, + { name: 'note_id', type: 'string', required: false, description: `The ID of the note to filter action items by. Optional` }, + { name: 'notestream_id', type: 'string', required: false, description: `The ID of the notestream to filter action items by. Optional` }, + { name: 'only_completed_action_items', type: 'string', required: false, description: `Set this value to true if user wants only completed/done action items. Optional` }, + { name: 'only_ongoing_action_items', type: 'string', required: false, description: `Set this value to true, if user only wants to get ongoing action items. Optional` }, + { name: 'to_date', type: 'string', required: false, description: `The end date of the range to get the action items from. Must be a valid ISO 8601 date string. Optional Field, if not provided, it will be ignored.` }, + { name: 'topic', type: 'string', required: false, description: `The topic of the action items to get. Optional` }, + ], + }, + { + name: 'fellowaimcp_get_channel_details', + description: `Retrieve detailed information about a specific channel by its ID.`, + params: [ + { name: 'channel_id', type: 'integer', required: true, description: `The ID of the channel to get details for. Use list_channels to find channel IDs.` }, + ], + }, + { + name: 'fellowaimcp_get_meeting_participants', + description: `Retrieve all participants of a meeting, including calendar attendees and note users.`, + params: [ + { name: 'meeting_id', type: 'string', required: false, description: `The ID of the meeting to get the participants for. Optional` }, + { name: 'note_id', type: 'string', required: false, description: `The ID of the note to get the participants for. Optional` }, + ], + }, + { + name: 'fellowaimcp_get_meeting_summary', + description: `Fetch summaries for one or more meetings, including key points, decisions, and action items.`, + params: [ + { name: 'meeting_ids', type: 'string', required: false, description: `List of meeting IDs to get summaries for. Must be provided as an array/list, for example: ['meeting_id_1', 'meeting_id_2']. Optional.` }, + { name: 'note_id', type: 'string', required: false, description: `The ID of the note to get the summary for. Optional` }, + ], + }, + { + name: 'fellowaimcp_get_meeting_transcript', + description: `Retrieve the transcript of a meeting. For meetings 15+ minutes, use start_time and end_time to fetch a specific segment.`, + params: [ + { name: 'end_time', type: 'string', required: false, description: `End time from beginning of recording (seconds, MM:SS, or HH:MM:SS format). If specified, minimum time range of 300s (5 minutes) is required.` }, + { name: 'meeting_id', type: 'string', required: false, description: `The ID of the meeting to get the transcript for. Optional` }, + { name: 'note_id', type: 'string', required: false, description: `The ID of the note to get the transcript for. Optional` }, + { name: 'recording_id', type: 'string', required: false, description: `The ID of a specific recording/part to get. Optional. Use this for multi-part meetings when you need a specific part's transcript.` }, + { name: 'start_time', type: 'string', required: false, description: `Start time from beginning of recording (seconds, MM:SS, or HH:MM:SS format). If specified, minimum time range of 300s (5 minutes) is required.` }, + ], + }, + { + name: 'fellowaimcp_list_channels', + description: `List all available channels in the workspace, optionally filtered by name or type.`, + params: [ + { name: 'name', type: 'string', required: false, description: `Optional filter: channel name (case-insensitive partial match)` }, + { name: 'type', type: 'string', required: false, description: `Optional filter: channel type (public or private)` }, + ], + }, + { + name: 'fellowaimcp_search_meetings', + description: `Search for meetings across calendar events and notes, with filters for participants, date range, content, and summary.`, + params: [ + { name: 'channel_id', type: 'string', required: false, description: `The ID of the channel to filter the meetings by. This is used to limit the search to a subset of all possible meetings the user has access to. Optional.` }, + { name: 'from_date', type: 'string', required: false, description: `The start date of the range to get meetings from (inclusive). ISO 8601 date string format. Used to filter meetings by start date. Optional but its use it's highly recommended.` }, + { name: 'has_external_participants', type: 'string', required: false, description: `Whether to filter meetings that have external participants. Optional.` }, + { name: 'has_summary', type: 'string', required: false, description: `Whether to filter meetings that have a summary or not. If you are trying to answer a question that depends on meeting content, most of the time you will want to use this since most meetings without summary are not useful. If you don't get the results you expect, you can try again without this parameter but using 'note'. Optional.` }, + { name: 'note', type: 'string', required: false, description: `A search query to match against meeting notes content. Used to search in meeting notes content. Optional but recommended.` }, + { name: 'note_id', type: 'string', required: false, description: `The ID of the note to filter the meetings by. Optional.` }, + { name: 'note_summary', type: 'string', required: false, description: `A semantic search query to search within meeting note summaries. This should be used specifically for searching past meetings with generated summaries. For best results, include the core of the user's question or prompt here rather than just keywords, as the semantic search works better with full context. If the question include things covered by other parameter like attendees, meeting title, etc, rephrase the question to NOT include those. Ideally this should be used in conjunction with the keyword based search of 'note' since some notes may have the relevant information but have no summaries. If no results are found with 'note_summary' or 'has_external_participants', use 'note'. Optional but recommended.` }, + { name: 'notestream_id', type: 'string', required: false, description: `The ID of the note stream to filter the meetings by. Optional.` }, + { name: 'participant_email_domains', type: 'string', required: false, description: `List of email domains to filter meetings by participant domains (AND match). Must be provided as an array/list, for example: ['company.com', 'partner.com']. Optional.` }, + { name: 'participant_emails', type: 'string', required: false, description: `List of email addresses to filter meetings by participants (AND match). Must be provided as an array/list, for example: ['user1@company.com', 'user2@company.com']. Optional.` }, + { name: 'participant_full_names', type: 'string', required: false, description: `List of full names to filter meetings by participants (AND match). Must be provided as an array/list, for example: ['John Smith', 'Jane Doe']. Optional.` }, + { name: 'title', type: 'string', required: false, description: `A simple keyword based search query to match against meeting titles. Used to search in meeting titles across all sources. Optional.` }, + { name: 'to_date', type: 'string', required: false, description: `The end date of the range to get meetings from (inclusive). ISO 8601 date string format. Used to filter meetings by end date. If it's obvious that the thing we are looking for is in the past, do set this field to the current date. Optional but its use it's highly recommended.` }, + { name: 'transcript', type: 'string', required: false, description: `A search query to match against meeting transcripts. Used to perform semantic search in meeting transcripts quotes. This does not include the speaker. Optional.` }, + { name: 'transcript_speaker', type: 'string', required: false, description: `The speaker to filter the transcripts by. It could be someone who is mentioning somebody or something. Use this parameter to filter transcripts by a specific speaker's name. This is particularly useful when searching for statements or mentions made by a particular person. Optional.` }, + { name: 'user_has_calendar_event', type: 'string', required: false, description: `IMPORTANT: Set this to True when the user asks about their OWN meetings. This includes phrases like: 'my meetings', 'meetings I had', 'meetings I attended', 'meetings on my calendar', 'my calls', 'meetings I was in', or any query that implies the user wants meetings they personally participated in (not just meetings they have access to). When True, results are filtered to only include meetings where the user was an invited attendee.` }, + ], + }, +] diff --git a/src/data/agent-connectors/gmail.ts b/src/data/agent-connectors/gmail.ts index d21147512..4594ddfa0 100644 --- a/src/data/agent-connectors/gmail.ts +++ b/src/data/agent-connectors/gmail.ts @@ -1,6 +1,44 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ + { + name: 'gmail_create_draft', + description: `Create a new draft email in Gmail for the authenticated user. Constructs a MIME message and saves it as a draft. Supports plain text and HTML content types, CC, BCC, and threading. Uses OAuth credentials.`, + params: [ + { name: 'body', type: 'string', required: true, description: `The body content of the draft email. Provide plain text or HTML depending on the content_type field. Example: 'Hello, this is my draft message.'` }, + { name: 'subject', type: 'string', required: true, description: `The subject line of the draft email. Example: 'Meeting Follow-up'.` }, + { name: 'to', type: 'string', required: true, description: `The recipient email address(es) for the draft. Provide a single address or comma-separated list. Example: 'recipient@example.com' or 'a@example.com,b@example.com'.` }, + { name: 'bcc', type: 'string', required: false, description: `BCC recipients for the draft email. Provide a comma-separated list of email addresses, e.g., bcc1@example.com,bcc2@example.com. Optional.` }, + { name: 'cc', type: 'string', required: false, description: `CC recipients for the draft email. Provide a comma-separated list of email addresses, e.g., cc1@example.com,cc2@example.com. Optional.` }, + { name: 'content_type', type: 'string', required: false, description: `The MIME content type for the email body. Use 'text/plain' for plain text or 'text/html' for HTML content. Defaults to 'text/plain'.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'thread_id', type: 'string', required: false, description: `The Gmail thread ID to associate this draft with an existing conversation. If provided, the draft will be part of that thread. Example: '17a1b2c3d4e5f6g7'.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'gmail_create_filter', + description: `Create a new email filter for the authenticated Gmail account. Specify criteria (sender, recipient, subject, query, or attachment) and actions (apply labels, forward, archive, star, trash, mark as read, etc.). At least one criteria field should be provided. Uses OAuth credentials.`, + params: [ + { name: 'add_label_ids', type: 'array', required: false, description: `List of Gmail label IDs to apply to matching messages (e.g., ['Label_123', 'STARRED']). Use the List Labels tool to find valid label IDs.` }, + { name: 'forward', type: 'string', required: false, description: `Email address to forward matching messages to. The address must already be configured as a forwarding address in the Gmail account.` }, + { name: 'from', type: 'string', required: false, description: `Sender email address or domain to match in the filter criteria (e.g., 'alerts@github.com' or '@newsletter.com').` }, + { name: 'has_attachment', type: 'boolean', required: false, description: `If true, only match messages that have at least one attachment.` }, + { name: 'query', type: 'string', required: false, description: `Gmail search query string to match messages using Gmail's search syntax (e.g., 'larger:10M', 'is:important').` }, + { name: 'remove_label_ids', type: 'array', required: false, description: `List of Gmail label IDs to remove from matching messages (e.g., ['INBOX'] to archive, ['UNREAD'] to mark as read).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'should_always_mark_important', type: 'boolean', required: false, description: `If true, always mark matching messages as important regardless of Gmail's automatic importance detection.` }, + { name: 'should_archive', type: 'boolean', required: false, description: `If true, skip the inbox for matching messages (equivalent to adding the 'Archive' action).` }, + { name: 'should_mark_read', type: 'boolean', required: false, description: `If true, automatically mark matching messages as read.` }, + { name: 'should_never_mark_important', type: 'boolean', required: false, description: `If true, never mark matching messages as important, overriding Gmail's automatic importance detection.` }, + { name: 'should_never_spam', type: 'boolean', required: false, description: `If true, never send matching messages to the Spam folder.` }, + { name: 'should_star', type: 'boolean', required: false, description: `If true, automatically star matching messages.` }, + { name: 'should_trash', type: 'boolean', required: false, description: `If true, automatically move matching messages to the Trash.` }, + { name: 'subject', type: 'string', required: false, description: `Subject line text to match in the filter criteria (e.g., '[GitHub]' or 'Invoice').` }, + { name: 'to', type: 'string', required: false, description: `Recipient email address to match in the filter criteria (e.g., 'team@example.com').` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'gmail_fetch_mails', description: `Fetch emails from a connected Gmail account using search filters. Requires a valid Gmail OAuth2 connection.`, @@ -47,6 +85,15 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'gmail_get_send_as', + description: `Get send-as alias settings including email signature for the authenticated Gmail account. Use the user's own email address to retrieve the default send-as settings and signature. Uses OAuth credentials.`, + params: [ + { name: 'send_as_email', type: 'string', required: true, description: `The send-as alias email address to retrieve settings for. Use the user's own email address (e.g., 'user@example.com') to get their default signature and send-as settings.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'gmail_get_thread_by_id', description: `Retrieve a specific Gmail thread by thread ID. Optionally control message format and metadata headers. Requires a valid Gmail OAuth2 connection with read access.`, @@ -58,6 +105,14 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'gmail_get_vacation_settings', + description: `Get the vacation auto-reply settings for the authenticated Gmail account. Uses OAuth credentials.`, + params: [ + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'gmail_list_drafts', description: `List draft emails from a connected Gmail account. Requires a valid Gmail OAuth2 connection.`, @@ -68,6 +123,14 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'gmail_list_filters', + description: `List all email filters for the authenticated Gmail account. Returns filter criteria and actions such as label assignment, forwarding, and archiving rules. Uses OAuth credentials.`, + params: [ + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'gmail_list_threads', description: `List threads in a connected Gmail account using optional search and label filters. Requires a valid Gmail OAuth2 connection with read access.`, @@ -81,6 +144,17 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'gmail_modify_message_labels', + description: `Add or remove labels on a Gmail message. Use label IDs such as 'INBOX', 'UNREAD', 'STARRED', 'IMPORTANT', 'TRASH', 'SPAM', or custom label IDs. At least one of add_label_ids or remove_label_ids should be provided. Uses OAuth credentials.`, + params: [ + { name: 'message_id', type: 'string', required: true, description: `The Gmail message ID whose labels will be modified. Obtain this from a list or search messages operation. Example: '17a1b2c3d4e5f6g7'.` }, + { name: 'add_label_ids', type: 'array', required: false, description: `List of label IDs to add to the message. Use system labels such as 'INBOX', 'UNREAD', 'STARRED', 'IMPORTANT', or custom label IDs retrieved from the Labels API. Example: ["STARRED", "INBOX"].` }, + { name: 'remove_label_ids', type: 'array', required: false, description: `List of label IDs to remove from the message. Use system labels such as 'UNREAD', 'STARRED', 'INBOX', or custom label IDs. Example: ["UNREAD"].` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'gmail_search_people', description: `Search people or contacts in the connected Google account using a query. Requires a valid Google OAuth2 connection with People API scopes.`, @@ -93,4 +167,42 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'gmail_trash_message', + description: `Move a Gmail message to the Trash. The message is not permanently deleted and can be recovered from Trash within 30 days. This operation is idempotent — trashing an already-trashed message is a no-op. Uses OAuth credentials.`, + params: [ + { name: 'message_id', type: 'string', required: true, description: `The Gmail message ID to move to Trash. Obtain this from a list or search messages operation. Example: '17a1b2c3d4e5f6g7'.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'gmail_update_send_as', + description: `Update send-as alias settings such as the email signature, display name, or reply-to address for the authenticated Gmail account. Use the user's own email address to update their default signature. Uses OAuth credentials.`, + params: [ + { name: 'send_as_email', type: 'string', required: true, description: `The send-as alias email address to update. Use the user's own email address (e.g., 'user@example.com') to update their default signature and settings.` }, + { name: 'display_name', type: 'string', required: false, description: `The display name shown as the sender name for this alias (e.g., 'Jane Smith').` }, + { name: 'is_default', type: 'boolean', required: false, description: `If true, sets this send-as alias as the default address used when composing new messages.` }, + { name: 'reply_to_address', type: 'string', required: false, description: `An optional email address that appears in the Reply-To header for messages sent from this alias (e.g., 'replies@example.com').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'signature', type: 'string', required: false, description: `HTML email signature to set for this alias. Supports full HTML markup (e.g., 'Jane Smith
Senior Engineer').` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'gmail_update_vacation_settings', + description: `Update the vacation auto-reply settings for the authenticated Gmail account. Set enableAutoReply to true to activate out-of-office responses. Uses OAuth credentials.`, + params: [ + { name: 'enable_auto_reply', type: 'boolean', required: true, description: `Whether to enable the vacation auto-reply. Set to true to turn on out-of-office responses, false to disable.` }, + { name: 'end_time', type: 'string', required: false, description: `End time for the vacation auto-reply as epoch milliseconds in string format (e.g., '1754006400000'). After this time, auto-reply stops.` }, + { name: 'response_body_html', type: 'string', required: false, description: `HTML body of the vacation auto-reply message. If both plain text and HTML are provided, HTML takes precedence for clients that support it.` }, + { name: 'response_body_plain_text', type: 'string', required: false, description: `Plain text body of the vacation auto-reply message.` }, + { name: 'response_subject', type: 'string', required: false, description: `Subject line of the vacation auto-reply email (e.g., 'Out of Office: Back on Monday').` }, + { name: 'restrict_to_contacts', type: 'boolean', required: false, description: `If true, only contacts in the user's Google Contacts will receive the auto-reply. Default is false.` }, + { name: 'restrict_to_domain', type: 'boolean', required: false, description: `If true, only users in the same Google Workspace domain will receive the auto-reply. Default is false.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'start_time', type: 'string', required: false, description: `Start time for the vacation auto-reply as epoch milliseconds in string format (e.g., '1753401600000'). Auto-reply activates from this time.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, ] diff --git a/src/data/agent-connectors/googledrive.ts b/src/data/agent-connectors/googledrive.ts index 3918741f8..acdba4583 100644 --- a/src/data/agent-connectors/googledrive.ts +++ b/src/data/agent-connectors/googledrive.ts @@ -1,6 +1,39 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ + { + name: 'googledrive_copy_file', + description: `Create a copy of an existing file in Google Drive. Optionally rename the copy, place it in a different folder, or add a description. Uses OAuth credentials.`, + params: [ + { name: 'file_id', type: 'string', required: true, description: `ID of the file to copy` }, + { name: 'description', type: 'string', required: false, description: `Optional description for the copied file` }, + { name: 'name', type: 'string', required: false, description: `Name for the copied file. If omitted, the copy is named 'Copy of '.` }, + { name: 'parent_folder_id', type: 'string', required: false, description: `ID of the destination folder for the copy. If omitted, the copy is placed in the same folder as the original.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'googledrive_create_folder', + description: `Create a new folder in Google Drive. Optionally place it inside a parent folder and add a description. Uses OAuth credentials.`, + params: [ + { name: 'name', type: 'string', required: true, description: `Name of the new folder` }, + { name: 'description', type: 'string', required: false, description: `Optional description for the new folder` }, + { name: 'parent_folder_id', type: 'string', required: false, description: `ID of the parent folder to create this folder inside. If omitted, the folder is created in the root of My Drive.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'googledrive_delete_file', + description: `Permanently delete a file or folder in Google Drive by its file ID. This action cannot be undone. Uses OAuth credentials.`, + params: [ + { name: 'file_id', type: 'string', required: true, description: `ID of the file or folder to delete` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'supports_all_drives', type: 'boolean', required: false, description: `Whether the request supports files in shared drives` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'googledrive_get_file_metadata', description: `Retrieve metadata for a specific file in Google Drive by its file ID. Returns name, MIME type, size, creation time, and more.`, @@ -12,6 +45,32 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'googledrive_move_file', + description: `Move a file or folder to a different location in Google Drive by updating its parent folder. Optionally rename the file during the move. Uses OAuth credentials.`, + params: [ + { name: 'file_id', type: 'string', required: true, description: `ID of the file or folder to move` }, + { name: 'new_parent_id', type: 'string', required: true, description: `ID of the destination folder to move the file into` }, + { name: 'name', type: 'string', required: false, description: `Optional new name for the file after moving. If omitted, the file keeps its current name.` }, + { name: 'old_parent_id', type: 'string', required: false, description: `ID of the current parent folder to remove the file from. Providing this ensures a clean move without the file appearing in multiple folders.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'googledrive_query_drive_activity', + description: `Query Google Drive activity to see who viewed, edited, moved, or shared files. Useful for auditing and compliance. Uses OAuth credentials.`, + params: [ + { name: 'ancestor_name', type: 'string', required: false, description: `Restrict activity to items under this folder. Format: 'items/FOLDER_ID'. Example: 'items/0B_abc123xyz'` }, + { name: 'consolidation_strategy', type: 'string', required: false, description: `How related activity is grouped. 'none' means each action is its own activity; 'legacy' consolidates similar actions. Valid values: 'none', 'legacy'.` }, + { name: 'filter', type: 'string', required: false, description: `Filter string to narrow activity results. Example: "time >= \\"2026-01-01T00:00:00Z\\""` }, + { name: 'item_name', type: 'string', required: false, description: `Restrict activity to a specific file or folder. Format: 'items/FILE_ID'. Example: 'items/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms'` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of activity records to return per page. Max 100.` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, { name: 'googledrive_search_content', description: `Search inside the content of files stored in Google Drive using full-text search. Finds files where the body text matches the search term.`, @@ -40,4 +99,20 @@ export const tools: Tool[] = [ { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, + { + name: 'googledrive_share_file', + description: `Share a file or folder in Google Drive by creating a new permission for a user, group, domain, or anyone. Supports sending notification emails. Uses OAuth credentials.`, + params: [ + { name: 'file_id', type: 'string', required: true, description: `ID of the file or folder to share` }, + { name: 'role', type: 'string', required: true, description: `The role to grant to the recipient. One of: 'reader', 'commenter', 'writer', 'organizer', 'fileOrganizer', 'owner'.` }, + { name: 'type', type: 'string', required: true, description: `The type of principal to share with. One of: 'user', 'group', 'domain', 'anyone'.` }, + { name: 'domain', type: 'string', required: false, description: `The domain to share with. Required when type is 'domain'. Example: 'example.com'.` }, + { name: 'email_address', type: 'string', required: false, description: `Email address of the user or group to share with. Required when type is 'user' or 'group'. Example: 'user@example.com'.` }, + { name: 'email_message', type: 'string', required: false, description: `Custom message to include in the notification email sent to the recipient.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'send_notification_email', type: 'boolean', required: false, description: `Whether to send a notification email to the recipient. Defaults to true.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'transfer_ownership', type: 'boolean', required: false, description: `Whether to transfer ownership of the file to the recipient. Only valid when role is 'owner'.` }, + ], + }, ] diff --git a/src/data/agent-connectors/googledwd.ts b/src/data/agent-connectors/googledwd.ts index 675bf5da7..069620c12 100644 --- a/src/data/agent-connectors/googledwd.ts +++ b/src/data/agent-connectors/googledwd.ts @@ -5,84 +5,29 @@ export const tools: Tool[] = [ name: 'googledwd_append_values', description: `Append rows of data to a Google Sheets spreadsheet. Data is added after the last row with existing content in the specified range.`, params: [ - { - name: 'range', - type: 'string', - required: true, - description: `The A1 notation range to append data to (e.g. Sheet1!A1)`, - }, - { - name: 'spreadsheet_id', - type: 'string', - required: true, - description: `The ID of the spreadsheet to append data to`, - }, - { - name: 'values', - type: 'array', - required: true, - description: `2D array of values to append. Each inner array is a row.`, - }, - { - name: 'insert_data_option', - type: 'string', - required: false, - description: `How the input data should be inserted. Options: INSERT_ROWS (inserts new rows), OVERWRITE (overwrites existing data). Default: OVERWRITE`, - }, - { - name: 'value_input_option', - type: 'string', - required: false, - description: `How input data should be interpreted. Options: RAW (literal values), USER_ENTERED (as if typed in UI, parses formulas/dates). Default: USER_ENTERED`, - }, + { name: 'range', type: 'string', required: true, description: `The A1 notation range to append data to (e.g. Sheet1!A1)` }, + { name: 'spreadsheet_id', type: 'string', required: true, description: `The ID of the spreadsheet to append data to` }, + { name: 'values', type: 'array', required: true, description: `2D array of values to append. Each inner array is a row.` }, + { name: 'insert_data_option', type: 'string', required: false, description: `How the input data should be inserted. Options: INSERT_ROWS (inserts new rows), OVERWRITE (overwrites existing data). Default: OVERWRITE` }, + { name: 'value_input_option', type: 'string', required: false, description: `How input data should be interpreted. Options: RAW (literal values), USER_ENTERED (as if typed in UI, parses formulas/dates). Default: USER_ENTERED` }, ], }, { name: 'googledwd_clear_values', description: `Clear all values in a specified range of a Google Sheets spreadsheet. Formatting is preserved; only the cell values are cleared.`, params: [ - { - name: 'range', - type: 'string', - required: true, - description: `The A1 notation range to clear (e.g. Sheet1!A1:D10)`, - }, - { - name: 'spreadsheet_id', - type: 'string', - required: true, - description: `The ID of the spreadsheet to clear values in`, - }, + { name: 'range', type: 'string', required: true, description: `The A1 notation range to clear (e.g. Sheet1!A1:D10)` }, + { name: 'spreadsheet_id', type: 'string', required: true, description: `The ID of the spreadsheet to clear values in` }, ], }, { name: 'googledwd_complete_task', description: `Mark a task as completed in Google Tasks. Sets the task status to 'completed'. Uses DWD service account credentials.`, params: [ - { - name: 'task_id', - type: 'string', - required: true, - description: `The ID of the task to mark as completed.`, - }, - { - name: 'task_list_id', - type: 'string', - required: true, - description: `The ID of the task list containing the task.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'task_id', type: 'string', required: true, description: `The ID of the task to mark as completed.` }, + { name: 'task_list_id', type: 'string', required: true, description: `The ID of the task list containing the task.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { @@ -90,441 +35,111 @@ export const tools: Tool[] = [ description: `Create a copy of an existing file in Google Drive. Optionally rename the copy, place it in a different folder, or add a description. Uses DWD service account credentials.`, params: [ { name: 'file_id', type: 'string', required: true, description: `ID of the file to copy` }, - { - name: 'description', - type: 'string', - required: false, - description: `Optional description for the copied file`, - }, - { - name: 'name', - type: 'string', - required: false, - description: `Name for the copied file. If omitted, the copy is named 'Copy of '.`, - }, - { - name: 'parent_folder_id', - type: 'string', - required: false, - description: `ID of the destination folder for the copy. If omitted, the copy is placed in the same folder as the original.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'description', type: 'string', required: false, description: `Optional description for the copied file` }, + { name: 'name', type: 'string', required: false, description: `Name for the copied file. If omitted, the copy is named 'Copy of '.` }, + { name: 'parent_folder_id', type: 'string', required: false, description: `ID of the destination folder for the copy. If omitted, the copy is placed in the same folder as the original.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_chat_message', description: `Send a new text message to a Google Chat space. Optionally reply in an existing thread using a thread key. Uses DWD service account credentials.`, params: [ - { - name: 'space_name', - type: 'string', - required: true, - description: `Resource name of the Chat space to post the message to (e.g., 'spaces/AAAABBBBCCCC').`, - }, - { - name: 'text', - type: 'string', - required: true, - description: `Plain text body of the message to send.`, - }, - { - name: 'request_id', - type: 'string', - required: false, - description: `Unique client-assigned request ID to deduplicate messages (e.g., a UUID). If a message with the same request ID already exists, it is returned instead of creating a new one.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'thread_key', - type: 'string', - required: false, - description: `Thread key to reply in an existing thread. If the thread does not exist, a new thread is created (falls back to new thread).`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Chat space to post the message to (e.g., 'spaces/AAAABBBBCCCC').` }, + { name: 'text', type: 'string', required: true, description: `Plain text body of the message to send.` }, + { name: 'request_id', type: 'string', required: false, description: `Unique client-assigned request ID to deduplicate messages (e.g., a UUID). If a message with the same request ID already exists, it is returned instead of creating a new one.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'thread_key', type: 'string', required: false, description: `Thread key to reply in an existing thread. If the thread does not exist, a new thread is created (falls back to new thread).` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_contact', description: `Create a new contact in Google People (Contacts). Provide at minimum a given name; optionally supply family name, email, phone number, organization, job title, and notes. Uses DWD service account credentials.`, params: [ - { - name: 'given_name', - type: 'string', - required: true, - description: `Given (first) name of the contact. Required.`, - }, - { - name: 'email', - type: 'string', - required: false, - description: `Email address for the new contact (e.g., jane@example.com).`, - }, - { - name: 'family_name', - type: 'string', - required: false, - description: `Family (last) name of the contact.`, - }, - { - name: 'job_title', - type: 'string', - required: false, - description: `Job title of the contact within their organization.`, - }, - { - name: 'notes', - type: 'string', - required: false, - description: `Free-text notes or biography to associate with the contact.`, - }, - { - name: 'organization', - type: 'string', - required: false, - description: `Organization (company) name for the contact.`, - }, - { - name: 'phone_number', - type: 'string', - required: false, - description: `Phone number for the contact (e.g., +1-555-555-5555).`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'given_name', type: 'string', required: true, description: `Given (first) name of the contact. Required.` }, + { name: 'email', type: 'string', required: false, description: `Email address for the new contact (e.g., jane@example.com).` }, + { name: 'family_name', type: 'string', required: false, description: `Family (last) name of the contact.` }, + { name: 'job_title', type: 'string', required: false, description: `Job title of the contact within their organization.` }, + { name: 'notes', type: 'string', required: false, description: `Free-text notes or biography to associate with the contact.` }, + { name: 'organization', type: 'string', required: false, description: `Organization (company) name for the contact.` }, + { name: 'phone_number', type: 'string', required: false, description: `Phone number for the contact (e.g., +1-555-555-5555).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_document', description: `Create a new blank Google Doc with an optional title. Returns the new document's ID and metadata.`, params: [ - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, { name: 'title', type: 'string', required: false, description: `Title of the new document` }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_draft', description: `Create a new draft email in Gmail for the authenticated user. Constructs a MIME message and saves it as a draft. Supports plain text and HTML content types, CC, BCC, and threading. Uses DWD service account credentials.`, params: [ - { - name: 'body', - type: 'string', - required: true, - description: `The body content of the draft email. Provide plain text or HTML depending on the content_type field. Example: 'Hello, this is my draft message.'`, - }, - { - name: 'subject', - type: 'string', - required: true, - description: `The subject line of the draft email. Example: 'Meeting Follow-up'.`, - }, - { - name: 'to', - type: 'string', - required: true, - description: `The recipient email address(es) for the draft. Provide a single address or comma-separated list. Example: 'recipient@example.com' or 'a@example.com,b@example.com'.`, - }, - { - name: 'bcc', - type: 'string', - required: false, - description: `BCC recipients for the draft email. Provide a comma-separated list of email addresses, e.g., bcc1@example.com,bcc2@example.com. Optional.`, - }, - { - name: 'cc', - type: 'string', - required: false, - description: `CC recipients for the draft email. Provide a comma-separated list of email addresses, e.g., cc1@example.com,cc2@example.com. Optional.`, - }, - { - name: 'content_type', - type: 'string', - required: false, - description: `The MIME content type for the email body. Use 'text/plain' for plain text or 'text/html' for HTML content. Defaults to 'text/plain'.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'thread_id', - type: 'string', - required: false, - description: `The Gmail thread ID to associate this draft with an existing conversation. If provided, the draft will be part of that thread. Example: '17a1b2c3d4e5f6g7'.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'body', type: 'string', required: true, description: `The body content of the draft email. Provide plain text or HTML depending on the content_type field. Example: 'Hello, this is my draft message.'` }, + { name: 'subject', type: 'string', required: true, description: `The subject line of the draft email. Example: 'Meeting Follow-up'.` }, + { name: 'to', type: 'string', required: true, description: `The recipient email address(es) for the draft. Provide a single address or comma-separated list. Example: 'recipient@example.com' or 'a@example.com,b@example.com'.` }, + { name: 'bcc', type: 'string', required: false, description: `BCC recipients for the draft email. Provide a comma-separated list of email addresses, e.g., bcc1@example.com,bcc2@example.com. Optional.` }, + { name: 'cc', type: 'string', required: false, description: `CC recipients for the draft email. Provide a comma-separated list of email addresses, e.g., cc1@example.com,cc2@example.com. Optional.` }, + { name: 'content_type', type: 'string', required: false, description: `The MIME content type for the email body. Use 'text/plain' for plain text or 'text/html' for HTML content. Defaults to 'text/plain'.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'thread_id', type: 'string', required: false, description: `The Gmail thread ID to associate this draft with an existing conversation. If provided, the draft will be part of that thread. Example: '17a1b2c3d4e5f6g7'.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_event', description: `Create a new event in a connected Google Calendar account. Supports meeting links, recurrence, attendees, and more. Uses DWD service account credentials.`, params: [ - { - name: 'start_datetime', - type: 'string', - required: true, - description: `Event start time in RFC3339 format`, - }, + { name: 'start_datetime', type: 'string', required: true, description: `Event start time in RFC3339 format` }, { name: 'summary', type: 'string', required: true, description: `Event title/summary` }, - { - name: 'attendees_emails', - type: 'array', - required: false, - description: `Attendee email addresses`, - }, - { - name: 'calendar_id', - type: 'string', - required: false, - description: `Calendar ID to create the event in`, - }, - { - name: 'create_meeting_room', - type: 'boolean', - required: false, - description: `Generate a Google Meet link for this event`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `Optional event description`, - }, - { - name: 'event_duration_hour', - type: 'integer', - required: false, - description: `Duration of event in hours`, - }, - { - name: 'event_duration_minutes', - type: 'integer', - required: false, - description: `Duration of event in minutes`, - }, - { - name: 'event_type', - type: 'string', - required: false, - description: `Event type for display purposes`, - }, - { - name: 'guests_can_invite_others', - type: 'boolean', - required: false, - description: `Allow guests to invite others`, - }, - { - name: 'guests_can_modify', - type: 'boolean', - required: false, - description: `Allow guests to modify the event`, - }, - { - name: 'guests_can_see_other_guests', - type: 'boolean', - required: false, - description: `Allow guests to see each other`, - }, + { name: 'attendees_emails', type: 'array', required: false, description: `Attendee email addresses` }, + { name: 'calendar_id', type: 'string', required: false, description: `Calendar ID to create the event in` }, + { name: 'create_meeting_room', type: 'boolean', required: false, description: `Generate a Google Meet link for this event` }, + { name: 'description', type: 'string', required: false, description: `Optional event description` }, + { name: 'event_duration_hour', type: 'integer', required: false, description: `Duration of event in hours` }, + { name: 'event_duration_minutes', type: 'integer', required: false, description: `Duration of event in minutes` }, + { name: 'event_type', type: 'string', required: false, description: `Event type for display purposes` }, + { name: 'guests_can_invite_others', type: 'boolean', required: false, description: `Allow guests to invite others` }, + { name: 'guests_can_modify', type: 'boolean', required: false, description: `Allow guests to modify the event` }, + { name: 'guests_can_see_other_guests', type: 'boolean', required: false, description: `Allow guests to see each other` }, { name: 'location', type: 'string', required: false, description: `Location of the event` }, - { - name: 'recurrence', - type: 'array', - required: false, - description: `Recurrence rules (iCalendar RRULE format)`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'send_updates', - type: 'boolean', - required: false, - description: `Send update notifications to attendees`, - }, - { - name: 'timezone', - type: 'string', - required: false, - description: `Timezone for the event (IANA time zone identifier)`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'transparency', - type: 'string', - required: false, - description: `Calendar transparency (free/busy)`, - }, - { - name: 'visibility', - type: 'string', - required: false, - description: `Visibility of the event`, - }, + { name: 'recurrence', type: 'array', required: false, description: `Recurrence rules (iCalendar RRULE format)` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'send_updates', type: 'boolean', required: false, description: `Send update notifications to attendees` }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for the event (IANA time zone identifier)` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'transparency', type: 'string', required: false, description: `Calendar transparency (free/busy)` }, + { name: 'visibility', type: 'string', required: false, description: `Visibility of the event` }, ], }, { name: 'googledwd_create_filter', description: `Create a new email filter for the authenticated Gmail account. Specify criteria (sender, recipient, subject, query, or attachment) and actions (apply labels, forward, archive, star, trash, mark as read, etc.). At least one criteria field should be provided. Uses DWD service account credentials.`, params: [ - { - name: 'add_label_ids', - type: 'array', - required: false, - description: `List of Gmail label IDs to apply to matching messages (e.g., ['Label_123', 'STARRED']). Use the List Labels tool to find valid label IDs.`, - }, - { - name: 'forward', - type: 'string', - required: false, - description: `Email address to forward matching messages to. The address must already be configured as a forwarding address in the Gmail account.`, - }, - { - name: 'from', - type: 'string', - required: false, - description: `Sender email address or domain to match in the filter criteria (e.g., 'alerts@github.com' or '@newsletter.com').`, - }, - { - name: 'has_attachment', - type: 'boolean', - required: false, - description: `If true, only match messages that have at least one attachment.`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Gmail search query string to match messages using Gmail's search syntax (e.g., 'larger:10M', 'is:important').`, - }, - { - name: 'remove_label_ids', - type: 'array', - required: false, - description: `List of Gmail label IDs to remove from matching messages (e.g., ['INBOX'] to archive, ['UNREAD'] to mark as read).`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'should_always_mark_important', - type: 'boolean', - required: false, - description: `If true, always mark matching messages as important regardless of Gmail's automatic importance detection.`, - }, - { - name: 'should_archive', - type: 'boolean', - required: false, - description: `If true, skip the inbox for matching messages (equivalent to adding the 'Archive' action).`, - }, - { - name: 'should_mark_read', - type: 'boolean', - required: false, - description: `If true, automatically mark matching messages as read.`, - }, - { - name: 'should_never_mark_important', - type: 'boolean', - required: false, - description: `If true, never mark matching messages as important, overriding Gmail's automatic importance detection.`, - }, - { - name: 'should_never_spam', - type: 'boolean', - required: false, - description: `If true, never send matching messages to the Spam folder.`, - }, - { - name: 'should_star', - type: 'boolean', - required: false, - description: `If true, automatically star matching messages.`, - }, - { - name: 'should_trash', - type: 'boolean', - required: false, - description: `If true, automatically move matching messages to the Trash.`, - }, - { - name: 'subject', - type: 'string', - required: false, - description: `Subject line text to match in the filter criteria (e.g., '[GitHub]' or 'Invoice').`, - }, - { - name: 'to', - type: 'string', - required: false, - description: `Recipient email address to match in the filter criteria (e.g., 'team@example.com').`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'add_label_ids', type: 'array', required: false, description: `List of Gmail label IDs to apply to matching messages (e.g., ['Label_123', 'STARRED']). Use the List Labels tool to find valid label IDs.` }, + { name: 'forward', type: 'string', required: false, description: `Email address to forward matching messages to. The address must already be configured as a forwarding address in the Gmail account.` }, + { name: 'from', type: 'string', required: false, description: `Sender email address or domain to match in the filter criteria (e.g., 'alerts@github.com' or '@newsletter.com').` }, + { name: 'has_attachment', type: 'boolean', required: false, description: `If true, only match messages that have at least one attachment.` }, + { name: 'query', type: 'string', required: false, description: `Gmail search query string to match messages using Gmail's search syntax (e.g., 'larger:10M', 'is:important').` }, + { name: 'remove_label_ids', type: 'array', required: false, description: `List of Gmail label IDs to remove from matching messages (e.g., ['INBOX'] to archive, ['UNREAD'] to mark as read).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'should_always_mark_important', type: 'boolean', required: false, description: `If true, always mark matching messages as important regardless of Gmail's automatic importance detection.` }, + { name: 'should_archive', type: 'boolean', required: false, description: `If true, skip the inbox for matching messages (equivalent to adding the 'Archive' action).` }, + { name: 'should_mark_read', type: 'boolean', required: false, description: `If true, automatically mark matching messages as read.` }, + { name: 'should_never_mark_important', type: 'boolean', required: false, description: `If true, never mark matching messages as important, overriding Gmail's automatic importance detection.` }, + { name: 'should_never_spam', type: 'boolean', required: false, description: `If true, never send matching messages to the Spam folder.` }, + { name: 'should_star', type: 'boolean', required: false, description: `If true, automatically star matching messages.` }, + { name: 'should_trash', type: 'boolean', required: false, description: `If true, automatically move matching messages to the Trash.` }, + { name: 'subject', type: 'string', required: false, description: `Subject line text to match in the filter criteria (e.g., '[GitHub]' or 'Invoice').` }, + { name: 'to', type: 'string', required: false, description: `Recipient email address to match in the filter criteria (e.g., 'team@example.com').` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { @@ -532,102 +147,37 @@ export const tools: Tool[] = [ description: `Create a new folder in Google Drive. Optionally place it inside a parent folder and add a description. Uses DWD service account credentials.`, params: [ { name: 'name', type: 'string', required: true, description: `Name of the new folder` }, - { - name: 'description', - type: 'string', - required: false, - description: `Optional description for the new folder`, - }, - { - name: 'parent_folder_id', - type: 'string', - required: false, - description: `ID of the parent folder to create this folder inside. If omitted, the folder is created in the root of My Drive.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'description', type: 'string', required: false, description: `Optional description for the new folder` }, + { name: 'parent_folder_id', type: 'string', required: false, description: `ID of the parent folder to create this folder inside. If omitted, the folder is created in the root of My Drive.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_form', description: `Create a new Google Form with a title and optional document title. Returns the new form's ID and metadata.`, params: [ - { - name: 'title', - type: 'string', - required: true, - description: `The title of the form shown to respondents`, - }, - { - name: 'document_title', - type: 'string', - required: false, - description: `The title of the document shown in Google Drive (defaults to the form title if not provided)`, - }, + { name: 'title', type: 'string', required: true, description: `The title of the form shown to respondents` }, + { name: 'document_title', type: 'string', required: false, description: `The title of the document shown in Google Drive (defaults to the form title if not provided)` }, ], }, { name: 'googledwd_create_meet_space', description: `Create a new Google Meet meeting space. Optionally configure access type and entry point access restrictions. Returns the meeting URI and space details. Uses DWD service account credentials.`, params: [ - { - name: 'access_type', - type: 'string', - required: false, - description: `Access type for the meeting space. One of: 'OPEN' (anyone with link), 'TRUSTED' (domain users), 'RESTRICTED' (only invited participants).`, - }, - { - name: 'entry_point_access', - type: 'string', - required: false, - description: `Who can use entry points to join. One of: 'ALL' (anyone), 'CREATOR_APP_ONLY' (only the creating app's users).`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'access_type', type: 'string', required: false, description: `Access type for the meeting space. One of: 'OPEN' (anyone with link), 'TRUSTED' (domain users), 'RESTRICTED' (only invited participants).` }, + { name: 'entry_point_access', type: 'string', required: false, description: `Who can use entry points to join. One of: 'ALL' (anyone), 'CREATOR_APP_ONLY' (only the creating app's users).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_presentation', description: `Create a new Google Slides presentation with an optional title.`, params: [ - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `Title of the new presentation`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'title', type: 'string', required: false, description: `Title of the new presentation` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { @@ -635,79 +185,24 @@ export const tools: Tool[] = [ description: `Create a new Google Sheets spreadsheet with an optional title and initial sheet configuration. Returns the new spreadsheet ID and metadata.`, params: [ { name: 'locale', type: 'string', required: false, description: `Locale of the spreadsheet` }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'sheets', - type: 'array', - required: false, - description: `Initial sheets to include in the spreadsheet`, - }, - { - name: 'time_zone', - type: 'string', - required: false, - description: `Time zone for the spreadsheet`, - }, - { - name: 'title', - type: 'string', - required: false, - description: `Title of the new spreadsheet`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'sheets', type: 'array', required: false, description: `Initial sheets to include in the spreadsheet` }, + { name: 'time_zone', type: 'string', required: false, description: `Time zone for the spreadsheet` }, + { name: 'title', type: 'string', required: false, description: `Title of the new spreadsheet` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_task', description: `Create a new task in a specified Google Tasks task list. Supports setting a title, notes, due date, and initial status. Uses DWD service account credentials.`, params: [ - { - name: 'task_list_id', - type: 'string', - required: true, - description: `The ID of the task list in which to create the task.`, - }, + { name: 'task_list_id', type: 'string', required: true, description: `The ID of the task list in which to create the task.` }, { name: 'title', type: 'string', required: true, description: `Title of the new task.` }, - { - name: 'due', - type: 'string', - required: false, - description: `Due date and time of the task in RFC3339 datetime format (e.g., 2025-08-15T17:00:00Z). Note: the time portion is ignored by the Google Tasks API; only the date is used.`, - }, - { - name: 'notes', - type: 'string', - required: false, - description: `Additional notes or description for the task.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Status of the task. Use 'needsAction' for an open task or 'completed' for a finished task.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'due', type: 'string', required: false, description: `Due date and time of the task in RFC3339 datetime format (e.g., 2025-08-15T17:00:00Z). Note: the time portion is ignored by the Google Tasks API; only the date is used.` }, + { name: 'notes', type: 'string', required: false, description: `Additional notes or description for the task.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'status', type: 'string', required: false, description: `Status of the task. Use 'needsAction' for an open task or 'completed' for a finished task.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { @@ -715,649 +210,219 @@ export const tools: Tool[] = [ description: `Create a new task list in Google Tasks for the authenticated user. Returns the created task list with its ID and metadata. Uses DWD service account credentials.`, params: [ { name: 'title', type: 'string', required: true, description: `Title of the new task list.` }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_create_vault_matter', description: `Create a new matter in Google Vault for e-discovery and legal hold purposes. Provide a name and an optional description. Uses DWD service account credentials.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: `Name of the new Vault matter (e.g., 'Q1 Litigation 2024').`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `Optional description of the Vault matter.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'name', type: 'string', required: true, description: `Name of the new Vault matter (e.g., 'Q1 Litigation 2024').` }, + { name: 'description', type: 'string', required: false, description: `Optional description of the Vault matter.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_delete_contact', description: `Permanently delete a contact from Google People using its resource name (e.g., 'people/c12345'). This action cannot be undone. Uses DWD service account credentials.`, params: [ - { - name: 'resource_name', - type: 'string', - required: true, - description: `Resource name of the contact to delete (e.g., 'people/c12345'). Obtain from a create or list response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'resource_name', type: 'string', required: true, description: `Resource name of the contact to delete (e.g., 'people/c12345'). Obtain from a create or list response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_delete_event', description: `Delete an event from a connected Google Calendar account. Requires the calendar ID and event ID. Uses DWD service account credentials.`, params: [ - { - name: 'event_id', - type: 'string', - required: true, - description: `The ID of the calendar event to delete`, - }, - { - name: 'calendar_id', - type: 'string', - required: false, - description: `The ID of the calendar from which the event should be deleted`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'event_id', type: 'string', required: true, description: `The ID of the calendar event to delete` }, + { name: 'calendar_id', type: 'string', required: false, description: `The ID of the calendar from which the event should be deleted` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_delete_file', description: `Permanently delete a file or folder in Google Drive by its file ID. This action cannot be undone. Uses DWD service account credentials.`, params: [ - { - name: 'file_id', - type: 'string', - required: true, - description: `ID of the file or folder to delete`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'supports_all_drives', - type: 'boolean', - required: false, - description: `Whether the request supports files in shared drives`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'file_id', type: 'string', required: true, description: `ID of the file or folder to delete` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'supports_all_drives', type: 'boolean', required: false, description: `Whether the request supports files in shared drives` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_delete_task', description: `Permanently delete a task from a Google Tasks task list. This action cannot be undone. Uses DWD service account credentials.`, params: [ - { - name: 'task_id', - type: 'string', - required: true, - description: `The ID of the task to delete.`, - }, - { - name: 'task_list_id', - type: 'string', - required: true, - description: `The ID of the task list containing the task.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'task_id', type: 'string', required: true, description: `The ID of the task to delete.` }, + { name: 'task_list_id', type: 'string', required: true, description: `The ID of the task list containing the task.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_end_meet_conference', description: `End the active conference in a Google Meet space, disconnecting all participants. Requires the resource name of the space (e.g., 'spaces/abc123'). Uses DWD service account credentials.`, params: [ - { - name: 'space_name', - type: 'string', - required: true, - description: `Resource name of the Meet space whose active conference to end (e.g., 'spaces/abc123').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Meet space whose active conference to end (e.g., 'spaces/abc123').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_fetch_mails', description: `Fetch emails from a connected Gmail account using search filters. Uses DWD service account credentials.`, params: [ - { - name: 'format', - type: 'string', - required: false, - description: `Format of the returned message.`, - }, - { - name: 'include_spam_trash', - type: 'boolean', - required: false, - description: `Whether to fetch emails from spam and trash folders`, - }, - { - name: 'label_ids', - type: 'array', - required: false, - description: `Gmail label IDs to filter messages`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of emails to fetch`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Page token for pagination`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search query string using Gmail's search syntax (e.g., 'is:unread from:user@example.com')`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'format', type: 'string', required: false, description: `Format of the returned message.` }, + { name: 'include_spam_trash', type: 'boolean', required: false, description: `Whether to fetch emails from spam and trash folders` }, + { name: 'label_ids', type: 'array', required: false, description: `Gmail label IDs to filter messages` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of emails to fetch` }, + { name: 'page_token', type: 'string', required: false, description: `Page token for pagination` }, + { name: 'query', type: 'string', required: false, description: `Search query string using Gmail's search syntax (e.g., 'is:unread from:user@example.com')` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_admin_group', description: `Retrieve details of a specific Google Workspace group by its email address or unique group ID using the Admin Directory API. Uses DWD service account credentials.`, params: [ - { - name: 'group_key', - type: 'string', - required: true, - description: `Group email address or unique group ID to retrieve (e.g., 'engineering@example.com' or a numeric ID).`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'group_key', type: 'string', required: true, description: `Group email address or unique group ID to retrieve (e.g., 'engineering@example.com' or a numeric ID).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_admin_user', description: `Retrieve details of a specific Google Workspace user by their primary email address or unique user ID using the Admin Directory API. Uses DWD service account credentials.`, params: [ - { - name: 'user_key', - type: 'string', - required: true, - description: `Primary email address or unique user ID of the user to retrieve (e.g., 'john@example.com' or '123456789').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'user_key', type: 'string', required: true, description: `Primary email address or unique user ID of the user to retrieve (e.g., 'john@example.com' or '123456789').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_alert', description: `Get details of a specific security alert from Google Workspace Alert Center. Uses DWD service account credentials.`, params: [ - { - name: 'alert_id', - type: 'string', - required: true, - description: `The unique identifier of the alert to retrieve. Example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'alert_id', type: 'string', required: true, description: `The unique identifier of the alert to retrieve. Example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_alert_metadata', description: `Get metadata for a specific alert including acknowledgement status and assignee. Uses DWD service account credentials.`, params: [ - { - name: 'alert_id', - type: 'string', - required: true, - description: `The unique identifier of the alert whose metadata to retrieve. Example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'alert_id', type: 'string', required: true, description: `The unique identifier of the alert whose metadata to retrieve. Example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_attachment_by_id', description: `Retrieve a specific attachment from a Gmail message using the message ID and attachment ID. Uses DWD service account credentials.`, params: [ - { - name: 'attachment_id', - type: 'string', - required: true, - description: `Unique Gmail attachment ID`, - }, - { - name: 'message_id', - type: 'string', - required: true, - description: `Unique Gmail message ID that contains the attachment`, - }, - { - name: 'file_name', - type: 'string', - required: false, - description: `Preferred filename to use when saving/returning the attachment`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'attachment_id', type: 'string', required: true, description: `Unique Gmail attachment ID` }, + { name: 'message_id', type: 'string', required: true, description: `Unique Gmail message ID that contains the attachment` }, + { name: 'file_name', type: 'string', required: false, description: `Preferred filename to use when saving/returning the attachment` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_chat_space', description: `Retrieve details of a specific Google Chat space (room or direct message) by its resource name (e.g., 'spaces/AAAA'). Uses DWD service account credentials.`, params: [ - { - name: 'space_name', - type: 'string', - required: true, - description: `Resource name of the Chat space to retrieve (e.g., 'spaces/AAAABBBBCCCC').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Chat space to retrieve (e.g., 'spaces/AAAABBBBCCCC').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_contacts', description: `Fetch a list of contacts from the connected Gmail account. Supports pagination and field filtering. Uses DWD service account credentials.`, params: [ - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of contacts to fetch`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token to retrieve the next page of results`, - }, - { - name: 'person_fields', - type: 'array', - required: false, - description: `Fields to include for each person`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of contacts to fetch` }, + { name: 'page_token', type: 'string', required: false, description: `Token to retrieve the next page of results` }, + { name: 'person_fields', type: 'array', required: false, description: `Fields to include for each person` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_event_by_id', description: `Retrieve a specific calendar event by its ID using optional filtering and list parameters. Uses DWD service account credentials.`, params: [ - { - name: 'event_id', - type: 'string', - required: true, - description: `The unique identifier of the calendar event to fetch`, - }, - { - name: 'calendar_id', - type: 'string', - required: false, - description: `The calendar ID to search in`, - }, - { - name: 'event_types', - type: 'array', - required: false, - description: `Filter by Google event types`, - }, + { name: 'event_id', type: 'string', required: true, description: `The unique identifier of the calendar event to fetch` }, + { name: 'calendar_id', type: 'string', required: false, description: `The calendar ID to search in` }, + { name: 'event_types', type: 'array', required: false, description: `Filter by Google event types` }, { name: 'query', type: 'string', required: false, description: `Free text search query` }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'show_deleted', - type: 'boolean', - required: false, - description: `Include deleted events in results`, - }, - { - name: 'single_events', - type: 'boolean', - required: false, - description: `Expand recurring events into instances`, - }, - { - name: 'time_max', - type: 'string', - required: false, - description: `Upper bound for event start time (RFC3339)`, - }, - { - name: 'time_min', - type: 'string', - required: false, - description: `Lower bound for event start time (RFC3339)`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'updated_min', - type: 'string', - required: false, - description: `Filter events updated after this time (RFC3339)`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'show_deleted', type: 'boolean', required: false, description: `Include deleted events in results` }, + { name: 'single_events', type: 'boolean', required: false, description: `Expand recurring events into instances` }, + { name: 'time_max', type: 'string', required: false, description: `Upper bound for event start time (RFC3339)` }, + { name: 'time_min', type: 'string', required: false, description: `Lower bound for event start time (RFC3339)` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'updated_min', type: 'string', required: false, description: `Filter events updated after this time (RFC3339)` }, ], }, { name: 'googledwd_get_file_metadata', description: `Retrieve metadata for a specific file in Google Drive by its file ID. Returns name, MIME type, size, creation time, and more.`, params: [ - { - name: 'file_id', - type: 'string', - required: true, - description: `The ID of the file to retrieve metadata for`, - }, - { - name: 'fields', - type: 'string', - required: false, - description: `Fields to include in the response`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'supports_all_drives', - type: 'boolean', - required: false, - description: `Support shared drives`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'file_id', type: 'string', required: true, description: `The ID of the file to retrieve metadata for` }, + { name: 'fields', type: 'string', required: false, description: `Fields to include in the response` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'supports_all_drives', type: 'boolean', required: false, description: `Support shared drives` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_form', description: `Get the structure and metadata of a Google Form including its title, description, and all questions.`, params: [ - { - name: 'form_id', - type: 'string', - required: true, - description: `The ID of the Google Form to retrieve`, - }, + { name: 'form_id', type: 'string', required: true, description: `The ID of the Google Form to retrieve` }, ], }, { name: 'googledwd_get_group_settings', description: `Get the settings for a Google Workspace group including posting permissions, membership settings, and moderation. Uses DWD service account credentials.`, params: [ - { - name: 'group_email', - type: 'string', - required: true, - description: `The email address of the Google Workspace group whose settings to retrieve. Example: 'engineering@example.com'`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'group_email', type: 'string', required: true, description: `The email address of the Google Workspace group whose settings to retrieve. Example: 'engineering@example.com'` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_keep_note', description: `Retrieve a single Google Keep note by its resource name (e.g., 'notes/abc123'), including its title, body, and metadata. Uses DWD service account credentials.`, params: [ - { - name: 'note_name', - type: 'string', - required: true, - description: `Resource name of the Keep note to retrieve (e.g., 'notes/abc123').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'note_name', type: 'string', required: true, description: `Resource name of the Keep note to retrieve (e.g., 'notes/abc123').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_meet_space', description: `Retrieve details of a Google Meet meeting space by its resource name (e.g., 'spaces/abc123'), including its meeting URI and configuration. Uses DWD service account credentials.`, params: [ - { - name: 'space_name', - type: 'string', - required: true, - description: `Resource name of the Meet space to retrieve (e.g., 'spaces/abc123').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Meet space to retrieve (e.g., 'spaces/abc123').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_message_by_id', description: `Retrieve a specific Gmail message using its message ID. Optionally control the format of the returned data. Uses DWD service account credentials.`, params: [ - { - name: 'message_id', - type: 'string', - required: true, - description: `Unique Gmail message ID`, - }, - { - name: 'format', - type: 'string', - required: false, - description: `Format of the returned message.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'message_id', type: 'string', required: true, description: `Unique Gmail message ID` }, + { name: 'format', type: 'string', required: false, description: `Format of the returned message.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { @@ -1365,36 +430,16 @@ export const tools: Tool[] = [ description: `Get a single response submitted to a Google Form by its response ID. Returns the respondent's answers for all questions.`, params: [ { name: 'form_id', type: 'string', required: true, description: `The ID of the Google Form` }, - { - name: 'response_id', - type: 'string', - required: true, - description: `The ID of the specific response to retrieve`, - }, + { name: 'response_id', type: 'string', required: true, description: `The ID of the specific response to retrieve` }, ], }, { name: 'googledwd_get_send_as', description: `Get send-as alias settings including email signature for the authenticated Gmail account. Use the user's own email address to retrieve the default send-as settings and signature. Uses DWD service account credentials.`, params: [ - { - name: 'send_as_email', - type: 'string', - required: true, - description: `The send-as alias email address to retrieve settings for. Use the user's own email address (e.g., 'user@example.com') to get their default signature and send-as settings.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'send_as_email', type: 'string', required: true, description: `The send-as alias email address to retrieve settings for. Use the user's own email address (e.g., 'user@example.com') to get their default signature and send-as settings.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { @@ -1402,2016 +447,566 @@ export const tools: Tool[] = [ description: `Retrieve a specific Gmail thread by thread ID. Optionally control message format and metadata headers. Uses service account with Domain-Wide Delegation.`, params: [ { name: 'thread_id', type: 'string', required: true, description: `Unique Gmail thread ID` }, - { - name: 'format', - type: 'string', - required: false, - description: `Format of messages in the returned thread.`, - }, - { - name: 'metadata_headers', - type: 'array', - required: false, - description: `Specific email headers to include when format is metadata`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'format', type: 'string', required: false, description: `Format of messages in the returned thread.` }, + { name: 'metadata_headers', type: 'array', required: false, description: `Specific email headers to include when format is metadata` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_userinfo', description: `Retrieve the profile information of the impersonated Google Workspace user, including their email address, name, and profile picture.`, params: [ - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_vacation_settings', description: `Get the vacation auto-reply settings for the authenticated Gmail account. Uses DWD service account credentials.`, params: [ - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_get_values', description: `Returns only the cell values from a specific range in a Google Sheet — no metadata, no formatting, just the data. For full spreadsheet metadata and formatting, use googledwd_read_spreadsheet instead.`, params: [ - { - name: 'range', - type: 'string', - required: true, - description: `Cell range to read in A1 notation`, - }, - { - name: 'spreadsheet_id', - type: 'string', - required: true, - description: `The ID of the Google Sheet`, - }, - { - name: 'major_dimension', - type: 'string', - required: false, - description: `Whether values are returned by rows or columns`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'value_render_option', - type: 'string', - required: false, - description: `How values should be rendered in the response`, - }, + { name: 'range', type: 'string', required: true, description: `Cell range to read in A1 notation` }, + { name: 'spreadsheet_id', type: 'string', required: true, description: `The ID of the Google Sheet` }, + { name: 'major_dimension', type: 'string', required: false, description: `Whether values are returned by rows or columns` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'value_render_option', type: 'string', required: false, description: `How values should be rendered in the response` }, ], }, { name: 'googledwd_get_vault_matter', description: `Retrieve details of a specific Google Vault matter by its matter ID. Optionally specify the view level (BASIC or FULL) to control how much detail is returned. Uses DWD service account credentials.`, params: [ - { - name: 'matter_id', - type: 'string', - required: true, - description: `Unique ID of the Vault matter to retrieve (e.g., '0123456789abcdef').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'view', - type: 'string', - required: false, - description: `Level of detail to return. 'BASIC' returns metadata only; 'FULL' includes collaborators and other details.`, - }, + { name: 'matter_id', type: 'string', required: true, description: `Unique ID of the Vault matter to retrieve (e.g., '0123456789abcdef').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'view', type: 'string', required: false, description: `Level of detail to return. 'BASIC' returns metadata only; 'FULL' includes collaborators and other details.` }, ], }, { name: 'googledwd_list_admin_activities', description: `List audit log activity events for a specific user and application in Google Workspace using the Admin Reports API. Use 'all' for user_key to retrieve activities for all users. Uses DWD service account credentials.`, params: [ - { - name: 'application_name', - type: 'string', - required: true, - description: `Name of the application whose activity records to retrieve. One of: 'admin', 'calendar', 'drive', 'gcp', 'groups', 'login', 'meet', 'mobile', 'rules', 'saml', 'token', 'user_accounts'.`, - }, - { - name: 'user_key', - type: 'string', - required: true, - description: `User email address or unique user ID to retrieve activity for. Use 'all' to retrieve activities for all users.`, - }, - { - name: 'end_time', - type: 'string', - required: false, - description: `End of the time range for activity records in RFC3339 format (e.g., '2024-01-31T23:59:59Z').`, - }, - { - name: 'event_name', - type: 'string', - required: false, - description: `Filter by a specific event name within the application (e.g., 'LOGIN_SUCCESS' for the login application).`, - }, - { - name: 'filters', - type: 'string', - required: false, - description: `Comma-separated event parameter filters (e.g., 'IP_ADDRESS==1.2.3.4'). See Reports API docs for supported parameters.`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of activity records to return per page (1–1000).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'start_time', - type: 'string', - required: false, - description: `Start of the time range for activity records in RFC3339 format (e.g., '2024-01-01T00:00:00Z').`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'application_name', type: 'string', required: true, description: `Name of the application whose activity records to retrieve. One of: 'admin', 'calendar', 'drive', 'gcp', 'groups', 'login', 'meet', 'mobile', 'rules', 'saml', 'token', 'user_accounts'.` }, + { name: 'user_key', type: 'string', required: true, description: `User email address or unique user ID to retrieve activity for. Use 'all' to retrieve activities for all users.` }, + { name: 'end_time', type: 'string', required: false, description: `End of the time range for activity records in RFC3339 format (e.g., '2024-01-31T23:59:59Z').` }, + { name: 'event_name', type: 'string', required: false, description: `Filter by a specific event name within the application (e.g., 'LOGIN_SUCCESS' for the login application).` }, + { name: 'filters', type: 'string', required: false, description: `Comma-separated event parameter filters (e.g., 'IP_ADDRESS==1.2.3.4'). See Reports API docs for supported parameters.` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of activity records to return per page (1–1000).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'start_time', type: 'string', required: false, description: `Start of the time range for activity records in RFC3339 format (e.g., '2024-01-01T00:00:00Z').` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_admin_groups', description: `List groups in a Google Workspace domain using the Admin Directory API. Supports filtering by domain, query string, and user membership. Uses DWD service account credentials.`, params: [ - { - name: 'customer', - type: 'string', - required: false, - description: `Customer ID or 'my_customer' for the authenticated account's domain (default: 'my_customer').`, - }, - { - name: 'domain', - type: 'string', - required: false, - description: `Domain name to filter groups (e.g., 'example.com').`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of groups to return per page (1–200).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Query string to filter groups (e.g., 'name:Engineering*').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'user_key', - type: 'string', - required: false, - description: `Filter groups to only those that contain this user (email or user ID).`, - }, + { name: 'customer', type: 'string', required: false, description: `Customer ID or 'my_customer' for the authenticated account's domain (default: 'my_customer').` }, + { name: 'domain', type: 'string', required: false, description: `Domain name to filter groups (e.g., 'example.com').` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of groups to return per page (1–200).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'query', type: 'string', required: false, description: `Query string to filter groups (e.g., 'name:Engineering*').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'user_key', type: 'string', required: false, description: `Filter groups to only those that contain this user (email or user ID).` }, ], }, { name: 'googledwd_list_admin_users', description: `List user accounts in a Google Workspace domain using the Admin Directory API. Supports filtering by domain, query string, ordering, and pagination. Uses DWD service account credentials.`, params: [ - { - name: 'customer', - type: 'string', - required: false, - description: `Customer ID or 'my_customer' for the authenticated account's domain (default: 'my_customer').`, - }, - { - name: 'domain', - type: 'string', - required: false, - description: `Domain name to filter users (e.g., 'example.com'). Mutually exclusive with customer.`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of users to return per page (1–500).`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Field to sort users by. One of: 'email', 'familyName', 'givenName'.`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Query string to filter users (e.g., 'email:admin*', 'name:John').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'show_deleted', - type: 'string', - required: false, - description: `If 'true', retrieves deleted users. Default is 'false'.`, - }, - { - name: 'sort_order', - type: 'string', - required: false, - description: `Sort direction for results. One of: 'ASCENDING', 'DESCENDING'.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'customer', type: 'string', required: false, description: `Customer ID or 'my_customer' for the authenticated account's domain (default: 'my_customer').` }, + { name: 'domain', type: 'string', required: false, description: `Domain name to filter users (e.g., 'example.com'). Mutually exclusive with customer.` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of users to return per page (1–500).` }, + { name: 'order_by', type: 'string', required: false, description: `Field to sort users by. One of: 'email', 'familyName', 'givenName'.` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'query', type: 'string', required: false, description: `Query string to filter users (e.g., 'email:admin*', 'name:John').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'show_deleted', type: 'string', required: false, description: `If 'true', retrieves deleted users. Default is 'false'.` }, + { name: 'sort_order', type: 'string', required: false, description: `Sort direction for results. One of: 'ASCENDING', 'DESCENDING'.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_alert_feedback', description: `List all feedback entries for a specific security alert. Uses DWD service account credentials.`, params: [ - { - name: 'alert_id', - type: 'string', - required: true, - description: `The unique identifier of the alert whose feedback to list. Example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'alert_id', type: 'string', required: true, description: `The unique identifier of the alert whose feedback to list. Example: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890'` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_alerts', description: `List security alerts from Google Workspace Alert Center. Shows suspicious logins, DLP violations, and other security events. Uses DWD service account credentials.`, params: [ - { - name: 'filter', - type: 'string', - required: false, - description: `Filter string to narrow alert results. Example: "type=\\"Suspicious login\\""`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order for results. Example: 'createTime desc'`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of alerts to return per page. Max 100.`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'filter', type: 'string', required: false, description: `Filter string to narrow alert results. Example: "type=\\"Suspicious login\\""` }, + { name: 'order_by', type: 'string', required: false, description: `Sort order for results. Example: 'createTime desc'` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of alerts to return per page. Max 100.` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_calendars', description: `List all accessible Google Calendar calendars for the authenticated user. Supports filters and pagination. Uses DWD service account credentials.`, params: [ - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of calendars to fetch`, - }, - { - name: 'min_access_role', - type: 'string', - required: false, - description: `Minimum access role to include in results`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token to retrieve the next page of results`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'show_deleted', - type: 'boolean', - required: false, - description: `Include deleted calendars in the list`, - }, - { - name: 'show_hidden', - type: 'boolean', - required: false, - description: `Include calendars that are hidden from the calendar list`, - }, - { - name: 'sync_token', - type: 'string', - required: false, - description: `Token to get updates since the last sync`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of calendars to fetch` }, + { name: 'min_access_role', type: 'string', required: false, description: `Minimum access role to include in results` }, + { name: 'page_token', type: 'string', required: false, description: `Token to retrieve the next page of results` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'show_deleted', type: 'boolean', required: false, description: `Include deleted calendars in the list` }, + { name: 'show_hidden', type: 'boolean', required: false, description: `Include calendars that are hidden from the calendar list` }, + { name: 'sync_token', type: 'string', required: false, description: `Token to get updates since the last sync` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_chat_members', description: `List members (human users and bots) in a Google Chat space. Supports filtering and pagination, with optional inclusion of Google Groups and invited members. Uses DWD service account credentials.`, params: [ - { - name: 'space_name', - type: 'string', - required: true, - description: `Resource name of the Chat space to list members for (e.g., 'spaces/AAAABBBBCCCC').`, - }, - { - name: 'filter', - type: 'string', - required: false, - description: `Query filter for members. Example: 'member.type = "HUMAN"'.`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of members to return per page (1–1000).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'show_groups', - type: 'boolean', - required: false, - description: `If true, include Google Groups in the member list.`, - }, - { - name: 'show_invited', - type: 'boolean', - required: false, - description: `If true, include invited (pending) members in the results.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Chat space to list members for (e.g., 'spaces/AAAABBBBCCCC').` }, + { name: 'filter', type: 'string', required: false, description: `Query filter for members. Example: 'member.type = "HUMAN"'.` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of members to return per page (1–1000).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'show_groups', type: 'boolean', required: false, description: `If true, include Google Groups in the member list.` }, + { name: 'show_invited', type: 'boolean', required: false, description: `If true, include invited (pending) members in the results.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_chat_messages', description: `List messages in a Google Chat space. Supports filtering, ordering, and pagination. Optionally include deleted messages. Uses DWD service account credentials.`, params: [ - { - name: 'space_name', - type: 'string', - required: true, - description: `Resource name of the Chat space to list messages from (e.g., 'spaces/AAAABBBBCCCC').`, - }, - { - name: 'filter', - type: 'string', - required: false, - description: `Query filter for messages. Example: 'createTime > "2024-01-01T00:00:00Z"'.`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort field and direction for results (e.g., 'createTime asc' or 'createTime desc').`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of messages to return per page (1–1000).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'show_deleted', - type: 'boolean', - required: false, - description: `If true, include deleted messages in the results.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Chat space to list messages from (e.g., 'spaces/AAAABBBBCCCC').` }, + { name: 'filter', type: 'string', required: false, description: `Query filter for messages. Example: 'createTime > "2024-01-01T00:00:00Z"'.` }, + { name: 'order_by', type: 'string', required: false, description: `Sort field and direction for results (e.g., 'createTime asc' or 'createTime desc').` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of messages to return per page (1–1000).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'show_deleted', type: 'boolean', required: false, description: `If true, include deleted messages in the results.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_chat_spaces', description: `List Google Chat spaces (rooms and direct messages) that the authenticated user or service account has access to. Supports filtering and pagination. Uses DWD service account credentials.`, params: [ - { - name: 'filter', - type: 'string', - required: false, - description: `Query filter for spaces. Example: 'spaceType = "SPACE"' or 'spaceType = "GROUP_CHAT"'.`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of spaces to return per page (1–1000).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'filter', type: 'string', required: false, description: `Query filter for spaces. Example: 'spaceType = "SPACE"' or 'spaceType = "GROUP_CHAT"'.` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of spaces to return per page (1–1000).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_documents', description: `List all Google Docs documents in the impersonated user's Drive. Optionally search by document name. Returns document IDs, names, and metadata with pagination support.`, params: [ - { - name: 'order_by', - type: 'string', - required: false, - description: `Sort order for results. Examples: modifiedTime desc, name asc, createdTime desc`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Number of documents to return per page (max 1000, default 100)`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for retrieving the next page of results. Use the nextPageToken from a previous response.`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Drive search query to filter documents. Defaults to all Google Docs. To search by name, use: mimeType = 'application/vnd.google-apps.document' and trashed = false and name contains 'report'`, - }, + { name: 'order_by', type: 'string', required: false, description: `Sort order for results. Examples: modifiedTime desc, name asc, createdTime desc` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of documents to return per page (max 1000, default 100)` }, + { name: 'page_token', type: 'string', required: false, description: `Token for retrieving the next page of results. Use the nextPageToken from a previous response.` }, + { name: 'query', type: 'string', required: false, description: `Drive search query to filter documents. Defaults to all Google Docs. To search by name, use: mimeType = 'application/vnd.google-apps.document' and trashed = false and name contains 'report'` }, ], }, { name: 'googledwd_list_drafts', description: `List draft emails from a connected Gmail account. Uses DWD service account credentials.`, params: [ - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of drafts to fetch`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Page token for pagination`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of drafts to fetch` }, + { name: 'page_token', type: 'string', required: false, description: `Page token for pagination` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_events', description: `List events from a connected Google Calendar account with filtering options. Uses DWD service account credentials.`, params: [ - { - name: 'calendar_id', - type: 'string', - required: false, - description: `Calendar ID to list events from`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of events to fetch`, - }, - { - name: 'order_by', - type: 'string', - required: false, - description: `Order of events in the result`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Page token for pagination`, - }, + { name: 'calendar_id', type: 'string', required: false, description: `Calendar ID to list events from` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of events to fetch` }, + { name: 'order_by', type: 'string', required: false, description: `Order of events in the result` }, + { name: 'page_token', type: 'string', required: false, description: `Page token for pagination` }, { name: 'query', type: 'string', required: false, description: `Free text search query` }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'single_events', - type: 'boolean', - required: false, - description: `Expand recurring events into single events`, - }, - { - name: 'time_max', - type: 'string', - required: false, - description: `Upper bound for event start time (RFC3339 timestamp)`, - }, - { - name: 'time_min', - type: 'string', - required: false, - description: `Lower bound for event start time (RFC3339 timestamp)`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'single_events', type: 'boolean', required: false, description: `Expand recurring events into single events` }, + { name: 'time_max', type: 'string', required: false, description: `Upper bound for event start time (RFC3339 timestamp)` }, + { name: 'time_min', type: 'string', required: false, description: `Lower bound for event start time (RFC3339 timestamp)` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_filters', description: `List all email filters for the authenticated Gmail account. Returns filter criteria and actions such as label assignment, forwarding, and archiving rules. Uses DWD service account credentials.`, params: [ - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_group_members', description: `List the members of a Google Workspace group using the Admin Directory API. Supports filtering by role and pagination. Uses DWD service account credentials.`, params: [ - { - name: 'group_key', - type: 'string', - required: true, - description: `Group email address or unique group ID whose members to list (e.g., 'engineering@example.com').`, - }, - { - name: 'include_derived_membership', - type: 'boolean', - required: false, - description: `If true, include members inherited from sub-groups or nested groups.`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of members to return per page (1–200).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'roles', - type: 'string', - required: false, - description: `Filter members by role. Comma-separated values from: 'OWNER', 'MANAGER', 'MEMBER'.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'group_key', type: 'string', required: true, description: `Group email address or unique group ID whose members to list (e.g., 'engineering@example.com').` }, + { name: 'include_derived_membership', type: 'boolean', required: false, description: `If true, include members inherited from sub-groups or nested groups.` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of members to return per page (1–200).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'roles', type: 'string', required: false, description: `Filter members by role. Comma-separated values from: 'OWNER', 'MANAGER', 'MEMBER'.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_keep_notes', description: `List notes in Google Keep. Supports filtering (e.g., by trashed status) and pagination. Returns up to 100 notes per page. Uses DWD service account credentials.`, params: [ - { - name: 'filter', - type: 'string', - required: false, - description: `Filter expression for notes. Example: 'trashed = false' or 'trashed = true'.`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of notes to return per page (1–100).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'filter', type: 'string', required: false, description: `Filter expression for notes. Example: 'trashed = false' or 'trashed = true'.` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of notes to return per page (1–100).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_org_units', description: `List organizational units (OUs) in a Google Workspace customer account using the Admin Directory API. Supports filtering by parent OU path and retrieval type. Uses DWD service account credentials.`, params: [ - { - name: 'customer_id', - type: 'string', - required: false, - description: `Customer ID or 'my_customer' for the authenticated account's domain (default: 'my_customer').`, - }, - { - name: 'org_unit_path', - type: 'string', - required: false, - description: `Full path of the parent organizational unit to list children of (e.g., '/Engineering').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'type', - type: 'string', - required: false, - description: `Type of OUs to return. 'all' returns all OUs; 'children' returns only direct children of the specified org_unit_path.`, - }, + { name: 'customer_id', type: 'string', required: false, description: `Customer ID or 'my_customer' for the authenticated account's domain (default: 'my_customer').` }, + { name: 'org_unit_path', type: 'string', required: false, description: `Full path of the parent organizational unit to list children of (e.g., '/Engineering').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'type', type: 'string', required: false, description: `Type of OUs to return. 'all' returns all OUs; 'children' returns only direct children of the specified org_unit_path.` }, ], }, { name: 'googledwd_list_responses', description: `List all responses submitted to a Google Form. Returns response IDs, submission timestamps, and answer values for each respondent.`, params: [ - { - name: 'form_id', - type: 'string', - required: true, - description: `The ID of the Google Form to list responses for`, - }, - { - name: 'filter', - type: 'string', - required: false, - description: `Filter responses by submission time. Format: timestamp > 2026-01-01T00:00:00Z`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of responses to return (max 5000)`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for retrieving the next page of results`, - }, + { name: 'form_id', type: 'string', required: true, description: `The ID of the Google Form to list responses for` }, + { name: 'filter', type: 'string', required: false, description: `Filter responses by submission time. Format: timestamp > 2026-01-01T00:00:00Z` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of responses to return (max 5000)` }, + { name: 'page_token', type: 'string', required: false, description: `Token for retrieving the next page of results` }, ], }, { name: 'googledwd_list_task_lists', description: `List all task lists for the authenticated user in Google Tasks. Returns a paginated collection of task lists. Uses DWD service account credentials.`, params: [ - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of task lists to return. Accepted value is between 1 and 100.`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token specifying the page of results to return. Obtained from nextPageToken in a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of task lists to return. Accepted value is between 1 and 100.` }, + { name: 'page_token', type: 'string', required: false, description: `Token specifying the page of results to return. Obtained from nextPageToken in a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_tasks', description: `List all tasks in a specified Google Tasks task list. Supports filtering by completion status, deletion status, and due date range. Uses DWD service account credentials.`, params: [ - { - name: 'task_list_id', - type: 'string', - required: true, - description: `The ID of the task list to retrieve tasks from.`, - }, - { - name: 'due_max', - type: 'string', - required: false, - description: `Upper bound for a task's due date (RFC3339 datetime). Tasks due after this datetime are excluded.`, - }, - { - name: 'due_min', - type: 'string', - required: false, - description: `Lower bound for a task's due date (RFC3339 datetime). Tasks due before this datetime are excluded.`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of tasks to return. Accepted value is between 1 and 100.`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token specifying the page of results to return. Obtained from nextPageToken in a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'show_completed', - type: 'boolean', - required: false, - description: `Flag indicating whether completed tasks are returned. The default is true.`, - }, - { - name: 'show_deleted', - type: 'boolean', - required: false, - description: `Flag indicating whether deleted tasks are returned. The default is false.`, - }, - { - name: 'show_hidden', - type: 'boolean', - required: false, - description: `Flag indicating whether hidden tasks are returned. The default is false.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'task_list_id', type: 'string', required: true, description: `The ID of the task list to retrieve tasks from.` }, + { name: 'due_max', type: 'string', required: false, description: `Upper bound for a task's due date (RFC3339 datetime). Tasks due after this datetime are excluded.` }, + { name: 'due_min', type: 'string', required: false, description: `Lower bound for a task's due date (RFC3339 datetime). Tasks due before this datetime are excluded.` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of tasks to return. Accepted value is between 1 and 100.` }, + { name: 'page_token', type: 'string', required: false, description: `Token specifying the page of results to return. Obtained from nextPageToken in a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'show_completed', type: 'boolean', required: false, description: `Flag indicating whether completed tasks are returned. The default is true.` }, + { name: 'show_deleted', type: 'boolean', required: false, description: `Flag indicating whether deleted tasks are returned. The default is false.` }, + { name: 'show_hidden', type: 'boolean', required: false, description: `Flag indicating whether hidden tasks are returned. The default is false.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_threads', description: `List threads in a Gmail account using optional search and label filters. Uses service account with Domain-Wide Delegation.`, params: [ - { - name: 'include_spam_trash', - type: 'boolean', - required: false, - description: `Whether to include threads from Spam and Trash`, - }, - { - name: 'label_ids', - type: 'array', - required: false, - description: `Gmail label IDs to filter threads (threads must match all labels)`, - }, - { - name: 'max_results', - type: 'integer', - required: false, - description: `Maximum number of threads to return`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Page token for pagination`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search query string using Gmail search syntax (for example, 'is:unread from:user@example.com')`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'include_spam_trash', type: 'boolean', required: false, description: `Whether to include threads from Spam and Trash` }, + { name: 'label_ids', type: 'array', required: false, description: `Gmail label IDs to filter threads (threads must match all labels)` }, + { name: 'max_results', type: 'integer', required: false, description: `Maximum number of threads to return` }, + { name: 'page_token', type: 'string', required: false, description: `Page token for pagination` }, + { name: 'query', type: 'string', required: false, description: `Search query string using Gmail search syntax (for example, 'is:unread from:user@example.com')` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_list_vault_matters', description: `List matters in Google Vault. Supports filtering by state (OPEN, CLOSED, DELETED) and specifying the view level (BASIC or FULL). Uses DWD service account credentials.`, params: [ - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of matters to return per page (1–100).`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'state', - type: 'string', - required: false, - description: `Filter matters by state. One of: 'OPEN', 'CLOSED', 'DELETED'.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'view', - type: 'string', - required: false, - description: `Level of detail to return. 'BASIC' returns metadata only; 'FULL' includes collaborators and other details.`, - }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of matters to return per page (1–100).` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'state', type: 'string', required: false, description: `Filter matters by state. One of: 'OPEN', 'CLOSED', 'DELETED'.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'view', type: 'string', required: false, description: `Level of detail to return. 'BASIC' returns metadata only; 'FULL' includes collaborators and other details.` }, ], }, { name: 'googledwd_modify_message_labels', description: `Add or remove labels on a Gmail message. Use label IDs such as 'INBOX', 'UNREAD', 'STARRED', 'IMPORTANT', 'TRASH', 'SPAM', or custom label IDs. At least one of add_label_ids or remove_label_ids should be provided. Uses DWD service account credentials.`, params: [ - { - name: 'message_id', - type: 'string', - required: true, - description: `The Gmail message ID whose labels will be modified. Obtain this from a list or search messages operation. Example: '17a1b2c3d4e5f6g7'.`, - }, - { - name: 'add_label_ids', - type: 'array', - required: false, - description: `List of label IDs to add to the message. Use system labels such as 'INBOX', 'UNREAD', 'STARRED', 'IMPORTANT', or custom label IDs retrieved from the Labels API. Example: ["STARRED", "INBOX"].`, - }, - { - name: 'remove_label_ids', - type: 'array', - required: false, - description: `List of label IDs to remove from the message. Use system labels such as 'UNREAD', 'STARRED', 'INBOX', or custom label IDs. Example: ["UNREAD"].`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'message_id', type: 'string', required: true, description: `The Gmail message ID whose labels will be modified. Obtain this from a list or search messages operation. Example: '17a1b2c3d4e5f6g7'.` }, + { name: 'add_label_ids', type: 'array', required: false, description: `List of label IDs to add to the message. Use system labels such as 'INBOX', 'UNREAD', 'STARRED', 'IMPORTANT', or custom label IDs retrieved from the Labels API. Example: ["STARRED", "INBOX"].` }, + { name: 'remove_label_ids', type: 'array', required: false, description: `List of label IDs to remove from the message. Use system labels such as 'UNREAD', 'STARRED', 'INBOX', or custom label IDs. Example: ["UNREAD"].` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_move_file', description: `Move a file or folder to a different location in Google Drive by updating its parent folder. Optionally rename the file during the move. Uses DWD service account credentials.`, params: [ - { - name: 'file_id', - type: 'string', - required: true, - description: `ID of the file or folder to move`, - }, - { - name: 'new_parent_id', - type: 'string', - required: true, - description: `ID of the destination folder to move the file into`, - }, - { - name: 'name', - type: 'string', - required: false, - description: `Optional new name for the file after moving. If omitted, the file keeps its current name.`, - }, - { - name: 'old_parent_id', - type: 'string', - required: false, - description: `ID of the current parent folder to remove the file from. Providing this ensures a clean move without the file appearing in multiple folders.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'file_id', type: 'string', required: true, description: `ID of the file or folder to move` }, + { name: 'new_parent_id', type: 'string', required: true, description: `ID of the destination folder to move the file into` }, + { name: 'name', type: 'string', required: false, description: `Optional new name for the file after moving. If omitted, the file keeps its current name.` }, + { name: 'old_parent_id', type: 'string', required: false, description: `ID of the current parent folder to remove the file from. Providing this ensures a clean move without the file appearing in multiple folders.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_query_drive_activity', description: `Query Google Drive activity to see who viewed, edited, moved, or shared files. Useful for auditing and compliance. Uses DWD service account credentials.`, params: [ - { - name: 'ancestor_name', - type: 'string', - required: false, - description: `Restrict activity to items under this folder. Format: 'items/FOLDER_ID'. Example: 'items/0B_abc123xyz'`, - }, - { - name: 'consolidation_strategy', - type: 'string', - required: false, - description: `How related activity is grouped. 'none' means each action is its own activity; 'legacy' consolidates similar actions. Valid values: 'none', 'legacy'.`, - }, - { - name: 'filter', - type: 'string', - required: false, - description: `Filter string to narrow activity results. Example: "time >= \\"2026-01-01T00:00:00Z\\""`, - }, - { - name: 'item_name', - type: 'string', - required: false, - description: `Restrict activity to a specific file or folder. Format: 'items/FILE_ID'. Example: 'items/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms'`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of activity records to return per page. Max 100.`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results from a previous response.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'ancestor_name', type: 'string', required: false, description: `Restrict activity to items under this folder. Format: 'items/FOLDER_ID'. Example: 'items/0B_abc123xyz'` }, + { name: 'consolidation_strategy', type: 'string', required: false, description: `How related activity is grouped. 'none' means each action is its own activity; 'legacy' consolidates similar actions. Valid values: 'none', 'legacy'.` }, + { name: 'filter', type: 'string', required: false, description: `Filter string to narrow activity results. Example: "time >= \\"2026-01-01T00:00:00Z\\""` }, + { name: 'item_name', type: 'string', required: false, description: `Restrict activity to a specific file or folder. Format: 'items/FILE_ID'. Example: 'items/1BxiMVs0XRA5nFMdKvBdBZjgmUUqptlbs74OgVE2upms'` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of activity records to return per page. Max 100.` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results from a previous response.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_read_document', description: `Read the complete content and structure of a Google Doc including text, formatting, tables, and metadata.`, params: [ - { - name: 'document_id', - type: 'string', - required: true, - description: `The ID of the Google Doc to read`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'suggestions_view_mode', - type: 'string', - required: false, - description: `How suggestions are rendered in the response`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'document_id', type: 'string', required: true, description: `The ID of the Google Doc to read` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'suggestions_view_mode', type: 'string', required: false, description: `How suggestions are rendered in the response` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_read_presentation', description: `Read the complete structure and content of a Google Slides presentation including slides, text, images, shapes, and metadata.`, params: [ - { - name: 'presentation_id', - type: 'string', - required: true, - description: `The ID of the Google Slides presentation to read`, - }, - { - name: 'fields', - type: 'string', - required: false, - description: `Fields to include in the response`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'presentation_id', type: 'string', required: true, description: `The ID of the Google Slides presentation to read` }, + { name: 'fields', type: 'string', required: false, description: `Fields to include in the response` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_read_spreadsheet', description: `Returns everything about a spreadsheet — including spreadsheet metadata, sheet properties, cell values, formatting, themes, and pixel sizes. If you only need cell values, use googledwd_get_values instead.`, params: [ - { - name: 'spreadsheet_id', - type: 'string', - required: true, - description: `The ID of the Google Sheet to read`, - }, - { - name: 'include_grid_data', - type: 'boolean', - required: false, - description: `Include cell data in the response`, - }, - { - name: 'ranges', - type: 'string', - required: false, - description: `Cell range to read in A1 notation`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'spreadsheet_id', type: 'string', required: true, description: `The ID of the Google Sheet to read` }, + { name: 'include_grid_data', type: 'boolean', required: false, description: `Include cell data in the response` }, + { name: 'ranges', type: 'string', required: false, description: `Cell range to read in A1 notation` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_search_content', description: `Search inside the content of files stored in Google Drive using full-text search. Finds files where the body text matches the search term.`, params: [ - { - name: 'search_term', - type: 'string', - required: true, - description: `Text to search for inside file contents`, - }, - { - name: 'fields', - type: 'string', - required: false, - description: `Fields to include in the response`, - }, - { - name: 'mime_type', - type: 'string', - required: false, - description: `Filter results by MIME type`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Number of files to return per page`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'supports_all_drives', - type: 'boolean', - required: false, - description: `Include shared drives in results`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'search_term', type: 'string', required: true, description: `Text to search for inside file contents` }, + { name: 'fields', type: 'string', required: false, description: `Fields to include in the response` }, + { name: 'mime_type', type: 'string', required: false, description: `Filter results by MIME type` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of files to return per page` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'supports_all_drives', type: 'boolean', required: false, description: `Include shared drives in results` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_search_files', description: `Search for files and folders in Google Drive using query filters like name, type, owner, and parent folder.`, params: [ - { - name: 'fields', - type: 'string', - required: false, - description: `Fields to include in the response`, - }, + { name: 'fields', type: 'string', required: false, description: `Fields to include in the response` }, { name: 'order_by', type: 'string', required: false, description: `Sort order for results` }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Number of files to return per page`, - }, - { - name: 'page_token', - type: 'string', - required: false, - description: `Token for the next page of results`, - }, + { name: 'page_size', type: 'integer', required: false, description: `Number of files to return per page` }, + { name: 'page_token', type: 'string', required: false, description: `Token for the next page of results` }, { name: 'query', type: 'string', required: false, description: `Drive search query string` }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'supports_all_drives', - type: 'boolean', - required: false, - description: `Include shared drives in results`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'supports_all_drives', type: 'boolean', required: false, description: `Include shared drives in results` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_search_people', description: `Search people or contacts in the connected Google account using a query. Uses DWD service account credentials.`, params: [ - { - name: 'query', - type: 'string', - required: true, - description: `Text query to search people (e.g., name, email address).`, - }, - { - name: 'other_contacts', - type: 'boolean', - required: false, - description: `Whether to include people not in the user's contacts (from 'Other Contacts').`, - }, - { - name: 'page_size', - type: 'integer', - required: false, - description: `Maximum number of people to return.`, - }, - { - name: 'person_fields', - type: 'array', - required: false, - description: `Fields to retrieve for each person.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'query', type: 'string', required: true, description: `Text query to search people (e.g., name, email address).` }, + { name: 'other_contacts', type: 'boolean', required: false, description: `Whether to include people not in the user's contacts (from 'Other Contacts').` }, + { name: 'page_size', type: 'integer', required: false, description: `Maximum number of people to return.` }, + { name: 'person_fields', type: 'array', required: false, description: `Fields to retrieve for each person.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_share_file', description: `Share a file or folder in Google Drive by creating a new permission for a user, group, domain, or anyone. Supports sending notification emails. Uses DWD service account credentials.`, params: [ - { - name: 'file_id', - type: 'string', - required: true, - description: `ID of the file or folder to share`, - }, - { - name: 'role', - type: 'string', - required: true, - description: `The role to grant to the recipient. One of: 'reader', 'commenter', 'writer', 'organizer', 'fileOrganizer', 'owner'.`, - }, - { - name: 'type', - type: 'string', - required: true, - description: `The type of principal to share with. One of: 'user', 'group', 'domain', 'anyone'.`, - }, - { - name: 'domain', - type: 'string', - required: false, - description: `The domain to share with. Required when type is 'domain'. Example: 'example.com'.`, - }, - { - name: 'email_address', - type: 'string', - required: false, - description: `Email address of the user or group to share with. Required when type is 'user' or 'group'. Example: 'user@example.com'.`, - }, - { - name: 'email_message', - type: 'string', - required: false, - description: `Custom message to include in the notification email sent to the recipient.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'send_notification_email', - type: 'boolean', - required: false, - description: `Whether to send a notification email to the recipient. Defaults to true.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'transfer_ownership', - type: 'boolean', - required: false, - description: `Whether to transfer ownership of the file to the recipient. Only valid when role is 'owner'.`, - }, + { name: 'file_id', type: 'string', required: true, description: `ID of the file or folder to share` }, + { name: 'role', type: 'string', required: true, description: `The role to grant to the recipient. One of: 'reader', 'commenter', 'writer', 'organizer', 'fileOrganizer', 'owner'.` }, + { name: 'type', type: 'string', required: true, description: `The type of principal to share with. One of: 'user', 'group', 'domain', 'anyone'.` }, + { name: 'domain', type: 'string', required: false, description: `The domain to share with. Required when type is 'domain'. Example: 'example.com'.` }, + { name: 'email_address', type: 'string', required: false, description: `Email address of the user or group to share with. Required when type is 'user' or 'group'. Example: 'user@example.com'.` }, + { name: 'email_message', type: 'string', required: false, description: `Custom message to include in the notification email sent to the recipient.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'send_notification_email', type: 'boolean', required: false, description: `Whether to send a notification email to the recipient. Defaults to true.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'transfer_ownership', type: 'boolean', required: false, description: `Whether to transfer ownership of the file to the recipient. Only valid when role is 'owner'.` }, ], }, { name: 'googledwd_trash_message', description: `Move a Gmail message to the Trash. The message is not permanently deleted and can be recovered from Trash within 30 days. This operation is idempotent — trashing an already-trashed message is a no-op. Uses DWD service account credentials.`, params: [ - { - name: 'message_id', - type: 'string', - required: true, - description: `The Gmail message ID to move to Trash. Obtain this from a list or search messages operation. Example: '17a1b2c3d4e5f6g7'.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'message_id', type: 'string', required: true, description: `The Gmail message ID to move to Trash. Obtain this from a list or search messages operation. Example: '17a1b2c3d4e5f6g7'.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_update_contact', description: `Update an existing Google People contact's names, email address, or phone number. Requires the contact's resource name (e.g., 'people/c12345') and the current etag to prevent conflicts. Uses DWD service account credentials.`, params: [ - { - name: 'etag', - type: 'string', - required: true, - description: `Current etag of the contact, required to prevent update conflicts. Obtain from a previous get or list response.`, - }, - { - name: 'resource_name', - type: 'string', - required: true, - description: `Resource name of the contact to update (e.g., 'people/c12345'). Obtain from a create or list response.`, - }, - { - name: 'email', - type: 'string', - required: false, - description: `Updated email address for the contact (e.g., newemail@example.com).`, - }, - { - name: 'family_name', - type: 'string', - required: false, - description: `Updated family (last) name of the contact.`, - }, - { - name: 'given_name', - type: 'string', - required: false, - description: `Updated given (first) name of the contact.`, - }, - { - name: 'phone_number', - type: 'string', - required: false, - description: `Updated phone number for the contact (e.g., +1-555-555-5555).`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'etag', type: 'string', required: true, description: `Current etag of the contact, required to prevent update conflicts. Obtain from a previous get or list response.` }, + { name: 'resource_name', type: 'string', required: true, description: `Resource name of the contact to update (e.g., 'people/c12345'). Obtain from a create or list response.` }, + { name: 'email', type: 'string', required: false, description: `Updated email address for the contact (e.g., newemail@example.com).` }, + { name: 'family_name', type: 'string', required: false, description: `Updated family (last) name of the contact.` }, + { name: 'given_name', type: 'string', required: false, description: `Updated given (first) name of the contact.` }, + { name: 'phone_number', type: 'string', required: false, description: `Updated phone number for the contact (e.g., +1-555-555-5555).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_update_document', description: `Update the content of an existing Google Doc using batch update requests. Supports inserting and deleting text, formatting, tables, and other document elements.`, params: [ - { - name: 'document_id', - type: 'string', - required: true, - description: `The ID of the Google Doc to update`, - }, - { - name: 'requests', - type: 'array', - required: true, - description: `Array of update requests to apply to the document`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'write_control', - type: 'object', - required: false, - description: `Optional write control for revision management`, - }, + { name: 'document_id', type: 'string', required: true, description: `The ID of the Google Doc to update` }, + { name: 'requests', type: 'array', required: true, description: `Array of update requests to apply to the document` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'write_control', type: 'object', required: false, description: `Optional write control for revision management` }, ], }, { name: 'googledwd_update_event', description: `Update an existing event in a Google Calendar account. Only provided fields will be updated. Supports updating time, attendees, location, meeting links, and more. Uses DWD service account credentials.`, params: [ - { - name: 'calendar_id', - type: 'string', - required: true, - description: `Calendar ID containing the event`, - }, - { - name: 'event_id', - type: 'string', - required: true, - description: `The ID of the calendar event to update`, - }, - { - name: 'attendees_emails', - type: 'array', - required: false, - description: `Attendee email addresses`, - }, - { - name: 'create_meeting_room', - type: 'boolean', - required: false, - description: `Generate a Google Meet link for this event`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `Optional event description`, - }, - { - name: 'end_datetime', - type: 'string', - required: false, - description: `Event end time in RFC3339 format`, - }, - { - name: 'event_duration_hour', - type: 'integer', - required: false, - description: `Duration of event in hours`, - }, - { - name: 'event_duration_minutes', - type: 'integer', - required: false, - description: `Duration of event in minutes`, - }, - { - name: 'event_type', - type: 'string', - required: false, - description: `Event type for display purposes`, - }, - { - name: 'guests_can_invite_others', - type: 'boolean', - required: false, - description: `Allow guests to invite others`, - }, - { - name: 'guests_can_modify', - type: 'boolean', - required: false, - description: `Allow guests to modify the event`, - }, - { - name: 'guests_can_see_other_guests', - type: 'boolean', - required: false, - description: `Allow guests to see each other`, - }, + { name: 'calendar_id', type: 'string', required: true, description: `Calendar ID containing the event` }, + { name: 'event_id', type: 'string', required: true, description: `The ID of the calendar event to update` }, + { name: 'attendees_emails', type: 'array', required: false, description: `Attendee email addresses` }, + { name: 'create_meeting_room', type: 'boolean', required: false, description: `Generate a Google Meet link for this event` }, + { name: 'description', type: 'string', required: false, description: `Optional event description` }, + { name: 'end_datetime', type: 'string', required: false, description: `Event end time in RFC3339 format` }, + { name: 'event_duration_hour', type: 'integer', required: false, description: `Duration of event in hours` }, + { name: 'event_duration_minutes', type: 'integer', required: false, description: `Duration of event in minutes` }, + { name: 'event_type', type: 'string', required: false, description: `Event type for display purposes` }, + { name: 'guests_can_invite_others', type: 'boolean', required: false, description: `Allow guests to invite others` }, + { name: 'guests_can_modify', type: 'boolean', required: false, description: `Allow guests to modify the event` }, + { name: 'guests_can_see_other_guests', type: 'boolean', required: false, description: `Allow guests to see each other` }, { name: 'location', type: 'string', required: false, description: `Location of the event` }, - { - name: 'recurrence', - type: 'array', - required: false, - description: `Recurrence rules (iCalendar RRULE format)`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'send_updates', - type: 'boolean', - required: false, - description: `Send update notifications to attendees`, - }, - { - name: 'start_datetime', - type: 'string', - required: false, - description: `Event start time in RFC3339 format`, - }, + { name: 'recurrence', type: 'array', required: false, description: `Recurrence rules (iCalendar RRULE format)` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'send_updates', type: 'boolean', required: false, description: `Send update notifications to attendees` }, + { name: 'start_datetime', type: 'string', required: false, description: `Event start time in RFC3339 format` }, { name: 'summary', type: 'string', required: false, description: `Event title/summary` }, - { - name: 'timezone', - type: 'string', - required: false, - description: `Timezone for the event (IANA time zone identifier)`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'transparency', - type: 'string', - required: false, - description: `Calendar transparency (free/busy)`, - }, - { - name: 'visibility', - type: 'string', - required: false, - description: `Visibility of the event`, - }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for the event (IANA time zone identifier)` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'transparency', type: 'string', required: false, description: `Calendar transparency (free/busy)` }, + { name: 'visibility', type: 'string', required: false, description: `Visibility of the event` }, ], }, { name: 'googledwd_update_group_settings', description: `Update settings for a Google Workspace group. Control who can post, join, view members, and more. Uses DWD service account credentials.`, params: [ - { - name: 'group_email', - type: 'string', - required: true, - description: `The email address of the Google Workspace group to update. Example: 'engineering@example.com'`, - }, - { - name: 'allow_external_members', - type: 'boolean', - required: false, - description: `Whether members outside the domain can join the group. True to allow external members, false to restrict to domain only.`, - }, - { - name: 'is_archived', - type: 'boolean', - required: false, - description: `Whether the group is archived. Archived groups cannot receive new messages.`, - }, - { - name: 'message_moderation_level', - type: 'string', - required: false, - description: `Moderation level for messages posted to the group. Valid values: 'MODERATE_ALL_MESSAGES', 'MODERATE_NON_MEMBERS', 'MODERATE_NEW_MEMBERS', 'MODERATE_NONE'.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'who_can_join', - type: 'string', - required: false, - description: `Permission to join the group. Valid values: 'ANYONE_CAN_JOIN', 'ALL_IN_DOMAIN_CAN_JOIN', 'INVITED_CAN_JOIN', 'CAN_REQUEST_TO_JOIN'.`, - }, - { - name: 'who_can_post_message', - type: 'string', - required: false, - description: `Permission to post messages to the group. Valid values: 'NONE_CAN_POST', 'ALL_MANAGERS_CAN_POST', 'ALL_MEMBERS_CAN_POST', 'ALL_OWNERS_CAN_POST', 'ALL_IN_DOMAIN_CAN_POST', 'ANYONE_CAN_POST'.`, - }, - { - name: 'who_can_view_group', - type: 'string', - required: false, - description: `Permission to view the group's messages. Valid values: 'ANYONE_CAN_VIEW', 'ALL_IN_DOMAIN_CAN_VIEW', 'ALL_MEMBERS_CAN_VIEW', 'ALL_MANAGERS_CAN_VIEW', 'ALL_OWNERS_CAN_VIEW'.`, - }, - { - name: 'who_can_view_membership', - type: 'string', - required: false, - description: `Permission to view the group's member list. Valid values: 'ALL_IN_DOMAIN_CAN_VIEW', 'ALL_MEMBERS_CAN_VIEW', 'ALL_MANAGERS_CAN_VIEW', 'ALL_OWNERS_CAN_VIEW'.`, - }, + { name: 'group_email', type: 'string', required: true, description: `The email address of the Google Workspace group to update. Example: 'engineering@example.com'` }, + { name: 'allow_external_members', type: 'boolean', required: false, description: `Whether members outside the domain can join the group. True to allow external members, false to restrict to domain only.` }, + { name: 'is_archived', type: 'boolean', required: false, description: `Whether the group is archived. Archived groups cannot receive new messages.` }, + { name: 'message_moderation_level', type: 'string', required: false, description: `Moderation level for messages posted to the group. Valid values: 'MODERATE_ALL_MESSAGES', 'MODERATE_NON_MEMBERS', 'MODERATE_NEW_MEMBERS', 'MODERATE_NONE'.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'who_can_join', type: 'string', required: false, description: `Permission to join the group. Valid values: 'ANYONE_CAN_JOIN', 'ALL_IN_DOMAIN_CAN_JOIN', 'INVITED_CAN_JOIN', 'CAN_REQUEST_TO_JOIN'.` }, + { name: 'who_can_post_message', type: 'string', required: false, description: `Permission to post messages to the group. Valid values: 'NONE_CAN_POST', 'ALL_MANAGERS_CAN_POST', 'ALL_MEMBERS_CAN_POST', 'ALL_OWNERS_CAN_POST', 'ALL_IN_DOMAIN_CAN_POST', 'ANYONE_CAN_POST'.` }, + { name: 'who_can_view_group', type: 'string', required: false, description: `Permission to view the group's messages. Valid values: 'ANYONE_CAN_VIEW', 'ALL_IN_DOMAIN_CAN_VIEW', 'ALL_MEMBERS_CAN_VIEW', 'ALL_MANAGERS_CAN_VIEW', 'ALL_OWNERS_CAN_VIEW'.` }, + { name: 'who_can_view_membership', type: 'string', required: false, description: `Permission to view the group's member list. Valid values: 'ALL_IN_DOMAIN_CAN_VIEW', 'ALL_MEMBERS_CAN_VIEW', 'ALL_MANAGERS_CAN_VIEW', 'ALL_OWNERS_CAN_VIEW'.` }, ], }, { name: 'googledwd_update_send_as', description: `Update send-as alias settings such as the email signature, display name, or reply-to address for the authenticated Gmail account. Use the user's own email address to update their default signature. Uses DWD service account credentials.`, params: [ - { - name: 'send_as_email', - type: 'string', - required: true, - description: `The send-as alias email address to update. Use the user's own email address (e.g., 'user@example.com') to update their default signature and settings.`, - }, - { - name: 'display_name', - type: 'string', - required: false, - description: `The display name shown as the sender name for this alias (e.g., 'Jane Smith').`, - }, - { - name: 'is_default', - type: 'boolean', - required: false, - description: `If true, sets this send-as alias as the default address used when composing new messages.`, - }, - { - name: 'reply_to_address', - type: 'string', - required: false, - description: `An optional email address that appears in the Reply-To header for messages sent from this alias (e.g., 'replies@example.com').`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'signature', - type: 'string', - required: false, - description: `HTML email signature to set for this alias. Supports full HTML markup (e.g., 'Jane Smith
Senior Engineer').`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'send_as_email', type: 'string', required: true, description: `The send-as alias email address to update. Use the user's own email address (e.g., 'user@example.com') to update their default signature and settings.` }, + { name: 'display_name', type: 'string', required: false, description: `The display name shown as the sender name for this alias (e.g., 'Jane Smith').` }, + { name: 'is_default', type: 'boolean', required: false, description: `If true, sets this send-as alias as the default address used when composing new messages.` }, + { name: 'reply_to_address', type: 'string', required: false, description: `An optional email address that appears in the Reply-To header for messages sent from this alias (e.g., 'replies@example.com').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'signature', type: 'string', required: false, description: `HTML email signature to set for this alias. Supports full HTML markup (e.g., 'Jane Smith
Senior Engineer').` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_update_task', description: `Update an existing task in a Google Tasks task list. Only the fields you provide will be updated. Supports changing title, notes, due date, and status. Uses DWD service account credentials.`, params: [ - { - name: 'task_id', - type: 'string', - required: true, - description: `The ID of the task to update.`, - }, - { - name: 'task_list_id', - type: 'string', - required: true, - description: `The ID of the task list containing the task.`, - }, - { - name: 'due', - type: 'string', - required: false, - description: `Updated due date and time of the task in RFC3339 datetime format (e.g., 2025-08-15T17:00:00Z). Note: the time portion is ignored by the Google Tasks API; only the date is used.`, - }, - { - name: 'notes', - type: 'string', - required: false, - description: `Updated notes or description for the task.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'status', - type: 'string', - required: false, - description: `Updated status of the task. Use 'needsAction' to reopen a task or 'completed' to mark it done.`, - }, + { name: 'task_id', type: 'string', required: true, description: `The ID of the task to update.` }, + { name: 'task_list_id', type: 'string', required: true, description: `The ID of the task list containing the task.` }, + { name: 'due', type: 'string', required: false, description: `Updated due date and time of the task in RFC3339 datetime format (e.g., 2025-08-15T17:00:00Z). Note: the time portion is ignored by the Google Tasks API; only the date is used.` }, + { name: 'notes', type: 'string', required: false, description: `Updated notes or description for the task.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'status', type: 'string', required: false, description: `Updated status of the task. Use 'needsAction' to reopen a task or 'completed' to mark it done.` }, { name: 'title', type: 'string', required: false, description: `Updated title of the task.` }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_update_vacation_settings', description: `Update the vacation auto-reply settings for the authenticated Gmail account. Set enableAutoReply to true to activate out-of-office responses. Uses DWD service account credentials.`, params: [ - { - name: 'enable_auto_reply', - type: 'boolean', - required: true, - description: `Whether to enable the vacation auto-reply. Set to true to turn on out-of-office responses, false to disable.`, - }, - { - name: 'end_time', - type: 'string', - required: false, - description: `End time for the vacation auto-reply as epoch milliseconds in string format (e.g., '1754006400000'). After this time, auto-reply stops.`, - }, - { - name: 'response_body_html', - type: 'string', - required: false, - description: `HTML body of the vacation auto-reply message. If both plain text and HTML are provided, HTML takes precedence for clients that support it.`, - }, - { - name: 'response_body_plain_text', - type: 'string', - required: false, - description: `Plain text body of the vacation auto-reply message.`, - }, - { - name: 'response_subject', - type: 'string', - required: false, - description: `Subject line of the vacation auto-reply email (e.g., 'Out of Office: Back on Monday').`, - }, - { - name: 'restrict_to_contacts', - type: 'boolean', - required: false, - description: `If true, only contacts in the user's Google Contacts will receive the auto-reply. Default is false.`, - }, - { - name: 'restrict_to_domain', - type: 'boolean', - required: false, - description: `If true, only users in the same Google Workspace domain will receive the auto-reply. Default is false.`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'start_time', - type: 'string', - required: false, - description: `Start time for the vacation auto-reply as epoch milliseconds in string format (e.g., '1753401600000'). Auto-reply activates from this time.`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, + { name: 'enable_auto_reply', type: 'boolean', required: true, description: `Whether to enable the vacation auto-reply. Set to true to turn on out-of-office responses, false to disable.` }, + { name: 'end_time', type: 'string', required: false, description: `End time for the vacation auto-reply as epoch milliseconds in string format (e.g., '1754006400000'). After this time, auto-reply stops.` }, + { name: 'response_body_html', type: 'string', required: false, description: `HTML body of the vacation auto-reply message. If both plain text and HTML are provided, HTML takes precedence for clients that support it.` }, + { name: 'response_body_plain_text', type: 'string', required: false, description: `Plain text body of the vacation auto-reply message.` }, + { name: 'response_subject', type: 'string', required: false, description: `Subject line of the vacation auto-reply email (e.g., 'Out of Office: Back on Monday').` }, + { name: 'restrict_to_contacts', type: 'boolean', required: false, description: `If true, only contacts in the user's Google Contacts will receive the auto-reply. Default is false.` }, + { name: 'restrict_to_domain', type: 'boolean', required: false, description: `If true, only users in the same Google Workspace domain will receive the auto-reply. Default is false.` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'start_time', type: 'string', required: false, description: `Start time for the vacation auto-reply as epoch milliseconds in string format (e.g., '1753401600000'). Auto-reply activates from this time.` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, ], }, { name: 'googledwd_update_values', description: `Update cell values in a specific range of a Google Sheet. Supports writing single cells or multiple rows and columns at once.`, params: [ - { - name: 'range', - type: 'string', - required: true, - description: `Cell range to update in A1 notation`, - }, - { - name: 'spreadsheet_id', - type: 'string', - required: true, - description: `The ID of the Google Sheet to update`, - }, - { - name: 'values', - type: 'array', - required: true, - description: `2D array of values to write to the range`, - }, - { - name: 'include_values_in_response', - type: 'boolean', - required: false, - description: `Return the updated cell values in the response`, - }, - { - name: 'schema_version', - type: 'string', - required: false, - description: `Optional schema version to use for tool execution`, - }, - { - name: 'tool_version', - type: 'string', - required: false, - description: `Optional tool version to use for execution`, - }, - { - name: 'value_input_option', - type: 'string', - required: false, - description: `How input values should be interpreted`, - }, + { name: 'range', type: 'string', required: true, description: `Cell range to update in A1 notation` }, + { name: 'spreadsheet_id', type: 'string', required: true, description: `The ID of the Google Sheet to update` }, + { name: 'values', type: 'array', required: true, description: `2D array of values to write to the range` }, + { name: 'include_values_in_response', type: 'boolean', required: false, description: `Return the updated cell values in the response` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + { name: 'value_input_option', type: 'string', required: false, description: `How input values should be interpreted` }, ], }, ] diff --git a/src/data/agent-connectors/googlemeet.ts b/src/data/agent-connectors/googlemeet.ts index fc22883ba..bf39306a9 100644 --- a/src/data/agent-connectors/googlemeet.ts +++ b/src/data/agent-connectors/googlemeet.ts @@ -1,4 +1,32 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ + { + name: 'googlemeet_create_meet_space', + description: `Create a new Google Meet meeting space. Optionally configure access type and entry point access restrictions. Returns the meeting URI and space details. Uses OAuth credentials.`, + params: [ + { name: 'access_type', type: 'string', required: false, description: `Access type for the meeting space. One of: 'OPEN' (anyone with link), 'TRUSTED' (domain users), 'RESTRICTED' (only invited participants).` }, + { name: 'entry_point_access', type: 'string', required: false, description: `Who can use entry points to join. One of: 'ALL' (anyone), 'CREATOR_APP_ONLY' (only the creating app's users).` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'googlemeet_end_meet_conference', + description: `End the active conference in a Google Meet space, disconnecting all participants. Requires the resource name of the space (e.g., 'spaces/abc123'). Uses OAuth credentials.`, + params: [ + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Meet space whose active conference to end (e.g., 'spaces/abc123').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, + { + name: 'googlemeet_get_meet_space', + description: `Retrieve details of a Google Meet meeting space by its resource name (e.g., 'spaces/abc123'), including its meeting URI and configuration. Uses OAuth credentials.`, + params: [ + { name: 'space_name', type: 'string', required: true, description: `Resource name of the Meet space to retrieve (e.g., 'spaces/abc123').` }, + { name: 'schema_version', type: 'string', required: false, description: `Optional schema version to use for tool execution` }, + { name: 'tool_version', type: 'string', required: false, description: `Optional tool version to use for execution` }, + ], + }, ] diff --git a/src/data/agent-connectors/grainmcp.ts b/src/data/agent-connectors/grainmcp.ts new file mode 100644 index 000000000..c7c9464ec --- /dev/null +++ b/src/data/agent-connectors/grainmcp.ts @@ -0,0 +1,339 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'grainmcp_add_clips_to_story', + description: `Adds one or more clips to an existing story. Use list_stories or fetch_story to find the story ID, and create_clip or list_clips to get clip IDs.`, + params: [ + { name: 'clip_ids', type: 'array', required: true, description: `List of clip IDs to add to the story. Use create_clip or list_clips to get clip IDs.` }, + { name: 'story_id', type: 'string', required: true, description: `ID of the story to add clips to.` }, + ], + }, + { + name: 'grainmcp_add_recordings_to_project', + description: `Adds one or more recordings to an existing project by recording ID. Use list_meetings or search_in_transcripts first to find recording IDs.`, + params: [ + { name: 'project_id', type: 'string', required: true, description: `The project ID to add recordings to.` }, + { name: 'recording_ids', type: 'array', required: true, description: `Recording IDs to add to the project.` }, + ], + }, + { + name: 'grainmcp_create_clip', + description: `Creates a clip on a recording between the given timestamps. +Use search_in_transcripts first to find the recording and relevant transcript timestamps, +then call this tool with the meeting ID and start/end timestamps. +Choose start_ms and end_ms to capture a complete thought or topic — avoid cutting off mid-sentence. +Invalid ranges (start_ms >= end_ms, or end_ms past the recording's duration) returns an error. +`, + params: [ + { name: 'clip_title', type: 'string', required: true, description: `Title for the clip.` }, + { name: 'end_ms', type: 'integer', required: true, description: `Timestamp in milliseconds where the clip should end.` }, + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID to create a clip on.` }, + { name: 'start_ms', type: 'integer', required: true, description: `Timestamp in milliseconds where the clip should start.` }, + ], + }, + { + name: 'grainmcp_create_project', + description: `Creates a new empty project with the given title. The project is created with restricted visibility (only you can see it). Use add_recordings_to_project to add meetings, and update_project_share_state to change visibility.`, + params: [ + { name: 'title', type: 'string', required: true, description: `The title for the new project.` }, + ], + }, + { + name: 'grainmcp_create_story', + description: `Creates a new story with the given title.`, + params: [ + { name: 'title', type: 'string', required: true, description: `The title for the new story.` }, + { name: 'clip_ids', type: 'array', required: false, description: `Optional list of clip IDs to be added to the story.` }, + { name: 'description', type: 'string', required: false, description: `Optional description for the story.` }, + ], + }, + { + name: 'grainmcp_fetch_deal', + description: `Fetches information about a single HubSpot deal by ID. +In addition to returning the same data as returned by list_all_deals, this returns +data about all the activity that has occurred on the deal. +`, + params: [ + { name: 'deal_id', type: 'string', required: true, description: `ID of a deal.` }, + ], + }, + { + name: 'grainmcp_fetch_meeting', + description: `Fetches information about a single Grain meeting by ID. +The response format is the same as is returned by list_meetings. +`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `ID of a meeting.` }, + ], + }, + { + name: 'grainmcp_fetch_meeting_action_items', + description: `Fetches the action items extracted from a single Grain meeting by ID. +Each action item includes the task description, timestamp, status (pending or completed), +the assignee (person_id and name, or null when unassigned), and the due date (or null +when not set). \`end_timestamp_ms\` is null when the action item has no end time. +In some cases, older meetings may not have had action items generated for them. +`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `ID of a meeting.` }, + ], + }, + { + name: 'grainmcp_fetch_meeting_coaching_feedback', + description: `Fetches AI-generated sales coaching feedback and scorecard for a single Grain meeting by ID. +The response format is the same as is returned by list_coaching_feedback. +`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `ID of a meeting.` }, + ], + }, + { + name: 'grainmcp_fetch_meeting_notes', + description: `Fetches the AI notes payload from a single Grain meeting by ID. +In some cases, older meetings may not have had notes generated for them. In these cases +you can use \`fetch_meeting_transcript\` instead to determine the content of the meeting. +`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `ID of a meeting.` }, + ], + }, + { + name: 'grainmcp_fetch_meeting_transcript', + description: `Fetches the full transcript of a single Grain meeting by ID. Returns the entire +conversation as markdown, which can be large for long meetings. +`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `ID of a meeting.` }, + ], + }, + { + name: 'grainmcp_fetch_project', + description: `Fetches detailed information about a single Grain project by ID, +including the list of recordings it contains with their URLs. +`, + params: [ + { name: 'project_id', type: 'string', required: true, description: `ID of a project.` }, + ], + }, + { + name: 'grainmcp_fetch_story', + description: `Fetches detailed information about a single Grain story by ID, including its items +(clips and text sections). Use list_stories first to find story IDs. +`, + params: [ + { name: 'story_id', type: 'string', required: true, description: `ID of the story to fetch.` }, + ], + }, + { + name: 'grainmcp_fetch_user_recording_notes', + description: `Fetches the current user's private notes for a single Grain meeting by ID. Returns the notes as markdown text, or a message if no notes exist.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `ID of a meeting.` }, + ], + }, + { + name: 'grainmcp_list_all_deals', + description: `List status of hubspot-linked deals that are synced in Grain. +If the list contains more than \`limit\` deals, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page of deals in the list +by calling the tool again and passing the \`cursor\` along with the same \`filters\`. +The list will be empty if there are no deals matching the supplied filters. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of deals that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_attended_meetings', + description: `Returns a filtered list of Grain meetings you have attended, ordered by most recent. +If the list contains more than \`limit\` meetings, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page of meetings in the list +by calling the tool again and passing the \`cursor\` along with the same \`filters\`. +The list will be empty if there are no meetings matching the supplied filters. +If also looking to include meetings the user didn't attend, use \`list_meetings\` instead. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of meetings that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_clips', + description: `Returns a paginated list of Grain clips you have access to, ordered by most recent. +Clips are short segments from meeting recordings. +If the list contains more than \`limit\` clips, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page by calling the tool again. +Only returns clips whose media has finished processing, so newly-created clips may take +a few minutes to appear. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters to narrow down the list of clips.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_coaching_feedback', + description: `List AI-generated sales-coaching feedback and scorecards for a filtered set of meetings. +If the list contains more than \`limit\` meetings, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page of meetings in the list +by calling the tool again and passing the \`cursor\` along with the same \`filters\`. +The list will be empty if there are no meetings matching the supplied filters. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of meetings that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_meetings', + description: `Returns a filtered list of Grain meetings you have access to, ordered by most recent. +If the list contains more than \`limit\` meetings, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page of meetings in the list +by calling the tool again and passing the \`cursor\` along with the same \`filters\`. +The list will be empty if there are no meetings matching the supplied filters. +If only looking for meetings the user attended, use \`list_attended_meetings\` instead. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of meetings that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_open_deals', + description: `List status of open hubspot-linked deals that are synced in Grain. +If the list contains more than \`limit\` deals, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page of deals in the list +by calling the tool again and passing the \`cursor\` along with the same \`filters\`. +The list will be empty if there are no open deals matching the supplied filters. +If also looking to include closed deals, use \`list_all_deals\` instead. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of deals that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_projects', + description: `Returns a paginated list of Grain projects you have access to, ordered by most recent. +A project is a curated group of meetings (recordings) that belong together. +If the list contains more than \`limit\` projects, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page of projects in the list +by calling the tool again and passing the \`cursor\` along with the same \`filters\`. +The list will be empty if there are no projects matching the supplied filters. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters to narrow down the list of projects.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_stories', + description: `Returns a paginated list of Grain stories you have access to, ordered by most recent. +Stories are curated collections of clips and text sections created from meetings. +If the list contains more than \`limit\` stories, the response will also contain a +non-null \`cursor\` value that can be used to fetch the next page by calling the tool again. +`, + params: [ + { name: 'cursor', type: 'string', required: false, description: `Optional cursor value from a previous request in order to fetch the next page of results.` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters to narrow down the list of stories.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + ], + }, + { + name: 'grainmcp_list_workspace_users', + description: `Get information about all the users in the logged-in Grain user's workspace. Each user's person ID is also returned and can be used to list recordings attended by that person.`, + params: [ + ], + }, + { + name: 'grainmcp_resolve_urls', + description: `Resolves canonical shareable URLs for Grain entities (meetings, clips, projects, stories) by ID. +Always prefer this tool over constructing URLs yourself; hand-built URLs are frequently wrong. +Supported \`media_type\` values: \`recording\`, \`clip\`, \`project\`, \`story\`. +Each returned item contains either a \`url\` on success or an \`error\` string if the entity is not +accessible to the current user. +`, + params: [ + { name: 'items', type: 'array', required: true, description: `List of entity references to resolve URLs for.` }, + ], + }, + { + name: 'grainmcp_search_companies', + description: `Returns a filtered list of companies that were participants of Grain meetings you have +access to. +`, + params: [ + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of meetings that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + { name: 'search_string', type: 'string', required: false, description: `Only search companies whose name or domain contains the specified substring.` }, + ], + }, + { + name: 'grainmcp_search_in_transcripts', + description: `Searches transcripts of Grain meetings and returns the matching segments rather than +the full transcript. Useful for locating specific content, topics, quotes, decisions, +action items, or moments across one or many meetings without loading entire transcripts. + +Uses hybrid semantic + keyword search over transcript segments — coherent conversation +chunks annotated with summaries, topics, entities, and speaker info. Results are +grouped by meeting and ordered by relevance. +`, + params: [ + { name: 'search_queries', type: 'array', required: true, description: `Array of 1-3 search queries optimized for hybrid BM25 + vector search over meeting transcript segments. +Segments group related discussion into chunks with descriptive summaries. +BM25 keyword matching against summaries is the strongest signal. + +Generate exactly 3 queries: +1. Extract key nouns, names, and actions into a dense keyword query (e.g. "Lisa user data export Auth0 Clerk") +2. Include the keywords PLUS plausible co-occurring topics from the same discussion segment (e.g. "Lisa data export migration Auth0 Clerk switching authentication") +3. A synonym/rephrasing variation (e.g. "Lisa handle account data transfer auth provider migration") + +Rules: +- ALWAYS preserve person names, product names, dates, and specific terms +- Keep queries keyword-dense, no filler words +- Do NOT write conversational/spoken-style queries +` }, + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of meetings that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 50. If not specified, the default is 10.` }, + { name: 'meeting_ids', type: 'array', required: false, description: `Optional list of meeting IDs to restrict the search to. When provided, only these meetings will be searched. Can be combined with filters for further narrowing.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of results to skip for pagination. Use with \`limit\` to page through results beyond the first page. Defaults to 0.` }, + ], + }, + { + name: 'grainmcp_search_persons', + description: `Returns a filtered list of persons that were participants of Grain meetings you have +access to. +`, + params: [ + { name: 'filters', type: 'object', required: false, description: `Optional filters that can be used to reduce the result set of meetings that are searched against.` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return per request page. Value should be between 1 and 20. If not specified, the default is 10.` }, + { name: 'search_string', type: 'string', required: false, description: `Only search persons whose name or email contains the specified substring.` }, + ], + }, + { + name: 'grainmcp_tag_meetings', + description: `Add or remove a tag from one or more meetings by recording ID. Creates the tag if it doesn't exist (on add).`, + params: [ + { name: 'action', type: 'string', required: true, description: `Whether to add or remove the tag.` }, + { name: 'recording_ids', type: 'array', required: true, description: `Recording IDs to tag or untag.` }, + { name: 'tag', type: 'string', required: true, description: `The tag name to add or remove. Must start with a letter or digit, followed by letters, digits, or hyphens.` }, + ], + }, + { + name: 'grainmcp_update_project_share_state', + description: `Changes the visibility of a project. Options: 'restricted' (only shared users), 'workspace' (all workspace members), 'public' (anyone with the link).`, + params: [ + { name: 'project_id', type: 'string', required: true, description: `The project ID to update.` }, + { name: 'share_state', type: 'string', required: true, description: `The new visibility level for the project.` }, + ], + }, +] diff --git a/src/data/agent-connectors/hubspot.ts b/src/data/agent-connectors/hubspot.ts index 54010dae4..4e0e97534 100644 --- a/src/data/agent-connectors/hubspot.ts +++ b/src/data/agent-connectors/hubspot.ts @@ -5,120 +5,40 @@ export const tools: Tool[] = [ name: 'hubspot_association_create', description: `Create a default association between two HubSpot CRM objects. For example, associate a contact with a deal, or a company with a ticket.`, params: [ - { - name: 'from_object_id', - type: 'string', - required: true, - description: `ID of the source object`, - }, - { - name: 'from_object_type', - type: 'string', - required: true, - description: `Type of the source object (e.g. contacts, companies, deals, tickets)`, - }, - { - name: 'to_object_id', - type: 'string', - required: true, - description: `ID of the target object`, - }, - { - name: 'to_object_type', - type: 'string', - required: true, - description: `Type of the target object (e.g. contacts, companies, deals, tickets)`, - }, + { name: 'from_object_id', type: 'string', required: true, description: `ID of the source object` }, + { name: 'from_object_type', type: 'string', required: true, description: `Type of the source object (e.g. contacts, companies, deals, tickets)` }, + { name: 'to_object_id', type: 'string', required: true, description: `ID of the target object` }, + { name: 'to_object_type', type: 'string', required: true, description: `Type of the target object (e.g. contacts, companies, deals, tickets)` }, ], }, { name: 'hubspot_associations_batch_archive', description: `Remove an association between two HubSpot CRM objects using the v4 associations API.`, params: [ - { - name: 'from_object_type', - type: 'string', - required: true, - description: `The type of the source object`, - }, - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of associations to archive in HubSpot v4 format.`, - }, - { - name: 'to_object_type', - type: 'string', - required: true, - description: `The type of the target object`, - }, + { name: 'from_object_type', type: 'string', required: true, description: `The type of the source object` }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of associations to archive in HubSpot v4 format.` }, + { name: 'to_object_type', type: 'string', required: true, description: `The type of the target object` }, ], }, { name: 'hubspot_associations_batch_create', description: `Create one or more associations between HubSpot records using the batch API. Pass arrays of IDs — up to 100 pairs per call.`, params: [ - { - name: 'from_object_type', - type: 'string', - required: true, - description: `Object type of the source records (e.g. contacts, deals, companies, tickets)`, - }, - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of association objects in HubSpot v4 format.`, - }, - { - name: 'to_object_type', - type: 'string', - required: true, - description: `Object type of the target records (e.g. deals, companies, contacts, tickets)`, - }, + { name: 'from_object_type', type: 'string', required: true, description: `Object type of the source records (e.g. contacts, deals, companies, tickets)` }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of association objects in HubSpot v4 format.` }, + { name: 'to_object_type', type: 'string', required: true, description: `Object type of the target records (e.g. deals, companies, contacts, tickets)` }, ], }, { name: 'hubspot_call_log', description: `Log a call engagement in HubSpot CRM. Records details of a phone call including title, duration, notes, status, and direction.`, params: [ - { - name: 'hs_call_title', - type: 'string', - required: true, - description: `Title or subject of the call`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: true, - description: `Date and time when the call took place (ISO 8601 format)`, - }, - { - name: 'hs_call_body', - type: 'string', - required: false, - description: `Notes or transcript from the call`, - }, - { - name: 'hs_call_direction', - type: 'string', - required: false, - description: `Direction of the call`, - }, - { - name: 'hs_call_duration', - type: 'number', - required: false, - description: `Duration of the call in milliseconds`, - }, - { - name: 'hs_call_status', - type: 'string', - required: false, - description: `Outcome status of the call`, - }, + { name: 'hs_call_title', type: 'string', required: true, description: `Title or subject of the call` }, + { name: 'hs_timestamp', type: 'string', required: true, description: `Date and time when the call took place (ISO 8601 format)` }, + { name: 'hs_call_body', type: 'string', required: false, description: `Notes or transcript from the call` }, + { name: 'hs_call_direction', type: 'string', required: false, description: `Direction of the call` }, + { name: 'hs_call_duration', type: 'number', required: false, description: `Duration of the call in milliseconds` }, + { name: 'hs_call_status', type: 'string', required: false, description: `Outcome status of the call` }, ], }, { @@ -126,273 +46,103 @@ export const tools: Tool[] = [ description: `Update an existing call engagement in HubSpot CRM by call ID. Provide any fields to update — only the fields you include will be changed.`, params: [ { name: 'call_id', type: 'string', required: true, description: `ID of the call to update` }, - { - name: 'hs_call_body', - type: 'string', - required: false, - description: `Notes or transcript from the call`, - }, - { - name: 'hs_call_direction', - type: 'string', - required: false, - description: `Direction of the call`, - }, - { - name: 'hs_call_duration', - type: 'number', - required: false, - description: `Duration of the call in milliseconds`, - }, - { - name: 'hs_call_from_number', - type: 'string', - required: false, - description: `Phone number the call originated from`, - }, - { - name: 'hs_call_recording_url', - type: 'string', - required: false, - description: `HTTPS URL pointing to the call recording (.mp3 or .wav)`, - }, - { - name: 'hs_call_status', - type: 'string', - required: false, - description: `Outcome status of the call`, - }, - { - name: 'hs_call_title', - type: 'string', - required: false, - description: `Title or subject of the call`, - }, - { - name: 'hs_call_to_number', - type: 'string', - required: false, - description: `Phone number that received the call`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: false, - description: `Date and time when the call took place`, - }, - { - name: 'hubspot_owner_id', - type: 'string', - required: false, - description: `ID of the HubSpot owner associated with the call`, - }, + { name: 'hs_call_body', type: 'string', required: false, description: `Notes or transcript from the call` }, + { name: 'hs_call_direction', type: 'string', required: false, description: `Direction of the call` }, + { name: 'hs_call_duration', type: 'number', required: false, description: `Duration of the call in milliseconds` }, + { name: 'hs_call_from_number', type: 'string', required: false, description: `Phone number the call originated from` }, + { name: 'hs_call_recording_url', type: 'string', required: false, description: `HTTPS URL pointing to the call recording (.mp3 or .wav)` }, + { name: 'hs_call_status', type: 'string', required: false, description: `Outcome status of the call` }, + { name: 'hs_call_title', type: 'string', required: false, description: `Title or subject of the call` }, + { name: 'hs_call_to_number', type: 'string', required: false, description: `Phone number that received the call` }, + { name: 'hs_timestamp', type: 'string', required: false, description: `Date and time when the call took place` }, + { name: 'hubspot_owner_id', type: 'string', required: false, description: `ID of the HubSpot owner associated with the call` }, ], }, { name: 'hubspot_calls_search', description: `Search HubSpot call engagements using filters and full-text search. Returns logged calls with their properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across call properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across call properties` }, ], }, { name: 'hubspot_campaign_get', description: `Retrieve details of a specific HubSpot marketing campaign by campaign ID.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: `ID of the campaign to retrieve`, - }, + { name: 'campaign_id', type: 'string', required: true, description: `ID of the campaign to retrieve` }, ], }, { name: 'hubspot_campaigns_list', description: `List all HubSpot marketing campaigns with pagination support.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination cursor for the next page of results`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of campaigns to return per page`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination cursor for the next page of results` }, + { name: 'limit', type: 'number', required: false, description: `Number of campaigns to return per page` }, ], }, { name: 'hubspot_companies_batch_archive', description: `Archive (soft delete) a company in HubSpot CRM using the batch archive API. Archived records are hidden from the UI but can be restored.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to archive. Each item has an 'id' field.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to archive. Each item has an 'id' field.` }, ], }, { name: 'hubspot_companies_batch_create', description: `Create one or more companys in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to create in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to create in HubSpot batch format.` }, ], }, { name: 'hubspot_companies_batch_read', description: `Retrieve a company record from HubSpot CRM using the batch read API. Returns the specified properties for the record.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to read. Each item has an 'id' field.`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `JSON array of property names to return. Omit to get default properties.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to read. Each item has an 'id' field.` }, + { name: 'properties', type: 'string', required: false, description: `JSON array of property names to return. Omit to get default properties.` }, ], }, { name: 'hubspot_companies_batch_update', description: `Update one or more companys in HubSpot using the batch API. Pass a list of records with IDs — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to update in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to update in HubSpot batch format.` }, ], }, { name: 'hubspot_companies_batch_upsert', description: `Upsert one or more companys in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to upsert in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to upsert in HubSpot batch format.` }, ], }, { name: 'hubspot_companies_search', description: `Search HubSpot companies using full-text search and pagination. Returns matching companies with specified properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search term for full-text search across company properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Search term for full-text search across company properties` }, ], }, { name: 'hubspot_company_create', description: `Create a new company in HubSpot CRM. Requires a company name as the unique identifier. Supports additional properties like domain, industry, phone, location, and revenue information.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: `Company name (required, serves as primary identifier)`, - }, - { - name: 'annualrevenue', - type: 'number', - required: false, - description: `Annual revenue of the company`, - }, + { name: 'name', type: 'string', required: true, description: `Company name (required, serves as primary identifier)` }, + { name: 'annualrevenue', type: 'number', required: false, description: `Annual revenue of the company` }, { name: 'city', type: 'string', required: false, description: `Company city location` }, { name: 'country', type: 'string', required: false, description: `Company country location` }, - { - name: 'description', - type: 'string', - required: false, - description: `Company description or overview`, - }, + { name: 'description', type: 'string', required: false, description: `Company description or overview` }, { name: 'domain', type: 'string', required: false, description: `Company website domain` }, - { - name: 'industry', - type: 'string', - required: false, - description: `Industry type of the company`, - }, - { - name: 'numberofemployees', - type: 'number', - required: false, - description: `Number of employees at the company`, - }, + { name: 'industry', type: 'string', required: false, description: `Industry type of the company` }, + { name: 'numberofemployees', type: 'number', required: false, description: `Number of employees at the company` }, { name: 'phone', type: 'string', required: false, description: `Company phone number` }, { name: 'state', type: 'string', required: false, description: `Company state or region` }, ], @@ -401,75 +151,25 @@ export const tools: Tool[] = [ name: 'hubspot_company_get', description: `Retrieve details of a specific company from HubSpot by company ID. Returns company properties and associated data.`, params: [ - { - name: 'company_id', - type: 'string', - required: true, - description: `ID of the company to retrieve`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, + { name: 'company_id', type: 'string', required: true, description: `ID of the company to retrieve` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, ], }, { name: 'hubspot_company_update', description: `Update an existing company in HubSpot CRM by company ID. Provide any fields to update.`, params: [ - { - name: 'company_id', - type: 'string', - required: true, - description: `ID of the company to update`, - }, - { - name: 'annualrevenue', - type: 'string', - required: false, - description: `Annual revenue of the company`, - }, - { - name: 'city', - type: 'string', - required: false, - description: `City where the company is located`, - }, - { - name: 'country', - type: 'string', - required: false, - description: `Country where the company is located`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `Description of the company`, - }, + { name: 'company_id', type: 'string', required: true, description: `ID of the company to update` }, + { name: 'annualrevenue', type: 'string', required: false, description: `Annual revenue of the company` }, + { name: 'city', type: 'string', required: false, description: `City where the company is located` }, + { name: 'country', type: 'string', required: false, description: `Country where the company is located` }, + { name: 'description', type: 'string', required: false, description: `Description of the company` }, { name: 'domain', type: 'string', required: false, description: `Company website domain` }, - { - name: 'industry', - type: 'string', - required: false, - description: `Industry the company operates in`, - }, + { name: 'industry', type: 'string', required: false, description: `Industry the company operates in` }, { name: 'name', type: 'string', required: false, description: `Name of the company` }, - { - name: 'numberofemployees', - type: 'number', - required: false, - description: `Number of employees at the company`, - }, + { name: 'numberofemployees', type: 'number', required: false, description: `Number of employees at the company` }, { name: 'phone', type: 'string', required: false, description: `Company phone number` }, - { - name: 'state', - type: 'string', - required: false, - description: `State or region where the company is located`, - }, + { name: 'state', type: 'string', required: false, description: `State or region where the company is located` }, { name: 'website', type: 'string', required: false, description: `Company website URL` }, ], }, @@ -477,453 +177,163 @@ export const tools: Tool[] = [ name: 'hubspot_contact_create', description: `Create a new contact in HubSpot CRM. Requires an email address as the unique identifier. Supports additional properties like name, company, phone, and lifecycle stage.`, params: [ - { - name: 'email', - type: 'string', - required: true, - description: `Primary email address for the contact (required, serves as unique identifier)`, - }, - { - name: 'company', - type: 'string', - required: false, - description: `Company name where the contact works`, - }, - { - name: 'firstname', - type: 'string', - required: false, - description: `First name of the contact`, - }, - { - name: 'hs_lead_status', - type: 'string', - required: false, - description: `Lead status of the contact`, - }, - { - name: 'jobtitle', - type: 'string', - required: false, - description: `Job title of the contact`, - }, - { - name: 'lastname', - type: 'string', - required: false, - description: `Last name of the contact`, - }, - { - name: 'lifecyclestage', - type: 'string', - required: false, - description: `Lifecycle stage of the contact`, - }, - { - name: 'phone', - type: 'string', - required: false, - description: `Phone number of the contact`, - }, - { - name: 'website', - type: 'string', - required: false, - description: `Personal or company website URL`, - }, + { name: 'email', type: 'string', required: true, description: `Primary email address for the contact (required, serves as unique identifier)` }, + { name: 'company', type: 'string', required: false, description: `Company name where the contact works` }, + { name: 'firstname', type: 'string', required: false, description: `First name of the contact` }, + { name: 'hs_lead_status', type: 'string', required: false, description: `Lead status of the contact` }, + { name: 'jobtitle', type: 'string', required: false, description: `Job title of the contact` }, + { name: 'lastname', type: 'string', required: false, description: `Last name of the contact` }, + { name: 'lifecyclestage', type: 'string', required: false, description: `Lifecycle stage of the contact` }, + { name: 'phone', type: 'string', required: false, description: `Phone number of the contact` }, + { name: 'website', type: 'string', required: false, description: `Personal or company website URL` }, ], }, { name: 'hubspot_contact_email_events_get', description: `Retrieve marketing email events for a specific contact by their email address. Returns open, click, bounce, and unsubscribe events.`, params: [ - { - name: 'email', - type: 'string', - required: true, - description: `Email address of the contact to retrieve events for`, - }, - { - name: 'eventType', - type: 'string', - required: false, - description: `Filter by event type (e.g., OPEN, CLICK, BOUNCE, UNSUBSCRIBE)`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of events to return per page`, - }, + { name: 'email', type: 'string', required: true, description: `Email address of the contact to retrieve events for` }, + { name: 'eventType', type: 'string', required: false, description: `Filter by event type (e.g., OPEN, CLICK, BOUNCE, UNSUBSCRIBE)` }, + { name: 'limit', type: 'number', required: false, description: `Number of events to return per page` }, ], }, { name: 'hubspot_contact_get', description: `Retrieve details of a specific contact from HubSpot by contact ID. Returns contact properties and associated data.`, params: [ - { - name: 'contact_id', - type: 'string', - required: true, - description: `ID of the contact to retrieve`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, + { name: 'contact_id', type: 'string', required: true, description: `ID of the contact to retrieve` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, ], }, { name: 'hubspot_contact_list_membership_get', description: `Retrieve all HubSpot lists that a specific contact belongs to, identified by contact ID.`, params: [ - { - name: 'contact_id', - type: 'string', - required: true, - description: `ID of the contact to retrieve list memberships for`, - }, + { name: 'contact_id', type: 'string', required: true, description: `ID of the contact to retrieve list memberships for` }, ], }, { name: 'hubspot_contact_update', description: `Update an existing contact in HubSpot CRM by contact ID. Provide any fields to update.`, params: [ - { - name: 'contact_id', - type: 'string', - required: true, - description: `ID of the contact to update`, - }, - { - name: 'company', - type: 'string', - required: false, - description: `Company name where the contact works`, - }, - { - name: 'email', - type: 'string', - required: false, - description: `Primary email address of the contact`, - }, - { - name: 'firstname', - type: 'string', - required: false, - description: `First name of the contact`, - }, - { - name: 'hs_lead_status', - type: 'string', - required: false, - description: `Lead status of the contact`, - }, - { - name: 'jobtitle', - type: 'string', - required: false, - description: `Job title of the contact`, - }, - { - name: 'lastname', - type: 'string', - required: false, - description: `Last name of the contact`, - }, - { - name: 'lifecyclestage', - type: 'string', - required: false, - description: `Lifecycle stage of the contact`, - }, - { - name: 'phone', - type: 'string', - required: false, - description: `Phone number of the contact`, - }, - { - name: 'website', - type: 'string', - required: false, - description: `Website URL of the contact`, - }, + { name: 'contact_id', type: 'string', required: true, description: `ID of the contact to update` }, + { name: 'company', type: 'string', required: false, description: `Company name where the contact works` }, + { name: 'email', type: 'string', required: false, description: `Primary email address of the contact` }, + { name: 'firstname', type: 'string', required: false, description: `First name of the contact` }, + { name: 'hs_lead_status', type: 'string', required: false, description: `Lead status of the contact` }, + { name: 'jobtitle', type: 'string', required: false, description: `Job title of the contact` }, + { name: 'lastname', type: 'string', required: false, description: `Last name of the contact` }, + { name: 'lifecyclestage', type: 'string', required: false, description: `Lifecycle stage of the contact` }, + { name: 'phone', type: 'string', required: false, description: `Phone number of the contact` }, + { name: 'website', type: 'string', required: false, description: `Website URL of the contact` }, ], }, { name: 'hubspot_contacts_batch_archive', description: `Archive (soft delete) a contact in HubSpot CRM using the batch archive API. Archived records are hidden from the UI but can be restored.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to archive. Each item has an 'id' field.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to archive. Each item has an 'id' field.` }, ], }, { name: 'hubspot_contacts_batch_create', description: `Create one or more contacts in HubSpot using the batch API. Pass the inputs array in native HubSpot format — up to 100 records per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of contact objects in HubSpot batch format. Each item has a 'properties' object and optional 'associations' array.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of contact objects in HubSpot batch format. Each item has a 'properties' object and optional 'associations' array.` }, ], }, { name: 'hubspot_contacts_batch_read', description: `Retrieve a contact record from HubSpot CRM using the batch read API. Returns the specified properties for the record.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to read. Each item has an 'id' field.`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `JSON array of property names to return. Omit to get default properties.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to read. Each item has an 'id' field.` }, + { name: 'properties', type: 'string', required: false, description: `JSON array of property names to return. Omit to get default properties.` }, ], }, { name: 'hubspot_contacts_batch_update', description: `Update one or more contacts in HubSpot using the batch API. Pass a list of records with IDs — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to update in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to update in HubSpot batch format.` }, ], }, { name: 'hubspot_contacts_batch_upsert', description: `Upsert one or more contacts in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to upsert in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to upsert in HubSpot batch format.` }, ], }, { name: 'hubspot_contacts_list', description: `Retrieve a list of contacts from HubSpot with filtering and pagination. Returns contact properties and supports pagination through cursor-based navigation.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination cursor to get the next set of results`, - }, - { - name: 'archived', - type: 'boolean', - required: false, - description: `Whether to include archived contacts in the results`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination cursor to get the next set of results` }, + { name: 'archived', type: 'boolean', required: false, description: `Whether to include archived contacts in the results` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, ], }, { name: 'hubspot_contacts_search', description: `Search HubSpot contacts using full-text search and pagination. Returns matching contacts with specified properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search term for full-text search across contact properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Search term for full-text search across contact properties` }, ], }, { name: 'hubspot_custom_object_record_create', description: `Create a new record for a HubSpot custom object type.`, params: [ - { - name: 'object_type_id', - type: 'string', - required: true, - description: `The object type ID of the custom object (e.g., contacts)`, - }, - { - name: 'properties', - type: 'string', - required: true, - description: `JSON object containing the properties for the new record`, - }, + { name: 'object_type_id', type: 'string', required: true, description: `The object type ID of the custom object (e.g., contacts)` }, + { name: 'properties', type: 'string', required: true, description: `JSON object containing the properties for the new record` }, ], }, { name: 'hubspot_custom_object_record_get', description: `Retrieve a specific record of a HubSpot custom object by object type ID and record ID.`, params: [ - { - name: 'object_type_id', - type: 'string', - required: true, - description: `The object type ID of the custom object (e.g., contacts)`, - }, - { - name: 'record_id', - type: 'string', - required: true, - description: `ID of the record to retrieve`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, + { name: 'object_type_id', type: 'string', required: true, description: `The object type ID of the custom object (e.g., contacts)` }, + { name: 'record_id', type: 'string', required: true, description: `ID of the record to retrieve` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, ], }, { name: 'hubspot_custom_object_record_update', description: `Update an existing record of a HubSpot custom object by object type ID and record ID. Use hubspot_schemas_list to discover available object type IDs and their properties.`, params: [ - { - name: 'object_type_id', - type: 'string', - required: true, - description: `The object type ID of the custom object (e.g., contacts)`, - }, - { - name: 'properties', - type: 'object', - required: true, - description: `Key-value pairs of custom object properties to update`, - }, - { - name: 'record_id', - type: 'string', - required: true, - description: `ID of the record to update`, - }, + { name: 'object_type_id', type: 'string', required: true, description: `The object type ID of the custom object (e.g., contacts)` }, + { name: 'properties', type: 'object', required: true, description: `Key-value pairs of custom object properties to update` }, + { name: 'record_id', type: 'string', required: true, description: `ID of the record to update` }, ], }, { name: 'hubspot_custom_object_records_search', description: `Search records of a HubSpot custom object by object type ID. Use hubspot_schemas_list to find the objectTypeId for your custom object.`, params: [ - { - name: 'object_type_id', - type: 'string', - required: true, - description: `The object type ID of the custom object (e.g., contacts)`, - }, - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across record properties`, - }, + { name: 'object_type_id', type: 'string', required: true, description: `The object type ID of the custom object (e.g., contacts)` }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across record properties` }, ], }, { name: 'hubspot_deal_create', description: `Create a new deal in HubSpot CRM. Requires dealname and dealstage. Supports additional properties like amount, pipeline, close date, and deal type.`, params: [ - { - name: 'dealname', - type: 'string', - required: true, - description: `Name of the deal (required)`, - }, - { - name: 'dealstage', - type: 'string', - required: true, - description: `Current stage of the deal (required)`, - }, + { name: 'dealname', type: 'string', required: true, description: `Name of the deal (required)` }, + { name: 'dealstage', type: 'string', required: true, description: `Current stage of the deal (required)` }, { name: 'amount', type: 'number', required: false, description: `Deal amount/value` }, - { - name: 'closedate', - type: 'string', - required: false, - description: `Expected close date (YYYY-MM-DD format)`, - }, + { name: 'closedate', type: 'string', required: false, description: `Expected close date (YYYY-MM-DD format)` }, { name: 'dealtype', type: 'string', required: false, description: `Type of deal` }, { name: 'description', type: 'string', required: false, description: `Deal description` }, - { - name: 'hs_priority', - type: 'string', - required: false, - description: `Deal priority (high, medium, low)`, - }, + { name: 'hs_priority', type: 'string', required: false, description: `Deal priority (high, medium, low)` }, { name: 'pipeline', type: 'string', required: false, description: `Deal pipeline` }, ], }, @@ -931,48 +341,23 @@ export const tools: Tool[] = [ name: 'hubspot_deal_get', description: `Retrieve details of a specific deal from HubSpot by deal ID. Returns deal properties and associated data.`, params: [ - { - name: 'deal_id', - type: 'string', - required: true, - description: `ID of the deal to retrieve`, - }, - { - name: 'associations', - type: 'string', - required: false, - description: `Comma-separated list of object types to retrieve associations for`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, + { name: 'deal_id', type: 'string', required: true, description: `ID of the deal to retrieve` }, + { name: 'associations', type: 'string', required: false, description: `Comma-separated list of object types to retrieve associations for` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, ], }, { name: 'hubspot_deal_line_items_get', description: `Retrieve all line items associated with a specific HubSpot deal.`, params: [ - { - name: 'deal_id', - type: 'string', - required: true, - description: `ID of the deal to retrieve line items for`, - }, + { name: 'deal_id', type: 'string', required: true, description: `ID of the deal to retrieve line items for` }, ], }, { name: 'hubspot_deal_pipelines_list', description: `Retrieve all deal pipelines in HubSpot, including pipeline stages. Use this to get valid pipeline IDs and stage IDs for creating or updating deals.`, params: [ - { - name: 'archived', - type: 'string', - required: false, - description: `Include archived pipelines in the response`, - }, + { name: 'archived', type: 'string', required: false, description: `Include archived pipelines in the response` }, ], }, { @@ -981,37 +366,12 @@ export const tools: Tool[] = [ params: [ { name: 'deal_id', type: 'string', required: true, description: `ID of the deal to update` }, { name: 'amount', type: 'number', required: false, description: `Updated deal amount/value` }, - { - name: 'closedate', - type: 'string', - required: false, - description: `Updated expected close date (YYYY-MM-DD format)`, - }, - { - name: 'dealname', - type: 'string', - required: false, - description: `Updated name of the deal`, - }, - { - name: 'dealstage', - type: 'string', - required: false, - description: `Updated stage of the deal`, - }, + { name: 'closedate', type: 'string', required: false, description: `Updated expected close date (YYYY-MM-DD format)` }, + { name: 'dealname', type: 'string', required: false, description: `Updated name of the deal` }, + { name: 'dealstage', type: 'string', required: false, description: `Updated stage of the deal` }, { name: 'dealtype', type: 'string', required: false, description: `Updated type of deal` }, - { - name: 'description', - type: 'string', - required: false, - description: `Updated deal description`, - }, - { - name: 'hs_priority', - type: 'string', - required: false, - description: `Updated deal priority`, - }, + { name: 'description', type: 'string', required: false, description: `Updated deal description` }, + { name: 'hs_priority', type: 'string', required: false, description: `Updated deal priority` }, { name: 'pipeline', type: 'string', required: false, description: `Updated deal pipeline` }, ], }, @@ -1019,324 +379,114 @@ export const tools: Tool[] = [ name: 'hubspot_deals_batch_archive', description: `Archive (soft delete) a deal in HubSpot CRM using the batch archive API. Archived records are hidden from the UI but can be restored.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to archive. Each item has an 'id' field.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to archive. Each item has an 'id' field.` }, ], }, { name: 'hubspot_deals_batch_create', description: `Create one or more deals in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to create in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to create in HubSpot batch format.` }, ], }, { name: 'hubspot_deals_batch_read', description: `Retrieve a deal record from HubSpot CRM using the batch read API. Returns the specified properties for the record.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to read. Each item has an 'id' field.`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `JSON array of property names to return. Omit to get default properties.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to read. Each item has an 'id' field.` }, + { name: 'properties', type: 'string', required: false, description: `JSON array of property names to return. Omit to get default properties.` }, ], }, { name: 'hubspot_deals_batch_update', description: `Update one or more deals in HubSpot using the batch API. Pass a list of records with IDs — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to update in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to update in HubSpot batch format.` }, ], }, { name: 'hubspot_deals_batch_upsert', description: `Upsert one or more deals in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to upsert in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to upsert in HubSpot batch format.` }, ], }, { name: 'hubspot_deals_search', description: `Search HubSpot deals using full-text search and pagination. Returns matching deals with specified properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Search term for full-text search across deal properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Search term for full-text search across deal properties` }, ], }, { name: 'hubspot_email_create', description: `Create an email engagement in HubSpot CRM to log an email interaction on a record's timeline. Use this to record sent, received, or forwarded emails against contacts, companies, or deals.`, params: [ - { - name: 'hs_email_direction', - type: 'string', - required: true, - description: `Direction the email was sent`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: true, - description: `Date and time of the email`, - }, - { - name: 'hs_email_headers', - type: 'string', - required: false, - description: `Email headers as a JSON-escaped string containing sender and recipient details`, - }, - { - name: 'hs_email_html', - type: 'string', - required: false, - description: `HTML body of the email`, - }, - { - name: 'hs_email_status', - type: 'string', - required: false, - description: `Send status of the email`, - }, - { - name: 'hs_email_subject', - type: 'string', - required: false, - description: `Subject line of the email`, - }, - { - name: 'hs_email_text', - type: 'string', - required: false, - description: `Plain-text body of the email`, - }, - { - name: 'hubspot_owner_id', - type: 'string', - required: false, - description: `ID of the HubSpot owner associated with the email`, - }, + { name: 'hs_email_direction', type: 'string', required: true, description: `Direction the email was sent` }, + { name: 'hs_timestamp', type: 'string', required: true, description: `Date and time of the email` }, + { name: 'hs_email_headers', type: 'string', required: false, description: `Email headers as a JSON-escaped string containing sender and recipient details` }, + { name: 'hs_email_html', type: 'string', required: false, description: `HTML body of the email` }, + { name: 'hs_email_status', type: 'string', required: false, description: `Send status of the email` }, + { name: 'hs_email_subject', type: 'string', required: false, description: `Subject line of the email` }, + { name: 'hs_email_text', type: 'string', required: false, description: `Plain-text body of the email` }, + { name: 'hubspot_owner_id', type: 'string', required: false, description: `ID of the HubSpot owner associated with the email` }, ], }, { name: 'hubspot_email_update', description: `Update an existing email engagement in HubSpot CRM by email ID. Provide any fields to update — only the fields you include will be changed.`, params: [ - { - name: 'email_id', - type: 'string', - required: true, - description: `ID of the email engagement to update`, - }, - { - name: 'hs_email_direction', - type: 'string', - required: false, - description: `Direction the email was sent`, - }, - { - name: 'hs_email_headers', - type: 'string', - required: false, - description: `Email headers as a JSON-escaped string containing sender and recipient details`, - }, - { - name: 'hs_email_html', - type: 'string', - required: false, - description: `HTML body of the email`, - }, - { - name: 'hs_email_status', - type: 'string', - required: false, - description: `Send status of the email`, - }, - { - name: 'hs_email_subject', - type: 'string', - required: false, - description: `Subject line of the email`, - }, - { - name: 'hs_email_text', - type: 'string', - required: false, - description: `Plain-text body of the email`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: false, - description: `Date and time of the email`, - }, - { - name: 'hubspot_owner_id', - type: 'string', - required: false, - description: `ID of the HubSpot owner associated with the email`, - }, + { name: 'email_id', type: 'string', required: true, description: `ID of the email engagement to update` }, + { name: 'hs_email_direction', type: 'string', required: false, description: `Direction the email was sent` }, + { name: 'hs_email_headers', type: 'string', required: false, description: `Email headers as a JSON-escaped string containing sender and recipient details` }, + { name: 'hs_email_html', type: 'string', required: false, description: `HTML body of the email` }, + { name: 'hs_email_status', type: 'string', required: false, description: `Send status of the email` }, + { name: 'hs_email_subject', type: 'string', required: false, description: `Subject line of the email` }, + { name: 'hs_email_text', type: 'string', required: false, description: `Plain-text body of the email` }, + { name: 'hs_timestamp', type: 'string', required: false, description: `Date and time of the email` }, + { name: 'hubspot_owner_id', type: 'string', required: false, description: `ID of the HubSpot owner associated with the email` }, ], }, { name: 'hubspot_emails_search', description: `Search HubSpot email engagements (logged emails) using filters and full-text search. Returns logged email records with their properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across email properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across email properties` }, ], }, { name: 'hubspot_engagements_list', description: `List engagements (notes, tasks, calls, emails, meetings) from HubSpot CRM. Supports filtering by engagement type and pagination.`, params: [ - { - name: 'engagement_type', - type: 'string', - required: true, - description: `Type of engagement to list`, - }, - { - name: 'after', - type: 'string', - required: false, - description: `Pagination cursor to get the next page of results`, - }, - { - name: 'limit', - type: 'integer', - required: false, - description: `Number of results to return (max 100)`, - }, + { name: 'engagement_type', type: 'string', required: true, description: `Type of engagement to list` }, + { name: 'after', type: 'string', required: false, description: `Pagination cursor to get the next page of results` }, + { name: 'limit', type: 'integer', required: false, description: `Number of results to return (max 100)` }, ], }, { name: 'hubspot_form_submissions_get', description: `Retrieve all submissions for a specific HubSpot form. Returns submitted field values and submission timestamps.`, params: [ - { - name: 'form_id', - type: 'string', - required: true, - description: `ID of the form to retrieve submissions for`, - }, - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset token for the next page`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of submissions to return per page`, - }, + { name: 'form_id', type: 'string', required: true, description: `ID of the form to retrieve submissions for` }, + { name: 'after', type: 'string', required: false, description: `Pagination offset token for the next page` }, + { name: 'limit', type: 'number', required: false, description: `Number of submissions to return per page` }, ], }, { name: 'hubspot_forms_list', description: `List all HubSpot marketing forms. Returns form IDs, names, and field definitions.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination cursor for the next page of results`, - }, - { - name: 'formTypes', - type: 'string', - required: false, - description: `Comma-separated list of form types to filter by (e.g., hubspot,captured,flow)`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of forms to return per page (max 50)`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination cursor for the next page of results` }, + { name: 'formTypes', type: 'string', required: false, description: `Comma-separated list of form types to filter by (e.g., hubspot,captured,flow)` }, + { name: 'limit', type: 'number', required: false, description: `Number of forms to return per page (max 50)` }, ], }, { @@ -1344,240 +494,85 @@ export const tools: Tool[] = [ description: `Create a new line item in HubSpot. Line items represent individual products or services in a deal.`, params: [ { name: 'name', type: 'string', required: true, description: `Name of the line item` }, - { - name: 'deal_id', - type: 'string', - required: false, - description: `ID of the deal to associate this line item with`, - }, - { - name: 'hs_product_id', - type: 'string', - required: false, - description: `ID of the associated product from HubSpot product library`, - }, - { - name: 'price', - type: 'string', - required: false, - description: `Unit price of the line item`, - }, - { - name: 'quantity', - type: 'string', - required: false, - description: `Quantity of the line item`, - }, + { name: 'deal_id', type: 'string', required: false, description: `ID of the deal to associate this line item with` }, + { name: 'hs_product_id', type: 'string', required: false, description: `ID of the associated product from HubSpot product library` }, + { name: 'price', type: 'string', required: false, description: `Unit price of the line item` }, + { name: 'quantity', type: 'string', required: false, description: `Quantity of the line item` }, ], }, { name: 'hubspot_line_items_batch_archive', description: `Archive (soft delete) a line item in HubSpot CRM using the batch archive API. Archived records are hidden from the UI but can be restored.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to archive. Each item has an 'id' field.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to archive. Each item has an 'id' field.` }, ], }, { name: 'hubspot_line_items_batch_create', description: `Create one or more line items in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to create in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to create in HubSpot batch format.` }, ], }, { name: 'hubspot_line_items_batch_read', description: `Retrieve a line item record from HubSpot CRM using the batch read API. Returns the specified properties for the record.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to read. Each item has an 'id' field.`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `JSON array of property names to return. Omit to get default properties.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to read. Each item has an 'id' field.` }, + { name: 'properties', type: 'string', required: false, description: `JSON array of property names to return. Omit to get default properties.` }, ], }, { name: 'hubspot_line_items_batch_update', description: `Update one or more line items in HubSpot using the batch API. Pass a list of records with IDs — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to update in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to update in HubSpot batch format.` }, ], }, { name: 'hubspot_meeting_log', description: `Log a meeting engagement in HubSpot CRM. Records details of a meeting including title, start/end time, description, and outcome.`, params: [ - { - name: 'hs_meeting_end_time', - type: 'string', - required: true, - description: `End time of the meeting (ISO 8601 format)`, - }, - { - name: 'hs_meeting_start_time', - type: 'string', - required: true, - description: `Start time of the meeting (ISO 8601 format)`, - }, - { - name: 'hs_meeting_title', - type: 'string', - required: true, - description: `Title of the meeting`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: true, - description: `Timestamp for the meeting (ISO 8601 format)`, - }, - { - name: 'hs_meeting_body', - type: 'string', - required: false, - description: `Description or agenda for the meeting`, - }, - { - name: 'hs_meeting_outcome', - type: 'string', - required: false, - description: `Outcome of the meeting`, - }, + { name: 'hs_meeting_end_time', type: 'string', required: true, description: `End time of the meeting (ISO 8601 format)` }, + { name: 'hs_meeting_start_time', type: 'string', required: true, description: `Start time of the meeting (ISO 8601 format)` }, + { name: 'hs_meeting_title', type: 'string', required: true, description: `Title of the meeting` }, + { name: 'hs_timestamp', type: 'string', required: true, description: `Timestamp for the meeting (ISO 8601 format)` }, + { name: 'hs_meeting_body', type: 'string', required: false, description: `Description or agenda for the meeting` }, + { name: 'hs_meeting_outcome', type: 'string', required: false, description: `Outcome of the meeting` }, ], }, { name: 'hubspot_meeting_update', description: `Update an existing meeting engagement in HubSpot CRM by meeting ID. Provide any fields to update — only the fields you include will be changed.`, params: [ - { - name: 'meeting_id', - type: 'string', - required: true, - description: `ID of the meeting to update`, - }, - { - name: 'hs_internal_meeting_notes', - type: 'string', - required: false, - description: `Internal notes not shared with attendees`, - }, - { - name: 'hs_meeting_body', - type: 'string', - required: false, - description: `Description or agenda for the meeting`, - }, - { - name: 'hs_meeting_end_time', - type: 'string', - required: false, - description: `End time of the meeting (ISO 8601 format)`, - }, - { - name: 'hs_meeting_location', - type: 'string', - required: false, - description: `Location of the meeting`, - }, - { - name: 'hs_meeting_outcome', - type: 'string', - required: false, - description: `Outcome of the meeting`, - }, - { - name: 'hs_meeting_start_time', - type: 'string', - required: false, - description: `Start time of the meeting (ISO 8601 format)`, - }, - { - name: 'hs_meeting_title', - type: 'string', - required: false, - description: `Title of the meeting`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: false, - description: `Timestamp for the meeting (ISO 8601 format)`, - }, - { - name: 'hubspot_owner_id', - type: 'string', - required: false, - description: `ID of the HubSpot owner associated with the meeting`, - }, + { name: 'meeting_id', type: 'string', required: true, description: `ID of the meeting to update` }, + { name: 'hs_internal_meeting_notes', type: 'string', required: false, description: `Internal notes not shared with attendees` }, + { name: 'hs_meeting_body', type: 'string', required: false, description: `Description or agenda for the meeting` }, + { name: 'hs_meeting_end_time', type: 'string', required: false, description: `End time of the meeting (ISO 8601 format)` }, + { name: 'hs_meeting_location', type: 'string', required: false, description: `Location of the meeting` }, + { name: 'hs_meeting_outcome', type: 'string', required: false, description: `Outcome of the meeting` }, + { name: 'hs_meeting_start_time', type: 'string', required: false, description: `Start time of the meeting (ISO 8601 format)` }, + { name: 'hs_meeting_title', type: 'string', required: false, description: `Title of the meeting` }, + { name: 'hs_timestamp', type: 'string', required: false, description: `Timestamp for the meeting (ISO 8601 format)` }, + { name: 'hubspot_owner_id', type: 'string', required: false, description: `ID of the HubSpot owner associated with the meeting` }, ], }, { name: 'hubspot_meetings_search', description: `Search HubSpot meeting engagements using filters and full-text search. Returns logged meetings with their properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across meeting properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across meeting properties` }, ], }, { name: 'hubspot_note_create', description: `Create a note in HubSpot CRM to log interactions, meeting summaries, or important information. Notes can be associated with contacts, companies, or deals.`, params: [ - { - name: 'props', - type: 'object', - required: true, - description: `Note properties. hs_note_body (required) is the note content. hs_timestamp (required) is Unix ms timestamp e.g. 1700000000000.`, - }, + { name: 'props', type: 'object', required: true, description: `Note properties. hs_note_body (required) is the note content. hs_timestamp (required) is Unix ms timestamp e.g. 1700000000000.` }, ], }, { @@ -1585,12 +580,7 @@ export const tools: Tool[] = [ description: `Log a note engagement in HubSpot CRM. Creates a text note that can be associated with contacts, companies, or deals.`, params: [ { name: 'hs_note_body', type: 'string', required: true, description: `Content of the note` }, - { - name: 'hs_timestamp', - type: 'string', - required: true, - description: `Timestamp for the note (ISO 8601 format)`, - }, + { name: 'hs_timestamp', type: 'string', required: true, description: `Timestamp for the note (ISO 8601 format)` }, ], }, { @@ -1598,102 +588,37 @@ export const tools: Tool[] = [ description: `Update an existing note in HubSpot CRM by note ID. Provide any fields to update — only the fields you include will be changed.`, params: [ { name: 'note_id', type: 'string', required: true, description: `ID of the note to update` }, - { - name: 'hs_note_body', - type: 'string', - required: false, - description: `Text content of the note`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: false, - description: `Date and time of the note`, - }, - { - name: 'hubspot_owner_id', - type: 'string', - required: false, - description: `ID of the HubSpot owner associated with the note`, - }, + { name: 'hs_note_body', type: 'string', required: false, description: `Text content of the note` }, + { name: 'hs_timestamp', type: 'string', required: false, description: `Date and time of the note` }, + { name: 'hubspot_owner_id', type: 'string', required: false, description: `ID of the HubSpot owner associated with the note` }, ], }, { name: 'hubspot_notes_search', description: `Search HubSpot note engagements using filters and full-text search. Returns logged notes with their content and timestamps.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across note content`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across note content` }, ], }, { name: 'hubspot_object_properties_list', description: `Retrieve all properties defined for a HubSpot CRM object type (contacts, companies, deals, tickets, etc.).`, params: [ - { - name: 'object_type', - type: 'string', - required: true, - description: `The CRM object type to list properties for`, - }, - { - name: 'archived', - type: 'string', - required: false, - description: `Include archived properties in the response`, - }, + { name: 'object_type', type: 'string', required: true, description: `The CRM object type to list properties for` }, + { name: 'archived', type: 'string', required: false, description: `Include archived properties in the response` }, ], }, { name: 'hubspot_owners_list', description: `List all HubSpot owners (users). Use this to find owner IDs for assigning contacts, deals, tickets, and other CRM records.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination cursor for the next page of results`, - }, - { - name: 'email', - type: 'string', - required: false, - description: `Filter owners by email address`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of owners to return per page (max 500)`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination cursor for the next page of results` }, + { name: 'email', type: 'string', required: false, description: `Filter owners by email address` }, + { name: 'limit', type: 'number', required: false, description: `Number of owners to return per page (max 500)` }, ], }, { @@ -1701,18 +626,8 @@ export const tools: Tool[] = [ description: `Create a new product in the HubSpot product library.`, params: [ { name: 'name', type: 'string', required: true, description: `Name of the product` }, - { - name: 'description', - type: 'string', - required: false, - description: `Description of the product`, - }, - { - name: 'hs_sku', - type: 'string', - required: false, - description: `Stock keeping unit (SKU) identifier for the product`, - }, + { name: 'description', type: 'string', required: false, description: `Description of the product` }, + { name: 'hs_sku', type: 'string', required: false, description: `Stock keeping unit (SKU) identifier for the product` }, { name: 'price', type: 'string', required: false, description: `Price of the product` }, ], }, @@ -1720,115 +635,50 @@ export const tools: Tool[] = [ name: 'hubspot_products_batch_archive', description: `Archive (soft delete) a product in HubSpot CRM using the batch archive API. Archived records are hidden from the UI but can be restored.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to archive. Each item has an 'id' field.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to archive. Each item has an 'id' field.` }, ], }, { name: 'hubspot_products_batch_read', description: `Retrieve a product record from HubSpot CRM using the batch read API. Returns the specified properties for the record.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to read. Each item has an 'id' field.`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `JSON array of property names to return. Omit to get default properties.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to read. Each item has an 'id' field.` }, + { name: 'properties', type: 'string', required: false, description: `JSON array of property names to return. Omit to get default properties.` }, ], }, { name: 'hubspot_products_list', description: `Retrieve a list of products from the HubSpot product library.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination cursor for the next page of results`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of products to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of product properties to include in response`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination cursor for the next page of results` }, + { name: 'limit', type: 'number', required: false, description: `Number of products to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of product properties to include in response` }, ], }, { name: 'hubspot_quote_create', description: `Create a new quote in HubSpot for a deal.`, params: [ - { - name: 'hs_language', - type: 'string', - required: true, - description: `Language of the quote (ISO 639-1 code, e.g. en, de, fr, es)`, - }, + { name: 'hs_language', type: 'string', required: true, description: `Language of the quote (ISO 639-1 code, e.g. en, de, fr, es)` }, { name: 'hs_title', type: 'string', required: true, description: `Title of the quote` }, - { - name: 'deal_id', - type: 'string', - required: false, - description: `ID of the deal to associate this quote with`, - }, - { - name: 'hs_expiration_date', - type: 'string', - required: false, - description: `Expiration date of the quote (YYYY-MM-DD format)`, - }, - { - name: 'hs_status', - type: 'string', - required: false, - description: `Status of the quote (DRAFT, PENDING_APPROVAL, APPROVED, REJECTED)`, - }, + { name: 'deal_id', type: 'string', required: false, description: `ID of the deal to associate this quote with` }, + { name: 'hs_expiration_date', type: 'string', required: false, description: `Expiration date of the quote (YYYY-MM-DD format)` }, + { name: 'hs_status', type: 'string', required: false, description: `Status of the quote (DRAFT, PENDING_APPROVAL, APPROVED, REJECTED)` }, ], }, { name: 'hubspot_quote_get', description: `Retrieve a specific HubSpot quote by its ID.`, params: [ - { - name: 'quote_id', - type: 'string', - required: true, - description: `ID of the quote to retrieve`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of quote properties to include in response`, - }, + { name: 'quote_id', type: 'string', required: true, description: `ID of the quote to retrieve` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of quote properties to include in response` }, ], }, { name: 'hubspot_schemas_list', description: `List all custom object schemas defined in HubSpot. Returns object type IDs, labels, and property definitions needed to work with custom objects.`, params: [ - { - name: 'archived', - type: 'string', - required: false, - description: `Include archived schemas in the response`, - }, + { name: 'archived', type: 'string', required: false, description: `Include archived schemas in the response` }, ], }, { @@ -1836,54 +686,19 @@ export const tools: Tool[] = [ description: `Mark a HubSpot task as completed or update its status. Use the task ID from hubspot_tasks_search or hubspot_task_create.`, params: [ { name: 'task_id', type: 'string', required: true, description: `ID of the task to update` }, - { - name: 'hs_task_body', - type: 'string', - required: false, - description: `Updated notes for the task`, - }, - { - name: 'hs_task_status', - type: 'string', - required: false, - description: `New status to set for the task`, - }, + { name: 'hs_task_body', type: 'string', required: false, description: `Updated notes for the task` }, + { name: 'hs_task_status', type: 'string', required: false, description: `New status to set for the task` }, ], }, { name: 'hubspot_task_create', description: `Create a new task in HubSpot CRM. Tasks can be assigned to owners and associated with contacts, companies, or deals.`, params: [ - { - name: 'hs_task_subject', - type: 'string', - required: true, - description: `Subject or title of the task`, - }, - { - name: 'hs_timestamp', - type: 'string', - required: true, - description: `Due date and time for the task (ISO 8601 format)`, - }, - { - name: 'hs_task_body', - type: 'string', - required: false, - description: `Notes or description for the task`, - }, - { - name: 'hs_task_priority', - type: 'string', - required: false, - description: `Priority level of the task`, - }, - { - name: 'hs_task_status', - type: 'string', - required: false, - description: `Status of the task`, - }, + { name: 'hs_task_subject', type: 'string', required: true, description: `Subject or title of the task` }, + { name: 'hs_timestamp', type: 'string', required: true, description: `Due date and time for the task (ISO 8601 format)` }, + { name: 'hs_task_body', type: 'string', required: false, description: `Notes or description for the task` }, + { name: 'hs_task_priority', type: 'string', required: false, description: `Priority level of the task` }, + { name: 'hs_task_status', type: 'string', required: false, description: `Status of the task` }, { name: 'hs_task_type', type: 'string', required: false, description: `Type of task` }, ], }, @@ -1891,229 +706,89 @@ export const tools: Tool[] = [ name: 'hubspot_tasks_search', description: `Search HubSpot tasks using filters and full-text search. Returns tasks with their subject, status, due date, and priority.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across task properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across task properties` }, ], }, { name: 'hubspot_ticket_create', description: `Create a new support ticket in HubSpot. Use hubspot_deal_pipelines_list with object type 'tickets' to find valid pipeline and stage IDs.`, params: [ - { - name: 'hs_pipeline_stage', - type: 'string', - required: true, - description: `Pipeline stage ID for the ticket`, - }, + { name: 'hs_pipeline_stage', type: 'string', required: true, description: `Pipeline stage ID for the ticket` }, { name: 'subject', type: 'string', required: true, description: `Subject of the ticket` }, - { - name: 'content', - type: 'string', - required: false, - description: `Detailed description of the support issue`, - }, - { - name: 'hs_pipeline', - type: 'string', - required: false, - description: `Pipeline ID for the ticket (defaults to '0' for the default pipeline)`, - }, - { - name: 'hs_ticket_priority', - type: 'string', - required: false, - description: `Priority level of the ticket`, - }, + { name: 'content', type: 'string', required: false, description: `Detailed description of the support issue` }, + { name: 'hs_pipeline', type: 'string', required: false, description: `Pipeline ID for the ticket (defaults to '0' for the default pipeline)` }, + { name: 'hs_ticket_priority', type: 'string', required: false, description: `Priority level of the ticket` }, ], }, { name: 'hubspot_ticket_get', description: `Retrieve details of a specific HubSpot support ticket by ticket ID.`, params: [ - { - name: 'ticket_id', - type: 'string', - required: true, - description: `ID of the ticket to retrieve`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, + { name: 'ticket_id', type: 'string', required: true, description: `ID of the ticket to retrieve` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, ], }, { name: 'hubspot_ticket_update', description: `Update an existing HubSpot support ticket by ticket ID. Provide any fields to update.`, params: [ - { - name: 'ticket_id', - type: 'string', - required: true, - description: `ID of the ticket to update`, - }, - { - name: 'content', - type: 'string', - required: false, - description: `Updated description of the support issue`, - }, - { - name: 'hs_pipeline', - type: 'string', - required: false, - description: `Updated pipeline ID for the ticket`, - }, - { - name: 'hs_pipeline_stage', - type: 'string', - required: false, - description: `Updated pipeline stage ID for the ticket`, - }, - { - name: 'hs_ticket_priority', - type: 'string', - required: false, - description: `Updated priority level of the ticket`, - }, - { - name: 'subject', - type: 'string', - required: false, - description: `Updated subject of the ticket`, - }, + { name: 'ticket_id', type: 'string', required: true, description: `ID of the ticket to update` }, + { name: 'content', type: 'string', required: false, description: `Updated description of the support issue` }, + { name: 'hs_pipeline', type: 'string', required: false, description: `Updated pipeline ID for the ticket` }, + { name: 'hs_pipeline_stage', type: 'string', required: false, description: `Updated pipeline stage ID for the ticket` }, + { name: 'hs_ticket_priority', type: 'string', required: false, description: `Updated priority level of the ticket` }, + { name: 'subject', type: 'string', required: false, description: `Updated subject of the ticket` }, ], }, { name: 'hubspot_tickets_batch_archive', description: `Archive (soft delete) a ticket in HubSpot CRM using the batch archive API. Archived records are hidden from the UI but can be restored.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to archive. Each item has an 'id' field.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to archive. Each item has an 'id' field.` }, ], }, { name: 'hubspot_tickets_batch_create', description: `Create one or more tickets in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to create in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to create in HubSpot batch format.` }, ], }, { name: 'hubspot_tickets_batch_read', description: `Retrieve a ticket record from HubSpot CRM using the batch read API. Returns the specified properties for the record.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of record IDs to read. Each item has an 'id' field.`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `JSON array of property names to return. Omit to get default properties.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of record IDs to read. Each item has an 'id' field.` }, + { name: 'properties', type: 'string', required: false, description: `JSON array of property names to return. Omit to get default properties.` }, ], }, { name: 'hubspot_tickets_batch_update', description: `Update one or more tickets in HubSpot using the batch API. Pass a list of records with IDs — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to update in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to update in HubSpot batch format.` }, ], }, { name: 'hubspot_tickets_batch_upsert', description: `Upsert one or more tickets in HubSpot using the batch API. Pass a list of records — up to 100 per call.`, params: [ - { - name: 'inputs', - type: 'string', - required: true, - description: `JSON array of objects to upsert in HubSpot batch format.`, - }, + { name: 'inputs', type: 'string', required: true, description: `JSON array of objects to upsert in HubSpot batch format.` }, ], }, { name: 'hubspot_tickets_search', description: `Search HubSpot support tickets using filters and full-text search. Returns matching tickets with their properties.`, params: [ - { - name: 'after', - type: 'string', - required: false, - description: `Pagination offset to get results starting from a specific position`, - }, - { - name: 'filterGroups', - type: 'string', - required: false, - description: `JSON string containing filter groups for advanced filtering`, - }, - { - name: 'limit', - type: 'number', - required: false, - description: `Number of results to return per page (max 100)`, - }, - { - name: 'properties', - type: 'string', - required: false, - description: `Comma-separated list of properties to include in the response`, - }, - { - name: 'query', - type: 'string', - required: false, - description: `Full-text search term across ticket properties`, - }, + { name: 'after', type: 'string', required: false, description: `Pagination offset to get results starting from a specific position` }, + { name: 'filterGroups', type: 'string', required: false, description: `JSON string containing filter groups for advanced filtering` }, + { name: 'limit', type: 'number', required: false, description: `Number of results to return per page (max 100)` }, + { name: 'properties', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` }, + { name: 'query', type: 'string', required: false, description: `Full-text search term across ticket properties` }, ], }, ] diff --git a/src/data/agent-connectors/klaviyomcp.ts b/src/data/agent-connectors/klaviyomcp.ts index 3bcc822f1..00f52a8c4 100644 --- a/src/data/agent-connectors/klaviyomcp.ts +++ b/src/data/agent-connectors/klaviyomcp.ts @@ -5,24 +5,9 @@ export const tools: Tool[] = [ name: 'klaviyomcp_assign_template_to_campaign_message', description: `Assigns an email template to a campaign message. This should be used after creating a template with the create_email_template tool and creating an email campaign.`, params: [ - { - name: 'campaignMessageId', - type: 'string', - required: true, - description: `The ID of the email campaign message to assign the template to.`, - }, - { - name: 'emailTemplateId', - type: 'string', - required: true, - description: `The ID of the email template to assign to the campaign message.`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'campaignMessageId', type: 'string', required: true, description: `The ID of the email campaign message to assign the template to.` }, + { name: 'emailTemplateId', type: 'string', required: true, description: `The ID of the email template to assign to the campaign message.` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { @@ -30,25 +15,16 @@ export const tools: Tool[] = [ description: `Creates a new draft campaign. For email campaigns, this can be used with the create_email_template tool for template creation and then assign_template_to_campaign_message to assign the template to the email campaign. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard`, params: [ { name: 'input', type: 'object', required: true, description: `CampaignCreateQuery` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_create_email_template', description: `Create a new email template from the given HTML. Returns the ID of the template. You can view and edit a template in the Klaviyo UI at https://www.klaviyo.com/email-editor/{TEMPLATE_ID}/edit.`, params: [ - { - name: 'html', - type: 'string', - required: true, - description: ` + { name: 'html', type: 'string', required: true, description: ` The complete HTML of the template. Should include and tags. -To include an image, first upload the image using the upload_image_from_url tool, then use the returned image URL. +To include an image, first upload the image using the upload_image_from_file or upload_image_from_url tool, then use the returned image URL. Always include an unsubscribe link. Do this by inserting the template string "{% unsubscribe 'Unsubscribe' %}". You can replace 'Unsubscribe' with custom text. To add an editable region to the template, ensure the has_editable_regions param is true and add the following: @@ -61,22 +37,11 @@ To add an editable image block, add the following within that region:
To add a universal content block, add the following within that region, replacing block_id with the ID of the universal content block: -
 
-`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, +
 
+` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, { name: 'name', type: 'string', required: true, description: `The name of the template` }, - { - name: 'hasEditableRegions', - type: 'boolean', - required: false, - description: `Whether the template HTML contains editable regions. Should be false unless they explicitly request an editable/drag-and-drop/hybrid template.`, - }, + { name: 'hasEditableRegions', type: 'boolean', required: false, description: `Whether the template HTML contains editable regions. Should be false unless they explicitly request an editable/drag-and-drop/hybrid template.` }, ], }, { @@ -84,90 +49,35 @@ To add a universal content block, add the following within that region, replacin description: `Create a new profile. Must include either email, phone_number, or external_id. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}`, params: [ { name: 'input', type: 'object', required: true, description: `ProfileCreateQuery` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_create_translation', description: `Create a new translation collection for a Klaviyo resource. Exactly one relationship must be provided. Valid channel + relationship combinations: email → campaign-variation, flow-message, template, template-universal-content; sms → campaign-variation, flow-message; mobile_push → campaign-variation, flow-message; whatsapp → template only.`, params: [ - { - name: 'channel', - type: 'string', - required: true, - description: `Channel for this translation`, - }, - { - name: 'fallbackLocale', - type: 'string', - required: true, - description: `Fallback locale (e.g. 'en')`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'relationshipId', - type: 'string', - required: true, - description: `ID of the related resource`, - }, - { - name: 'relationshipType', - type: 'string', - required: true, - description: `Type of related resource`, - }, - { - name: 'sourceLocale', - type: 'string', - required: true, - description: `Source locale (e.g. 'en')`, - }, - { - name: 'targetLocales', - type: 'array', - required: true, - description: `Target locales (e.g. ['fr', 'es']). Pass as a JSON array of values.`, - }, + { name: 'channel', type: 'string', required: true, description: `Channel for this translation` }, + { name: 'fallbackLocale', type: 'string', required: true, description: `Fallback locale (e.g. 'en')` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'relationshipId', type: 'string', required: true, description: `ID of the related resource` }, + { name: 'relationshipType', type: 'string', required: true, description: `Type of related resource` }, + { name: 'sourceLocale', type: 'string', required: true, description: `Source locale (e.g. 'en')` }, + { name: 'targetLocales', type: 'array', required: true, description: `Target locales (e.g. ['fr', 'es']). Pass as a JSON array of values.` }, ], }, { name: 'klaviyomcp_delete_translation', description: `Delete a translation collection by ID. This removes all localization settings and translation values for the resource.`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'translationId', - type: 'string', - required: true, - description: `The ID of the translation to delete`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'translationId', type: 'string', required: true, description: `The ID of the translation to delete` }, ], }, { name: 'klaviyomcp_get_account_details', description: `Get the details of the account. You can view and edit your account details flow in the Klaviyo UI at https://www.klaviyo.com/settings/account`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { @@ -175,150 +85,45 @@ To add a universal content block, add the following within that region, replacin description: `Returns a specific campaign based on a required id. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard`, params: [ { name: 'id', type: 'string', required: true, description: `No description.` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_get_campaign_report', description: `Returns metrics data for campaigns with the given filters and within the given timeframe. Can return performance data such as opens, clicks, and conversions, etc. This tool will also give you information about each campaign in the report, such as: audience names and IDs for the campaign (included audiences are audiences sent the campaign, excluded audiences are audiences not sent the campaign), campaign name, send time, send channel, and campaign ID.`, params: [ - { - name: 'conversionMetricId', - type: 'string', - required: true, - description: `ID of the metric to be used for conversion statistics. You can get available metrics IDs using the get_metrics tool and just requesting the 'name' field. Do not use any additional filters on the get_metrics tool. If a specific metric is not requested, use the ID of the metric named 'Placed Order'. If it doesn't exist, use any metric.`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'statistics', - type: 'array', - required: true, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "bounce_rate", "bounced", "bounced_or_failed", "bounced_or_failed_rate", "click_rate", "click_to_open_rate", "clicks", "clicks_unique", "conversion_rate", "conversion_uniques", "conversions", "delivered", "delivery_rate", "failed", "failed_rate", "open_rate", "opens", "opens_unique", "recipients", "spam_complaint_rate", "spam_complaints", "unsubscribe_rate", "unsubscribe_uniques", "unsubscribes". Example: ["bounce_rate", "bounced", "bounced_or_failed"]`, - }, - { - name: 'detailFilters', - type: 'array', - required: false, - description: `Array of detail filter objects for breakdown rows. Each object must have fieldName (e.g. "tags", "audiences.included.name"), operator, and value. Example: [{"fieldName": "tags", "operator": "equals", "value": "promo"}]`, - }, - { - name: 'filters', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "send_channel", "campaign_id"), operator (e.g. "equals", "contains-any"), and value. Example: [{"fieldName": "send_channel", "operator": "equals", "value": "email"}]`, - }, - { - name: 'groupBy', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "campaign_id", "campaign_message_id", "campaign_message_name", "group", "group_name", "send_channel", "tag_id", "tag_name", "text_message_format", "variation", "variation_name". Example: ["campaign_id", "campaign_message_id", "campaign_message_name"]`, - }, - { - name: 'groupByAudience', - type: 'boolean', - required: false, - description: `If true, also return an aggregation of stats grouped by audience (list/segment) and send channel, combining data across campaigns.`, - }, - { - name: 'timeframe', - type: 'string', - required: false, - description: `The timeframe to query for data within. The max length a timeframe can be is 1 year. If unspecified, use 1 year.`, - }, - { - name: 'valueStatistics', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "average_order_value", "conversion_value", "revenue_per_recipient". Example: ["average_order_value", "conversion_value", "revenue_per_recipient"]`, - }, + { name: 'conversionMetricId', type: 'string', required: true, description: `ID of the metric to be used for conversion statistics. You can get available metrics IDs using the get_metrics tool and just requesting the 'name' field. Do not use any additional filters on the get_metrics tool. If a specific metric is not requested, use the ID of the metric named 'Placed Order'. If it doesn't exist, use any metric.` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'statistics', type: 'array', required: true, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "bounce_rate", "bounced", "bounced_or_failed", "bounced_or_failed_rate", "click_rate", "click_to_open_rate", "clicks", "clicks_unique", "conversion_rate", "conversion_uniques", "conversions", "delivered", "delivery_rate", "failed", "failed_rate", "open_rate", "opens", "opens_unique", "recipients", "spam_complaint_rate", "spam_complaints", "unsubscribe_rate", "unsubscribe_uniques", "unsubscribes". Example: ["bounce_rate", "bounced", "bounced_or_failed"]` }, + { name: 'detailFilters', type: 'array', required: false, description: `Array of detail filter objects for breakdown rows. Each object must have fieldName (e.g. "tags", "audiences.included.name"), operator, and value. Example: [{"fieldName": "tags", "operator": "equals", "value": "promo"}]` }, + { name: 'filters', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "send_channel", "campaign_id"), operator (e.g. "equals", "contains-any"), and value. Example: [{"fieldName": "send_channel", "operator": "equals", "value": "email"}]` }, + { name: 'groupBy', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "campaign_id", "campaign_message_id", "campaign_message_name", "group", "group_name", "send_channel", "tag_id", "tag_name", "text_message_format", "variation", "variation_name". Example: ["campaign_id", "campaign_message_id", "campaign_message_name"]` }, + { name: 'groupByAudience', type: 'boolean', required: false, description: `If true, also return an aggregation of stats grouped by audience (list/segment) and send channel, combining data across campaigns.` }, + { name: 'timeframe', type: 'string', required: false, description: `The timeframe to query for data within. The max length a timeframe can be is 1 year. If unspecified, use 1 year.` }, + { name: 'valueStatistics', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "average_order_value", "conversion_value", "revenue_per_recipient". Example: ["average_order_value", "conversion_value", "revenue_per_recipient"]` }, ], }, { name: 'klaviyomcp_get_campaigns', description: `Returns some or all campaigns based on filters. You can view and edit a campaign in the Klaviyo UI at https://www.klaviyo.com/campaign/{CAMPAIGN_ID}/wizard. Do not use this for queries related to the status of campaigns, reporting on campaigns, or campaign performance data. For those use cases, use the get_campaign_report tool.`, params: [ - { - name: 'channel', - type: 'string', - required: true, - description: `Which types of campaigns to return. To get all types of campaigns, call this tool for each channel.`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'campaignMessageFields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "definition", "definition.channel", "definition.label", "definition.content", "definition.content.subject", "definition.content.preview_text", "definition.content.from_email", "definition.content.from_label", "definition.content.reply_to_email", "definition.content.cc_email", "definition.content.bcc_email", "definition.content.body", "definition.content.media_url", "definition.content.title", "definition.content.dynamic_image", "definition.render_options", "definition.render_options.shorten_links", "definition.render_options.add_org_prefix", "definition.render_options.add_info_link", "definition.render_options.add_opt_out_language", "definition.notification_type", "definition.kv_pairs", "definition.options", "definition.options.on_open", "definition.options.on_open.type", "definition.options.on_open.ios_deep_link", "definition.options.on_open.android_deep_link", "definition.options.badge", "definition.options.badge.display", "definition.options.badge.badge_options", "definition.options.badge.badge_options.badge_config", "definition.options.badge.badge_options.value", "definition.options.badge.badge_options.set_from_property", "definition.options.play_sound", "send_times", "created_at", "updated_at". Example: ["definition", "definition.channel", "definition.label"]`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "status", "archived", "audiences", "audiences.included", "audiences.excluded", "send_options", "send_options.use_smart_sending", "tracking_options", "tracking_options.add_tracking_params", "tracking_options.custom_tracking_params", "tracking_options.is_tracking_clicks", "tracking_options.is_tracking_opens", "send_strategy", "send_strategy.method", "send_strategy.datetime", "send_strategy.options", "send_strategy.options.is_local", "send_strategy.options.send_past_recipients_immediately", "send_strategy.throttle_percentage", "send_strategy.date", "created_at", "scheduled_at", "updated_at", "send_time". Example: ["name", "status", "archived"]`, - }, - { - name: 'filters', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "status", "name", "archived"), operator (e.g. "equals", "contains", "any"), and value. Example: [{"fieldName": "status", "operator": "equals", "value": "Draft"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, + { name: 'channel', type: 'string', required: true, description: `Which types of campaigns to return. To get all types of campaigns, call this tool for each channel.` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'campaignMessageFields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "definition", "definition.channel", "definition.label", "definition.content", "definition.content.subject", "definition.content.preview_text", "definition.content.from_email", "definition.content.from_label", "definition.content.reply_to_email", "definition.content.cc_email", "definition.content.bcc_email", "definition.content.body", "definition.content.media_url", "definition.content.title", "definition.content.dynamic_image", "definition.render_options", "definition.render_options.shorten_links", "definition.render_options.add_org_prefix", "definition.render_options.add_info_link", "definition.render_options.add_opt_out_language", "definition.notification_type", "definition.kv_pairs", "definition.options", "definition.options.on_open", "definition.options.on_open.type", "definition.options.on_open.ios_deep_link", "definition.options.on_open.android_deep_link", "definition.options.badge", "definition.options.badge.display", "definition.options.badge.badge_options", "definition.options.badge.badge_options.badge_config", "definition.options.badge.badge_options.value", "definition.options.badge.badge_options.set_from_property", "definition.options.play_sound", "send_times", "created_at", "updated_at". Example: ["definition", "definition.channel", "definition.label"]` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "status", "archived", "audiences", "audiences.included", "audiences.excluded", "send_options", "send_options.use_smart_sending", "tracking_options", "tracking_options.add_tracking_params", "tracking_options.custom_tracking_params", "tracking_options.is_tracking_clicks", "tracking_options.is_tracking_opens", "send_strategy", "send_strategy.method", "send_strategy.datetime", "send_strategy.options", "send_strategy.options.is_local", "send_strategy.options.send_past_recipients_immediately", "send_strategy.throttle_percentage", "send_strategy.date", "created_at", "scheduled_at", "updated_at", "send_time". Example: ["name", "status", "archived"]` }, + { name: 'filters', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "status", "name", "archived"), operator (e.g. "equals", "contains", "any"), and value. Example: [{"fieldName": "status", "operator": "equals", "value": "Draft"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, ], }, { name: 'klaviyomcp_get_catalog_items', description: `Get all catalog items in an account. (Also known as products)`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'catalogVariantFields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "external_id", "title", "description", "sku", "inventory_policy", "inventory_quantity", "price", "url", "image_full_url", "image_thumbnail_url", "images", "custom_metadata", "published", "created", "updated". Example: ["external_id", "title", "description"]`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "external_id", "title", "description", "price", "url", "image_full_url", "image_thumbnail_url", "images", "custom_metadata", "published", "created", "updated". Example: ["external_id", "title", "description"]`, - }, - { - name: 'filter', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "title", "ids", "published"), operator (e.g. "contains", "any", "equals"), and value. Example: [{"fieldName": "title", "operator": "contains", "value": "shirt"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'catalogVariantFields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "external_id", "title", "description", "sku", "inventory_policy", "inventory_quantity", "price", "url", "image_full_url", "image_thumbnail_url", "images", "custom_metadata", "published", "created", "updated". Example: ["external_id", "title", "description"]` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "external_id", "title", "description", "price", "url", "image_full_url", "image_thumbnail_url", "images", "custom_metadata", "published", "created", "updated". Example: ["external_id", "title", "description"]` }, + { name: 'filter', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "title", "ids", "published"), operator (e.g. "contains", "any", "equals"), and value. Example: [{"fieldName": "title", "operator": "contains", "value": "shirt"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, { name: 'sort', type: 'string', required: false, description: `What to sort by.` }, ], }, @@ -326,66 +131,21 @@ To add a universal content block, add the following within that region, replacin name: 'klaviyomcp_get_email_template', description: `Get an email template with the given data. Returns attributes including the html or amp. You can view and edit a template in the Klaviyo UI at https://www.klaviyo.com/email-editor/{TEMPLATE_ID}/edit.`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'templateId', - type: 'string', - required: true, - description: `The ID of the template to return`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'templateId', type: 'string', required: true, description: `The ID of the template return` }, ], }, { name: 'klaviyomcp_get_events', description: `Get individual event records for a given filter such as a profile ID or metric ID. For aggregated data, prefer get_campaign_report or get_flow_report (performance metrics) or query_metric_aggregates (counts, sums, unique profiles). Only use this tool to inspect specific events or when the other tools don't support the dimension you need — in that case, only a small sample of events can be processed in context, so clearly tell the user the results are based on a limited sample.`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "timestamp", "event_properties", "datetime", "uuid". Example: ["timestamp", "event_properties", "datetime"]`, - }, - { - name: 'filter', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "metric_id", "profile_id", "datetime"), operator (e.g. "equals", "greater-than"), and value. Example: [{"fieldName": "metric_id", "operator": "equals", "value": "abc123"}]`, - }, - { - name: 'metricFields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "integration". Example: ["name", "created", "updated"]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: `Number of results to return per page (1-1000). Default is 10. Keep small (10-50) when processing results in context. Use larger values only when paginating to export or aggregate data outside of context.`, - }, - { - name: 'profileFields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "phone_number", "external_id", "first_name", "last_name", "organization", "locale", "title", "image", "created", "updated", "last_event_date", "location", "location.address1", "location.address2", "location.city", "location.country", "location.latitude", "location.longitude", "location.region", "location.zip", "location.timezone", "location.ip", "properties". Example: ["email", "phone_number", "external_id"]`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "timestamp", "event_properties", "datetime", "uuid". Example: ["timestamp", "event_properties", "datetime"]` }, + { name: 'filter', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "metric_id", "profile_id", "datetime"), operator (e.g. "equals", "greater-than"), and value. Example: [{"fieldName": "metric_id", "operator": "equals", "value": "abc123"}]` }, + { name: 'metricFields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "integration". Example: ["name", "created", "updated"]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, + { name: 'pageSize', type: 'integer', required: false, description: `Number of results to return per page (1-1000). Default is 10. Keep small (10-50) when processing results in context. Use larger values only when paginating to export or aggregate data outside of context.` }, + { name: 'profileFields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "phone_number", "external_id", "first_name", "last_name", "organization", "locale", "title", "image", "created", "updated", "last_event_date", "location", "location.address1", "location.address2", "location.city", "location.country", "location.latitude", "location.longitude", "location.region", "location.zip", "location.timezone", "location.ip", "properties". Example: ["email", "phone_number", "external_id"]` }, { name: 'sort', type: 'string', required: false, description: `What to sort by.` }, ], }, @@ -394,102 +154,32 @@ To add a universal content block, add the following within that region, replacin description: `Returns a flow by ID. You can view and edit a flow in the Klaviyo UI at https://www.klaviyo.com/flow/{FLOW_ID}/edit.`, params: [ { name: 'id', type: 'string', required: true, description: `No description.` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_get_flow_report', description: `Returns metrics data for flows with the given filters and within the given timeframe. Can return performance data such as opens, clicks, and conversions, etc. This tool will also give you information about each flow in the report, such as: flow name, trigger type, and flow ID.`, params: [ - { - name: 'conversionMetricId', - type: 'string', - required: true, - description: `ID of the metric to be used for conversion statistics. You can get available metrics IDs using the get_metrics tool and just requesting the 'name' field. Do not use any additional filters on the get_metrics tool. If a specific metric is not requested, use the ID of the metric named 'Placed Order'. If it doesn't exist, use any metric.`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'statistics', - type: 'array', - required: true, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "bounce_rate", "bounced", "bounced_or_failed", "bounced_or_failed_rate", "click_rate", "click_to_open_rate", "clicks", "clicks_unique", "conversion_rate", "conversion_uniques", "conversions", "delivered", "delivery_rate", "failed", "failed_rate", "open_rate", "opens", "opens_unique", "recipients", "spam_complaint_rate", "spam_complaints", "unsubscribe_rate", "unsubscribe_uniques", "unsubscribes". Example: ["bounce_rate", "bounced", "bounced_or_failed"]`, - }, - { - name: 'detailFilters', - type: 'array', - required: false, - description: `Array of detail filter objects. Each object must have fieldName ("name"), operator ("contains-any"), and value (array). Example: [{"fieldName": "name", "operator": "contains-any", "value": ["welcome"]}]`, - }, - { - name: 'filters', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "send_channel", "flow_id"), operator (e.g. "equals", "contains-any"), and value. Example: [{"fieldName": "send_channel", "operator": "equals", "value": "email"}]`, - }, - { - name: 'groupBy', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "flow_id", "flow_name", "flow_message_id", "flow_message_name", "send_channel", "tag_id", "tag_name", "text_message_format", "variation", "variation_name". Example: ["flow_id", "flow_name", "flow_message_id"]`, - }, - { - name: 'timeframe', - type: 'string', - required: false, - description: `The timeframe to query for data within. The max length a timeframe can be is 1 year. If unspecified, use 1 year.`, - }, - { - name: 'valueStatistics', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "average_order_value", "conversion_value", "revenue_per_recipient". Example: ["average_order_value", "conversion_value", "revenue_per_recipient"]`, - }, + { name: 'conversionMetricId', type: 'string', required: true, description: `ID of the metric to be used for conversion statistics. You can get available metrics IDs using the get_metrics tool and just requesting the 'name' field. Do not use any additional filters on the get_metrics tool. If a specific metric is not requested, use the ID of the metric named 'Placed Order'. If it doesn't exist, use any metric.` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'statistics', type: 'array', required: true, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "bounce_rate", "bounced", "bounced_or_failed", "bounced_or_failed_rate", "click_rate", "click_to_open_rate", "clicks", "clicks_unique", "conversion_rate", "conversion_uniques", "conversions", "delivered", "delivery_rate", "failed", "failed_rate", "open_rate", "opens", "opens_unique", "recipients", "spam_complaint_rate", "spam_complaints", "unsubscribe_rate", "unsubscribe_uniques", "unsubscribes". Example: ["bounce_rate", "bounced", "bounced_or_failed"]` }, + { name: 'detailFilters', type: 'array', required: false, description: `Array of detail filter objects. Each object must have fieldName ("name"), operator ("contains-any"), and value (array). Example: [{"fieldName": "name", "operator": "contains-any", "value": ["welcome"]}]` }, + { name: 'filters', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "send_channel", "flow_id"), operator (e.g. "equals", "contains-any"), and value. Example: [{"fieldName": "send_channel", "operator": "equals", "value": "email"}]` }, + { name: 'groupBy', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "flow_id", "flow_name", "flow_message_id", "flow_message_name", "send_channel", "tag_id", "tag_name", "text_message_format", "variation", "variation_name". Example: ["flow_id", "flow_name", "flow_message_id"]` }, + { name: 'timeframe', type: 'string', required: false, description: `The timeframe to query for data within. The max length a timeframe can be is 1 year. If unspecified, use 1 year.` }, + { name: 'valueStatistics', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "average_order_value", "conversion_value", "revenue_per_recipient". Example: ["average_order_value", "conversion_value", "revenue_per_recipient"]` }, ], }, { name: 'klaviyomcp_get_flows', description: `Returns some or all flows based on filters. You can view and edit a flow in the Klaviyo UI at https://www.klaviyo.com/flow/{FLOW_ID}/edit. Do not use this for queries related to the status of flows, reporting on flows, or flow performance data. For those use cases, use the get_flow_report tool.`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "status", "archived", "created", "updated", "trigger_type". Example: ["name", "status", "archived"]`, - }, - { - name: 'filters', - type: 'array', - required: false, - description: `Array of filter objects to narrow results. Each object must have fieldName (e.g. "status", "name", "trigger_type"), operator (e.g. "equals", "contains", "any"), and value. Example: [{"fieldName": "status", "operator": "equals", "value": "live"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: `Number of results to return per page (1-100)`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "status", "archived", "created", "updated", "trigger_type". Example: ["name", "status", "archived"]` }, + { name: 'filters', type: 'array', required: false, description: `Array of filter objects to narrow results. Each object must have fieldName (e.g. "status", "name", "trigger_type"), operator (e.g. "equals", "contains", "any"), and value. Example: [{"fieldName": "status", "operator": "equals", "value": "live"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, + { name: 'pageSize', type: 'integer', required: false, description: `Number of results to return per page (1-100)` }, ], }, { @@ -497,48 +187,18 @@ To add a universal content block, add the following within that region, replacin description: `Get a list with the given list ID. You can view and edit a list in the Klaviyo UI at https://www.klaviyo.com/lists/{LIST_ID}`, params: [ { name: 'id', type: 'string', required: true, description: `No description.` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'includeProfileCount', - type: 'boolean', - required: false, - description: `Whether to include the number of profiles. Only set to true if this is requested.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'includeProfileCount', type: 'boolean', required: false, description: `Whether to include the number of profiles. Only set to true if this is requested.` }, ], }, { name: 'klaviyomcp_get_lists', description: `Get all lists in an account. To filter by tag, do not use the 'filters' parameter. Instead, call this and look for the 'tags' property in the response. You can view and edit a list in the Klaviyo UI at https://www.klaviyo.com/lists/{LIST_ID}`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "opt_in_process". Example: ["name", "created", "updated"]`, - }, - { - name: 'filter', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "name", "id"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "name", "operator": "equals", "value": "My List"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "opt_in_process". Example: ["name", "created", "updated"]` }, + { name: 'filter', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "name", "id"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "name", "operator": "equals", "value": "My List"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, { name: 'sort', type: 'string', required: false, description: `What to sort by.` }, ], }, @@ -546,48 +206,18 @@ To add a universal content block, add the following within that region, replacin name: 'klaviyomcp_get_metric', description: `Get a metric with the given metric ID. You can view and edit a metric in the Klaviyo UI at https://www.klaviyo.com/metric/{METRIC_ID}/{METRIC_NAME}`, params: [ - { - name: 'metricId', - type: 'string', - required: true, - description: `The ID of the metric to return`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'metricId', type: 'string', required: true, description: `The ID of the metric to return` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_get_metrics', description: `Get all metrics in an account. You can view and edit a metric in the Klaviyo UI at https://www.klaviyo.com/metric/{METRIC_ID}/{METRIC_NAME}`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "integration". Example: ["name", "created", "updated"]`, - }, - { - name: 'filter', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "integration.name", "integration.category"), operator ("equals"), and value. Example: [{"fieldName": "integration.name", "operator": "equals", "value": "Shopify"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "created", "updated", "integration". Example: ["name", "created", "updated"]` }, + { name: 'filter', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "integration.name", "integration.category"), operator ("equals"), and value. Example: [{"fieldName": "integration.name", "operator": "equals", "value": "Shopify"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, ], }, { @@ -595,48 +225,18 @@ To add a universal content block, add the following within that region, replacin description: `Get details of the profile with the given profile ID. Includes additional information about their subscriptions. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}`, params: [ { name: 'id', type: 'string', required: true, description: `The profile ID to retrieve.` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_get_profiles', description: `Get all profiles in an account. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "phone_number", "external_id", "first_name", "last_name", "organization", "locale", "title", "image", "created", "updated", "last_event_date", "location", "location.address1", "location.address2", "location.city", "location.country", "location.latitude", "location.longitude", "location.region", "location.zip", "location.timezone", "location.ip", "properties". Example: ["email", "phone_number", "external_id"]`, - }, - { - name: 'filters', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "email", "id", "phone_number"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "email", "operator": "equals", "value": "user@example.com"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: `Number of results to return per page (1-100)`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "phone_number", "external_id", "first_name", "last_name", "organization", "locale", "title", "image", "created", "updated", "last_event_date", "location", "location.address1", "location.address2", "location.city", "location.country", "location.latitude", "location.longitude", "location.region", "location.zip", "location.timezone", "location.ip", "properties". Example: ["email", "phone_number", "external_id"]` }, + { name: 'filters', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "email", "id", "phone_number"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "email", "operator": "equals", "value": "user@example.com"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, + { name: 'pageSize', type: 'integer', required: false, description: `Number of results to return per page (1-100)` }, { name: 'sort', type: 'string', required: false, description: `What to sort by.` }, ], }, @@ -644,49 +244,19 @@ To add a universal content block, add the following within that region, replacin name: 'klaviyomcp_get_segment', description: `Get a segment with the given segment ID. You can view and edit a segment in the Klaviyo UI at https://www.klaviyo.com/lists/{SEGMENT_ID}`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, { name: 'segmentId', type: 'string', required: true, description: `No description.` }, - { - name: 'includeProfileCount', - type: 'boolean', - required: false, - description: `Whether to include the number of profiles. Only set to true if this is requested.`, - }, + { name: 'includeProfileCount', type: 'boolean', required: false, description: `Whether to include the number of profiles. Only set to true if this is requested.` }, ], }, { name: 'klaviyomcp_get_segments', description: `Get all segments in an account. To filter by tag, do not use the 'filters' parameter. Instead, call this and look for the 'tags' property in the response. You can view and edit a segment in the Klaviyo UI at https://www.klaviyo.com/lists/{SEGMENT_ID}`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'fields', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "definition", "definition.condition_groups", "created", "updated", "is_active", "is_processing", "is_starred". Example: ["name", "definition", "definition.condition_groups"]`, - }, - { - name: 'filters', - type: 'array', - required: false, - description: `Array of filter objects. Each object must have fieldName (e.g. "name", "id", "is_active"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "name", "operator": "equals", "value": "Active Users"}]`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'fields', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "name", "definition", "definition.condition_groups", "created", "updated", "is_active", "is_processing", "is_starred". Example: ["name", "definition", "definition.condition_groups"]` }, + { name: 'filters', type: 'array', required: false, description: `Array of filter objects. Each object must have fieldName (e.g. "name", "id", "is_active"), operator (e.g. "equals", "any"), and value. Example: [{"fieldName": "name", "operator": "equals", "value": "Active Users"}]` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, { name: 'sort', type: 'string', required: false, description: `What to sort by.` }, ], }, @@ -694,60 +264,20 @@ To add a universal content block, add the following within that region, replacin name: 'klaviyomcp_get_translation', description: `Get a translation collection by ID. Returns localization settings (source/target locales, channel, fallback). Set includeValues to true to also get the translation values (source text and translations per locale for each translatable field).`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'translationId', - type: 'string', - required: true, - description: `The ID of the translation`, - }, - { - name: 'include', - type: 'string', - required: false, - description: `Related resource to include in the response`, - }, - { - name: 'includeValues', - type: 'boolean', - required: false, - description: `Include translation values (source text and translations per locale)`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'translationId', type: 'string', required: true, description: `The ID of the translation` }, + { name: 'include', type: 'string', required: false, description: `Related resource to include in the response` }, + { name: 'includeValues', type: 'boolean', required: false, description: `Include translation values (source text and translations per locale)` }, ], }, { name: 'klaviyomcp_get_translations', description: `List all translation collections in the account. Each translation links a Klaviyo resource (campaign variation, flow message, template, etc.) to its localization settings. Supports filtering by channel, resource_type, and related_resource_id.`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'filter', - type: 'string', - required: false, - description: `Filter string, e.g. equals(channel,"email") or equals(resource_type,"campaign-variation")`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Cursor for pagination (from previous response)`, - }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: `Page size (1-100, default 20)`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'filter', type: 'string', required: false, description: `Filter string, e.g. equals(channel,"email") or equals(resource_type,"campaign-variation")` }, + { name: 'pageCursor', type: 'string', required: false, description: `Cursor for pagination (from previous response)` }, + { name: 'pageSize', type: 'number', required: false, description: `Page size (1-100, default 20)` }, ], }, { @@ -768,156 +298,41 @@ Examples of appropriate use cases: - Unique profile counts grouped by campaign or message - Custom metric aggregations not available in standard reports`, params: [ - { - name: 'endDate', - type: 'string', - required: true, - description: `End of the date range (exclusive) in ISO 8601 format without timezone offset, e.g. '2024-12-31T23:59:59'. Do not include a 'Z' suffix or timezone offset; use the timezone parameter instead. The date range must not exceed 1 year.`, - }, - { - name: 'measurements', - type: 'array', - required: true, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "count", "sum_value", "unique". Example: ["count", "sum_value", "unique"]`, - }, - { - name: 'metricId', - type: 'string', - required: true, - description: `The ID of the metric to aggregate. Use the get_metrics tool to find available metric IDs. Common metrics include 'Placed Order', 'Opened Email', 'Clicked Email', etc.`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'startDate', - type: 'string', - required: true, - description: `Start of the date range (inclusive) in ISO 8601 format without timezone offset, e.g. '2024-01-01T00:00:00'. Do not include a 'Z' suffix or timezone offset; use the timezone parameter instead. The date range must not exceed 1 year.`, - }, - { - name: 'additionalFilter', - type: 'string', - required: false, - description: `Optional structured filter to narrow results by a single dimension. Only one additional filter is supported by the API.`, - }, - { - name: 'groupBy', - type: 'array', - required: false, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "$attributed_channel", "$attributed_flow", "$attributed_message", "$attributed_variation", "$campaign_channel", "$flow", "$flow_channel", "$message", "$message_send_cohort", "$usage_amount", "$value_currency", "$variation", "$variation_send_cohort", "Bot Click", "Bounce Type", "Campaign Name", "Client Canonical", "Client Name", "Client Type", "Email Domain", "Failure Source", "Failure Type", "From Number", "From Phone Region", "Inbox Provider", "List", "Message Name", "Message Type", "Method", "Segment Count", "Subject", "To Number", "To Phone Region", "URL", "form_id". Example: ["$attributed_channel", "$attributed_flow", "$attributed_message"]`, - }, - { - name: 'interval', - type: 'string', - required: false, - description: `Time interval for grouping results: 'hour', 'day' (default), 'week', or 'month'`, - }, - { - name: 'pageCursor', - type: 'string', - required: false, - description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.`, - }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: `Number of rows per page. Must be between 500 and 10,000 (default 500).`, - }, - { - name: 'sort', - type: 'string', - required: false, - description: `Sort results by a grouping dimension. Prefix with '-' for descending order (e.g., '-$attributed_flow'). The sort value must also be included in the 'groupBy' parameter. Only dimension-based sorting is supported.`, - }, - { - name: 'timezone', - type: 'string', - required: false, - description: `Timezone for processing the query (e.g., 'America/New_York', 'US/Eastern'). Defaults to UTC.`, - }, + { name: 'endDate', type: 'string', required: true, description: `End of the date range (exclusive) in ISO 8601 format without timezone offset, e.g. '2024-12-31T23:59:59'. Do not include a 'Z' suffix or timezone offset; use the timezone parameter instead. The date range must not exceed 1 year.` }, + { name: 'measurements', type: 'array', required: true, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "count", "sum_value", "unique". Example: ["count", "sum_value", "unique"]` }, + { name: 'metricId', type: 'string', required: true, description: `The ID of the metric to aggregate. Use the get_metrics tool to find available metric IDs. Common metrics include 'Placed Order', 'Opened Email', 'Clicked Email', etc.` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'startDate', type: 'string', required: true, description: `Start of the date range (inclusive) in ISO 8601 format without timezone offset, e.g. '2024-01-01T00:00:00'. Do not include a 'Z' suffix or timezone offset; use the timezone parameter instead. The date range must not exceed 1 year.` }, + { name: 'additionalFilter', type: 'string', required: false, description: `Optional structured filter to narrow results by a single dimension. Only one additional filter is supported by the API.` }, + { name: 'groupBy', type: 'array', required: false, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "$attributed_channel", "$attributed_flow", "$attributed_message", "$attributed_variation", "$campaign_channel", "$flow", "$flow_channel", "$message", "$message_send_cohort", "$usage_amount", "$value_currency", "$variation", "$variation_send_cohort", "Bot Click", "Bounce Type", "Campaign Name", "Client Canonical", "Client Name", "Client Type", "Email Domain", "Failure Source", "Failure Type", "From Number", "From Phone Region", "Inbox Provider", "List", "Message Name", "Message Type", "Method", "Segment Count", "Subject", "To Number", "To Phone Region", "URL", "form_id". Example: ["$attributed_channel", "$attributed_flow", "$attributed_message"]` }, + { name: 'interval', type: 'string', required: false, description: `Time interval for grouping results: 'hour', 'day' (default), 'week', or 'month'` }, + { name: 'pageCursor', type: 'string', required: false, description: `Only used for pagination. If links.next is null then you've reached the last page of results. Otherwise, pass links.next to this parameter to get the next page.` }, + { name: 'pageSize', type: 'integer', required: false, description: `Number of rows per page. Must be between 500 and 10,000 (default 500).` }, + { name: 'sort', type: 'string', required: false, description: `Sort results by a grouping dimension. Prefix with '-' for descending order (e.g., '-$attributed_flow'). The sort value must also be included in the 'groupBy' parameter. Only dimension-based sorting is supported.` }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for processing the query (e.g., 'America/New_York', 'US/Eastern'). Defaults to UTC.` }, ], }, { name: 'klaviyomcp_subscribe_profile_to_marketing', description: `Subscribe a profile to marketing for a given channel. If a profile doesn't already exist, it will be created. Returns 'Success' if successful.`, params: [ - { - name: 'channels', - type: 'array', - required: true, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "sms". Example: ["email", "sms"]`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'emailAddress', - type: 'string', - required: false, - description: `The email address of the profile to subscribe. Required if email channel is included.`, - }, - { - name: 'listId', - type: 'string', - required: false, - description: `The ID of the list to subscribe the profile to if provided.`, - }, - { - name: 'phoneNumber', - type: 'string', - required: false, - description: `The phone number of the profile to subscribe. Required if sms channel is included.`, - }, - { - name: 'profileId', - type: 'string', - required: false, - description: `The ID of the profile to subscribe if the profile already exists and has an ID.`, - }, + { name: 'channels', type: 'array', required: true, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "sms". Example: ["email", "sms"]` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'emailAddress', type: 'string', required: false, description: `The email address of the profile to subscribe. Required if email channel is included.` }, + { name: 'listId', type: 'string', required: false, description: `The ID of the list to subscribe the profile to if provided.` }, + { name: 'phoneNumber', type: 'string', required: false, description: `The phone number of the profile to subscribe. Required if sms channel is included.` }, + { name: 'profileId', type: 'string', required: false, description: `The ID of the profile to subscribe if the profile already exists and has an ID.` }, ], }, { name: 'klaviyomcp_unsubscribe_profile_from_marketing', description: `Unsubscribe a profile from marketing for a given channel. Returns 'Success' if successful.`, params: [ - { - name: 'channels', - type: 'array', - required: true, - description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "sms". Example: ["email", "sms"]`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'emailAddress', - type: 'string', - required: false, - description: `The email address of the profile to unsubscribe. Required if email channel is included.`, - }, - { - name: 'listId', - type: 'string', - required: false, - description: `The ID of the list to unsubscribe the profile from if provided.`, - }, - { - name: 'phoneNumber', - type: 'string', - required: false, - description: `The phone number of the profile to unsubscribe. Required if sms channel is included.`, - }, + { name: 'channels', type: 'array', required: true, description: `Array of strings to include in the response. Pass as a JSON array. Accepted values: "email", "sms". Example: ["email", "sms"]` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'emailAddress', type: 'string', required: false, description: `The email address of the profile to unsubscribe. Required if email channel is included.` }, + { name: 'listId', type: 'string', required: false, description: `The ID of the list to unsubscribe the profile to if provided.` }, + { name: 'phoneNumber', type: 'string', required: false, description: `The phone number of the profile to unsubscribe. Required if sms channel is included.` }, ], }, { @@ -925,78 +340,28 @@ Examples of appropriate use cases: description: `Update the profile with the given profile ID. You can view and edit a profile in the Klaviyo UI at https://www.klaviyo.com/profile/{PROFILE_ID}`, params: [ { name: 'input', type: 'object', required: true, description: `ProfilePartialUpdateQuery` }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, ], }, { name: 'klaviyomcp_update_translation', description: `Update a translation's settings and/or import translation values. All attributes are optional — only provided fields are updated. To import values, first call get_translation with includeValues=true, then provide the values array with updated translations. Each value has an 'id' (composite key like 'scheduled_message::abc::subject') and a 'translations' object mapping locale codes to translated text.`, params: [ - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'translationId', - type: 'string', - required: true, - description: `The ID of the translation to update`, - }, - { - name: 'fallbackLocale', - type: 'string', - required: false, - description: `Updated fallback locale`, - }, - { - name: 'sourceLocale', - type: 'string', - required: false, - description: `Updated source locale`, - }, - { - name: 'targetLocales', - type: 'array', - required: false, - description: `Updated target locales. Pass as a JSON array of values.`, - }, - { - name: 'values', - type: 'array', - required: false, - description: `Translation values to import. Pass as a JSON array of values.`, - }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'translationId', type: 'string', required: true, description: `The ID of the translation to update` }, + { name: 'fallbackLocale', type: 'string', required: false, description: `Updated fallback locale` }, + { name: 'sourceLocale', type: 'string', required: false, description: `Updated source locale` }, + { name: 'targetLocales', type: 'array', required: false, description: `Updated target locales. Pass as a JSON array of values.` }, + { name: 'values', type: 'array', required: false, description: `Translation values to import. Pass as a JSON array of values.` }, ], }, { name: 'klaviyomcp_upload_image_from_url', description: `Upload an image from a URL or data URI.`, params: [ - { - name: 'imageURL', - type: 'string', - required: true, - description: `The URL of the image to upload`, - }, - { - name: 'model', - type: 'string', - required: true, - description: `The name of the LLM currently using the tool.`, - }, - { - name: 'name', - type: 'string', - required: false, - description: `A name for the image. Defaults to the filename if omitted.`, - }, + { name: 'imageURL', type: 'string', required: true, description: `The URL of the image to upload` }, + { name: 'model', type: 'string', required: true, description: `The name of the LLM currently using the tool.` }, + { name: 'name', type: 'string', required: false, description: `A name for the image. Defaults to the filename if omitted.` }, ], }, ] diff --git a/src/data/agent-connectors/leadiq.ts b/src/data/agent-connectors/leadiq.ts index 02fa2721a..ba9c195e7 100644 --- a/src/data/agent-connectors/leadiq.ts +++ b/src/data/agent-connectors/leadiq.ts @@ -5,19 +5,19 @@ export const tools: Tool[] = [ name: 'leadiq_add_prospect_to_list', description: `Add a contact to an existing LeadIQ prospect list. Provide first name, last name, and any known contact details. Use Get Prospect Lists to find the list ID.`, params: [ - { name: 'list_id', type: 'string', required: true, description: `ID of the prospect list to add the contact to` }, { name: 'first_name', type: 'string', required: true, description: `First name of the prospect` }, { name: 'last_name', type: 'string', required: true, description: `Last name of the prospect` }, - { name: 'work_email', type: 'string', required: false, description: `Work email address of the prospect` }, - { name: 'work_phone', type: 'string', required: false, description: `Work phone number of the prospect` }, - { name: 'mobile_phone', type: 'string', required: false, description: `Mobile phone number of the prospect` }, - { name: 'title', type: 'string', required: false, description: `Job title of the prospect` }, - { name: 'seniority', type: 'string', required: false, description: `Seniority level of the prospect` }, + { name: 'list_id', type: 'string', required: true, description: `ID of the prospect list to add the contact to` }, { name: 'company', type: 'string', required: false, description: `Current company name of the prospect` }, { name: 'company_domain', type: 'string', required: false, description: `Website domain of the prospect's company` }, { name: 'company_industry', type: 'string', required: false, description: `Industry of the prospect's company` }, { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn profile URL of the prospect` }, + { name: 'mobile_phone', type: 'string', required: false, description: `Mobile phone number of the prospect` }, { name: 'notes', type: 'string', required: false, description: `Internal notes about this prospect` }, + { name: 'seniority', type: 'string', required: false, description: `Seniority level of the prospect` }, + { name: 'title', type: 'string', required: false, description: `Job title of the prospect` }, + { name: 'work_email', type: 'string', required: false, description: `Work email address of the prospect` }, + { name: 'work_phone', type: 'string', required: false, description: `Work phone number of the prospect` }, ], }, { @@ -32,34 +32,35 @@ export const tools: Tool[] = [ name: 'leadiq_flat_advanced_search', description: `Search across LeadIQ's full contact database using advanced filters for title, seniority, company, industry, location, and more. Returns a flat list of matching contacts. Consumes credits per result.`, params: [ - { name: 'contact_filter', type: 'object', required: false, description: `Filter contacts by title, seniority, role, location, and more` }, + { name: 'company_excluded_filter', type: 'object', required: false, description: `Exclude contacts at companies matching these criteria` }, { name: 'company_filter', type: 'object', required: false, description: `Filter by company attributes including name, domain, industry, size, and location` }, { name: 'contact_excluded_filter', type: 'object', required: false, description: `Exclude contacts matching these criteria` }, - { name: 'company_excluded_filter', type: 'object', required: false, description: `Exclude contacts at companies matching these criteria` }, - { name: 'skip', type: 'integer', required: false, description: `Number of results to skip for pagination (default 0)` }, + { name: 'contact_filter', type: 'object', required: false, description: `Filter contacts by title, seniority, role, location, and more` }, { name: 'limit', type: 'integer', required: false, description: `Maximum number of contacts to return (default 10)` }, + { name: 'skip', type: 'integer', required: false, description: `Number of results to skip for pagination (default 0)` }, ], }, { name: 'leadiq_get_account', description: `Retrieve the current LeadIQ account details including active plans, product subscriptions, billing status, and credit usage (available and used). Use this to check remaining search credits before making enrichment calls.`, - params: [], + params: [ + ], }, { name: 'leadiq_get_list', description: `Retrieve a specific prospect list by ID, including its contacts with name, title, company, email, and LinkedIn URL. Use Get Prospect Lists first to find the list ID.`, params: [ { name: 'id', type: 'string', required: true, description: `ID of the prospect list to retrieve` }, - { name: 'prospects_limit', type: 'integer', required: false, description: `Maximum number of prospects to return from the list (default 25)` }, { name: 'prospects_cursor', type: 'string', required: false, description: `Pagination cursor from a previous response to get the next batch of prospects` }, + { name: 'prospects_limit', type: 'integer', required: false, description: `Maximum number of prospects to return from the list (default 25)` }, ], }, { name: 'leadiq_get_lists', description: `Retrieve all prospect lists in the LeadIQ account. Returns list metadata including name, status, and timestamps. Use the returned list IDs with Get Prospect List to fetch contacts.`, params: [ - { name: 'limit', type: 'integer', required: false, description: `Maximum number of lists to return per page` }, { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from a previous response's nextCursor field` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of lists to return per page` }, ], }, { @@ -72,29 +73,30 @@ export const tools: Tool[] = [ { name: 'leadiq_get_usage', description: `Retrieve API credit usage for the current billing period — plan credit counts, usage caps, trial usage, and subscription status. Use this to monitor quota before making credit-consuming calls.`, - params: [], + params: [ + ], }, { name: 'leadiq_grouped_advanced_search', description: `Search LeadIQ's contact database with advanced filters and get results grouped by company. Each result contains a company record with its top matching contacts. Useful for account-based prospecting. Consumes credits per contact returned.`, params: [ - { name: 'contact_filter', type: 'object', required: false, description: `Filter contacts by title, seniority, role, location, and more` }, + { name: 'company_excluded_filter', type: 'object', required: false, description: `Exclude companies matching these criteria` }, { name: 'company_filter', type: 'object', required: false, description: `Filter by company name, domain, industry, size, location, and more` }, { name: 'contact_excluded_filter', type: 'object', required: false, description: `Exclude contacts matching these criteria` }, - { name: 'company_excluded_filter', type: 'object', required: false, description: `Exclude companies matching these criteria` }, - { name: 'skip', type: 'integer', required: false, description: `Number of companies to skip for pagination (default 0)` }, + { name: 'contact_filter', type: 'object', required: false, description: `Filter contacts by title, seniority, role, location, and more` }, { name: 'limit', type: 'integer', required: false, description: `Maximum number of companies to return (default 10)` }, { name: 'limit_per_company', type: 'integer', required: false, description: `Maximum number of contacts to return per company (default 5)` }, + { name: 'skip', type: 'integer', required: false, description: `Number of companies to skip for pagination (default 0)` }, ], }, { name: 'leadiq_search_company', description: `Search for a company by name, domain, or LinkedIn URL. Returns firmographic data including employee count, industry, headquarters location, and funding information.`, params: [ - { name: 'name', type: 'string', required: false, description: `Company name to search for` }, { name: 'domain', type: 'string', required: false, description: `Company website domain` }, - { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn company page URL` }, { name: 'linkedin_id', type: 'string', required: false, description: `LinkedIn company numeric ID` }, + { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn company page URL` }, + { name: 'name', type: 'string', required: false, description: `Company name to search for` }, { name: 'strict', type: 'boolean', required: false, description: `Enable strict matching — only return exact name or domain matches` }, ], }, @@ -102,29 +104,29 @@ export const tools: Tool[] = [ name: 'leadiq_search_people', description: `Search for a person by LinkedIn URL, email, or name + company. At least one of: linkedin_url, email, or first_name+last_name must be provided. Returns verified work emails, direct dials, and current job details. Consumes LeadIQ credits per result.`, params: [ + { name: 'company_domain', type: 'string', required: false, description: `Domain of the person's current company` }, + { name: 'company_name', type: 'string', required: false, description: `Current company name of the person` }, + { name: 'contains_work_contact_info', type: 'boolean', required: false, description: `Only return results that have at least one work email or work phone` }, + { name: 'email', type: 'string', required: false, description: `Known email address of the person` }, { name: 'first_name', type: 'string', required: false, description: `First name of the person to search for` }, - { name: 'last_name', type: 'string', required: false, description: `Last name of the person to search for` }, { name: 'full_name', type: 'string', required: false, description: `Full name of the person (alternative to first_name + last_name)` }, - { name: 'email', type: 'string', required: false, description: `Known email address of the person` }, + { name: 'last_name', type: 'string', required: false, description: `Last name of the person to search for` }, + { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return (default 10, max 25)` }, { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn profile URL of the person` }, - { name: 'company_name', type: 'string', required: false, description: `Current company name of the person` }, - { name: 'company_domain', type: 'string', required: false, description: `Domain of the person's current company` }, - { name: 'contains_work_contact_info', type: 'boolean', required: false, description: `Only return results that have at least one work email or work phone` }, { name: 'skip', type: 'integer', required: false, description: `Number of results to skip for pagination (default 0)` }, - { name: 'limit', type: 'integer', required: false, description: `Maximum number of results to return (default 10, max 25)` }, ], }, { name: 'leadiq_search_people_preview', description: `Check whether LeadIQ has a work email or phone number for a person without consuming credits. Use this before calling Search People to avoid wasting credits on contacts with no data.`, params: [ - { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn profile URL of the person` }, + { name: 'company_domain', type: 'string', required: false, description: `Domain of the person's current company` }, + { name: 'company_name', type: 'string', required: false, description: `Current company name of the person` }, { name: 'email', type: 'string', required: false, description: `Known email address of the person` }, - { name: 'full_name', type: 'string', required: false, description: `Full name of the person` }, { name: 'first_name', type: 'string', required: false, description: `First name of the person` }, + { name: 'full_name', type: 'string', required: false, description: `Full name of the person` }, { name: 'last_name', type: 'string', required: false, description: `Last name of the person` }, - { name: 'company_name', type: 'string', required: false, description: `Current company name of the person` }, - { name: 'company_domain', type: 'string', required: false, description: `Domain of the person's current company` }, + { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn profile URL of the person` }, ], }, { @@ -132,14 +134,14 @@ export const tools: Tool[] = [ description: `Report incorrect or outdated contact data back to LeadIQ to improve data quality. Mark an email or phone as correct or invalid, and optionally provide a correction or bounce reason.`, params: [ { name: 'value', type: 'string', required: true, description: `The contact info value being reported (email address or phone number)` }, - { name: 'status', type: 'string', required: false, description: `Whether the contact info is correct or invalid` }, - { name: 'type', type: 'string', required: false, description: `Type of contact information being reported` }, - { name: 'person_id', type: 'string', required: false, description: `LeadIQ person ID associated with the contact info` }, - { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn URL of the person the feedback is about` }, - { name: 'company_name', type: 'string', required: false, description: `Company name for additional context` }, { name: 'company_domain', type: 'string', required: false, description: `Company domain for additional context` }, - { name: 'title', type: 'string', required: false, description: `Job title of the person at the time the contact info was used` }, + { name: 'company_name', type: 'string', required: false, description: `Company name for additional context` }, { name: 'invalid_reason', type: 'string', required: false, description: `Specific bounce or invalidity reason code (for invalid emails)` }, + { name: 'linkedin_url', type: 'string', required: false, description: `LinkedIn URL of the person the feedback is about` }, + { name: 'person_id', type: 'string', required: false, description: `LeadIQ person ID associated with the contact info` }, + { name: 'status', type: 'string', required: false, description: `Whether the contact info is correct or invalid` }, + { name: 'title', type: 'string', required: false, description: `Job title of the person at the time the contact info was used` }, + { name: 'type', type: 'string', required: false, description: `Type of contact information being reported` }, ], }, ] diff --git a/src/data/agent-connectors/mailchimp.ts b/src/data/agent-connectors/mailchimp.ts index 864770ef6..40191d2d5 100644 --- a/src/data/agent-connectors/mailchimp.ts +++ b/src/data/agent-connectors/mailchimp.ts @@ -1,1339 +1,465 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ - // ─── Account ────────────────────────────────────────────────────────────────── - { - name: 'mailchimp_ping', - description: - 'Health check — returns a simple "Everything\'s Chimpy!" response if your API key is valid.', - params: [], - }, { name: 'mailchimp_account_info', - description: - 'Retrieve details about the authenticated Mailchimp account, including plan, contact info, and industry.', - params: [], + description: `Retrieve details about the connected Mailchimp account, including username, contact info, and plan details.`, + params: [ + { name: 'fields', type: 'string', required: false, description: `Comma-separated list of fields to return.` }, + ], }, - - // ─── Audiences (Lists) ──────────────────────────────────────────────────────── { - name: 'mailchimp_lists_list', - description: - 'List all Mailchimp audiences (lists) in the account with pagination and filtering options.', + name: 'mailchimp_automation_get', + description: `Retrieve details about a specific classic automation in Mailchimp.`, params: [ - { - name: 'count', - type: 'number', - required: false, - description: 'Number of audiences to return (default 10, max 1000).', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'sort_field', - type: 'string', - required: false, - description: 'Sort audiences by field: `date_created` or `campaign_last_sent`.', - }, - { - name: 'sort_dir', - type: 'string', - required: false, - description: 'Sort direction: `ASC` or `DESC`.', - }, - { - name: 'before_date_created', - type: 'string', - required: false, - description: 'Filter audiences created before this ISO 8601 datetime.', - }, + { name: 'workflow_id', type: 'string', required: true, description: `The ID of the automation. Get it from \`mailchimp_automations_list\`.` }, ], }, { - name: 'mailchimp_list_get', - description: 'Retrieve details about a specific Mailchimp audience by its list ID.', + name: 'mailchimp_automation_pause', + description: `Pause all emails in a Mailchimp classic automation.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience. Get it from `mailchimp_lists_list`.', - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include in the response.', - }, + { name: 'workflow_id', type: 'string', required: true, description: `The ID of the automation. Get it from \`mailchimp_automations_list\`.` }, ], }, { - name: 'mailchimp_list_create', - description: - 'Create a new Mailchimp audience. Requires a contact address and campaign defaults. Note: free plans allow only one audience.', + name: 'mailchimp_automation_start', + description: `Start all emails in a Mailchimp classic automation.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: 'The name of the audience.', - }, - { - name: 'permission_reminder', - type: 'string', - required: true, - description: - 'A reminder for subscribers about why they were added (e.g. "You subscribed to our newsletter.").', - }, - { - name: 'from_name', - type: 'string', - required: true, - description: 'Default sender display name for campaigns.', - }, - { - name: 'from_email', - type: 'string', - required: true, - description: 'Default sender email address (must be verified).', - }, - { - name: 'email_type_option', - type: 'boolean', - required: true, - description: 'Set to `true` to let subscribers choose HTML or plain text email format.', - }, - { - name: 'contact_company', - type: 'string', - required: true, - description: 'Company name for the audience contact address.', - }, - { - name: 'contact_address', - type: 'string', - required: true, - description: 'Street address for the audience contact address.', - }, - { - name: 'contact_city', - type: 'string', - required: true, - description: 'City for the audience contact address.', - }, - { - name: 'contact_state', - type: 'string', - required: true, - description: 'State or province for the audience contact address.', - }, - { - name: 'contact_zip', - type: 'string', - required: true, - description: 'ZIP or postal code for the audience contact address.', - }, - { - name: 'contact_country', - type: 'string', - required: true, - description: 'Two-letter ISO country code for the audience contact address (e.g. `US`).', - }, - { - name: 'subject', - type: 'string', - required: false, - description: 'Default campaign subject line.', - }, - { - name: 'language', - type: 'string', - required: false, - description: 'Default language for the audience (ISO 639-1 code, e.g. `en`).', - }, + { name: 'workflow_id', type: 'string', required: true, description: `The ID of the automation. Get it from \`mailchimp_automations_list\`.` }, ], }, { - name: 'mailchimp_list_update', - description: - 'Update settings for a Mailchimp audience such as name, permission reminder, or sender details.', + name: 'mailchimp_automations_list', + description: `Return a summary of all classic automations (Email Series) in the Mailchimp account.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience. Get it from `mailchimp_lists_list`.', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'Updated audience name.', - }, - { - name: 'permission_reminder', - type: 'string', - required: false, - description: 'Updated permission reminder text.', - }, - { - name: 'from_name', - type: 'string', - required: false, - description: 'Updated default sender display name.', - }, - { - name: 'from_email', - type: 'string', - required: false, - description: 'Updated default sender email address.', - }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'status', type: 'string', required: false, description: `Filter by automation status: \`save\`, \`paused\`, \`sending\`.` }, ], }, { - name: 'mailchimp_list_delete', - description: - 'Permanently delete a Mailchimp audience and all its member data. This action is irreversible.', + name: 'mailchimp_batch_status_get', + description: `Check the status of a Mailchimp batch operation. Use this to poll the result of a previously submitted batch request.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience to delete.', - }, + { name: 'batch_id', type: 'string', required: true, description: `The ID of the batch operation. Returned when a batch is created via the Mailchimp API.` }, ], }, - - // ─── Members ────────────────────────────────────────────────────────────────── { - name: 'mailchimp_list_members_list', - description: - 'List all members of a Mailchimp audience with filtering by status, segment, and pagination.', + name: 'mailchimp_campaign_content_get', + description: `Retrieve the content (HTML, plain text, or template) of a Mailchimp campaign.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience. Get it from `mailchimp_lists_list`.', - }, - { - name: 'status', - type: 'string', - required: false, - description: - 'Filter by subscription status: `subscribed`, `unsubscribed`, `cleaned`, `pending`, or `transactional`.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of members to return (default 10, max 1000).', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'email_address', - type: 'string', - required: false, - description: 'Filter to a specific email address.', - }, - { - name: 'since_last_changed', - type: 'string', - required: false, - description: 'Filter members changed after this ISO 8601 datetime.', - }, - { - name: 'segment_id', - type: 'string', - required: false, - description: 'Filter members in a specific segment.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, ], }, { - name: 'mailchimp_list_member_get', - description: - 'Retrieve information about a specific audience member by their MD5-hashed email address.', + name: 'mailchimp_campaign_content_set', + description: `Set the HTML or plain text content of a Mailchimp campaign.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: - "The MD5 hash of the member's email address (lowercase). Get it from `mailchimp_list_members_list`.", - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'html', type: 'string', required: false, description: `Full HTML content for the campaign.` }, + { name: 'plain_text', type: 'string', required: false, description: `Plain text version of the campaign content.` }, + { name: 'template_id', type: 'string', required: false, description: `ID of a saved Mailchimp template to use. Get it from \`mailchimp_templates_list\`.` }, ], }, { - name: 'mailchimp_list_member_add', - description: 'Add a new member to a Mailchimp audience.', + name: 'mailchimp_campaign_create', + description: `Create a new Mailchimp campaign (regular, plaintext, A/B split, RSS, or variate).`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'email_address', - type: 'string', - required: true, - description: "The member's email address.", - }, - { - name: 'status', - type: 'string', - required: true, - description: 'Subscription status: `subscribed`, `unsubscribed`, `cleaned`, or `pending`.', - }, - { - name: 'first_name', - type: 'string', - required: false, - description: "Member's first name.", - }, - { - name: 'last_name', - type: 'string', - required: false, - description: "Member's last name.", - }, - { - name: 'tags', - type: 'string', - required: false, - description: 'JSON array of tags to apply (e.g. `["vip","beta"]`).', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience to send to. Get it from \`mailchimp_lists_list\`.` }, + { name: 'type', type: 'string', required: true, description: `Campaign type: \`regular\`, \`plaintext\`, \`absplit\`, \`rss\`, \`variate\`.` }, + { name: 'from_name', type: 'string', required: false, description: `The 'from' name for the campaign.` }, + { name: 'preview_text', type: 'string', required: false, description: `Preview text displayed in the inbox.` }, + { name: 'reply_to', type: 'string', required: false, description: `The reply-to email address.` }, + { name: 'segment_id', type: 'string', required: false, description: `ID of a segment to send to (optional). Get it from \`mailchimp_segments_list\`.` }, + { name: 'subject_line', type: 'string', required: false, description: `The subject line for the campaign.` }, + { name: 'title', type: 'string', required: false, description: `The internal title for this campaign (not shown to subscribers).` }, ], }, { - name: 'mailchimp_list_member_update', - description: "Update an existing audience member's details such as email, status, or name.", + name: 'mailchimp_campaign_delete', + description: `Remove a campaign from a Mailchimp account. Only campaigns in draft or removed status can be deleted.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: "MD5 hash of the member's email address (lowercase).", - }, - { - name: 'status', - type: 'string', - required: false, - description: - 'Updated subscription status: `subscribed`, `unsubscribed`, `cleaned`, or `pending`.', - }, - { - name: 'email_address', - type: 'string', - required: false, - description: 'Updated email address.', - }, - { - name: 'first_name', - type: 'string', - required: false, - description: 'Updated first name.', - }, - { - name: 'last_name', - type: 'string', - required: false, - description: 'Updated last name.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign to delete. Get it from \`mailchimp_campaigns_list\`.` }, ], }, { - name: 'mailchimp_list_member_upsert', - description: - "Add or update a member in an audience. Creates the member if they don't exist; updates them if they do.", + name: 'mailchimp_campaign_get', + description: `Retrieve details about a specific Mailchimp campaign.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: "MD5 hash of the member's email address (lowercase).", - }, - { - name: 'email_address', - type: 'string', - required: true, - description: "The member's email address.", - }, - { - name: 'status_if_new', - type: 'string', - required: true, - description: - 'Status to set if this is a new subscriber: `subscribed`, `unsubscribed`, `cleaned`, or `pending`.', - }, - { - name: 'status', - type: 'string', - required: false, - description: 'Updated subscription status for existing members.', - }, - { - name: 'first_name', - type: 'string', - required: false, - description: 'First name.', - }, - { - name: 'last_name', - type: 'string', - required: false, - description: 'Last name.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, ], }, { - name: 'mailchimp_list_member_archive', - description: - 'Archive a member from a Mailchimp audience (sets status to unsubscribed without permanently deleting).', + name: 'mailchimp_campaign_schedule', + description: `Schedule a Mailchimp campaign to be sent at a specific time.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: "MD5 hash of the member's email address (lowercase).", - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign to schedule. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'schedule_time', type: 'string', required: true, description: `UTC datetime to send the campaign in ISO 8601 format (e.g., \`2026-05-01T14:00:00+00:00\`).` }, ], }, { - name: 'mailchimp_list_member_delete_permanent', - description: 'Permanently delete a member from a Mailchimp audience. This cannot be undone.', + name: 'mailchimp_campaign_send', + description: `Send a Mailchimp campaign immediately. The campaign must be in \`save\` status with valid content and recipients.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: "MD5 hash of the member's email address (lowercase).", - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign to send. Get it from \`mailchimp_campaigns_list\`.` }, ], }, { - name: 'mailchimp_list_member_tags_get', - description: 'Retrieve all tags applied to a specific audience member.', + name: 'mailchimp_campaign_test', + description: `Send a test email for a Mailchimp campaign to one or more email addresses.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: "MD5 hash of the member's email address (lowercase).", - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'test_emails', type: 'string', required: true, description: `JSON array of email addresses to send the test to.` }, + { name: 'send_type', type: 'string', required: false, description: `Email format for the test: \`html\` or \`plaintext\`.` }, ], }, { - name: 'mailchimp_list_member_tags_update', - description: 'Add or remove tags on a specific audience member.', + name: 'mailchimp_campaign_unschedule', + description: `Cancel a scheduled Mailchimp campaign and return it to draft status.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'subscriber_hash', - type: 'string', - required: true, - description: "MD5 hash of the member's email address (lowercase).", - }, - { - name: 'tags', - type: 'string', - required: true, - description: - 'JSON array of tag objects, each with `name` and `status` (`active` or `inactive`). Example: `[{"name":"vip","status":"active"}]`.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the scheduled campaign. Get it from \`mailchimp_campaigns_list\`.` }, ], }, - - // ─── Segments ───────────────────────────────────────────────────────────────── { - name: 'mailchimp_segments_list', - description: 'List all segments in a Mailchimp audience.', + name: 'mailchimp_campaign_update', + description: `Update the settings of a Mailchimp campaign that has not yet been sent.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience. Get it from `mailchimp_lists_list`.', - }, - { - name: 'type', - type: 'string', - required: false, - description: 'Filter by segment type: `saved`, `static`, or `fuzzy`.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of segments to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'from_name', type: 'string', required: false, description: `Updated 'from' name.` }, + { name: 'list_id', type: 'string', required: false, description: `Updated audience ID.` }, + { name: 'preview_text', type: 'string', required: false, description: `New preview text.` }, + { name: 'reply_to', type: 'string', required: false, description: `Updated reply-to email address.` }, + { name: 'subject_line', type: 'string', required: false, description: `New subject line.` }, + { name: 'title', type: 'string', required: false, description: `New internal campaign title.` }, ], }, { - name: 'mailchimp_segment_get', - description: 'Retrieve details about a specific audience segment.', + name: 'mailchimp_campaigns_list', + description: `Return a list of all campaigns in the Mailchimp account, with optional filters.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'segment_id', - type: 'string', - required: true, - description: 'The unique ID of the segment. Get it from `mailchimp_segments_list`.', - }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'list_id', type: 'string', required: false, description: `Filter by audience ID.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'sort_dir', type: 'string', required: false, description: `Sort direction: \`ASC\` or \`DESC\`.` }, + { name: 'sort_field', type: 'string', required: false, description: `Sort field: \`create_time\` or \`send_time\`.` }, + { name: 'status', type: 'string', required: false, description: `Filter by status: \`save\`, \`paused\`, \`schedule\`, \`sending\`, \`sent\`.` }, + { name: 'type', type: 'string', required: false, description: `Filter by campaign type: \`regular\`, \`plaintext\`, \`absplit\`, \`rss\`, \`variate\`.` }, ], }, { - name: 'mailchimp_segment_create', - description: - 'Create a new segment in a Mailchimp audience. Provide either `options` for a saved/conditional segment or `static_segment` for a static list of emails.', + name: 'mailchimp_list_create', + description: `Create a new Mailchimp audience (list). Requires a contact address and campaign defaults.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'name', - type: 'string', - required: true, - description: 'Name for the segment.', - }, - { - name: 'static_segment', - type: 'string', - required: false, - description: - 'JSON array of email addresses for a static segment (e.g. `["a@example.com","b@example.com"]`).', - }, - { - name: 'options', - type: 'object', - required: false, - description: 'Conditions object for a saved/conditional segment.', - }, + { name: 'contact_address', type: 'string', required: true, description: `The street address for the contact address.` }, + { name: 'contact_city', type: 'string', required: true, description: `The city for the contact address.` }, + { name: 'contact_company', type: 'string', required: true, description: `The company name for the contact address (required by Mailchimp).` }, + { name: 'contact_country', type: 'string', required: true, description: `The two-letter ISO country code for the contact address (e.g. \`US\`).` }, + { name: 'contact_state', type: 'string', required: true, description: `The state or province for the contact address.` }, + { name: 'contact_zip', type: 'string', required: true, description: `The postal/ZIP code for the contact address.` }, + { name: 'email_type_option', type: 'boolean', required: true, description: `Whether to allow subscribers to choose email format (HTML or plain text).` }, + { name: 'from_email', type: 'string', required: true, description: `The default sender email address for campaigns.` }, + { name: 'from_name', type: 'string', required: true, description: `The default display name for the campaign sender.` }, + { name: 'name', type: 'string', required: true, description: `The name of the audience.` }, + { name: 'permission_reminder', type: 'string', required: true, description: `A reminder for subscribers about why they were added.` }, + { name: 'language', type: 'string', required: false, description: `The default language for the audience (e.g. \`en\`, \`fr\`).` }, + { name: 'subject', type: 'string', required: false, description: `The default subject line for campaigns.` }, ], }, { - name: 'mailchimp_segment_update', - description: "Update an existing audience segment's name or member conditions.", + name: 'mailchimp_list_delete', + description: `Permanently delete a Mailchimp audience and all its members.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'segment_id', - type: 'string', - required: true, - description: 'The unique ID of the segment.', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'Updated segment name.', - }, - { - name: 'static_segment', - type: 'string', - required: false, - description: 'Updated JSON array of email addresses for a static segment.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience to delete. Get it from \`mailchimp_lists_list\`.` }, ], }, { - name: 'mailchimp_segment_delete', - description: 'Delete a segment from a Mailchimp audience.', + name: 'mailchimp_list_get', + description: `Retrieve information about a specific Mailchimp audience (list) by its ID.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'segment_id', - type: 'string', - required: true, - description: 'The unique ID of the segment to delete.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, ], }, { - name: 'mailchimp_segment_members_list', - description: 'List all members of a specific audience segment.', + name: 'mailchimp_list_member_add', + description: `Add a new member to a Mailchimp audience.`, params: [ - { - name: 'list_id', - type: 'string', - required: true, - description: 'The unique ID of the audience.', - }, - { - name: 'segment_id', - type: 'string', - required: true, - description: 'The unique ID of the segment.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of members to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, + { name: 'email_address', type: 'string', required: true, description: `The member's email address.` }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'status', type: 'string', required: true, description: `Subscription status: \`subscribed\`, \`unsubscribed\`, \`cleaned\`, \`pending\`.` }, + { name: 'first_name', type: 'string', required: false, description: `Member's first name (stored in FNAME merge field).` }, + { name: 'last_name', type: 'string', required: false, description: `Member's last name (stored in LNAME merge field).` }, + { name: 'tags', type: 'string', required: false, description: `JSON array of tag names to apply to the member.` }, ], }, - - // ─── Campaigns ──────────────────────────────────────────────────────────────── { - name: 'mailchimp_campaigns_list', - description: - 'List all campaigns in the Mailchimp account with filtering by type, status, and date.', + name: 'mailchimp_list_member_archive', + description: `Archive a member in a Mailchimp audience (soft delete). The member's data is preserved but they will not receive campaigns. The \`subscriber_hash\` is the MD5 hash of the lowercase email.`, params: [ - { - name: 'type', - type: 'string', - required: false, - description: - 'Filter by campaign type: `regular`, `plaintext`, `absplit`, `rss`, or `variate`.', - }, - { - name: 'status', - type: 'string', - required: false, - description: 'Filter by status: `save`, `paused`, `schedule`, `sending`, or `sent`.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of campaigns to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'list_id', - type: 'string', - required: false, - description: 'Filter campaigns by audience ID.', - }, - { - name: 'before_send_time', - type: 'string', - required: false, - description: 'Filter campaigns scheduled before this ISO 8601 datetime.', - }, - { - name: 'since_send_time', - type: 'string', - required: false, - description: 'Filter campaigns scheduled after this ISO 8601 datetime.', - }, - { - name: 'sort_field', - type: 'string', - required: false, - description: 'Sort by field: `create_time` or `send_time`.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, ], }, { - name: 'mailchimp_campaign_get', - description: 'Retrieve details about a specific campaign by its ID.', + name: 'mailchimp_list_member_delete_permanent', + description: `Permanently delete a member from a Mailchimp audience. This removes all of their data and cannot be undone. Use \`mailchimp_list_member_archive\` for a reversible soft delete.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign. Get it from `mailchimp_campaigns_list`.', - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, ], }, { - name: 'mailchimp_campaign_create', - description: - 'Create a new Mailchimp campaign. Use `mailchimp_campaign_content_set` to add HTML content before sending.', + name: 'mailchimp_list_member_get', + description: `Retrieve information about a specific member in a Mailchimp audience. The \`subscriber_hash\` is the MD5 hash of the member's lowercase email address.`, params: [ - { - name: 'type', - type: 'string', - required: true, - description: 'Campaign type: `regular`, `plaintext`, `absplit`, `rss`, or `variate`.', - }, - { - name: 'list_id', - type: 'string', - required: true, - description: 'The audience ID to send this campaign to.', - }, - { - name: 'subject_line', - type: 'string', - required: false, - description: 'Subject line for the campaign.', - }, - { - name: 'preview_text', - type: 'string', - required: false, - description: 'Preview text shown in inbox previews.', - }, - { - name: 'title', - type: 'string', - required: false, - description: 'Internal campaign title (not shown to subscribers).', - }, - { - name: 'from_name', - type: 'string', - required: false, - description: 'Sender display name.', - }, - { - name: 'reply_to', - type: 'string', - required: false, - description: 'Reply-to email address.', - }, - { - name: 'segment_id', - type: 'string', - required: false, - description: 'Send only to members of this segment ID.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, ], }, { - name: 'mailchimp_campaign_update', - description: - 'Update settings for an existing campaign such as subject line, sender name, or audience.', + name: 'mailchimp_list_member_tags_get', + description: `Retrieve the tags assigned to a specific member in a Mailchimp audience.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'subject_line', - type: 'string', - required: false, - description: 'Updated subject line.', - }, - { - name: 'preview_text', - type: 'string', - required: false, - description: 'Updated preview text.', - }, - { - name: 'title', - type: 'string', - required: false, - description: 'Updated campaign title.', - }, - { - name: 'from_name', - type: 'string', - required: false, - description: 'Updated sender display name.', - }, - { - name: 'reply_to', - type: 'string', - required: false, - description: 'Updated reply-to email address.', - }, - { - name: 'list_id', - type: 'string', - required: false, - description: 'Updated audience ID.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, ], }, { - name: 'mailchimp_campaign_delete', - description: 'Delete a campaign. Only campaigns with status `save` or `paused` can be deleted.', + name: 'mailchimp_list_member_tags_update', + description: `Add or remove tags for a specific member in a Mailchimp audience. Provide a JSON array of tag objects with \`name\` and \`status\` (\`active\` to add, \`inactive\` to remove).`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign to delete.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, + { name: 'tags', type: 'string', required: true, description: `JSON array of tag objects. Each has \`name\` (string) and \`status\` (\`active\` to add, \`inactive\` to remove).` }, ], }, { - name: 'mailchimp_campaign_content_get', - description: 'Retrieve the HTML and plain-text content of a campaign.', + name: 'mailchimp_list_member_update', + description: `Update an existing member's data in a Mailchimp audience. The \`subscriber_hash\` is the MD5 hash of the member's lowercase email address.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, + { name: 'email_address', type: 'string', required: false, description: `Updated email address.` }, + { name: 'first_name', type: 'string', required: false, description: `Updated first name (FNAME merge field).` }, + { name: 'last_name', type: 'string', required: false, description: `Updated last name (LNAME merge field).` }, + { name: 'status', type: 'string', required: false, description: `New subscription status: \`subscribed\`, \`unsubscribed\`, \`cleaned\`, \`pending\`.` }, ], }, { - name: 'mailchimp_campaign_content_set', - description: 'Set the HTML content for a campaign. Call this before sending.', + name: 'mailchimp_list_member_upsert', + description: `Add a new member or update an existing member in a Mailchimp audience (idempotent). The \`subscriber_hash\` is the MD5 hash of the lowercase email address.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'html', - type: 'string', - required: false, - description: 'Raw HTML for the campaign body.', - }, - { - name: 'plain_text', - type: 'string', - required: false, - description: 'Plain text version of the campaign.', - }, - { - name: 'template_id', - type: 'string', - required: false, - description: 'ID of a saved template to use as the campaign content.', - }, + { name: 'email_address', type: 'string', required: true, description: `The member's email address.` }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'status_if_new', type: 'string', required: true, description: `Status for new members: \`subscribed\`, \`unsubscribed\`, \`cleaned\`, \`pending\`.` }, + { name: 'subscriber_hash', type: 'string', required: true, description: `MD5 hash of the member's lowercase email address.` }, + { name: 'first_name', type: 'string', required: false, description: `First name (FNAME merge field).` }, + { name: 'last_name', type: 'string', required: false, description: `Last name (LNAME merge field).` }, + { name: 'status', type: 'string', required: false, description: `Status for existing members.` }, ], }, { - name: 'mailchimp_campaign_send', - description: - 'Send a campaign immediately. The campaign must have a subject line, content, and a valid recipient list.', + name: 'mailchimp_list_members_list', + description: `Return a list of members in a Mailchimp audience, with optional filters by status.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign to send.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page (max 1000).` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'sort_dir', type: 'string', required: false, description: `Sort direction: \`ASC\` or \`DESC\`.` }, + { name: 'sort_field', type: 'string', required: false, description: `Field to sort by: \`last_changed\` or \`timestamp_opt\`.` }, + { name: 'status', type: 'string', required: false, description: `Filter by member status: \`subscribed\`, \`unsubscribed\`, \`cleaned\`, \`pending\`, \`transactional\`, \`archived\`.` }, ], }, { - name: 'mailchimp_campaign_schedule', - description: 'Schedule a campaign to send at a specific time. Requires a paid Mailchimp plan.', + name: 'mailchimp_list_update', + description: `Update an existing Mailchimp audience's name or settings.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'schedule_time', - type: 'string', - required: true, - description: - 'The UTC datetime to send the campaign in ISO 8601 format (e.g. `2024-12-01T10:00:00Z`).', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'from_email', type: 'string', required: false, description: `Updated sender email address.` }, + { name: 'from_name', type: 'string', required: false, description: `Updated sender display name.` }, + { name: 'name', type: 'string', required: false, description: `New name for the audience.` }, + { name: 'permission_reminder', type: 'string', required: false, description: `Updated permission reminder.` }, ], }, { - name: 'mailchimp_campaign_unschedule', - description: 'Cancel a scheduled campaign and return it to draft status.', + name: 'mailchimp_lists_list', + description: `Return a list of all Mailchimp audiences (lists) in the account.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the scheduled campaign.', - }, + { name: 'count', type: 'integer', required: false, description: `Number of records to return per page (max 1000).` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'sort_dir', type: 'string', required: false, description: `Sort direction: \`ASC\` or \`DESC\`.` }, + { name: 'sort_field', type: 'string', required: false, description: `Field to sort results by: \`date_created\` or \`campaign_last_sent\`.` }, ], }, { - name: 'mailchimp_campaign_test', - description: 'Send a test email for a campaign to one or more addresses.', + name: 'mailchimp_ping', + description: `Check the health of the Mailchimp API. Returns a health status string.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'test_emails', - type: 'string', - required: true, - description: - 'JSON-encoded array of email addresses to send the test to (e.g. `["you@example.com"]`).', - }, - { - name: 'send_type', - type: 'string', - required: false, - description: 'Email format to send: `html` (default) or `plaintext`.', - }, ], }, - - // ─── Templates ──────────────────────────────────────────────────────────────── { - name: 'mailchimp_templates_list', - description: 'List all email templates in the Mailchimp account.', + name: 'mailchimp_report_click_details', + description: `Return click details and statistics for links in a Mailchimp campaign.`, params: [ - { - name: 'type', - type: 'string', - required: false, - description: 'Filter by template type: `user`, `gallery`, or `base`.', - }, - { - name: 'category', - type: 'string', - required: false, - description: 'Filter by template category.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of templates to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'sort_field', - type: 'string', - required: false, - description: 'Sort by `date_created` or `name`.', - }, - { - name: 'sort_dir', - type: 'string', - required: false, - description: 'Sort direction: `ASC` or `DESC`.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, ], }, { - name: 'mailchimp_template_get', - description: 'Retrieve details about a specific email template by its ID.', + name: 'mailchimp_report_email_activity', + description: `Return per-subscriber email activity for a specific Mailchimp campaign, including opens, clicks, and bounces.`, params: [ - { - name: 'template_id', - type: 'string', - required: true, - description: 'The unique ID of the template. Get it from `mailchimp_templates_list`.', - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, ], }, { - name: 'mailchimp_template_create', - description: 'Create a new custom HTML email template.', + name: 'mailchimp_report_get', + description: `Retrieve the report summary for a specific Mailchimp campaign, including opens, clicks, bounces, and unsubscribes.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: 'Name for the template.', - }, - { - name: 'html', - type: 'string', - required: true, - description: 'HTML content of the template.', - }, - { - name: 'folder_id', - type: 'string', - required: false, - description: 'ID of the folder to place the template in.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, ], }, { - name: 'mailchimp_template_update', - description: "Update an existing email template's name or HTML content.", + name: 'mailchimp_report_open_details', + description: `Return a list of members who opened a specific Mailchimp campaign.`, params: [ - { - name: 'template_id', - type: 'string', - required: true, - description: 'The unique ID of the template.', - }, - { - name: 'name', - type: 'string', - required: false, - description: 'Updated template name.', - }, - { - name: 'html', - type: 'string', - required: false, - description: 'Updated HTML content.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, ], }, { - name: 'mailchimp_template_delete', - description: 'Delete a custom email template.', + name: 'mailchimp_report_unsubscribes', + description: `Return a list of members who unsubscribed from a specific Mailchimp campaign.`, params: [ - { - name: 'template_id', - type: 'string', - required: true, - description: 'The unique ID of the template to delete.', - }, + { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign. Get it from \`mailchimp_campaigns_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, ], }, - - // ─── Reports ────────────────────────────────────────────────────────────────── { name: 'mailchimp_reports_list', - description: 'List campaign reports for the account with filtering by type and date.', + description: `Return a list of campaign reports in the Mailchimp account.`, params: [ - { - name: 'type', - type: 'string', - required: false, - description: - 'Filter by campaign type: `regular`, `plaintext`, `absplit`, `rss`, or `variate`.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of reports to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'since_send_time', - type: 'string', - required: false, - description: 'Filter reports for campaigns sent after this ISO 8601 datetime.', - }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'type', type: 'string', required: false, description: `Filter by campaign type: \`regular\`, \`absplit\`, \`variate\`, \`rss\`, \`plaintext\`.` }, ], }, { - name: 'mailchimp_report_get', - description: 'Retrieve the summary report for a specific sent campaign.', + name: 'mailchimp_segment_create', + description: `Create a new static or saved segment in a Mailchimp audience.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign. Get it from `mailchimp_campaigns_list`.', - }, - { - name: 'fields', - type: 'string', - required: false, - description: 'Comma-separated list of fields to include.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'name', type: 'string', required: true, description: `Name of the segment.` }, + { name: 'options', type: 'string', required: false, description: `JSON object defining conditions for a saved segment. See Mailchimp docs for condition format.` }, + { name: 'static_segment', type: 'string', required: false, description: `JSON array of email addresses to add to a static segment.` }, ], }, { - name: 'mailchimp_report_click_details', - description: - 'Retrieve click activity details for a sent campaign, showing which links were clicked.', + name: 'mailchimp_segment_delete', + description: `Delete a segment from a Mailchimp audience.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of results to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'segment_id', type: 'string', required: true, description: `The ID of the segment to delete. Get it from \`mailchimp_segments_list\`.` }, ], }, { - name: 'mailchimp_report_open_details', - description: - 'Retrieve open activity details for a sent campaign, showing who opened the email.', + name: 'mailchimp_segment_get', + description: `Retrieve details about a specific segment in a Mailchimp audience.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of results to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'segment_id', type: 'string', required: true, description: `The ID of the segment. Get it from \`mailchimp_segments_list\`.` }, ], }, { - name: 'mailchimp_report_email_activity', - description: - 'Retrieve per-subscriber email activity (opens, clicks, bounces) for a sent campaign.', + name: 'mailchimp_segment_members_list', + description: `Return a list of members in a specific segment of a Mailchimp audience.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of results to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'since', - type: 'string', - required: false, - description: 'Filter activity since this ISO 8601 datetime.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'segment_id', type: 'string', required: true, description: `The ID of the segment. Get it from \`mailchimp_segments_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, ], }, { - name: 'mailchimp_report_unsubscribes', - description: 'Retrieve the list of members who unsubscribed from a sent campaign.', + name: 'mailchimp_segment_update', + description: `Update the name or conditions of a segment in a Mailchimp audience.`, params: [ - { - name: 'campaign_id', - type: 'string', - required: true, - description: 'The unique ID of the campaign.', - }, - { - name: 'count', - type: 'number', - required: false, - description: 'Number of results to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'segment_id', type: 'string', required: true, description: `The ID of the segment. Get it from \`mailchimp_segments_list\`.` }, + { name: 'name', type: 'string', required: false, description: `New name for the segment.` }, + { name: 'static_segment', type: 'string', required: false, description: `Updated JSON array of emails for a static segment.` }, ], }, - - // ─── Automations ────────────────────────────────────────────────────────────── { - name: 'mailchimp_automations_list', - description: 'List all classic automation workflows in the Mailchimp account.', + name: 'mailchimp_segments_list', + description: `Return a list of segments for a specific Mailchimp audience.`, params: [ - { - name: 'count', - type: 'number', - required: false, - description: 'Number of automations to return.', - }, - { - name: 'offset', - type: 'number', - required: false, - description: 'Pagination offset.', - }, - { - name: 'status', - type: 'string', - required: false, - description: 'Filter by status: `save`, `paused`, or `sending`.', - }, - { - name: 'before_create_time', - type: 'string', - required: false, - description: 'Filter automations created before this ISO 8601 datetime.', - }, + { name: 'list_id', type: 'string', required: true, description: `The ID of the audience. Get it from \`mailchimp_lists_list\`.` }, + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'type', type: 'string', required: false, description: `Filter by segment type: \`static\` or \`saved\`.` }, ], }, { - name: 'mailchimp_automation_get', - description: 'Retrieve details about a specific classic automation workflow.', + name: 'mailchimp_template_create', + description: `Create a new user-defined HTML template in Mailchimp.`, params: [ - { - name: 'workflow_id', - type: 'string', - required: true, - description: - 'The unique ID of the automation workflow. Get it from `mailchimp_automations_list`.', - }, + { name: 'html', type: 'string', required: true, description: `The HTML content for the template.` }, + { name: 'name', type: 'string', required: true, description: `A name for the template.` }, + { name: 'folder_id', type: 'string', required: false, description: `ID of a folder to place the template in.` }, ], }, { - name: 'mailchimp_automation_start', - description: 'Start all emails in a paused or saved automation workflow.', + name: 'mailchimp_template_delete', + description: `Permanently delete a user-defined template from Mailchimp.`, params: [ - { - name: 'workflow_id', - type: 'string', - required: true, - description: 'The unique ID of the automation workflow.', - }, + { name: 'template_id', type: 'string', required: true, description: `The ID of the template to delete. Get it from \`mailchimp_templates_list\`.` }, ], }, { - name: 'mailchimp_automation_pause', - description: 'Pause all emails in an active automation workflow.', + name: 'mailchimp_template_get', + description: `Retrieve information about a specific template in the Mailchimp account.`, params: [ - { - name: 'workflow_id', - type: 'string', - required: true, - description: 'The unique ID of the automation workflow.', - }, + { name: 'template_id', type: 'string', required: true, description: `The ID of the template. Get it from \`mailchimp_templates_list\`.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, ], }, - - // ─── Batch ──────────────────────────────────────────────────────────────────── { - name: 'mailchimp_batch_status_get', - description: 'Check the status of a batch operation by its batch ID.', + name: 'mailchimp_template_update', + description: `Update a user-defined template's name or HTML content in Mailchimp.`, params: [ - { - name: 'batch_id', - type: 'string', - required: true, - description: 'The unique ID of the batch operation.', - }, + { name: 'template_id', type: 'string', required: true, description: `The ID of the template. Get it from \`mailchimp_templates_list\`.` }, + { name: 'html', type: 'string', required: false, description: `New HTML content for the template.` }, + { name: 'name', type: 'string', required: false, description: `New name for the template.` }, + ], + }, + { + name: 'mailchimp_templates_list', + description: `Return a list of templates in the Mailchimp account, including user-created and Mailchimp base templates.`, + params: [ + { name: 'count', type: 'integer', required: false, description: `Number of records per page.` }, + { name: 'fields', type: 'string', required: false, description: `Comma-separated fields to return.` }, + { name: 'offset', type: 'integer', required: false, description: `Number of records to skip.` }, + { name: 'sort_dir', type: 'string', required: false, description: `Sort direction: \`ASC\` or \`DESC\`.` }, + { name: 'sort_field', type: 'string', required: false, description: `Sort field: \`date_created\`.` }, + { name: 'type', type: 'string', required: false, description: `Filter by template type: \`user\`, \`base\`, \`gallery\`.` }, ], }, ] diff --git a/src/data/agent-connectors/quickbooks.ts b/src/data/agent-connectors/quickbooks.ts index 41269c6be..683ada34c 100644 --- a/src/data/agent-connectors/quickbooks.ts +++ b/src/data/agent-connectors/quickbooks.ts @@ -1,2246 +1,824 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ - // ─── Company Info ───────────────────────────────────────────────────────────── { - name: 'quickbooks_company_info_get', - description: 'Retrieve company information for the connected QuickBooks Online account.', - params: [], - }, - - // ─── Accounts ───────────────────────────────────────────────────────────────── - { - name: 'quickbooks_accounts_list', - description: - 'List accounts from QuickBooks Online. Use where_clause to filter (e.g. "AccountType = \'Bank\'").', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause to filter accounts, e.g. "AccountType = \'Bank\'".', - }, + name: 'quickbooks_account_create', + description: `Create a new account in QuickBooks Online.`, + params: [ + { name: 'AccountType', type: 'string', required: true, description: `Account type (e.g. Bank, Expense, Income, Liability).` }, + { name: 'Name', type: 'string', required: true, description: `Name of the account.` }, + { name: 'AccountSubType', type: 'string', required: false, description: `Account sub-type.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the account is active.` }, + { name: 'CurrencyRef', type: 'string', required: false, description: `Currency reference as JSON, e.g. {"value":"USD"}.` }, + { name: 'Description', type: 'string', required: false, description: `Description of the account.` }, ], }, { name: 'quickbooks_account_get', - description: 'Retrieve a single QuickBooks Online account by its ID.', + description: `Retrieve a single QuickBooks Online account by its ID.`, params: [ - { - name: 'account_id', - type: 'string', - required: true, - description: 'The ID of the account to retrieve.', - }, + { name: 'account_id', type: 'string', required: true, description: `The ID of the account to retrieve.` }, ], }, { - name: 'quickbooks_account_create', - description: 'Create a new account in QuickBooks Online.', - params: [ - { - name: 'Name', - type: 'string', - required: true, - description: 'Name of the account.', - }, - { - name: 'AccountType', - type: 'string', - required: true, - description: 'Account type (e.g. Bank, Expense, Income, Liability).', - }, - { - name: 'AccountSubType', - type: 'string', - required: false, - description: 'Account sub-type.', - }, - { - name: 'Description', - type: 'string', - required: false, - description: 'Description of the account.', - }, - { - name: 'CurrencyRef', - type: 'string', - required: false, - description: 'Currency reference as JSON, e.g. `{"value":"USD"}`.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the account is active.', - }, + name: 'quickbooks_account_update', + description: `Update an existing account in QuickBooks Online. Requires SyncToken from account_get.`, + params: [ + { name: 'AccountType', type: 'string', required: true, description: `Account type.` }, + { name: 'Id', type: 'string', required: true, description: `The ID of the account to update.` }, + { name: 'Name', type: 'string', required: true, description: `Name of the account.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from the account_get response (optimistic locking).` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the account is active.` }, + { name: 'Description', type: 'string', required: false, description: `Description.` }, ], }, { - name: 'quickbooks_account_update', - description: - 'Update an existing account in QuickBooks Online. Requires SyncToken from account_get.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'The ID of the account to update.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from the account_get response (optimistic locking).', - }, - { - name: 'Name', - type: 'string', - required: true, - description: 'Name of the account.', - }, - { - name: 'AccountType', - type: 'string', - required: true, - description: 'Account type.', - }, - { - name: 'Description', - type: 'string', - required: false, - description: 'Description.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the account is active.', - }, + name: 'quickbooks_accounts_list', + description: `List accounts from QuickBooks Online. Use where_clause to filter (e.g. "AccountType = 'Bank'").`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause to filter accounts, e.g. "AccountType = 'Bank'"` }, ], }, - - // ─── Customers ──────────────────────────────────────────────────────────────── { - name: 'quickbooks_customers_list', - description: 'List customers from QuickBooks Online with optional filtering and pagination.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause, e.g. "Active = true".', - }, + name: 'quickbooks_bill_create', + description: `Create a new bill in QuickBooks Online.`, + params: [ + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'VendorRef', type: 'string', required: true, description: `Vendor reference as JSON, e.g. {"value":"123"}.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Bill number.` }, + { name: 'DueDate', type: 'string', required: false, description: `Due date YYYY-MM-DD.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_customer_get', - description: 'Retrieve a single QuickBooks Online customer by ID.', + name: 'quickbooks_bill_delete', + description: `Delete a bill in QuickBooks Online.`, params: [ - { - name: 'customer_id', - type: 'string', - required: true, - description: 'The ID of the customer.', - }, + { name: 'Id', type: 'string', required: true, description: `Bill ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from bill_get.` }, ], }, { - name: 'quickbooks_customer_create', - description: 'Create a new customer in QuickBooks Online.', - params: [ - { - name: 'DisplayName', - type: 'string', - required: true, - description: 'Display name for the customer.', - }, - { - name: 'GivenName', - type: 'string', - required: false, - description: 'First name.', - }, - { - name: 'FamilyName', - type: 'string', - required: false, - description: 'Last name.', - }, - { - name: 'CompanyName', - type: 'string', - required: false, - description: 'Company name.', - }, - { - name: 'PrimaryEmailAddr', - type: 'string', - required: false, - description: 'Email as JSON, e.g. `{"Address":"john@example.com"}`.', - }, - { - name: 'PrimaryPhone', - type: 'string', - required: false, - description: 'Phone as JSON, e.g. `{"FreeFormNumber":"555-1234"}`.', - }, - { - name: 'BillAddr', - type: 'string', - required: false, - description: 'Billing address as JSON object.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the customer is active.', - }, + name: 'quickbooks_bill_get', + description: `Retrieve a single QuickBooks Online bill by ID.`, + params: [ + { name: 'bill_id', type: 'string', required: true, description: `The ID of the bill.` }, ], }, { - name: 'quickbooks_customer_update', - description: - 'Update an existing customer in QuickBooks Online. Requires SyncToken from customer_get.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Customer ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from customer_get.', - }, - { - name: 'DisplayName', - type: 'string', - required: true, - description: 'Display name.', - }, - { - name: 'GivenName', - type: 'string', - required: false, - description: 'First name.', - }, - { - name: 'FamilyName', - type: 'string', - required: false, - description: 'Last name.', - }, - { - name: 'CompanyName', - type: 'string', - required: false, - description: 'Company name.', - }, - { - name: 'PrimaryEmailAddr', - type: 'string', - required: false, - description: 'Email as JSON.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the customer is active.', - }, + name: 'quickbooks_bill_payment_create', + description: `Create a new bill payment in QuickBooks Online.`, + params: [ + { name: 'Line', type: 'string', required: true, description: `Linked transactions as JSON array with LinkedTxn.` }, + { name: 'PayType', type: 'string', required: true, description: `Payment type: Check or CreditCard.` }, + { name: 'TotalAmt', type: 'string', required: true, description: `Total amount as number string, e.g. "200.00".` }, + { name: 'VendorRef', type: 'string', required: true, description: `Vendor reference as JSON, e.g. {"value":"123"}.` }, + { name: 'CheckPayment', type: 'string', required: false, description: `Check payment details as JSON, required when PayType is Check. e.g. {"BankAccountRef":{"value":"35"}}.` }, + { name: 'CreditCardPayment', type: 'string', required: false, description: `Credit card payment details as JSON, required when PayType is CreditCard. e.g. {"CCAccountRef":{"value":"41"}}.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Document/check number.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_customer_delete', - description: - 'Mark a customer as inactive in QuickBooks Online (customers cannot be permanently deleted).', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Customer ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from customer_get.', - }, + name: 'quickbooks_bill_payment_delete', + description: `Delete a bill payment in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Bill Payment ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from bill_payment_get.` }, ], }, - - // ─── Vendors ────────────────────────────────────────────────────────────────── { - name: 'quickbooks_vendors_list', - description: 'List vendors from QuickBooks Online with optional filtering and pagination.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_bill_payment_get', + description: `Retrieve a single QuickBooks Online bill payment by ID.`, + params: [ + { name: 'bill_payment_id', type: 'string', required: true, description: `The ID of the bill payment.` }, ], }, { - name: 'quickbooks_vendor_get', - description: 'Retrieve a single QuickBooks Online vendor by ID.', + name: 'quickbooks_bill_payments_list', + description: `List bill payments from QuickBooks Online.`, params: [ - { - name: 'vendor_id', - type: 'string', - required: true, - description: 'The ID of the vendor.', - }, + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_vendor_create', - description: 'Create a new vendor in QuickBooks Online.', - params: [ - { - name: 'DisplayName', - type: 'string', - required: true, - description: 'Display name for the vendor.', - }, - { - name: 'GivenName', - type: 'string', - required: false, - description: 'First name.', - }, - { - name: 'FamilyName', - type: 'string', - required: false, - description: 'Last name.', - }, - { - name: 'CompanyName', - type: 'string', - required: false, - description: 'Company name.', - }, - { - name: 'PrimaryEmailAddr', - type: 'string', - required: false, - description: 'Email as JSON.', - }, - { - name: 'PrimaryPhone', - type: 'string', - required: false, - description: 'Phone as JSON.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the vendor is active.', - }, + name: 'quickbooks_bill_update', + description: `Update an existing bill in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Bill ID.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from bill_get.` }, + { name: 'VendorRef', type: 'string', required: true, description: `Vendor reference as JSON.` }, + { name: 'DueDate', type: 'string', required: false, description: `Due date YYYY-MM-DD.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_vendor_update', - description: 'Update an existing vendor in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Vendor ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from vendor_get.', - }, - { - name: 'DisplayName', - type: 'string', - required: true, - description: 'Display name.', - }, - { - name: 'CompanyName', - type: 'string', - required: false, - description: 'Company name.', - }, - { - name: 'PrimaryEmailAddr', - type: 'string', - required: false, - description: 'Email as JSON.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the vendor is active.', - }, + name: 'quickbooks_bills_list', + description: `List bills from QuickBooks Online with optional filtering and pagination.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, - - // ─── Items ──────────────────────────────────────────────────────────────────── { - name: 'quickbooks_items_list', - description: 'List items (products and services) from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause, e.g. "Type = \'Service\'".', - }, + name: 'quickbooks_class_create', + description: `Create a new class in QuickBooks Online.`, + params: [ + { name: 'Name', type: 'string', required: true, description: `Name of the class.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the class is active.` }, + { name: 'ParentRef', type: 'string', required: false, description: `Parent class reference as JSON.` }, ], }, { - name: 'quickbooks_item_get', - description: 'Retrieve a single QuickBooks Online item by ID.', + name: 'quickbooks_class_get', + description: `Retrieve a single QuickBooks Online class by ID.`, params: [ - { - name: 'item_id', - type: 'string', - required: true, - description: 'The ID of the item.', - }, + { name: 'class_id', type: 'string', required: true, description: `The ID of the class.` }, ], }, { - name: 'quickbooks_item_create', - description: 'Create a new item (product or service) in QuickBooks Online.', - params: [ - { - name: 'Name', - type: 'string', - required: true, - description: 'Name of the item.', - }, - { - name: 'Type', - type: 'string', - required: true, - description: 'Item type: Service, NonInventory, or Inventory.', - }, - { - name: 'Description', - type: 'string', - required: false, - description: 'Description of the item.', - }, - { - name: 'UnitPrice', - type: 'string', - required: false, - description: 'Unit price as a number string, e.g. `"150.00"`.', - }, - { - name: 'IncomeAccountRef', - type: 'string', - required: false, - description: 'Income account reference as JSON, e.g. `{"value":"1","name":"Services"}`.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the item is active.', - }, + name: 'quickbooks_classes_list', + description: `List classes from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, { - name: 'quickbooks_item_update', - description: 'Update an existing item in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Item ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from item_get.', - }, - { - name: 'Name', - type: 'string', - required: true, - description: 'Name of the item.', - }, - { - name: 'Type', - type: 'string', - required: true, - description: 'Item type.', - }, - { - name: 'Description', - type: 'string', - required: false, - description: 'Description.', - }, - { - name: 'UnitPrice', - type: 'string', - required: false, - description: 'Unit price as number string.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the item is active.', - }, + name: 'quickbooks_company_info_get', + description: `Retrieve company information for the connected QuickBooks Online account.`, + params: [ ], }, { - name: 'quickbooks_item_delete', - description: - 'Mark an item as inactive in QuickBooks Online (items cannot be permanently deleted).', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Item ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from item_get.', - }, + name: 'quickbooks_credit_memo_create', + description: `Create a new credit memo in QuickBooks Online.`, + params: [ + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Credit memo number.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, - - // ─── Invoices ───────────────────────────────────────────────────────────────── { - name: 'quickbooks_invoices_list', - description: 'List invoices from QuickBooks Online with optional filtering and pagination.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause, e.g. "TxnDate > \'2024-01-01\'".', - }, + name: 'quickbooks_credit_memo_delete', + description: `Delete a credit memo in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Credit Memo ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from credit_memo_get.` }, ], }, { - name: 'quickbooks_invoice_get', - description: 'Retrieve a single QuickBooks Online invoice by ID.', + name: 'quickbooks_credit_memo_get', + description: `Retrieve a single QuickBooks Online credit memo by ID.`, params: [ - { - name: 'invoice_id', - type: 'string', - required: true, - description: 'The ID of the invoice.', - }, + { name: 'credit_memo_id', type: 'string', required: true, description: `The ID of the credit memo.` }, ], }, { - name: 'quickbooks_invoice_create', - description: 'Create a new invoice in QuickBooks Online.', - params: [ - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON, e.g. `{"value":"123"}`.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date in YYYY-MM-DD format.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Invoice number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, - { - name: 'EmailStatus', - type: 'string', - required: false, - description: 'Email status: EmailSent or NotSet.', - }, - { - name: 'BillEmail', - type: 'string', - required: false, - description: 'Billing email as JSON, e.g. `{"Address":"customer@example.com"}`.', - }, + name: 'quickbooks_credit_memos_list', + description: `List credit memos from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_invoice_update', - description: 'Update an existing invoice in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Invoice ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from invoice_get.', - }, - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date YYYY-MM-DD.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Invoice number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, - { - name: 'EmailStatus', - type: 'string', - required: false, - description: 'Email status.', - }, + name: 'quickbooks_customer_create', + description: `Create a new customer in QuickBooks Online.`, + params: [ + { name: 'DisplayName', type: 'string', required: true, description: `Display name for the customer.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the customer is active.` }, + { name: 'BillAddr', type: 'string', required: false, description: `Billing address as JSON object.` }, + { name: 'CompanyName', type: 'string', required: false, description: `Company name.` }, + { name: 'FamilyName', type: 'string', required: false, description: `Last name.` }, + { name: 'GivenName', type: 'string', required: false, description: `First name.` }, + { name: 'PrimaryEmailAddr', type: 'string', required: false, description: `Email as JSON, e.g. {"Address":"john@example.com"}.` }, + { name: 'PrimaryPhone', type: 'string', required: false, description: `Phone as JSON, e.g. {"FreeFormNumber":"555-1234"}.` }, ], }, { - name: 'quickbooks_invoice_void', - description: 'Void an invoice in QuickBooks Online.', + name: 'quickbooks_customer_delete', + description: `Mark a customer as inactive in QuickBooks Online (customers cannot be permanently deleted).`, params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Invoice ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from invoice_get.', - }, + { name: 'Id', type: 'string', required: true, description: `Customer ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from customer_get.` }, ], }, { - name: 'quickbooks_invoice_delete', - description: 'Delete an invoice in QuickBooks Online.', + name: 'quickbooks_customer_get', + description: `Retrieve a single QuickBooks Online customer by ID.`, params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Invoice ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from invoice_get.', - }, + { name: 'customer_id', type: 'string', required: true, description: `The ID of the customer.` }, ], }, { - name: 'quickbooks_invoice_send', - description: 'Send an invoice by email in QuickBooks Online.', - params: [ - { - name: 'invoice_id', - type: 'string', - required: true, - description: 'The ID of the invoice to send.', - }, - { - name: 'send_to', - type: 'string', - required: true, - description: 'Email address to send the invoice to.', - }, + name: 'quickbooks_customer_update', + description: `Update an existing customer in QuickBooks Online. Requires SyncToken from customer_get.`, + params: [ + { name: 'DisplayName', type: 'string', required: true, description: `Display name.` }, + { name: 'Id', type: 'string', required: true, description: `Customer ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from customer_get.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the customer is active.` }, + { name: 'CompanyName', type: 'string', required: false, description: `Company name.` }, + { name: 'FamilyName', type: 'string', required: false, description: `Last name.` }, + { name: 'GivenName', type: 'string', required: false, description: `First name.` }, + { name: 'PrimaryEmailAddr', type: 'string', required: false, description: `Email as JSON.` }, ], }, - - // ─── Bills ──────────────────────────────────────────────────────────────────── { - name: 'quickbooks_bills_list', - description: 'List bills from QuickBooks Online with optional filtering and pagination.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_customers_list', + description: `List customers from QuickBooks Online with optional filtering and pagination.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause, e.g. "Active = true"` }, ], }, { - name: 'quickbooks_bill_get', - description: 'Retrieve a single QuickBooks Online bill by ID.', + name: 'quickbooks_department_create', + description: `Create a new department in QuickBooks Online.`, params: [ - { - name: 'bill_id', - type: 'string', - required: true, - description: 'The ID of the bill.', - }, + { name: 'Name', type: 'string', required: true, description: `Name of the department.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the department is active.` }, + { name: 'ParentRef', type: 'string', required: false, description: `Parent department reference as JSON.` }, ], }, { - name: 'quickbooks_bill_create', - description: 'Create a new bill in QuickBooks Online.', - params: [ - { - name: 'VendorRef', - type: 'string', - required: true, - description: 'Vendor reference as JSON, e.g. `{"value":"123"}`.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date YYYY-MM-DD.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Bill number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_department_get', + description: `Retrieve a single QuickBooks Online department by ID.`, + params: [ + { name: 'department_id', type: 'string', required: true, description: `The ID of the department.` }, ], }, { - name: 'quickbooks_bill_update', - description: 'Update an existing bill in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Bill ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from bill_get.', - }, - { - name: 'VendorRef', - type: 'string', - required: true, - description: 'Vendor reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date YYYY-MM-DD.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_departments_list', + description: `List departments from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, { - name: 'quickbooks_bill_delete', - description: 'Delete a bill in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Bill ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from bill_get.', - }, + name: 'quickbooks_deposit_create', + description: `Create a new deposit in QuickBooks Online.`, + params: [ + { name: 'DepositToAccountRef', type: 'string', required: true, description: `Account to deposit into as JSON.` }, + { name: 'Line', type: 'string', required: true, description: `Deposit lines as JSON array.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, + { name: 'TxnDate', type: 'string', required: false, description: `Transaction date YYYY-MM-DD.` }, ], }, - - // ─── Bill Payments ──────────────────────────────────────────────────────────── { - name: 'quickbooks_bill_payments_list', - description: 'List bill payments from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_deposit_delete', + description: `Delete a deposit in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Deposit ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from deposit_get.` }, ], }, { - name: 'quickbooks_bill_payment_get', - description: 'Retrieve a single QuickBooks Online bill payment by ID.', + name: 'quickbooks_deposit_get', + description: `Retrieve a single QuickBooks Online deposit by ID.`, params: [ - { - name: 'bill_payment_id', - type: 'string', - required: true, - description: 'The ID of the bill payment.', - }, + { name: 'deposit_id', type: 'string', required: true, description: `The ID of the deposit.` }, ], }, { - name: 'quickbooks_bill_payment_create', - description: 'Create a new bill payment in QuickBooks Online.', - params: [ - { - name: 'VendorRef', - type: 'string', - required: true, - description: 'Vendor reference as JSON, e.g. `{"value":"123"}`.', - }, - { - name: 'TotalAmt', - type: 'string', - required: true, - description: 'Total amount as number string, e.g. `"200.00"`.', - }, - { - name: 'PayType', - type: 'string', - required: true, - description: 'Payment type: Check or CreditCard.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Linked transactions as JSON array with LinkedTxn.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Document/check number.', - }, - { - name: 'CheckPayment', - type: 'string', - required: false, - description: - 'Check payment details as JSON, required when PayType is Check. e.g. `{"BankAccountRef":{"value":"35"}}`.', - }, - { - name: 'CreditCardPayment', - type: 'string', - required: false, - description: - 'Credit card payment details as JSON, required when PayType is CreditCard. e.g. `{"CCAccountRef":{"value":"41"}}`.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_deposits_list', + description: `List deposits from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, { - name: 'quickbooks_bill_payment_delete', - description: 'Delete a bill payment in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Bill Payment ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from bill_payment_get.', - }, + name: 'quickbooks_employee_create', + description: `Create a new employee in QuickBooks Online.`, + params: [ + { name: 'FamilyName', type: 'string', required: true, description: `Employee last name.` }, + { name: 'GivenName', type: 'string', required: true, description: `Employee first name.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the employee is active.` }, + { name: 'DisplayName', type: 'string', required: false, description: `Display name.` }, + { name: 'PrimaryEmailAddr', type: 'string', required: false, description: `Email as JSON.` }, + { name: 'PrimaryPhone', type: 'string', required: false, description: `Phone as JSON.` }, ], }, - - // ─── Payments ───────────────────────────────────────────────────────────────── { - name: 'quickbooks_payments_list', - description: 'List payments from QuickBooks Online with optional filtering and pagination.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_employee_get', + description: `Retrieve a single QuickBooks Online employee by ID.`, + params: [ + { name: 'employee_id', type: 'string', required: true, description: `The ID of the employee.` }, ], }, { - name: 'quickbooks_payment_get', - description: 'Retrieve a single QuickBooks Online payment by ID.', + name: 'quickbooks_employees_list', + description: `List employees from QuickBooks Online.`, params: [ - { - name: 'payment_id', - type: 'string', - required: true, - description: 'The ID of the payment.', - }, + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_payment_create', - description: 'Create a new customer payment in QuickBooks Online.', - params: [ - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON, e.g. `{"value":"123"}`.', - }, - { - name: 'TotalAmt', - type: 'string', - required: true, - description: 'Total payment amount as number string, e.g. `"500.00"`.', - }, - { - name: 'PaymentRefNum', - type: 'string', - required: false, - description: 'Payment reference number (check number, etc.).', - }, - { - name: 'Line', - type: 'string', - required: false, - description: 'Linked transactions as JSON array.', - }, + name: 'quickbooks_estimate_create', + description: `Create a new estimate (quote) in QuickBooks Online.`, + params: [ + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Estimate number.` }, + { name: 'ExpirationDate', type: 'string', required: false, description: `Expiration date YYYY-MM-DD.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_payment_update', - description: 'Update an existing payment in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Payment ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from payment_get.', - }, - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON.', - }, - { - name: 'TotalAmt', - type: 'string', - required: true, - description: 'Total payment amount as number string.', - }, - { - name: 'PaymentRefNum', - type: 'string', - required: false, - description: 'Payment reference number.', - }, + name: 'quickbooks_estimate_delete', + description: `Delete an estimate in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Estimate ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from estimate_get.` }, ], }, { - name: 'quickbooks_payment_delete', - description: 'Delete a payment in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Payment ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from payment_get.', - }, + name: 'quickbooks_estimate_get', + description: `Retrieve a single QuickBooks Online estimate by ID.`, + params: [ + { name: 'estimate_id', type: 'string', required: true, description: `The ID of the estimate.` }, ], }, - - // ─── Estimates ──────────────────────────────────────────────────────────────── { name: 'quickbooks_estimates_list', - description: 'List estimates from QuickBooks Online with optional filtering and pagination.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + description: `List estimates from QuickBooks Online with optional filtering and pagination.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_estimate_get', - description: 'Retrieve a single QuickBooks Online estimate by ID.', + name: 'quickbooks_invoice_create', + description: `Create a new invoice in QuickBooks Online.`, params: [ - { - name: 'estimate_id', - type: 'string', - required: true, - description: 'The ID of the estimate.', - }, + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON, e.g. {"value":"123"}.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'BillEmail', type: 'string', required: false, description: `Billing email as JSON, e.g. {"Address":"customer@example.com"}.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Invoice number.` }, + { name: 'DueDate', type: 'string', required: false, description: `Due date in YYYY-MM-DD format.` }, + { name: 'EmailStatus', type: 'string', required: false, description: `Email status: EmailSent or NotSet.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_estimate_create', - description: 'Create a new estimate (quote) in QuickBooks Online.', - params: [ - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Estimate number.', - }, - { - name: 'ExpirationDate', - type: 'string', - required: false, - description: 'Expiration date YYYY-MM-DD.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_invoice_delete', + description: `Delete an invoice in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Invoice ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from invoice_get.` }, ], }, { - name: 'quickbooks_estimate_delete', - description: 'Delete an estimate in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Estimate ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from estimate_get.', - }, + name: 'quickbooks_invoice_get', + description: `Retrieve a single QuickBooks Online invoice by ID.`, + params: [ + { name: 'invoice_id', type: 'string', required: true, description: `The ID of the invoice.` }, ], }, - - // ─── Credit Memos ───────────────────────────────────────────────────────────── { - name: 'quickbooks_credit_memos_list', - description: 'List credit memos from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_invoice_send', + description: `Send an invoice by email in QuickBooks Online.`, + params: [ + { name: 'invoice_id', type: 'string', required: true, description: `The ID of the invoice to send.` }, + { name: 'send_to', type: 'string', required: true, description: `Email address to send the invoice to.` }, ], }, { - name: 'quickbooks_credit_memo_get', - description: 'Retrieve a single QuickBooks Online credit memo by ID.', + name: 'quickbooks_invoice_update', + description: `Update an existing invoice in QuickBooks Online.`, params: [ - { - name: 'credit_memo_id', - type: 'string', - required: true, - description: 'The ID of the credit memo.', - }, + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON.` }, + { name: 'Id', type: 'string', required: true, description: `Invoice ID.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from invoice_get.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Invoice number.` }, + { name: 'DueDate', type: 'string', required: false, description: `Due date YYYY-MM-DD.` }, + { name: 'EmailStatus', type: 'string', required: false, description: `Email status.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_credit_memo_create', - description: 'Create a new credit memo in QuickBooks Online.', - params: [ - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Credit memo number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_invoice_void', + description: `Void an invoice in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Invoice ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from invoice_get.` }, ], }, { - name: 'quickbooks_credit_memo_delete', - description: 'Delete a credit memo in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Credit Memo ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from credit_memo_get.', - }, + name: 'quickbooks_invoices_list', + description: `List invoices from QuickBooks Online with optional filtering and pagination.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause, e.g. "TxnDate > '2024-01-01'"` }, ], }, - - // ─── Sales Receipts ─────────────────────────────────────────────────────────── { - name: 'quickbooks_sales_receipts_list', - description: 'List sales receipts from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_item_create', + description: `Create a new item (product or service) in QuickBooks Online.`, + params: [ + { name: 'Name', type: 'string', required: true, description: `Name of the item.` }, + { name: 'Type', type: 'string', required: true, description: `Item type: Service, NonInventory, or Inventory.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the item is active.` }, + { name: 'Description', type: 'string', required: false, description: `Description of the item.` }, + { name: 'IncomeAccountRef', type: 'string', required: false, description: `Income account reference as JSON, e.g. {"value":"1","name":"Services"}.` }, + { name: 'UnitPrice', type: 'string', required: false, description: `Unit price as a number string, e.g. "150.00".` }, ], }, { - name: 'quickbooks_sales_receipt_get', - description: 'Retrieve a single QuickBooks Online sales receipt by ID.', + name: 'quickbooks_item_delete', + description: `Mark an item as inactive in QuickBooks Online (items cannot be permanently deleted).`, params: [ - { - name: 'sales_receipt_id', - type: 'string', - required: true, - description: 'The ID of the sales receipt.', - }, + { name: 'Id', type: 'string', required: true, description: `Item ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from item_get.` }, ], }, { - name: 'quickbooks_sales_receipt_create', - description: 'Create a new sales receipt in QuickBooks Online.', - params: [ - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Receipt number.', - }, - { - name: 'PaymentRefNum', - type: 'string', - required: false, - description: 'Payment reference number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_item_get', + description: `Retrieve a single QuickBooks Online item by ID.`, + params: [ + { name: 'item_id', type: 'string', required: true, description: `The ID of the item.` }, ], }, { - name: 'quickbooks_sales_receipt_delete', - description: 'Delete a sales receipt in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Sales Receipt ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from sales_receipt_get.', - }, + name: 'quickbooks_item_update', + description: `Update an existing item in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Item ID.` }, + { name: 'Name', type: 'string', required: true, description: `Name of the item.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from item_get.` }, + { name: 'Type', type: 'string', required: true, description: `Item type.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the item is active.` }, + { name: 'Description', type: 'string', required: false, description: `Description.` }, + { name: 'UnitPrice', type: 'string', required: false, description: `Unit price as number string.` }, ], }, - - // ─── Refund Receipts ────────────────────────────────────────────────────────── { - name: 'quickbooks_refund_receipts_list', - description: 'List refund receipts from QuickBooks Online.', + name: 'quickbooks_items_list', + description: `List items (products and services) from QuickBooks Online.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause, e.g. "Type = 'Service'"` }, ], }, { - name: 'quickbooks_refund_receipt_get', - description: 'Retrieve a single QuickBooks Online refund receipt by ID.', + name: 'quickbooks_journal_entries_list', + description: `List journal entries from QuickBooks Online.`, params: [ - { - name: 'refund_receipt_id', - type: 'string', - required: true, - description: 'The ID of the refund receipt.', - }, + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_refund_receipt_create', - description: 'Create a new refund receipt in QuickBooks Online.', - params: [ - { - name: 'CustomerRef', - type: 'string', - required: true, - description: 'Customer reference as JSON.', - }, - { - name: 'DepositToAccountRef', - type: 'string', - required: true, - description: - 'Account to deposit the refund into as JSON, e.g. `{"value":"35"}` for Checking.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Refund receipt number.', - }, - { - name: 'PaymentRefNum', - type: 'string', - required: false, - description: 'Payment reference number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_journal_entry_create', + description: `Create a new journal entry in QuickBooks Online.`, + params: [ + { name: 'Line', type: 'string', required: true, description: `Journal entry lines as JSON array with debit/credit amounts.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Journal entry number.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, + { name: 'TxnDate', type: 'string', required: false, description: `Transaction date YYYY-MM-DD.` }, ], }, - - // ─── Purchase Orders ────────────────────────────────────────────────────────── { - name: 'quickbooks_purchase_orders_list', - description: 'List purchase orders from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_journal_entry_delete', + description: `Delete a journal entry in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Journal Entry ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from journal_entry_get.` }, ], }, { - name: 'quickbooks_purchase_order_get', - description: 'Retrieve a single QuickBooks Online purchase order by ID.', + name: 'quickbooks_journal_entry_get', + description: `Retrieve a single QuickBooks Online journal entry by ID.`, params: [ - { - name: 'purchase_order_id', - type: 'string', - required: true, - description: 'The ID of the purchase order.', - }, + { name: 'journal_entry_id', type: 'string', required: true, description: `The ID of the journal entry.` }, ], }, { - name: 'quickbooks_purchase_order_create', - description: 'Create a new purchase order in QuickBooks Online.', - params: [ - { - name: 'VendorRef', - type: 'string', - required: true, - description: 'Vendor reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Purchase order number.', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date YYYY-MM-DD.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_payment_create', + description: `Create a new customer payment in QuickBooks Online.`, + params: [ + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON, e.g. {"value":"123"}.` }, + { name: 'TotalAmt', type: 'string', required: true, description: `Total payment amount as number string, e.g. "500.00".` }, + { name: 'Line', type: 'string', required: false, description: `Linked transactions as JSON array.` }, + { name: 'PaymentRefNum', type: 'string', required: false, description: `Payment reference number (check number, etc.).` }, ], }, { - name: 'quickbooks_purchase_order_delete', - description: 'Delete a purchase order in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Purchase Order ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from purchase_order_get.', - }, + name: 'quickbooks_payment_delete', + description: `Delete a payment in QuickBooks Online.`, + params: [ + { name: 'Id', type: 'string', required: true, description: `Payment ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from payment_get.` }, ], }, - - // ─── Deposits ───────────────────────────────────────────────────────────────── { - name: 'quickbooks_deposits_list', - description: 'List deposits from QuickBooks Online.', + name: 'quickbooks_payment_get', + description: `Retrieve a single QuickBooks Online payment by ID.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'payment_id', type: 'string', required: true, description: `The ID of the payment.` }, ], }, { - name: 'quickbooks_deposit_get', - description: 'Retrieve a single QuickBooks Online deposit by ID.', + name: 'quickbooks_payment_update', + description: `Update an existing payment in QuickBooks Online.`, params: [ - { - name: 'deposit_id', - type: 'string', - required: true, - description: 'The ID of the deposit.', - }, + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON.` }, + { name: 'Id', type: 'string', required: true, description: `Payment ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from payment_get.` }, + { name: 'TotalAmt', type: 'string', required: true, description: `Total payment amount as number string.` }, + { name: 'PaymentRefNum', type: 'string', required: false, description: `Payment reference number.` }, ], }, { - name: 'quickbooks_deposit_create', - description: 'Create a new deposit in QuickBooks Online.', - params: [ - { - name: 'DepositToAccountRef', - type: 'string', - required: true, - description: 'Account to deposit into as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Deposit lines as JSON array.', - }, - { - name: 'TxnDate', - type: 'string', - required: false, - description: 'Transaction date YYYY-MM-DD.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_payments_list', + description: `List payments from QuickBooks Online with optional filtering and pagination.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_deposit_delete', - description: 'Delete a deposit in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Deposit ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from deposit_get.', - }, + name: 'quickbooks_purchase_order_create', + description: `Create a new purchase order in QuickBooks Online.`, + params: [ + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'VendorRef', type: 'string', required: true, description: `Vendor reference as JSON.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Purchase order number.` }, + { name: 'DueDate', type: 'string', required: false, description: `Due date YYYY-MM-DD.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, - - // ─── Transfers ──────────────────────────────────────────────────────────────── { - name: 'quickbooks_transfers_list', - description: 'List transfers from QuickBooks Online.', + name: 'quickbooks_purchase_order_delete', + description: `Delete a purchase order in QuickBooks Online.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'Id', type: 'string', required: true, description: `Purchase Order ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from purchase_order_get.` }, ], }, { - name: 'quickbooks_transfer_get', - description: 'Retrieve a single QuickBooks Online transfer by ID.', + name: 'quickbooks_purchase_order_get', + description: `Retrieve a single QuickBooks Online purchase order by ID.`, params: [ - { - name: 'transfer_id', - type: 'string', - required: true, - description: 'The ID of the transfer.', - }, + { name: 'purchase_order_id', type: 'string', required: true, description: `The ID of the purchase order.` }, ], }, { - name: 'quickbooks_transfer_create', - description: 'Create a new fund transfer between accounts in QuickBooks Online.', - params: [ - { - name: 'FromAccountRef', - type: 'string', - required: true, - description: 'Source account reference as JSON.', - }, - { - name: 'ToAccountRef', - type: 'string', - required: true, - description: 'Destination account reference as JSON.', - }, - { - name: 'Amount', - type: 'string', - required: true, - description: 'Transfer amount as number string.', - }, - { - name: 'TxnDate', - type: 'string', - required: false, - description: 'Transaction date YYYY-MM-DD.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_purchase_orders_list', + description: `List purchase orders from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, - - // ─── Journal Entries ────────────────────────────────────────────────────────── { - name: 'quickbooks_journal_entries_list', - description: 'List journal entries from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_refund_receipt_create', + description: `Create a new refund receipt in QuickBooks Online.`, + params: [ + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON.` }, + { name: 'DepositToAccountRef', type: 'string', required: true, description: `Account to deposit the refund into as JSON, e.g. {"value":"35"} for Checking.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Refund receipt number.` }, + { name: 'PaymentRefNum', type: 'string', required: false, description: `Payment reference number.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_journal_entry_get', - description: 'Retrieve a single QuickBooks Online journal entry by ID.', + name: 'quickbooks_refund_receipt_get', + description: `Retrieve a single QuickBooks Online refund receipt by ID.`, params: [ - { - name: 'journal_entry_id', - type: 'string', - required: true, - description: 'The ID of the journal entry.', - }, + { name: 'refund_receipt_id', type: 'string', required: true, description: `The ID of the refund receipt.` }, ], }, { - name: 'quickbooks_journal_entry_create', - description: 'Create a new journal entry in QuickBooks Online.', - params: [ - { - name: 'Line', - type: 'string', - required: true, - description: 'Journal entry lines as JSON array with debit/credit amounts.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Journal entry number.', - }, - { - name: 'TxnDate', - type: 'string', - required: false, - description: 'Transaction date YYYY-MM-DD.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_refund_receipts_list', + description: `List refund receipts from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, { - name: 'quickbooks_journal_entry_delete', - description: 'Delete a journal entry in QuickBooks Online.', - params: [ - { - name: 'Id', - type: 'string', - required: true, - description: 'Journal Entry ID.', - }, - { - name: 'SyncToken', - type: 'string', - required: true, - description: 'SyncToken from journal_entry_get.', - }, + name: 'quickbooks_report_aged_payables', + description: `Retrieve an Aged Payable Detail report from QuickBooks Online.`, + params: [ + { name: 'due_date', type: 'string', required: false, description: `Due date filter in YYYY-MM-DD format.` }, + { name: 'report_date', type: 'string', required: false, description: `Report date in YYYY-MM-DD format.` }, ], }, - - // ─── Vendor Credits ─────────────────────────────────────────────────────────── { - name: 'quickbooks_vendor_credits_list', - description: 'List vendor credits from QuickBooks Online.', + name: 'quickbooks_report_aged_receivables', + description: `Retrieve an Aged Receivable Detail report from QuickBooks Online.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'due_date', type: 'string', required: false, description: `Due date filter in YYYY-MM-DD format.` }, + { name: 'report_date', type: 'string', required: false, description: `Report date in YYYY-MM-DD format.` }, ], }, { - name: 'quickbooks_vendor_credit_get', - description: 'Retrieve a single QuickBooks Online vendor credit by ID.', + name: 'quickbooks_report_balance_sheet', + description: `Retrieve a Balance Sheet report from QuickBooks Online.`, params: [ - { - name: 'vendor_credit_id', - type: 'string', - required: true, - description: 'The ID of the vendor credit.', - }, + { name: 'accounting_method', type: 'string', required: false, description: `Accounting method: Accrual or Cash.` }, + { name: 'end_date', type: 'string', required: false, description: `Report end date in YYYY-MM-DD format.` }, + { name: 'start_date', type: 'string', required: false, description: `Report start date in YYYY-MM-DD format.` }, ], }, { - name: 'quickbooks_vendor_credit_create', - description: 'Create a new vendor credit in QuickBooks Online.', - params: [ - { - name: 'VendorRef', - type: 'string', - required: true, - description: 'Vendor reference as JSON.', - }, - { - name: 'Line', - type: 'string', - required: true, - description: 'Line items as JSON array.', - }, - { - name: 'DocNumber', - type: 'string', - required: false, - description: 'Vendor credit number.', - }, - { - name: 'PrivateNote', - type: 'string', - required: false, - description: 'Internal memo.', - }, + name: 'quickbooks_report_cash_flow', + description: `Retrieve a Cash Flow report from QuickBooks Online.`, + params: [ + { name: 'end_date', type: 'string', required: false, description: `Report end date in YYYY-MM-DD format.` }, + { name: 'start_date', type: 'string', required: false, description: `Report start date in YYYY-MM-DD format.` }, ], }, - - // ─── Classes ────────────────────────────────────────────────────────────────── { - name: 'quickbooks_classes_list', - description: 'List classes from QuickBooks Online.', + name: 'quickbooks_report_general_ledger', + description: `Retrieve a General Ledger report from QuickBooks Online.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'accounting_method', type: 'string', required: false, description: `Accounting method: Accrual or Cash.` }, + { name: 'end_date', type: 'string', required: false, description: `Report end date in YYYY-MM-DD format.` }, + { name: 'start_date', type: 'string', required: false, description: `Report start date in YYYY-MM-DD format.` }, ], }, { - name: 'quickbooks_class_get', - description: 'Retrieve a single QuickBooks Online class by ID.', + name: 'quickbooks_report_profit_and_loss', + description: `Retrieve a Profit and Loss report from QuickBooks Online.`, params: [ - { - name: 'class_id', - type: 'string', - required: true, - description: 'The ID of the class.', - }, + { name: 'accounting_method', type: 'string', required: false, description: `Accounting method: Accrual or Cash.` }, + { name: 'end_date', type: 'string', required: false, description: `Report end date in YYYY-MM-DD format.` }, + { name: 'start_date', type: 'string', required: false, description: `Report start date in YYYY-MM-DD format.` }, ], }, { - name: 'quickbooks_class_create', - description: 'Create a new class in QuickBooks Online.', - params: [ - { - name: 'Name', - type: 'string', - required: true, - description: 'Name of the class.', - }, - { - name: 'ParentRef', - type: 'string', - required: false, - description: 'Parent class reference as JSON.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the class is active.', - }, + name: 'quickbooks_report_trial_balance', + description: `Retrieve a Trial Balance report from QuickBooks Online.`, + params: [ + { name: 'accounting_method', type: 'string', required: false, description: `Accounting method: Accrual or Cash.` }, + { name: 'end_date', type: 'string', required: false, description: `Report end date in YYYY-MM-DD format.` }, + { name: 'start_date', type: 'string', required: false, description: `Report start date in YYYY-MM-DD format.` }, ], }, - - // ─── Departments ────────────────────────────────────────────────────────────── { - name: 'quickbooks_departments_list', - description: 'List departments from QuickBooks Online.', + name: 'quickbooks_sales_receipt_create', + description: `Create a new sales receipt in QuickBooks Online.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'CustomerRef', type: 'string', required: true, description: `Customer reference as JSON.` }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Receipt number.` }, + { name: 'PaymentRefNum', type: 'string', required: false, description: `Payment reference number.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_department_get', - description: 'Retrieve a single QuickBooks Online department by ID.', + name: 'quickbooks_sales_receipt_delete', + description: `Delete a sales receipt in QuickBooks Online.`, params: [ - { - name: 'department_id', - type: 'string', - required: true, - description: 'The ID of the department.', - }, + { name: 'Id', type: 'string', required: true, description: `Sales Receipt ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from sales_receipt_get.` }, ], }, { - name: 'quickbooks_department_create', - description: 'Create a new department in QuickBooks Online.', - params: [ - { - name: 'Name', - type: 'string', - required: true, - description: 'Name of the department.', - }, - { - name: 'ParentRef', - type: 'string', - required: false, - description: 'Parent department reference as JSON.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the department is active.', - }, + name: 'quickbooks_sales_receipt_get', + description: `Retrieve a single QuickBooks Online sales receipt by ID.`, + params: [ + { name: 'sales_receipt_id', type: 'string', required: true, description: `The ID of the sales receipt.` }, ], }, - - // ─── Employees ──────────────────────────────────────────────────────────────── { - name: 'quickbooks_employees_list', - description: 'List employees from QuickBooks Online.', - params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, - { - name: 'where_clause', - type: 'string', - required: false, - description: 'Optional WHERE clause.', - }, + name: 'quickbooks_sales_receipts_list', + description: `List sales receipts from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, { - name: 'quickbooks_employee_get', - description: 'Retrieve a single QuickBooks Online employee by ID.', + name: 'quickbooks_tax_code_get', + description: `Retrieve a single QuickBooks Online tax code by ID.`, params: [ - { - name: 'employee_id', - type: 'string', - required: true, - description: 'The ID of the employee.', - }, + { name: 'tax_code_id', type: 'string', required: true, description: `The ID of the tax code.` }, ], }, { - name: 'quickbooks_employee_create', - description: 'Create a new employee in QuickBooks Online.', - params: [ - { - name: 'GivenName', - type: 'string', - required: true, - description: 'Employee first name.', - }, - { - name: 'FamilyName', - type: 'string', - required: true, - description: 'Employee last name.', - }, - { - name: 'DisplayName', - type: 'string', - required: false, - description: 'Display name.', - }, - { - name: 'PrimaryEmailAddr', - type: 'string', - required: false, - description: 'Email as JSON.', - }, - { - name: 'PrimaryPhone', - type: 'string', - required: false, - description: 'Phone as JSON.', - }, - { - name: 'Active', - type: 'boolean', - required: false, - description: 'Whether the employee is active.', - }, + name: 'quickbooks_tax_codes_list', + description: `List tax codes from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, - - // ─── Tax Codes ──────────────────────────────────────────────────────────────── { - name: 'quickbooks_tax_codes_list', - description: 'List tax codes from QuickBooks Online.', + name: 'quickbooks_transfer_create', + description: `Create a new fund transfer between accounts in QuickBooks Online.`, params: [ - { - name: 'max_results', - type: 'integer', - required: true, - description: 'Maximum number of records to return.', - }, - { - name: 'start_position', - type: 'integer', - required: true, - description: 'Starting position for pagination (1-based).', - }, + { name: 'Amount', type: 'string', required: true, description: `Transfer amount as number string.` }, + { name: 'FromAccountRef', type: 'string', required: true, description: `Source account reference as JSON.` }, + { name: 'ToAccountRef', type: 'string', required: true, description: `Destination account reference as JSON.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, + { name: 'TxnDate', type: 'string', required: false, description: `Transaction date YYYY-MM-DD.` }, ], }, { - name: 'quickbooks_tax_code_get', - description: 'Retrieve a single QuickBooks Online tax code by ID.', + name: 'quickbooks_transfer_get', + description: `Retrieve a single QuickBooks Online transfer by ID.`, params: [ - { - name: 'tax_code_id', - type: 'string', - required: true, - description: 'The ID of the tax code.', - }, + { name: 'transfer_id', type: 'string', required: true, description: `The ID of the transfer.` }, ], }, - - // ─── Reports ────────────────────────────────────────────────────────────────── { - name: 'quickbooks_report_profit_and_loss', - description: 'Retrieve a Profit and Loss report from QuickBooks Online.', - params: [ - { - name: 'start_date', - type: 'string', - required: false, - description: 'Report start date in YYYY-MM-DD format.', - }, - { - name: 'end_date', - type: 'string', - required: false, - description: 'Report end date in YYYY-MM-DD format.', - }, - { - name: 'accounting_method', - type: 'string', - required: false, - description: 'Accounting method: Accrual or Cash.', - }, + name: 'quickbooks_transfers_list', + description: `List transfers from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, { - name: 'quickbooks_report_balance_sheet', - description: 'Retrieve a Balance Sheet report from QuickBooks Online.', - params: [ - { - name: 'start_date', - type: 'string', - required: false, - description: 'Report start date in YYYY-MM-DD format.', - }, - { - name: 'end_date', - type: 'string', - required: false, - description: 'Report end date in YYYY-MM-DD format.', - }, - { - name: 'accounting_method', - type: 'string', - required: false, - description: 'Accounting method: Accrual or Cash.', - }, + name: 'quickbooks_vendor_create', + description: `Create a new vendor in QuickBooks Online.`, + params: [ + { name: 'DisplayName', type: 'string', required: true, description: `Display name for the vendor.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the vendor is active.` }, + { name: 'CompanyName', type: 'string', required: false, description: `Company name.` }, + { name: 'FamilyName', type: 'string', required: false, description: `Last name.` }, + { name: 'GivenName', type: 'string', required: false, description: `First name.` }, + { name: 'PrimaryEmailAddr', type: 'string', required: false, description: `Email as JSON.` }, + { name: 'PrimaryPhone', type: 'string', required: false, description: `Phone as JSON.` }, ], }, { - name: 'quickbooks_report_cash_flow', - description: 'Retrieve a Cash Flow report from QuickBooks Online.', + name: 'quickbooks_vendor_credit_create', + description: `Create a new vendor credit in QuickBooks Online.`, params: [ - { - name: 'start_date', - type: 'string', - required: false, - description: 'Report start date in YYYY-MM-DD format.', - }, - { - name: 'end_date', - type: 'string', - required: false, - description: 'Report end date in YYYY-MM-DD format.', - }, + { name: 'Line', type: 'string', required: true, description: `Line items as JSON array.` }, + { name: 'VendorRef', type: 'string', required: true, description: `Vendor reference as JSON.` }, + { name: 'DocNumber', type: 'string', required: false, description: `Vendor credit number.` }, + { name: 'PrivateNote', type: 'string', required: false, description: `Internal memo.` }, ], }, { - name: 'quickbooks_report_trial_balance', - description: 'Retrieve a Trial Balance report from QuickBooks Online.', - params: [ - { - name: 'start_date', - type: 'string', - required: false, - description: 'Report start date in YYYY-MM-DD format.', - }, - { - name: 'end_date', - type: 'string', - required: false, - description: 'Report end date in YYYY-MM-DD format.', - }, - { - name: 'accounting_method', - type: 'string', - required: false, - description: 'Accounting method: Accrual or Cash.', - }, + name: 'quickbooks_vendor_credit_get', + description: `Retrieve a single QuickBooks Online vendor credit by ID.`, + params: [ + { name: 'vendor_credit_id', type: 'string', required: true, description: `The ID of the vendor credit.` }, ], }, { - name: 'quickbooks_report_general_ledger', - description: 'Retrieve a General Ledger report from QuickBooks Online.', - params: [ - { - name: 'start_date', - type: 'string', - required: false, - description: 'Report start date in YYYY-MM-DD format.', - }, - { - name: 'end_date', - type: 'string', - required: false, - description: 'Report end date in YYYY-MM-DD format.', - }, - { - name: 'accounting_method', - type: 'string', - required: false, - description: 'Accounting method: Accrual or Cash.', - }, + name: 'quickbooks_vendor_credits_list', + description: `List vendor credits from QuickBooks Online.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, ], }, { - name: 'quickbooks_report_aged_payables', - description: 'Retrieve an Aged Payable Detail report from QuickBooks Online.', + name: 'quickbooks_vendor_get', + description: `Retrieve a single QuickBooks Online vendor by ID.`, params: [ - { - name: 'report_date', - type: 'string', - required: false, - description: 'Report date in YYYY-MM-DD format.', - }, - { - name: 'due_date', - type: 'string', - required: false, - description: 'Due date filter in YYYY-MM-DD format.', - }, + { name: 'vendor_id', type: 'string', required: true, description: `The ID of the vendor.` }, ], }, { - name: 'quickbooks_report_aged_receivables', - description: 'Retrieve an Aged Receivable Detail report from QuickBooks Online.', - params: [ - { - name: 'report_date', - type: 'string', - required: false, - description: 'Report date in YYYY-MM-DD format.', - }, - { - name: 'due_date', - type: 'string', - required: false, - description: 'Due date filter in YYYY-MM-DD format.', - }, + name: 'quickbooks_vendor_update', + description: `Update an existing vendor in QuickBooks Online.`, + params: [ + { name: 'DisplayName', type: 'string', required: true, description: `Display name.` }, + { name: 'Id', type: 'string', required: true, description: `Vendor ID.` }, + { name: 'SyncToken', type: 'string', required: true, description: `SyncToken from vendor_get.` }, + { name: 'Active', type: 'boolean', required: false, description: `Whether the vendor is active.` }, + { name: 'CompanyName', type: 'string', required: false, description: `Company name.` }, + { name: 'PrimaryEmailAddr', type: 'string', required: false, description: `Email as JSON.` }, + ], + }, + { + name: 'quickbooks_vendors_list', + description: `List vendors from QuickBooks Online with optional filtering and pagination.`, + params: [ + { name: 'max_results', type: 'integer', required: true, description: `Maximum number of records to return.` }, + { name: 'start_position', type: 'integer', required: true, description: `Starting position for pagination (1-based).` }, + { name: 'where_clause', type: 'string', required: false, description: `Optional WHERE clause.` }, ], }, ] diff --git a/src/data/agent-connectors/supermetricsmcp.ts b/src/data/agent-connectors/supermetricsmcp.ts new file mode 100644 index 000000000..b67141c4a --- /dev/null +++ b/src/data/agent-connectors/supermetricsmcp.ts @@ -0,0 +1,158 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'supermetricsmcp_accounts_discovery', + description: `List connected ad accounts and profiles for a marketing or advertising data source.`, + params: [ + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'compress', type: 'string', required: false, description: `Whether to compress the response payload.` }, + { name: 'filter', type: 'string', required: false, description: `Text filter to narrow discovery results.` }, + ], + }, + { + name: 'supermetricsmcp_campaign_and_resource_get', + description: `Retrieve campaign details, performance metrics, or related resources from an advertising platform.`, + params: [ + { name: 'account_id', type: 'string', required: true, description: `Ad account or profile ID for the selected data source.` }, + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'max_rows', type: 'string', required: false, description: `Maximum number of rows to return.` }, + { name: 'params', type: 'string', required: false, description: `Resource-type-specific parameters. See ResourceParams for which fields apply to each resource_type.` }, + { name: 'resource_type', type: 'string', required: false, description: `Type of resource to retrieve (e.g. \`CAMPAIGN\`, \`AD_GROUP\`).` }, + ], + }, + { + name: 'supermetricsmcp_campaign_create', + description: `Create a new advertising campaign on Google Ads, Facebook Ads, TikTok Ads, LinkedIn Ads, or Microsoft Advertising.`, + params: [ + { name: 'account_id', type: 'string', required: true, description: `Ad account or profile ID for the selected data source.` }, + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'name', type: 'string', required: true, description: `Display name for the campaign.` }, + { name: 'ad_groups', type: 'string', required: false, description: `Ad groups (AW/AC) or ad sets (FA/TIK) to create with the campaign.` }, + { name: 'bidding_strategy', type: 'string', required: false, description: `Bidding strategy. Also accepted inside platform_settings. AW: MANUAL_CPC, MAXIMIZE_CLICKS, MAXIMIZE_CONVERSIONS, TARGET_CPA, MAXIMIZE_CONVERSION_VALUE, TARGET_ROAS. For TARGET_ROAS, set the target value via platform_settings.bidding_config.target_roas (float multiplier, e.g. 3.5 = 350% ROAS). Without it, optimizes for max value with no target. For TARGET_CPA, set target via platform_settings.bidding_config.target_cpa (float in account currency, e.g. 5.0 = $5). AC: MAX_CLICKS, MAX_CONVERSIONS, MANUAL_CPC, ENHANCED_CPC, TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSION_VALUE. FA: LOWEST_COST_WITHOUT_CAP (default), LOWEST_COST_WITH_BID_CAP, COST_CAP. FA also accepts TARGET_ROAS — use bidding_config.target_roas to set the target. Auto-sets OUTCOME_SALES objective, VALUE optimization, and pixel if not specified.` }, + { name: 'budget_amount', type: 'string', required: false, description: `Daily or lifetime budget amount in the account currency.` }, + { name: 'budget_type', type: 'string', required: false, description: `Budget type: DAILY or LIFETIME. LIA: only LIFETIME at campaign level. AC: LIFETIME only works on AUDIENCE campaigns.` }, + { name: 'end_date', type: 'string', required: false, description: `End of the data range (YYYY-MM-DD).` }, + { name: 'extensions', type: 'string', required: false, description: `Ad extensions (AW/AC — sitelinks, callouts, snippets; AW also supports image extensions). Ignored on FA/TIK.` }, + { name: 'platform_settings', type: 'string', required: false, description: `Platform-specific settings. AW: {campaign_type (SEARCH, DISPLAY, PERFORMANCE_MAX, SHOPPING, VIDEO, DEMAND_GEN), bidding_strategy, bidding_config (see below), network_settings}. bidding_config (AW/AC/FA): {target_roas (float multiplier, e.g. 3.5 = 350% ROAS — used with TARGET_ROAS), target_cpa (float in account currency, e.g. 5.0 = $5 — used with TARGET_CPA)}. Works the same on all platforms. AC: {campaign_type (SEARCH, AUDIENCE, SHOPPING, DYNAMIC_SEARCH, PERFORMANCE_MAX), bidding_strategy (MAX_CLICKS, MAX_CONVERSIONS, MANUAL_CPC, TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSION_VALUE, ENHANCED_CPC)}. FA: {objective (OUTCOME_TRAFFIC, OUTCOME_ENGAGEMENT, OUTCOME_LEADS, OUTCOME_SALES, OUTCOME_AWARENESS, OUTCOME_APP_PROMOTION), special_ad_categories, buying_type, campaign_budget_optimization (true=CBO on, budget at campaign level; false=CBO off, budget per ad set)}. TIK: {objective_type (TRAFFIC, LEAD_GENERATION, REACH, VIDEO_VIEWS, CONVERSIONS, APP_INSTALL), promotion_type (WEBSITE, APP, SHOP — defaults to WEBSITE), placement_type (PLACEMENT_TYPE_AUTOMATIC default)}.LIA: campaign-level platform_settings are optional. Ad group platform_settings are where LIA-specific options go (campaign_type, cost_type, objective_type, daily_budget).` }, + { name: 'start_date', type: 'string', required: false, description: `Start of the data range (YYYY-MM-DD).` }, + { name: 'status', type: 'string', required: false, description: `Campaign status (e.g. \`ENABLED\`, \`PAUSED\`).` }, + { name: 'targeting', type: 'string', required: false, description: `Campaign-level targeting defaults inherited by all ad groups` }, + { name: 'url_tags', type: 'string', required: false, description: `Campaign-level URL tracking parameters appended to ad links` }, + ], + }, + { + name: 'supermetricsmcp_campaign_update', + description: `Update an existing advertising campaign by its ID on a supported ad platform.`, + params: [ + { name: 'account_id', type: 'string', required: true, description: `Ad account or profile ID for the selected data source.` }, + { name: 'campaign_id', type: 'string', required: true, description: `Unique identifier of the campaign to update.` }, + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'ad_groups', type: 'string', required: false, description: `Ad groups to create (no id) or update (with id). Only provided fields change on update.` }, + { name: 'bidding_strategy', type: 'string', required: false, description: `New bidding strategy. AW: MANUAL_CPC, MAXIMIZE_CLICKS, MAXIMIZE_CONVERSIONS, TARGET_CPA, MAXIMIZE_CONVERSION_VALUE, TARGET_ROAS. For TARGET_ROAS, set the target value via platform_settings.bidding_config.target_roas (float multiplier, e.g. 3.5 = 350% ROAS). Without it, optimizes for max value with no target. For TARGET_CPA, set target via platform_settings.bidding_config.target_cpa (float in account currency, e.g. 5.0 = $5). AC: MAX_CLICKS, MAX_CONVERSIONS, MANUAL_CPC, ENHANCED_CPC, TARGET_CPA, TARGET_ROAS, MAXIMIZE_CONVERSION_VALUE. FA: LOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, COST_CAP. FA also accepts TARGET_ROAS — use bidding_config.target_roas to set the target. IMPORTANT: FA bid strategy changes require the campaign to have a budget. CBO-off campaigns (budget at ad set level) cannot have their bid strategy changed. LOWEST_COST_WITH_BID_CAP requires bid_amount on each ad set.` }, + { name: 'budget_amount', type: 'string', required: false, description: `Daily or lifetime budget amount in the account currency.` }, + { name: 'budget_type', type: 'string', required: false, description: `New budget type: DAILY or LIFETIME. LIA: only LIFETIME at campaign level. AC: LIFETIME only works on AUDIENCE campaigns.` }, + { name: 'end_date', type: 'string', required: false, description: `End of the data range (YYYY-MM-DD).` }, + { name: 'extensions', type: 'string', required: false, description: `Replace extensions (removes old, adds new) — AW/AC. Ignored on FA/TIK.` }, + { name: 'name', type: 'string', required: false, description: `Display name for the campaign.` }, + { name: 'platform_settings', type: 'string', required: false, description: `Platform-specific settings to update. AW/AC/FA: {bidding_config: {target_roas (float, e.g. 3.5 = 350%), target_cpa (float, e.g. 5.0 = $5)}}. AW: {ad_schedule, bid_adjustments}. FA: {campaign_budget_optimization (true=CBO on, false=CBO off)}.` }, + { name: 'remove_ad_group_ids', type: 'string', required: false, description: `Ad group / ad set IDs to remove` }, + { name: 'remove_ad_ids', type: 'string', required: false, description: `Ad IDs to remove` }, + { name: 'start_date', type: 'string', required: false, description: `Start of the data range (YYYY-MM-DD).` }, + { name: 'status', type: 'string', required: false, description: `Campaign status (e.g. \`ENABLED\`, \`PAUSED\`).` }, + { name: 'targeting', type: 'string', required: false, description: `Replace campaign targeting (removes old, adds new)` }, + { name: 'url_tags', type: 'string', required: false, description: `Campaign-level URL tracking parameters appended to ad links` }, + ], + }, + { + name: 'supermetricsmcp_contact_supermetrics', + description: `Send product feedback, create a support ticket, or submit a sales enquiry to Supermetrics.`, + params: [ + { name: 'message', type: 'string', required: true, description: `Detailed description. Include relevant context: tools used, errors encountered, data sources involved, trace IDs` }, + { name: 'subject', type: 'string', required: true, description: `Brief summary of the feedback or issue` }, + { name: 'type', type: 'string', required: true, description: `Type of contact: 'feedback' for product feedback/feature requests, 'support' for technical issues, 'sales' for sales enquiries and demo requests` }, + { name: 'category', type: 'string', required: false, description: `Support ticket category. Only used when type is 'support'` }, + { name: 'company', type: 'string', required: false, description: `Contact's company name. Required when type is 'sales'` }, + { name: 'country', type: 'string', required: false, description: `Contact's country. Required when type is 'sales'` }, + { name: 'ds_id', type: 'string', required: false, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'firstname', type: 'string', required: false, description: `Contact's first name. Required when type is 'sales'` }, + { name: 'industry', type: 'string', required: false, description: `Contact's industry. Used when type is 'sales'` }, + { name: 'lastname', type: 'string', required: false, description: `Contact's last name. Required when type is 'sales'` }, + ], + }, + { + name: 'supermetricsmcp_data_query', + description: `Query marketing analytics data from any connected data source, with optional date ranges, field selection, and filters.`, + params: [ + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'compare_end_date', type: 'string', required: false, description: `End of the comparison period (YYYY-MM-DD). Required when \`compare_type\` is \`custom\`.` }, + { name: 'compare_show', type: 'string', required: false, description: `How to display the comparison: +- 'perc_change': percentage change (default) +- 'abs_change': absolute change +- 'value': raw value from the comparison period` }, + { name: 'compare_start_date', type: 'string', required: false, description: `Start of the comparison period (YYYY-MM-DD). Required when \`compare_type\` is \`custom\`.` }, + { name: 'compare_type', type: 'string', required: false, description: `Select how to compare results to an earlier period: +- 'prev_range': previous period of the same length +- 'prev_year': same period in the previous year +- 'prev_year_weekday': same weekdays in the previous year +- 'custom': user-defined period (requires compare_start_date and compare_end_date)` }, + { name: 'date_range_type', type: 'string', required: false, description: `Preset date range (e.g. \`last_30_days\`, \`last_month\`). Use instead of \`start_date\`/\`end_date\`.` }, + { name: 'ds_accounts', type: 'string', required: false, description: `List of account IDs to query data from.` }, + { name: 'end_date', type: 'string', required: false, description: `End of the data range (YYYY-MM-DD).` }, + { name: 'fields', type: 'string', required: false, description: `List of metric and dimension field names to include. Use \`field_discovery\` to find valid field names.` }, + { name: 'filters', type: 'string', required: false, description: `List of field filters to narrow the query results.` }, + { name: 'max_rows', type: 'string', required: false, description: `Maximum number of rows to return.` }, + { name: 'settings', type: 'string', required: false, description: `All data source-specific settings from data_source_discovery config mode. Pass as a JSON object. IMPORTANT: Every setting_id from data_source_discovery (report_type, common_settings, report-type-specific settings) MUST be passed inside this object — do NOT pass them as separate root-level parameters. Example: {"report_type": "TopIosApps", "country": "US", "list_type": "top-free"}` }, + { name: 'start_date', type: 'string', required: false, description: `Start of the data range (YYYY-MM-DD).` }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for date calculations (e.g. \`America/New_York\`).` }, + ], + }, + { + name: 'supermetricsmcp_data_source_discovery', + description: `List all available marketing and advertising data sources supported by Supermetrics.`, + params: [ + { name: 'compress', type: 'string', required: false, description: `Whether to compress the response payload.` }, + { name: 'ds_id', type: 'string', required: false, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + ], + }, + { + name: 'supermetricsmcp_field_discovery', + description: `List available metrics and dimensions for a specific data source. Returns field names usable in \`data_query\`.`, + params: [ + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'compress', type: 'string', required: false, description: `Whether to compress the response payload.` }, + { name: 'filter', type: 'string', required: false, description: `Text filter to narrow discovery results.` }, + ], + }, + { + name: 'supermetricsmcp_get_async_query_results', + description: `Retrieve results of an async \`data_query\` using the schedule ID returned by that query.`, + params: [ + { name: 'schedule_id', type: 'string', required: true, description: `Schedule ID returned by \`data_query\` for async result retrieval.` }, + { name: 'compress', type: 'string', required: false, description: `Whether to compress the response payload.` }, + ], + }, + { + name: 'supermetricsmcp_get_today', + description: `Get the current UTC date and time. Use before \`data_query\` to resolve relative date references.`, + params: [ + ], + }, + { + name: 'supermetricsmcp_resources_manage', + description: `Open the visual media picker or manage ad creative assets for a supported platform.`, + params: [ + { name: 'account_id', type: 'string', required: true, description: `Ad account or profile ID for the selected data source.` }, + { name: 'ds_id', type: 'string', required: true, description: `Data source identifier (e.g. \`GA4\`, \`FA\`, \`ADWORDS\`). Use \`data_source_discovery\` to list available IDs.` }, + { name: 'action', type: 'string', required: false, description: `Action to perform on the resource (e.g. \`browse_assets\`).` }, + { name: 'asset_type', type: 'string', required: false, description: `Type of creative asset to manage (e.g. \`IMAGE\`, \`VIDEO\`).` }, + { name: 'params', type: 'string', required: false, description: `Internal action-specific parameters (used by the picker UI).` }, + ], + }, + { + name: 'supermetricsmcp_user_info', + description: `Retrieve the authenticated Supermetrics user's profile information.`, + params: [ + ], + }, +] diff --git a/src/data/agent-connectors/xero.ts b/src/data/agent-connectors/xero.ts index 73677d688..2c5b1a583 100644 --- a/src/data/agent-connectors/xero.ts +++ b/src/data/agent-connectors/xero.ts @@ -1,1612 +1,660 @@ import type { Tool } from '../../types/agent-connectors' -const XERO_TENANT_PARAM: Tool['params'][number] = { - name: 'xero_tenant_id', - type: 'string', - required: false, - description: - 'Xero tenant (organisation) ID. Injected automatically by Scalekit — you do not need to supply this.', -} - export const tools: Tool[] = [ { - name: 'xero_accounts_list', - description: 'Retrieve the full chart of accounts for a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: - 'Return records modified after this UTC datetime (ISO 8601). e.g. 2024-01-01T00:00:00', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Name ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Type=="BANK"', - }, + name: 'xero_account_create', + description: `Create a new account in the Xero chart of accounts.`, + params: [ + { name: 'Code', type: 'string', required: true, description: `Customer defined alpha numeric account code.` }, + { name: 'Name', type: 'string', required: true, description: `Name of the account.` }, + { name: 'Type', type: 'string', required: true, description: `Account type (e.g. BANK, CURRENT, EQUITY, EXPENSE, FIXED, LIABILITY, OTHERINCOME, OVERHEADS, PREPAYMENT, REVENUE, SALES, TERMLIAB, PAYGLIABILITY).` }, + { name: 'BankAccountNumber', type: 'string', required: false, description: `For bank accounts, the bank account number.` }, + { name: 'CurrencyCode', type: 'string', required: false, description: `For bank accounts, the currency of the account.` }, + { name: 'Description', type: 'string', required: false, description: `Description of the account.` }, + { name: 'EnablePaymentsToAccount', type: 'boolean', required: false, description: `If true, payments can be made to this account.` }, + { name: 'TaxType', type: 'string', required: false, description: `Default tax type for the account.` }, ], }, { - name: 'xero_account_get', - description: 'Retrieve a single account by its AccountID.', + name: 'xero_account_delete', + description: `Archive (soft-delete) an account from the Xero chart of accounts by setting its status to ARCHIVED.`, params: [ - XERO_TENANT_PARAM, - { - name: 'account_id', - type: 'string', - required: true, - description: 'AccountID GUID. Get it from xero_accounts_list.', - }, + { name: 'account_id', type: 'string', required: true, description: `Xero account GUID to archive.` }, ], }, { - name: 'xero_account_create', - description: 'Create a new account in the Xero chart of accounts.', - params: [ - XERO_TENANT_PARAM, - { - name: 'Code', - type: 'string', - required: true, - description: 'Unique account code. e.g. 200', - }, - { - name: 'Name', - type: 'string', - required: true, - description: 'Account name. e.g. My Savings Account', - }, - { name: 'Type', type: 'string', required: true, description: 'Account type. e.g. BANK' }, - { - name: 'BankAccountNumber', - type: 'string', - required: false, - description: 'Bank account number. e.g. 01-0123-0123456-00', - }, - { - name: 'CurrencyCode', - type: 'string', - required: false, - description: 'Currency code. e.g. NZD', - }, - { name: 'Description', type: 'string', required: false, description: 'Account description.' }, - { - name: 'EnablePaymentsToAccount', - type: 'boolean', - required: false, - description: 'Allow payments to this account.', - }, - { name: 'TaxType', type: 'string', required: false, description: 'Tax type. e.g. NONE' }, + name: 'xero_account_get', + description: `Retrieve a single account by its AccountID.`, + params: [ + { name: 'account_id', type: 'string', required: true, description: `Xero account GUID.` }, ], }, { name: 'xero_account_update', - description: 'Update an existing account in the Xero chart of accounts.', - params: [ - XERO_TENANT_PARAM, - { - name: 'account_id', - type: 'string', - required: true, - description: 'AccountID GUID. Get it from xero_accounts_list.', - }, - { name: 'Code', type: 'string', required: false, description: 'Account code.' }, - { name: 'Description', type: 'string', required: false, description: 'Account description.' }, - { - name: 'EnablePaymentsToAccount', - type: 'boolean', - required: false, - description: 'Allow payments to this account.', - }, - { name: 'Name', type: 'string', required: false, description: 'Account name.' }, - { name: 'TaxType', type: 'string', required: false, description: 'Tax type.' }, + description: `Update an existing account in the Xero chart of accounts.`, + params: [ + { name: 'account_id', type: 'string', required: true, description: `Xero account GUID.` }, + { name: 'Code', type: 'string', required: false, description: `Updated account code.` }, + { name: 'Description', type: 'string', required: false, description: `Updated description.` }, + { name: 'EnablePaymentsToAccount', type: 'boolean', required: false, description: `Enable/disable payments to account.` }, + { name: 'Name', type: 'string', required: false, description: `Updated name of the account.` }, + { name: 'TaxType', type: 'string', required: false, description: `Updated tax type.` }, ], }, { - name: 'xero_account_delete', - description: - 'Archive (soft-delete) an account from the Xero chart of accounts by setting its status to ARCHIVED.', + name: 'xero_accounts_list', + description: `Retrieve the full chart of accounts for a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'account_id', - type: 'string', - required: true, - description: 'AccountID GUID. Get it from xero_accounts_list.', - }, + { name: 'modified_after', type: 'string', required: false, description: `Return records modified after this UTC datetime (ISO 8601).` }, + { name: 'order', type: 'string', required: false, description: `Order results (e.g. Name ASC).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression (e.g. Type=="BANK").` }, ], }, { - name: 'xero_contacts_list', - description: 'Retrieve contacts (customers and suppliers) from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Name ASC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: 'Records per page. e.g. 100', - }, - { - name: 'searchTerm', - type: 'string', - required: false, - description: 'Search term. e.g. Acme', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. IsSupplier==true', - }, + name: 'xero_bank_transactions_list', + description: `Retrieve spend or receive money bank transactions from Xero.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_contact_get', - description: 'Retrieve a single contact by its ContactID.', + name: 'xero_bank_transfers_list', + description: `Retrieve bank transfers between accounts in Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'contact_id', - type: 'string', - required: true, - description: 'ContactID GUID. Get it from xero_contacts_list.', - }, + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_contact_create', - description: 'Create a new contact (customer or supplier) in Xero.', - params: [ - XERO_TENANT_PARAM, - { name: 'Name', type: 'string', required: true, description: 'Contact name. e.g. Acme Corp' }, - { - name: 'AccountNumber', - type: 'string', - required: false, - description: 'Account number. e.g. CUST-001', - }, - { - name: 'Addresses', - type: 'array', - required: false, - description: 'Array of address objects.', - }, - { - name: 'DefaultCurrency', - type: 'string', - required: false, - description: 'Default currency code. e.g. NZD', - }, - { - name: 'EmailAddress', - type: 'string', - required: false, - description: 'Email address. e.g. john@acme.com', - }, - { name: 'FirstName', type: 'string', required: false, description: 'First name. e.g. John' }, - { name: 'IsCustomer', type: 'boolean', required: false, description: 'Mark as a customer.' }, - { name: 'IsSupplier', type: 'boolean', required: false, description: 'Mark as a supplier.' }, - { name: 'LastName', type: 'string', required: false, description: 'Last name. e.g. Smith' }, - { name: 'Phones', type: 'array', required: false, description: 'Array of phone objects.' }, + name: 'xero_batch_payments_list', + description: `Retrieve batch payments from a Xero organisation.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_contact_update', - description: 'Update an existing contact in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'contact_id', - type: 'string', - required: true, - description: 'ContactID GUID. Get it from xero_contacts_list.', - }, - { - name: 'DefaultCurrency', - type: 'string', - required: false, - description: 'Default currency code.', - }, - { name: 'EmailAddress', type: 'string', required: false, description: 'Email address.' }, - { name: 'FirstName', type: 'string', required: false, description: 'First name.' }, - { name: 'IsCustomer', type: 'boolean', required: false, description: 'Mark as a customer.' }, - { name: 'IsSupplier', type: 'boolean', required: false, description: 'Mark as a supplier.' }, - { name: 'LastName', type: 'string', required: false, description: 'Last name.' }, - { name: 'Name', type: 'string', required: false, description: 'Contact name.' }, + name: 'xero_contact_create', + description: `Create a new contact (customer or supplier) in Xero.`, + params: [ + { name: 'Name', type: 'string', required: true, description: `Full name of the contact / company.` }, + { name: 'AccountNumber', type: 'string', required: false, description: `Unique account number for this contact.` }, + { name: 'Addresses', type: 'array', required: false, description: `Array of address objects.` }, + { name: 'DefaultCurrency', type: 'string', required: false, description: `Default currency for this contact.` }, + { name: 'EmailAddress', type: 'string', required: false, description: `Email address of the contact.` }, + { name: 'FirstName', type: 'string', required: false, description: `First name of primary contact person.` }, + { name: 'IsCustomer', type: 'boolean', required: false, description: `True if contact is a customer.` }, + { name: 'IsSupplier', type: 'boolean', required: false, description: `True if contact is a supplier.` }, + { name: 'LastName', type: 'string', required: false, description: `Last name of primary contact person.` }, + { name: 'Phones', type: 'array', required: false, description: `Array of phone objects e.g. [{"PhoneType":"DEFAULT","PhoneNumber":"021-123456"}].` }, ], }, { - name: 'xero_contact_groups_list', - description: 'Retrieve all contact groups in a Xero organisation.', + name: 'xero_contact_get', + description: `Retrieve a single contact by its ContactID.`, params: [ - XERO_TENANT_PARAM, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Name ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="ACTIVE"', - }, + { name: 'contact_id', type: 'string', required: true, description: `Xero contact GUID.` }, ], }, { - name: 'xero_contact_group_get', - description: 'Retrieve a single contact group by its ContactGroupID.', + name: 'xero_contact_group_create', + description: `Create a new contact group in Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'contact_group_id', - type: 'string', - required: true, - description: 'ContactGroupID GUID. Get it from xero_contact_groups_list.', - }, + { name: 'Name', type: 'string', required: true, description: `Name of the contact group.` }, ], }, { - name: 'xero_contact_group_create', - description: 'Create a new contact group in Xero.', + name: 'xero_contact_group_delete', + description: `Delete (soft-delete) a contact group in Xero by setting its status to DELETED.`, params: [ - XERO_TENANT_PARAM, - { - name: 'Name', - type: 'string', - required: true, - description: 'Group name. e.g. VIP Customers', - }, + { name: 'contact_group_id', type: 'string', required: true, description: `Xero contact group GUID to delete.` }, ], }, { - name: 'xero_contact_group_update', - description: 'Update a contact group name in Xero.', + name: 'xero_contact_group_get', + description: `Retrieve a single contact group by its ContactGroupID.`, params: [ - XERO_TENANT_PARAM, - { - name: 'contact_group_id', - type: 'string', - required: true, - description: 'ContactGroupID GUID. Get it from xero_contact_groups_list.', - }, - { name: 'Name', type: 'string', required: true, description: 'New group name.' }, + { name: 'contact_group_id', type: 'string', required: true, description: `Xero contact group GUID.` }, ], }, { - name: 'xero_contact_group_delete', - description: 'Delete (soft-delete) a contact group in Xero by setting its status to DELETED.', + name: 'xero_contact_group_update', + description: `Update a contact group name in Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'contact_group_id', - type: 'string', - required: true, - description: 'ContactGroupID GUID. Get it from xero_contact_groups_list.', - }, + { name: 'contact_group_id', type: 'string', required: true, description: `Xero contact group GUID.` }, + { name: 'Name', type: 'string', required: true, description: `New name for the contact group.` }, ], }, { - name: 'xero_invoices_list', - description: 'Retrieve sales invoices and bills from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'ContactIDs', - type: 'string', - required: false, - description: 'Comma-separated ContactID GUIDs to filter by.', - }, - { - name: 'Statuses', - type: 'string', - required: false, - description: 'Comma-separated statuses. e.g. AUTHORISED,SUBMITTED', - }, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. DueDate ASC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'pageSize', - type: 'integer', - required: false, - description: 'Records per page. e.g. 100', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + name: 'xero_contact_groups_list', + description: `Retrieve all contact groups in a Xero organisation.`, + params: [ + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_invoice_get', - description: 'Retrieve a single invoice or bill by its InvoiceID.', + name: 'xero_contact_update', + description: `Update an existing contact in Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'invoice_id', - type: 'string', - required: true, - description: 'InvoiceID GUID. Get it from xero_invoices_list.', - }, + { name: 'contact_id', type: 'string', required: true, description: `Xero contact GUID.` }, + { name: 'DefaultCurrency', type: 'string', required: false, description: `Updated default currency.` }, + { name: 'EmailAddress', type: 'string', required: false, description: `Updated email address.` }, + { name: 'FirstName', type: 'string', required: false, description: `Updated first name.` }, + { name: 'IsCustomer', type: 'boolean', required: false, description: `Update customer flag.` }, + { name: 'IsSupplier', type: 'boolean', required: false, description: `Update supplier flag.` }, + { name: 'LastName', type: 'string', required: false, description: `Updated last name.` }, + { name: 'Name', type: 'string', required: false, description: `Updated name.` }, ], }, { - name: 'xero_invoice_create', - description: 'Create a new invoice (ACCREC) or bill (ACCPAY) in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'Contact', - type: 'string', - required: true, - description: 'Contact object as JSON string with ContactID.', - }, - { - name: 'LineItems', - type: 'array', - required: true, - description: 'Array of line item objects.', - }, - { - name: 'Type', - type: 'string', - required: true, - description: 'ACCREC (invoice) or ACCPAY (bill).', - }, - { - name: 'CurrencyCode', - type: 'string', - required: false, - description: 'Currency code. e.g. NZD', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date (YYYY-MM-DD). Required when authorising.', - }, - { - name: 'InvoiceNumber', - type: 'string', - required: false, - description: 'Invoice number. e.g. INV-001', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference. e.g. PO-123' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. AUTHORISED' }, + name: 'xero_contacts_list', + description: `Retrieve contacts (customers and suppliers) from a Xero organisation.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Return contacts modified after this UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order (e.g. Name ASC).` }, + { name: 'page', type: 'number', required: false, description: `Page number for pagination.` }, + { name: 'pageSize', type: 'number', required: false, description: `Number of records per page (max 1000).` }, + { name: 'searchTerm', type: 'string', required: false, description: `Search term to filter contacts by name or email.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression (e.g. IsSupplier==true).` }, ], }, { - name: 'xero_invoice_update', - description: - 'Update an existing invoice or bill in Xero. DueDate is required when setting Status to AUTHORISED.', - params: [ - XERO_TENANT_PARAM, - { - name: 'invoice_id', - type: 'string', - required: true, - description: 'InvoiceID GUID. Get it from xero_invoices_list.', - }, - { - name: 'DueDate', - type: 'string', - required: false, - description: 'Due date (YYYY-MM-DD). Required when setting Status to AUTHORISED.', - }, - { - name: 'LineItems', - type: 'array', - required: false, - description: 'Array of line item objects.', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. AUTHORISED' }, + name: 'xero_credit_note_create', + description: `Create a new credit note in Xero.`, + params: [ + { name: 'Contact', type: 'string', required: true, description: `Contact object e.g. {"ContactID":"guid"}.` }, + { name: 'LineItems', type: 'array', required: true, description: `Array of line item objects.` }, + { name: 'Type', type: 'string', required: true, description: `Credit note type: ACCRECCREDIT (sales credit) or ACCPAYCREDIT (purchase credit).` }, + { name: 'CurrencyCode', type: 'string', required: false, description: `Currency code.` }, + { name: 'Date', type: 'string', required: false, description: `Date of credit note (YYYY-MM-DD).` }, + { name: 'Reference', type: 'string', required: false, description: `Reference number.` }, + { name: 'Status', type: 'string', required: false, description: `Status: DRAFT or AUTHORISED.` }, ], }, { - name: 'xero_invoice_delete', - description: - 'Void (soft-delete) an invoice or bill in Xero by setting its status to VOIDED. Only works on AUTHORISED or SUBMITTED invoices.', + name: 'xero_credit_note_get', + description: `Retrieve a single credit note by its CreditNoteID.`, params: [ - XERO_TENANT_PARAM, - { - name: 'invoice_id', - type: 'string', - required: true, - description: 'InvoiceID GUID. Get it from xero_invoices_list.', - }, + { name: 'credit_note_id', type: 'string', required: true, description: `Xero credit note GUID.` }, ], }, { - name: 'xero_credit_notes_list', - description: 'Retrieve credit notes from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + name: 'xero_credit_note_update', + description: `Update an existing credit note in Xero.`, + params: [ + { name: 'credit_note_id', type: 'string', required: true, description: `Xero credit note GUID.` }, + { name: 'Reference', type: 'string', required: false, description: `Updated reference.` }, + { name: 'Status', type: 'string', required: false, description: `New status (DRAFT, AUTHORISED, VOIDED).` }, ], }, { - name: 'xero_credit_note_get', - description: 'Retrieve a single credit note by its CreditNoteID.', + name: 'xero_credit_notes_list', + description: `Retrieve credit notes from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'credit_note_id', - type: 'string', - required: true, - description: 'CreditNoteID GUID. Get it from xero_credit_notes_list.', - }, + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_credit_note_create', - description: 'Create a new credit note in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'Contact', - type: 'string', - required: true, - description: 'Contact object as JSON string with ContactID.', - }, - { - name: 'LineItems', - type: 'array', - required: true, - description: 'Array of line item objects.', - }, - { - name: 'Type', - type: 'string', - required: true, - description: 'ACCRECCREDIT or ACCPAYCREDIT.', - }, - { - name: 'CurrencyCode', - type: 'string', - required: false, - description: 'Currency code. e.g. NZD', - }, - { - name: 'Date', - type: 'string', - required: false, - description: 'Credit note date (YYYY-MM-DD).', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference. e.g. CN-001' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. AUTHORISED' }, + name: 'xero_currencies_list', + description: `Retrieve enabled currencies for a Xero organisation.`, + params: [ + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_credit_note_update', - description: 'Update an existing credit note in Xero.', + name: 'xero_employee_create', + description: `Create a new employee record in Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'credit_note_id', - type: 'string', - required: true, - description: 'CreditNoteID GUID. Get it from xero_credit_notes_list.', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference. e.g. CN-002' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. AUTHORISED' }, + { name: 'FirstName', type: 'string', required: true, description: `First name of the employee.` }, + { name: 'LastName', type: 'string', required: true, description: `Last name of the employee.` }, + { name: 'ExternalLink', type: 'string', required: false, description: `Link to employee in external system e.g. {"Url":"https://...","Description":"Employee record"}.` }, + { name: 'Status', type: 'string', required: false, description: `Employee status (ACTIVE or TERMINATED).` }, ], }, { - name: 'xero_payments_list', - description: 'Retrieve payments applied to invoices, credit notes, or prepayments in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + name: 'xero_employee_get', + description: `Retrieve a single employee by their EmployeeID.`, + params: [ + { name: 'employee_id', type: 'string', required: true, description: `Xero employee GUID.` }, ], }, { - name: 'xero_overpayments_list', - description: 'Retrieve overpayments from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + name: 'xero_employee_update', + description: `Update an existing employee in Xero.`, + params: [ + { name: 'employee_id', type: 'string', required: true, description: `Xero employee GUID.` }, + { name: 'FirstName', type: 'string', required: false, description: `Updated first name.` }, + { name: 'LastName', type: 'string', required: false, description: `Updated last name.` }, + { name: 'Status', type: 'string', required: false, description: `Updated status (ACTIVE or TERMINATED).` }, ], }, { - name: 'xero_prepayments_list', - description: 'Retrieve prepayments from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + name: 'xero_employees_list', + description: `Retrieve employees from a Xero organisation.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_batch_payments_list', - description: 'Retrieve batch payments from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + name: 'xero_invoice_create', + description: `Create a new invoice (ACCREC) or bill (ACCPAY) in Xero.`, + params: [ + { name: 'Contact', type: 'string', required: true, description: `Contact object with ContactID e.g. {"ContactID":"guid"}.` }, + { name: 'LineItems', type: 'array', required: true, description: `Array of line items. Each needs Description, Quantity, UnitAmount, AccountCode.` }, + { name: 'Type', type: 'string', required: true, description: `Invoice type: ACCREC (sales invoice) or ACCPAY (bill/purchase invoice).` }, + { name: 'CurrencyCode', type: 'string', required: false, description: `Currency (defaults to org default).` }, + { name: 'DueDate', type: 'string', required: false, description: `Due date in YYYY-MM-DD format.` }, + { name: 'InvoiceNumber', type: 'string', required: false, description: `Custom invoice reference number.` }, + { name: 'Reference', type: 'string', required: false, description: `Additional reference number.` }, + { name: 'Status', type: 'string', required: false, description: `Invoice status (DRAFT or AUTHORISED).` }, ], }, { - name: 'xero_bank_transactions_list', - description: 'Retrieve spend or receive money bank transactions from Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Type=="SPEND"', - }, + name: 'xero_invoice_delete', + description: `Void (soft-delete) an invoice or bill in Xero by setting its status to VOIDED.`, + params: [ + { name: 'invoice_id', type: 'string', required: true, description: `Xero invoice GUID to void.` }, ], }, { - name: 'xero_bank_transfers_list', - description: 'Retrieve bank transfers between accounts in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Amount>100', - }, + name: 'xero_invoice_get', + description: `Retrieve a single invoice or bill by its InvoiceID.`, + params: [ + { name: 'invoice_id', type: 'string', required: true, description: `Xero invoice GUID.` }, ], }, { - name: 'xero_items_list', - description: 'Retrieve inventory items from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Name ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. IsTrackedAsInventory==true', - }, + name: 'xero_invoice_update', + description: `Update an existing invoice or bill in Xero. Note: DueDate is required when setting Status to AUTHORISED.`, + params: [ + { name: 'invoice_id', type: 'string', required: true, description: `Xero invoice GUID.` }, + { name: 'DueDate', type: 'string', required: false, description: `Updated due date (YYYY-MM-DD). Required when Status is AUTHORISED.` }, + { name: 'LineItems', type: 'array', required: false, description: `Updated line items array.` }, + { name: 'Reference', type: 'string', required: false, description: `Updated reference.` }, + { name: 'Status', type: 'string', required: false, description: `New status (DRAFT, SUBMITTED, AUTHORISED, DELETED, VOIDED).` }, ], }, { - name: 'xero_item_get', - description: 'Retrieve a single item by its ItemID or Code.', + name: 'xero_invoices_list', + description: `Retrieve sales invoices and bills from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'item_id', - type: 'string', - required: true, - description: 'ItemID GUID or item Code. Get it from xero_items_list.', - }, + { name: 'ContactIDs', type: 'string', required: false, description: `Comma-separated ContactIDs to filter invoices.` }, + { name: 'modified_after', type: 'string', required: false, description: `Return invoices modified after this UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'pageSize', type: 'number', required: false, description: `Records per page (max 1000).` }, + { name: 'Statuses', type: 'string', required: false, description: `Comma-separated statuses to filter (e.g. DRAFT,AUTHORISED).` }, + { name: 'where', type: 'string', required: false, description: `Filter expression (e.g. Type=="ACCREC" && Status=="AUTHORISED").` }, ], }, { name: 'xero_item_create', - description: 'Create a new inventory item in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'Code', - type: 'string', - required: true, - description: 'Unique item code. e.g. ITEM-001', - }, - { - name: 'Description', - type: 'string', - required: false, - description: 'Item description. e.g. Blue widget', - }, - { - name: 'InventoryAssetAccountCode', - type: 'string', - required: false, - description: 'Inventory asset account code. e.g. 630', - }, - { - name: 'IsTrackedAsInventory', - type: 'boolean', - required: false, - description: 'Track as inventory.', - }, - { name: 'Name', type: 'string', required: false, description: 'Item name. e.g. Widget A' }, - { - name: 'PurchaseDescription', - type: 'string', - required: false, - description: 'Purchase description.', - }, - { - name: 'PurchaseDetails', - type: 'string', - required: false, - description: 'Purchase details JSON. e.g. {"UnitPrice":5.00,"AccountCode":"300"}', - }, - { - name: 'SalesDetails', - type: 'string', - required: false, - description: 'Sales details JSON. e.g. {"UnitPrice":9.99,"AccountCode":"200"}', - }, + description: `Create a new inventory item in Xero.`, + params: [ + { name: 'Code', type: 'string', required: true, description: `Unique item code.` }, + { name: 'Description', type: 'string', required: false, description: `Description for sales invoices.` }, + { name: 'InventoryAssetAccountCode', type: 'string', required: false, description: `Account code for inventory asset (required if tracked).` }, + { name: 'IsTrackedAsInventory', type: 'boolean', required: false, description: `Track this item as inventory.` }, + { name: 'Name', type: 'string', required: false, description: `Name of the item.` }, + { name: 'PurchaseDescription', type: 'string', required: false, description: `Description for purchase orders.` }, + { name: 'PurchaseDetails', type: 'string', required: false, description: `Purchase pricing JSON e.g. {"UnitPrice":5.00,"AccountCode":"300","TaxType":"INPUT2"}.` }, + { name: 'SalesDetails', type: 'string', required: false, description: `Sales pricing JSON e.g. {"UnitPrice":9.99,"AccountCode":"200","TaxType":"OUTPUT2"}.` }, ], }, { - name: 'xero_item_update', - description: 'Update an existing inventory item in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'item_id', - type: 'string', - required: true, - description: 'ItemID GUID. Get it from xero_items_list.', - }, - { name: 'Code', type: 'string', required: true, description: 'Item code. e.g. ITEM-001' }, - { name: 'Description', type: 'string', required: false, description: 'Item description.' }, - { name: 'Name', type: 'string', required: false, description: 'Item name.' }, - { - name: 'PurchaseDescription', - type: 'string', - required: false, - description: 'Purchase description.', - }, - { - name: 'PurchaseDetails', - type: 'string', - required: false, - description: 'Purchase details JSON.', - }, - { name: 'SalesDetails', type: 'string', required: false, description: 'Sales details JSON.' }, + name: 'xero_item_delete', + description: `Delete an inventory item from Xero.`, + params: [ + { name: 'item_id', type: 'string', required: true, description: `Xero item GUID to delete.` }, ], }, { - name: 'xero_item_delete', - description: 'Delete an inventory item from Xero.', + name: 'xero_item_get', + description: `Retrieve a single item by its ItemID or Code.`, params: [ - XERO_TENANT_PARAM, - { - name: 'item_id', - type: 'string', - required: true, - description: 'ItemID GUID. Get it from xero_items_list.', - }, + { name: 'item_id', type: 'string', required: true, description: `Xero item GUID or item Code.` }, ], }, { - name: 'xero_purchase_orders_list', - description: 'Retrieve purchase orders from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'DateFrom', - type: 'string', - required: false, - description: 'Start date (YYYY-MM-DD).', - }, - { name: 'DateTo', type: 'string', required: false, description: 'End date (YYYY-MM-DD).' }, - { - name: 'Status', - type: 'string', - required: false, - description: 'Status filter. e.g. AUTHORISED', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. PurchaseOrderNumber ASC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, + name: 'xero_item_update', + description: `Update an existing inventory item in Xero.`, + params: [ + { name: 'Code', type: 'string', required: true, description: `Item code (required by Xero for item updates).` }, + { name: 'item_id', type: 'string', required: true, description: `Xero item GUID.` }, + { name: 'Description', type: 'string', required: false, description: `Updated sales description.` }, + { name: 'Name', type: 'string', required: false, description: `Updated item name.` }, + { name: 'PurchaseDescription', type: 'string', required: false, description: `Updated purchase description.` }, + { name: 'PurchaseDetails', type: 'string', required: false, description: `Updated purchase details JSON.` }, + { name: 'SalesDetails', type: 'string', required: false, description: `Updated sales details JSON.` }, ], }, { - name: 'xero_purchase_order_get', - description: 'Retrieve a single purchase order by its PurchaseOrderID.', + name: 'xero_items_list', + description: `Retrieve inventory items from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'purchase_order_id', - type: 'string', - required: true, - description: 'PurchaseOrderID GUID. Get it from xero_purchase_orders_list.', - }, + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_purchase_order_create', - description: 'Create a new purchase order in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'Contact', - type: 'string', - required: true, - description: 'Contact object as JSON string with ContactID.', - }, - { - name: 'LineItems', - type: 'array', - required: true, - description: 'Array of line item objects.', - }, - { - name: 'CurrencyCode', - type: 'string', - required: false, - description: 'Currency code. e.g. NZD', - }, - { name: 'Date', type: 'string', required: false, description: 'Order date (YYYY-MM-DD).' }, - { - name: 'DeliveryDate', - type: 'string', - required: false, - description: 'Delivery date (YYYY-MM-DD).', - }, - { - name: 'PurchaseOrderNumber', - type: 'string', - required: false, - description: 'PO number. e.g. PO-001', - }, - { - name: 'Reference', - type: 'string', - required: false, - description: 'Reference. e.g. Ref-001', - }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. DRAFT' }, + name: 'xero_manual_journal_create', + description: `Create a new manual journal entry in Xero.`, + params: [ + { name: 'JournalLines', type: 'array', required: true, description: `Array of journal line objects with LineAmount, AccountCode, Description.` }, + { name: 'Narration', type: 'string', required: true, description: `Description of the manual journal.` }, + { name: 'Date', type: 'string', required: false, description: `Journal date (YYYY-MM-DD).` }, + { name: 'Status', type: 'string', required: false, description: `Status: DRAFT or POSTED.` }, ], }, { - name: 'xero_purchase_order_update', - description: 'Update an existing purchase order in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'purchase_order_id', - type: 'string', - required: true, - description: 'PurchaseOrderID GUID. Get it from xero_purchase_orders_list.', - }, - { - name: 'DeliveryDate', - type: 'string', - required: false, - description: 'Delivery date (YYYY-MM-DD).', - }, - { - name: 'LineItems', - type: 'array', - required: false, - description: 'Array of line item objects.', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. AUTHORISED' }, + name: 'xero_manual_journal_get', + description: `Retrieve a single manual journal by its ManualJournalID.`, + params: [ + { name: 'manual_journal_id', type: 'string', required: true, description: `Xero manual journal GUID.` }, ], }, { - name: 'xero_quotes_list', - description: 'Retrieve quotes from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'ContactID', - type: 'string', - required: false, - description: 'Filter by ContactID GUID.', - }, - { - name: 'DateFrom', - type: 'string', - required: false, - description: 'Start date (YYYY-MM-DD).', - }, - { name: 'DateTo', type: 'string', required: false, description: 'End date (YYYY-MM-DD).' }, - { name: 'Status', type: 'string', required: false, description: 'Status filter. e.g. SENT' }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, + name: 'xero_manual_journal_update', + description: `Update an existing manual journal in Xero. Note: JournalLines are required when setting Status to POSTED.`, + params: [ + { name: 'manual_journal_id', type: 'string', required: true, description: `Xero manual journal GUID.` }, + { name: 'Date', type: 'string', required: false, description: `Updated date (YYYY-MM-DD).` }, + { name: 'JournalLines', type: 'array', required: false, description: `Array of journal lines (required when changing Status to POSTED).` }, + { name: 'Narration', type: 'string', required: false, description: `Updated narration.` }, + { name: 'Status', type: 'string', required: false, description: `Updated status (DRAFT or POSTED).` }, ], }, { - name: 'xero_quote_get', - description: 'Retrieve a single quote by its QuoteID.', + name: 'xero_manual_journals_list', + description: `Retrieve manual journals from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'quote_id', - type: 'string', - required: true, - description: 'QuoteID GUID. Get it from xero_quotes_list.', - }, + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_quote_create', - description: 'Create a new quote in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'Contact', - type: 'string', - required: true, - description: 'Contact object as JSON string with ContactID.', - }, - { name: 'Date', type: 'string', required: true, description: 'Quote date (YYYY-MM-DD).' }, - { - name: 'LineItems', - type: 'array', - required: true, - description: 'Array of line item objects.', - }, - { - name: 'CurrencyCode', - type: 'string', - required: false, - description: 'Currency code. e.g. NZD', - }, - { - name: 'ExpiryDate', - type: 'string', - required: false, - description: 'Expiry date (YYYY-MM-DD).', - }, - { - name: 'QuoteNumber', - type: 'string', - required: false, - description: 'Quote number. e.g. QU-001', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. DRAFT' }, - { name: 'Summary', type: 'string', required: false, description: 'Summary of services.' }, - { - name: 'Title', - type: 'string', - required: false, - description: 'Quote title. e.g. Service Proposal', - }, + name: 'xero_overpayments_list', + description: `Retrieve overpayments from a Xero organisation.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_quote_update', - description: 'Update an existing quote in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'quote_id', - type: 'string', - required: true, - description: 'QuoteID GUID. Get it from xero_quotes_list.', - }, - { - name: 'Contact', - type: 'string', - required: true, - description: 'Contact object as JSON string with ContactID.', - }, - { name: 'Date', type: 'string', required: true, description: 'Quote date (YYYY-MM-DD).' }, - { - name: 'ExpiryDate', - type: 'string', - required: false, - description: 'Expiry date (YYYY-MM-DD).', - }, - { - name: 'LineItems', - type: 'array', - required: false, - description: 'Array of line item objects.', - }, - { name: 'Reference', type: 'string', required: false, description: 'Reference.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. SENT' }, + name: 'xero_payments_list', + description: `Retrieve payments applied to invoices, credit notes, or prepayments in Xero.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_repeating_invoices_list', - description: 'Retrieve repeating invoice templates from a Xero organisation.', + name: 'xero_prepayments_list', + description: `Retrieve prepayments from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Type ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="AUTHORISED"', - }, + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_manual_journals_list', - description: 'Retrieve manual journals from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Date DESC', - }, - { name: 'page', type: 'integer', required: false, description: 'Page number. e.g. 1' }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="POSTED"', - }, + name: 'xero_purchase_order_create', + description: `Create a new purchase order in Xero.`, + params: [ + { name: 'Contact', type: 'string', required: true, description: `Supplier contact object e.g. {"ContactID":"guid"}.` }, + { name: 'LineItems', type: 'array', required: true, description: `Array of line item objects.` }, + { name: 'CurrencyCode', type: 'string', required: false, description: `Currency code.` }, + { name: 'Date', type: 'string', required: false, description: `PO date (YYYY-MM-DD).` }, + { name: 'DeliveryDate', type: 'string', required: false, description: `Expected delivery date (YYYY-MM-DD).` }, + { name: 'PurchaseOrderNumber', type: 'string', required: false, description: `Custom PO number.` }, + { name: 'Reference', type: 'string', required: false, description: `Reference.` }, + { name: 'Status', type: 'string', required: false, description: `Status: DRAFT or SUBMITTED.` }, ], }, { - name: 'xero_manual_journal_get', - description: 'Retrieve a single manual journal by its ManualJournalID.', + name: 'xero_purchase_order_get', + description: `Retrieve a single purchase order by its PurchaseOrderID.`, params: [ - XERO_TENANT_PARAM, - { - name: 'manual_journal_id', - type: 'string', - required: true, - description: 'ManualJournalID GUID. Get it from xero_manual_journals_list.', - }, + { name: 'purchase_order_id', type: 'string', required: true, description: `Xero purchase order GUID.` }, ], }, { - name: 'xero_manual_journal_create', - description: 'Create a new manual journal entry in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'JournalLines', - type: 'array', - required: true, - description: 'Array of journal line objects.', - }, - { - name: 'Narration', - type: 'string', - required: true, - description: 'Journal narration. e.g. Year-end adjustment', - }, - { name: 'Date', type: 'string', required: false, description: 'Journal date (YYYY-MM-DD).' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. DRAFT' }, + name: 'xero_purchase_order_update', + description: `Update an existing purchase order in Xero.`, + params: [ + { name: 'purchase_order_id', type: 'string', required: true, description: `Xero purchase order GUID.` }, + { name: 'DeliveryDate', type: 'string', required: false, description: `Updated delivery date (YYYY-MM-DD).` }, + { name: 'LineItems', type: 'array', required: false, description: `Updated line items.` }, + { name: 'Reference', type: 'string', required: false, description: `Updated reference.` }, + { name: 'Status', type: 'string', required: false, description: `New status (DRAFT, SUBMITTED, AUTHORISED, BILLED, DELETED).` }, ], }, { - name: 'xero_manual_journal_update', - description: - 'Update an existing manual journal in Xero. JournalLines are required when setting Status to POSTED.', - params: [ - XERO_TENANT_PARAM, - { - name: 'manual_journal_id', - type: 'string', - required: true, - description: 'ManualJournalID GUID. Get it from xero_manual_journals_list.', - }, - { name: 'Date', type: 'string', required: false, description: 'Journal date (YYYY-MM-DD).' }, - { - name: 'JournalLines', - type: 'array', - required: false, - description: 'Array of journal line objects. Required when setting Status to POSTED.', - }, - { name: 'Narration', type: 'string', required: false, description: 'Journal narration.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. POSTED' }, + name: 'xero_purchase_orders_list', + description: `Retrieve purchase orders from a Xero organisation.`, + params: [ + { name: 'DateFrom', type: 'string', required: false, description: `Filter POs issued from this date (YYYY-MM-DD).` }, + { name: 'DateTo', type: 'string', required: false, description: `Filter POs issued to this date (YYYY-MM-DD).` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'Status', type: 'string', required: false, description: `Filter by status (DRAFT, SUBMITTED, AUTHORISED, BILLED, DELETED).` }, ], }, { - name: 'xero_employees_list', - description: 'Retrieve employees from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. LastName ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="ACTIVE"', - }, + name: 'xero_quote_create', + description: `Create a new quote in Xero.`, + params: [ + { name: 'Contact', type: 'string', required: true, description: `Contact object e.g. {"ContactID":"guid"}.` }, + { name: 'Date', type: 'string', required: true, description: `Quote date (YYYY-MM-DD).` }, + { name: 'LineItems', type: 'array', required: true, description: `Array of line item objects.` }, + { name: 'CurrencyCode', type: 'string', required: false, description: `Currency code.` }, + { name: 'ExpiryDate', type: 'string', required: false, description: `Quote expiry date (YYYY-MM-DD).` }, + { name: 'QuoteNumber', type: 'string', required: false, description: `Custom quote number.` }, + { name: 'Reference', type: 'string', required: false, description: `Reference.` }, + { name: 'Status', type: 'string', required: false, description: `Status: DRAFT or SENT.` }, + { name: 'Summary', type: 'string', required: false, description: `Quote summary.` }, + { name: 'Title', type: 'string', required: false, description: `Quote title.` }, ], }, { - name: 'xero_employee_get', - description: 'Retrieve a single employee by their EmployeeID.', + name: 'xero_quote_get', + description: `Retrieve a single quote by its QuoteID.`, params: [ - XERO_TENANT_PARAM, - { - name: 'employee_id', - type: 'string', - required: true, - description: 'EmployeeID GUID. Get it from xero_employees_list.', - }, + { name: 'quote_id', type: 'string', required: true, description: `Xero quote GUID.` }, ], }, { - name: 'xero_employee_create', - description: 'Create a new employee record in Xero.', + name: 'xero_quote_update', + description: `Update an existing quote in Xero.`, params: [ - XERO_TENANT_PARAM, - { name: 'FirstName', type: 'string', required: true, description: 'First name. e.g. Jane' }, - { name: 'LastName', type: 'string', required: true, description: 'Last name. e.g. Doe' }, - { name: 'ExternalLink', type: 'string', required: false, description: 'External link URL.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. ACTIVE' }, + { name: 'Contact', type: 'string', required: true, description: `Contact object e.g. {"ContactID":"guid"} (required by Xero for quote updates).` }, + { name: 'Date', type: 'string', required: true, description: `Quote date YYYY-MM-DD (required by Xero for quote updates).` }, + { name: 'quote_id', type: 'string', required: true, description: `Xero quote GUID.` }, + { name: 'ExpiryDate', type: 'string', required: false, description: `Updated expiry date (YYYY-MM-DD).` }, + { name: 'LineItems', type: 'array', required: false, description: `Updated line items.` }, + { name: 'Reference', type: 'string', required: false, description: `Updated reference.` }, + { name: 'Status', type: 'string', required: false, description: `New status (DRAFT, SENT, DECLINED, ACCEPTED, INVOICED, DELETED).` }, ], }, { - name: 'xero_employee_update', - description: 'Update an existing employee in Xero.', + name: 'xero_quotes_list', + description: `Retrieve quotes from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'employee_id', - type: 'string', - required: true, - description: 'EmployeeID GUID. Get it from xero_employees_list.', - }, - { name: 'FirstName', type: 'string', required: false, description: 'First name.' }, - { name: 'LastName', type: 'string', required: false, description: 'Last name.' }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. TERMINATED' }, + { name: 'ContactID', type: 'string', required: false, description: `Filter by contact GUID.` }, + { name: 'DateFrom', type: 'string', required: false, description: `Quote date from (YYYY-MM-DD).` }, + { name: 'DateTo', type: 'string', required: false, description: `Quote date to (YYYY-MM-DD).` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'page', type: 'number', required: false, description: `Page number.` }, + { name: 'Status', type: 'string', required: false, description: `Filter by status (DRAFT, SENT, DECLINED, ACCEPTED, INVOICED, DELETED).` }, ], }, { - name: 'xero_currencies_list', - description: 'Retrieve enabled currencies for a Xero organisation.', + name: 'xero_repeating_invoices_list', + description: `Retrieve repeating invoice templates from a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Code ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Code=="USD"', - }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_tax_rates_list', - description: 'Retrieve tax rates from a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'TaxType', - type: 'string', - required: false, - description: 'Filter by tax type. e.g. OUTPUT2', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Name ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="ACTIVE"', - }, + name: 'xero_report_aged_payables', + description: `Retrieve the Aged Payables Outstanding report for a Xero organisation.`, + params: [ + { name: 'contactID', type: 'string', required: true, description: `Contact GUID (required by Xero for AgedPayablesByContact report).` }, + { name: 'date', type: 'string', required: false, description: `Report date (YYYY-MM-DD).` }, + { name: 'fromDate', type: 'string', required: false, description: `Start date for transactions.` }, + { name: 'toDate', type: 'string', required: false, description: `End date for transactions.` }, ], }, { - name: 'xero_tax_rate_create', - description: 'Create a new tax rate in Xero.', + name: 'xero_report_aged_receivables', + description: `Retrieve the Aged Receivables Outstanding report for a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'Name', - type: 'string', - required: true, - description: 'Tax rate name. e.g. GST on Expenses', - }, - { - name: 'TaxComponents', - type: 'array', - required: true, - description: 'Array of tax component objects.', - }, + { name: 'contactID', type: 'string', required: true, description: `Contact GUID (required by Xero for AgedReceivablesByContact report).` }, + { name: 'date', type: 'string', required: false, description: `Report date (YYYY-MM-DD).` }, + { name: 'fromDate', type: 'string', required: false, description: `Start date for transactions.` }, + { name: 'toDate', type: 'string', required: false, description: `End date for transactions.` }, ], }, { - name: 'xero_tax_rate_update', - description: 'Update an existing tax rate in Xero.', - params: [ - XERO_TENANT_PARAM, - { - name: 'TaxComponents', - type: 'array', - required: true, - description: - 'Array of tax component objects. e.g. [{"Name":"Tax","Rate":15,"IsCompound":false}]', - }, - { - name: 'TaxType', - type: 'string', - required: true, - description: 'Tax type identifier. e.g. OUTPUT2', - }, - { - name: 'Name', - type: 'string', - required: false, - description: 'Tax rate name. e.g. GST on Sales', - }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. ACTIVE' }, + name: 'xero_report_balance_sheet', + description: `Retrieve the Balance Sheet report for a Xero organisation.`, + params: [ + { name: 'date', type: 'string', required: false, description: `Report date (YYYY-MM-DD). Defaults to today.` }, + { name: 'periods', type: 'number', required: false, description: `Number of periods to compare.` }, + { name: 'standardLayout', type: 'boolean', required: false, description: `Use standard layout.` }, + { name: 'timeframe', type: 'string', required: false, description: `Timeframe for comparison: MONTH, QUARTER, or YEAR.` }, + { name: 'trackingCategoryID', type: 'string', required: false, description: `Tracking category ID to segment by.` }, ], }, { - name: 'xero_tracking_categories_list', - description: 'Retrieve tracking categories and their options from Xero.', + name: 'xero_report_bank_summary', + description: `Retrieve the Bank Summary report for a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. Name ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. Status=="ACTIVE"', - }, + { name: 'fromDate', type: 'string', required: false, description: `Start date (YYYY-MM-DD).` }, + { name: 'toDate', type: 'string', required: false, description: `End date (YYYY-MM-DD).` }, ], }, { - name: 'xero_tracking_category_update', - description: 'Update a tracking category name or status in Xero.', + name: 'xero_report_executive_summary', + description: `Retrieve the Executive Summary report for a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'tracking_category_id', - type: 'string', - required: true, - description: 'TrackingCategoryID GUID. Get it from xero_tracking_categories_list.', - }, - { - name: 'Name', - type: 'string', - required: false, - description: 'Category name. e.g. Department', - }, - { name: 'Status', type: 'string', required: false, description: 'Status. e.g. ACTIVE' }, + { name: 'date', type: 'string', required: false, description: `Report month (YYYY-MM-DD, first day of month).` }, ], }, { - name: 'xero_tracking_category_delete', - description: 'Delete a tracking category from Xero.', + name: 'xero_report_profit_and_loss', + description: `Retrieve the Profit and Loss report for a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'tracking_category_id', - type: 'string', - required: true, - description: 'TrackingCategoryID GUID. Get it from xero_tracking_categories_list.', - }, + { name: 'fromDate', type: 'string', required: false, description: `Report start date (YYYY-MM-DD).` }, + { name: 'periods', type: 'number', required: false, description: `Number of periods to compare.` }, + { name: 'standardLayout', type: 'boolean', required: false, description: `Use standard layout.` }, + { name: 'timeframe', type: 'string', required: false, description: `Timeframe: MONTH, QUARTER, or YEAR.` }, + { name: 'toDate', type: 'string', required: false, description: `Report end date (YYYY-MM-DD).` }, + { name: 'trackingCategoryID', type: 'string', required: false, description: `Tracking category ID to segment by.` }, ], }, { - name: 'xero_tracking_option_create', - description: 'Create a new option within a tracking category in Xero.', + name: 'xero_report_trial_balance', + description: `Retrieve the Trial Balance report for a Xero organisation.`, params: [ - XERO_TENANT_PARAM, - { - name: 'tracking_category_id', - type: 'string', - required: true, - description: 'TrackingCategoryID GUID. Get it from xero_tracking_categories_list.', - }, - { name: 'Name', type: 'string', required: true, description: 'Option name. e.g. North' }, + { name: 'date', type: 'string', required: false, description: `Report date (YYYY-MM-DD).` }, + { name: 'paymentsOnly', type: 'boolean', required: false, description: `If true, include only cash-basis transactions.` }, ], }, { - name: 'xero_users_list', - description: 'Retrieve users of a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'modified_after', - type: 'string', - required: false, - description: 'Return records modified after this UTC datetime (ISO 8601).', - }, - { - name: 'order', - type: 'string', - required: false, - description: 'Order results. e.g. LastName ASC', - }, - { - name: 'where', - type: 'string', - required: false, - description: 'Filter expression. e.g. IsSubscriber==true', - }, + name: 'xero_tax_rate_create', + description: `Create a new tax rate in Xero.`, + params: [ + { name: 'Name', type: 'string', required: true, description: `Name of the tax rate.` }, + { name: 'TaxComponents', type: 'array', required: true, description: `Array of tax components e.g. [{"Name":"GST","Rate":15,"IsCompound":false}].` }, ], }, { - name: 'xero_user_get', - description: 'Retrieve a single Xero organisation user by their UserID.', + name: 'xero_tax_rate_update', + description: `Update an existing tax rate in Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'user_id', - type: 'string', - required: true, - description: 'UserID GUID. Get it from xero_users_list.', - }, + { name: 'TaxComponents', type: 'array', required: true, description: `Array of tax component objects e.g. [{"Name":"Tax","Rate":15,"IsCompound":false}]. Required by Xero when updating a tax rate.` }, + { name: 'TaxType', type: 'string', required: true, description: `Tax type identifier to update.` }, + { name: 'Name', type: 'string', required: false, description: `Updated name.` }, + { name: 'Status', type: 'string', required: false, description: `Updated status (ACTIVE or DELETED).` }, ], }, { - name: 'xero_report_balance_sheet', - description: 'Retrieve the Balance Sheet report for a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'date', - type: 'string', - required: false, - description: 'Report date (YYYY-MM-DD). e.g. 2024-06-30', - }, - { - name: 'periods', - type: 'integer', - required: false, - description: 'Number of comparison periods. e.g. 3', - }, - { - name: 'standardLayout', - type: 'boolean', - required: false, - description: 'Use standard layout.', - }, - { - name: 'timeframe', - type: 'string', - required: false, - description: 'Comparison timeframe. e.g. MONTH', - }, - { - name: 'trackingCategoryID', - type: 'string', - required: false, - description: 'Filter by tracking category GUID.', - }, + name: 'xero_tax_rates_list', + description: `Retrieve tax rates from a Xero organisation.`, + params: [ + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'TaxType', type: 'string', required: false, description: `Filter by specific tax type.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_report_profit_and_loss', - description: 'Retrieve the Profit and Loss report for a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'fromDate', - type: 'string', - required: false, - description: 'Start date (YYYY-MM-DD). e.g. 2024-01-01', - }, - { - name: 'periods', - type: 'integer', - required: false, - description: 'Number of comparison periods. e.g. 3', - }, - { - name: 'standardLayout', - type: 'boolean', - required: false, - description: 'Use standard layout.', - }, - { - name: 'timeframe', - type: 'string', - required: false, - description: 'Comparison timeframe. e.g. MONTH', - }, - { - name: 'toDate', - type: 'string', - required: false, - description: 'End date (YYYY-MM-DD). e.g. 2024-06-30', - }, - { - name: 'trackingCategoryID', - type: 'string', - required: false, - description: 'Filter by tracking category GUID.', - }, + name: 'xero_tracking_categories_list', + description: `Retrieve tracking categories and their options from Xero.`, + params: [ + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, { - name: 'xero_report_trial_balance', - description: 'Retrieve the Trial Balance report for a Xero organisation.', + name: 'xero_tracking_category_delete', + description: `Delete a tracking category from Xero.`, params: [ - XERO_TENANT_PARAM, - { - name: 'date', - type: 'string', - required: false, - description: 'Report date (YYYY-MM-DD). e.g. 2024-06-30', - }, - { - name: 'paymentsOnly', - type: 'boolean', - required: false, - description: 'Include only payment transactions.', - }, + { name: 'tracking_category_id', type: 'string', required: true, description: `Xero tracking category GUID to delete.` }, ], }, { - name: 'xero_report_aged_payables', - description: 'Retrieve the Aged Payables Outstanding report for a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'contactID', - type: 'string', - required: true, - description: 'ContactID GUID to report on. Get it from xero_contacts_list.', - }, - { - name: 'date', - type: 'string', - required: false, - description: 'Report date (YYYY-MM-DD). e.g. 2024-06-30', - }, - { - name: 'fromDate', - type: 'string', - required: false, - description: 'Start date (YYYY-MM-DD).', - }, - { name: 'toDate', type: 'string', required: false, description: 'End date (YYYY-MM-DD).' }, + name: 'xero_tracking_category_update', + description: `Update a tracking category name or status in Xero.`, + params: [ + { name: 'tracking_category_id', type: 'string', required: true, description: `Xero tracking category GUID.` }, + { name: 'Name', type: 'string', required: false, description: `Updated name.` }, + { name: 'Status', type: 'string', required: false, description: `Updated status (ACTIVE or ARCHIVED).` }, ], }, { - name: 'xero_report_aged_receivables', - description: 'Retrieve the Aged Receivables Outstanding report for a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'contactID', - type: 'string', - required: true, - description: 'ContactID GUID to report on. Get it from xero_contacts_list.', - }, - { - name: 'date', - type: 'string', - required: false, - description: 'Report date (YYYY-MM-DD). e.g. 2024-06-30', - }, - { - name: 'fromDate', - type: 'string', - required: false, - description: 'Start date (YYYY-MM-DD).', - }, - { name: 'toDate', type: 'string', required: false, description: 'End date (YYYY-MM-DD).' }, + name: 'xero_tracking_option_create', + description: `Create a new option within a tracking category in Xero.`, + params: [ + { name: 'Name', type: 'string', required: true, description: `Name of the tracking option.` }, + { name: 'tracking_category_id', type: 'string', required: true, description: `Xero tracking category GUID.` }, ], }, { - name: 'xero_report_bank_summary', - description: 'Retrieve the Bank Summary report for a Xero organisation.', + name: 'xero_user_get', + description: `Retrieve a single Xero organisation user by their UserID.`, params: [ - XERO_TENANT_PARAM, - { - name: 'fromDate', - type: 'string', - required: false, - description: 'Start date (YYYY-MM-DD). e.g. 2024-01-01', - }, - { - name: 'toDate', - type: 'string', - required: false, - description: 'End date (YYYY-MM-DD). e.g. 2024-06-30', - }, + { name: 'user_id', type: 'string', required: true, description: `Xero user GUID.` }, ], }, { - name: 'xero_report_executive_summary', - description: 'Retrieve the Executive Summary report for a Xero organisation.', - params: [ - XERO_TENANT_PARAM, - { - name: 'date', - type: 'string', - required: false, - description: 'Report date (YYYY-MM-DD). e.g. 2024-06-01', - }, + name: 'xero_users_list', + description: `Retrieve users of a Xero organisation.`, + params: [ + { name: 'modified_after', type: 'string', required: false, description: `Modified after UTC datetime.` }, + { name: 'order', type: 'string', required: false, description: `Sort order.` }, + { name: 'where', type: 'string', required: false, description: `Filter expression.` }, ], }, ] diff --git a/src/data/agent-connectors/zapiermcp.ts b/src/data/agent-connectors/zapiermcp.ts index f2ca0295d..9e1c0feff 100644 --- a/src/data/agent-connectors/zapiermcp.ts +++ b/src/data/agent-connectors/zapiermcp.ts @@ -4,244 +4,112 @@ export const tools: Tool[] = [ { name: 'zapiermcp_auto_provision_mcp', description: `Automatically set up this MCP server based on the user's existing connected accounts in Zapier.`, - params: [], + params: [ + ], }, { name: 'zapiermcp_create_zapier_skill', description: `Save a workflow as a reusable Zapier Skill. A skill is a named, versioned markdown document that defines how to accomplish a task using Zapier actions.`, params: [ - { - name: 'description', - type: 'string', - required: true, - description: `One-sentence description of what this skill does`, - }, - { - name: 'name', - type: 'string', - required: true, - description: `Short, unique name for this skill (e.g. 'create jira ticket', 'daily standup'). Names are case-insensitive.`, - }, - { - name: 'skillDefinition', - type: 'string', - required: true, - description: `Full markdown content of the skill. IMPORTANT: Before creating, ask the user about their specific configuration — project keys, channel names, default assignees, recurring parameters — so those get baked in as fixed values. Reference each MCP tool the skill uses with a \`\`\`mcp-tool\\n\\n\`\`\` code fence. Include step-by-step instructions and any fixed parameter values.`, - }, + { name: 'description', type: 'string', required: true, description: `One-sentence description of what this skill does` }, + { name: 'name', type: 'string', required: true, description: `Short, unique name for this skill (e.g. 'create jira ticket', 'daily standup'). Names are case-insensitive.` }, + { name: 'skillDefinition', type: 'string', required: true, description: `Full markdown content of the skill. IMPORTANT: Before creating, ask the user about their specific configuration — project keys, channel names, default assignees, recurring parameters — so those get baked in as fixed values. Reference each MCP tool the skill uses with a \`\`\`mcp-tool\\n\\n\`\`\` code fence. Include step-by-step instructions and any fixed parameter values.` }, ], }, { name: 'zapiermcp_delete_zapier_skill', description: `Permanently delete a Zapier Skill by name.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: `The exact name of the skill to delete`, - }, + { name: 'name', type: 'string', required: true, description: `The exact name of the skill to delete` }, ], }, { name: 'zapiermcp_disable_zapier_action', description: `Remove an app's actions from this MCP server. Use list_enabled_zapier_actions to see which apps are currently enabled.`, params: [ - { - name: 'app', - type: 'string', - required: true, - description: `App name to remove (e.g., 'gmail', 'jira', 'slack'). Accepts short names or full IDs. Use list_enabled_zapier_actions to see enabled apps.`, - }, - { - name: 'action', - type: 'string', - required: false, - description: `Specific action key to remove. If omitted, all actions for the app are removed.`, - }, + { name: 'app', type: 'string', required: true, description: `App name to remove (e.g., 'gmail', 'jira', 'slack'). Accepts short names or full IDs. Use list_enabled_zapier_actions to see enabled apps.` }, + { name: 'action', type: 'string', required: false, description: `Specific action key to remove. If omitted, all actions for the app are removed.` }, ], }, { name: 'zapiermcp_discover_zapier_actions', description: `Search 8,000+ Zapier apps to find actions you can enable. Returns app IDs and action keys to use with enable_zapier_action.`, params: [ - { - name: 'app', - type: 'string', - required: false, - description: `Search for apps by name. Omit to see popular apps. Search 8,000+ available apps.`, - }, + { name: 'app', type: 'string', required: false, description: `Search for apps by name. Omit to see popular apps. Search 8,000+ available apps.` }, ], }, { name: 'zapiermcp_enable_zapier_action', description: `Enable an app's actions on this MCP server. Use discover_zapier_actions to find the app name first.`, params: [ - { - name: 'app', - type: 'string', - required: true, - description: `App name or identifier (e.g., 'gmail', 'jira', 'slack'). Accepts short names or full IDs from discover_zapier_actions.`, - }, - { - name: 'action', - type: 'string', - required: false, - description: `Specific action key to enable. If omitted or '*', all actions for the app are enabled.`, - }, + { name: 'app', type: 'string', required: true, description: `App name or identifier (e.g., 'gmail', 'jira', 'slack'). Accepts short names or full IDs from discover_zapier_actions.` }, + { name: 'action', type: 'string', required: false, description: `Specific action key to enable. If omitted or '*', all actions for the app are enabled.` }, ], }, { name: 'zapiermcp_execute_zapier_read_action', description: `Execute a search or read action to retrieve data from a connected app. Call list_enabled_zapier_actions first to get the app name and action key.`, params: [ - { - name: 'action', - type: 'string', - required: true, - description: `Action key to execute. Use list_enabled_zapier_actions to get exact keys.`, - }, - { - name: 'app', - type: 'string', - required: true, - description: `App identifier. Use list_enabled_zapier_actions to see available apps.`, - }, - { - name: 'instructions', - type: 'string', - required: true, - description: `Natural language instructions for the action`, - }, - { - name: 'output', - type: 'string', - required: true, - description: `Natural language description of what data you want from the results. Example: 'just the title and created date' or 'only items with status active'. A filter will be automatically generated to extract this data.`, - }, - { - name: 'params', - type: 'object', - required: false, - description: `Optional direct parameter values to pass to the action`, - }, + { name: 'action', type: 'string', required: true, description: `Action key to execute. Use list_enabled_zapier_actions to get exact keys.` }, + { name: 'app', type: 'string', required: true, description: `App identifier. Use list_enabled_zapier_actions to see available apps.` }, + { name: 'instructions', type: 'string', required: true, description: `Natural language instructions for the action` }, + { name: 'output', type: 'string', required: true, description: `Natural language description of what data you want from the results. Example: 'just the title and created date' or 'only items with status active'. A filter will be automatically generated to extract this data.` }, + { name: 'params', type: 'object', required: false, description: `Optional direct parameter values to pass to the action` }, ], }, { name: 'zapiermcp_execute_zapier_write_action', description: `Execute a write or create action in a connected app. Call list_enabled_zapier_actions first to get the app name and action key.`, params: [ - { - name: 'action', - type: 'string', - required: true, - description: `Action key to execute. Use list_enabled_zapier_actions to get exact keys.`, - }, - { - name: 'app', - type: 'string', - required: true, - description: `App identifier. Use list_enabled_zapier_actions to see available apps.`, - }, - { - name: 'instructions', - type: 'string', - required: true, - description: `Natural language instructions for the action`, - }, - { - name: 'output', - type: 'string', - required: true, - description: `Natural language description of what data you want from the results. Example: 'just the title and created date' or 'only items with status active'. A filter will be automatically generated to extract this data.`, - }, - { - name: 'params', - type: 'object', - required: false, - description: `Optional direct parameter values to pass to the action`, - }, + { name: 'action', type: 'string', required: true, description: `Action key to execute. Use list_enabled_zapier_actions to get exact keys.` }, + { name: 'app', type: 'string', required: true, description: `App identifier. Use list_enabled_zapier_actions to see available apps.` }, + { name: 'instructions', type: 'string', required: true, description: `Natural language instructions for the action` }, + { name: 'output', type: 'string', required: true, description: `Natural language description of what data you want from the results. Example: 'just the title and created date' or 'only items with status active'. A filter will be automatically generated to extract this data.` }, + { name: 'params', type: 'object', required: false, description: `Optional direct parameter values to pass to the action` }, ], }, { name: 'zapiermcp_get_configuration_url', description: `Get the URL where users can configure this MCP server — adding, editing, or removing actions and connecting accounts.`, - params: [], + params: [ + ], }, { name: 'zapiermcp_get_zapier_skill', description: `Fetch the full markdown content of a Zapier Skill by name. Call this before executing a skill.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: `The exact name of the skill to retrieve`, - }, + { name: 'name', type: 'string', required: true, description: `The exact name of the skill to retrieve` }, ], }, { name: 'zapiermcp_list_enabled_zapier_actions', description: `List all apps and actions currently enabled on this Zapier MCP server. Pass an app name to see its available action keys. Use action keys with execute_zapier_read_action and execute_zapier_write_action.`, params: [ - { - name: 'action', - type: 'string', - required: false, - description: `Filter by action key. Omit to list all actions.`, - }, - { - name: 'app', - type: 'string', - required: false, - description: `Filter by app name (e.g., 'gmail', 'jira', 'slack'). Omit to list all apps.`, - }, + { name: 'action', type: 'string', required: false, description: `Filter by action key. Omit to list all actions.` }, + { name: 'app', type: 'string', required: false, description: `Filter by app name (e.g., 'gmail', 'jira', 'slack'). Omit to list all apps.` }, ], }, { name: 'zapiermcp_list_zapier_skills', description: `List all saved Zapier Skills with their names and descriptions.`, - params: [], + params: [ + ], }, { name: 'zapiermcp_send_feedback', description: `Send feedback about your Zapier MCP experience to the Zapier team.`, params: [ - { - name: 'feedback', - type: 'string', - required: true, - description: `Feedback message to send to the Zapier MCP team`, - }, - { - name: 'feedback_positive', - type: 'boolean', - required: true, - description: `Whether this is positive feedback (true) or negative (false)`, - }, + { name: 'feedback', type: 'string', required: true, description: `Feedback message to send to the Zapier MCP team` }, + { name: 'feedback_positive', type: 'boolean', required: true, description: `Whether this is positive feedback (true) or negative (false)` }, ], }, { name: 'zapiermcp_update_zapier_skill', description: `Update an existing Zapier Skill's description or content by name.`, params: [ - { - name: 'name', - type: 'string', - required: true, - description: `The exact name of the skill to update`, - }, - { - name: 'description', - type: 'string', - required: false, - description: `Updated one-sentence description (optional)`, - }, - { - name: 'skillDefinition', - type: 'string', - required: false, - description: `Updated full markdown content (optional)`, - }, + { name: 'name', type: 'string', required: true, description: `The exact name of the skill to update` }, + { name: 'description', type: 'string', required: false, description: `Updated one-sentence description (optional)` }, + { name: 'skillDefinition', type: 'string', required: false, description: `Updated full markdown content (optional)` }, ], }, ] diff --git a/src/data/agent-connectors/zoom.ts b/src/data/agent-connectors/zoom.ts index fc22883ba..6ef672749 100644 --- a/src/data/agent-connectors/zoom.ts +++ b/src/data/agent-connectors/zoom.ts @@ -1,4 +1,267 @@ import type { Tool } from '../../types/agent-connectors' export const tools: Tool[] = [ + { + name: 'zoom_chat_channel_create', + description: `Create a new Team Chat channel.`, + params: [ + { name: 'name', type: 'string', required: true, description: `Name of the channel` }, + { name: 'members', type: 'array', required: false, description: `List of member objects with email field to add to the channel` }, + { name: 'type', type: 'integer', required: false, description: `Channel type: 1=private, 2=private with external users, 3=public, 4=new external` }, + ], + }, + { + name: 'zoom_chat_channel_delete', + description: `Delete a Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID` }, + ], + }, + { + name: 'zoom_chat_channel_get', + description: `Get details of a specific Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID` }, + ], + }, + { + name: 'zoom_chat_channel_member_invite', + description: `Invite one or more members to a Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID` }, + { name: 'members', type: 'array', required: true, description: `Array of member objects with email field` }, + ], + }, + { + name: 'zoom_chat_channel_member_remove', + description: `Remove a member from a Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID` }, + { name: 'member_id', type: 'string', required: true, description: `The member ID or email to remove` }, + ], + }, + { + name: 'zoom_chat_channel_members_list', + description: `List members of a Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID` }, + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page of results` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of members per page (max 50)` }, + ], + }, + { + name: 'zoom_chat_channel_messages_list', + description: `List messages in a Zoom Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID to list messages from` }, + { name: 'user_id', type: 'string', required: true, description: `The user ID or 'me' for the authenticated user` }, + { name: 'date', type: 'string', required: false, description: `Date to retrieve messages for (yyyy-MM-dd). Defaults to today.` }, + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of messages per page (max 50)` }, + ], + }, + { + name: 'zoom_chat_channel_update', + description: `Update the name or settings of a Team Chat channel.`, + params: [ + { name: 'channel_id', type: 'string', required: true, description: `The channel ID` }, + { name: 'name', type: 'string', required: false, description: `New name for the channel` }, + ], + }, + { + name: 'zoom_chat_channels_list', + description: `List all Zoom Team Chat channels the authenticated user belongs to.`, + params: [ + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of channels per page (max 50)` }, + ], + }, + { + name: 'zoom_chat_message_send', + description: `Send a message in a Zoom Team Chat channel or to a user.`, + params: [ + { name: 'message', type: 'string', required: true, description: `The message text to send` }, + { name: 'user_id', type: 'string', required: true, description: `Sender's user ID or 'me'` }, + { name: 'to_channel', type: 'string', required: false, description: `Channel ID to send the message to` }, + { name: 'to_jid', type: 'string', required: false, description: `JID of the user to send a direct message to` }, + ], + }, + { + name: 'zoom_meeting_create', + description: `Schedule a new Zoom meeting for a user.`, + params: [ + { name: 'topic', type: 'string', required: true, description: `Meeting topic/title` }, + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + { name: 'agenda', type: 'string', required: false, description: `Meeting description or agenda` }, + { name: 'duration', type: 'integer', required: false, description: `Meeting duration in minutes` }, + { name: 'password', type: 'string', required: false, description: `Meeting passcode (max 10 chars)` }, + { name: 'start_time', type: 'string', required: false, description: `Meeting start time in ISO 8601 UTC format` }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for the meeting (e.g. America/New_York)` }, + { name: 'type', type: 'integer', required: false, description: `1=Instant, 2=Scheduled, 3=Recurring no fixed time, 8=Recurring fixed time` }, + ], + }, + { + name: 'zoom_meeting_delete', + description: `Delete a Zoom meeting.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID to delete` }, + { name: 'occurrence_id', type: 'string', required: false, description: `Occurrence ID for recurring meeting instances` }, + ], + }, + { + name: 'zoom_meeting_get', + description: `Retrieve details of a specific Zoom meeting.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID` }, + ], + }, + { + name: 'zoom_meeting_invitation_get', + description: `Retrieve the invitation text for a Zoom meeting.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID` }, + ], + }, + { + name: 'zoom_meeting_recordings_delete', + description: `Delete all cloud recordings for a specific meeting.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID or UUID` }, + { name: 'action', type: 'string', required: false, description: `trash (move to trash, default) or delete (permanent)` }, + ], + }, + { + name: 'zoom_meeting_recordings_get', + description: `Retrieve all cloud recordings for a specific meeting.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID or UUID` }, + ], + }, + { + name: 'zoom_meeting_registrant_add', + description: `Register a participant for a Zoom meeting.`, + params: [ + { name: 'email', type: 'string', required: true, description: `Registrant's email address` }, + { name: 'first_name', type: 'string', required: true, description: `Registrant's first name` }, + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID` }, + { name: 'last_name', type: 'string', required: false, description: `Registrant's last name` }, + { name: 'occurrence_ids', type: 'string', required: false, description: `Comma-separated occurrence IDs for recurring meetings` }, + ], + }, + { + name: 'zoom_meeting_registrants_list', + description: `List all registrants for a Zoom meeting.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID` }, + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page` }, + { name: 'occurrence_id', type: 'string', required: false, description: `Occurrence ID for recurring meetings` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of records per page (max 300)` }, + { name: 'status', type: 'string', required: false, description: `Filter by status: pending, approved, denied` }, + ], + }, + { + name: 'zoom_meeting_status_update', + description: `Update the status of a Zoom meeting (e.g., end a meeting in progress).`, + params: [ + { name: 'action', type: 'string', required: true, description: `Action to perform: 'end' to end the meeting` }, + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID` }, + ], + }, + { + name: 'zoom_meeting_update', + description: `Update an existing Zoom meeting's details.`, + params: [ + { name: 'meeting_id', type: 'string', required: true, description: `The meeting ID to update` }, + { name: 'agenda', type: 'string', required: false, description: `New meeting agenda` }, + { name: 'duration', type: 'integer', required: false, description: `New duration in minutes` }, + { name: 'password', type: 'string', required: false, description: `New meeting passcode` }, + { name: 'start_time', type: 'string', required: false, description: `New start time in ISO 8601 UTC format` }, + { name: 'timezone', type: 'string', required: false, description: `Timezone for the meeting` }, + { name: 'topic', type: 'string', required: false, description: `New meeting topic` }, + ], + }, + { + name: 'zoom_meetings_list', + description: `List all meetings scheduled by a user.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page of results` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of records per page (max 300)` }, + { name: 'type', type: 'string', required: false, description: `Filter: scheduled, live, upcoming, upcoming_meetings, previous_meetings` }, + ], + }, + { + name: 'zoom_past_meeting_get', + description: `Retrieve details of an ended Zoom meeting.`, + params: [ + { name: 'meeting_uuid', type: 'string', required: true, description: `The meeting UUID (double-encode if contains / or //)` }, + ], + }, + { + name: 'zoom_recordings_list', + description: `List all cloud recordings for a user.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + { name: 'from', type: 'string', required: false, description: `Start date in yyyy-MM-dd format (default: current date minus 1 month)` }, + { name: 'mc', type: 'string', required: false, description: `Set to true to retrieve recordings from Zoom Room` }, + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of records per page (max 300)` }, + { name: 'to', type: 'string', required: false, description: `End date in yyyy-MM-dd format (max 1 month range)` }, + { name: 'trash', type: 'boolean', required: false, description: `Set to true to list trashed recordings` }, + ], + }, + { + name: 'zoom_user_delete', + description: `Disassociate or permanently delete a Zoom user.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `The user ID to delete` }, + { name: 'action', type: 'string', required: false, description: `disassociate (default) or delete` }, + { name: 'transfer_email', type: 'string', required: false, description: `Email to transfer data to before deletion` }, + ], + }, + { + name: 'zoom_user_get', + description: `Retrieve details of a specific Zoom user.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + ], + }, + { + name: 'zoom_user_permissions_get', + description: `Retrieve permissions for a Zoom user.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + ], + }, + { + name: 'zoom_user_settings_get', + description: `Retrieve settings for a Zoom user.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + ], + }, + { + name: 'zoom_user_update', + description: `Update a Zoom user's profile information.`, + params: [ + { name: 'user_id', type: 'string', required: true, description: `User ID or 'me' for the authenticated user` }, + { name: 'company', type: 'string', required: false, description: `User's company name` }, + { name: 'display_name', type: 'string', required: false, description: `New display name` }, + { name: 'first_name', type: 'string', required: false, description: `New first name` }, + { name: 'job_title', type: 'string', required: false, description: `User's job title` }, + { name: 'last_name', type: 'string', required: false, description: `New last name` }, + { name: 'location', type: 'string', required: false, description: `User's location` }, + { name: 'phone_number', type: 'string', required: false, description: `User's phone number` }, + ], + }, + { + name: 'zoom_users_list', + description: `List all users on a Zoom account.`, + params: [ + { name: 'next_page_token', type: 'string', required: false, description: `Token for next page` }, + { name: 'page_size', type: 'integer', required: false, description: `Number of records per page (max 300)` }, + { name: 'role_id', type: 'string', required: false, description: `Filter users by role ID` }, + { name: 'status', type: 'string', required: false, description: `Filter by status: active, inactive, pending` }, + ], + }, ] From 361ad75296baca45d07a144fbfff74192a3c41ab Mon Sep 17 00:00:00 2001 From: Saif Ali Shaik Date: Thu, 21 May 2026 14:48:59 +0530 Subject: [PATCH 03/10] fix: escape single quotes in connectorAuthType frontmatter value --- scripts/sync-agent-connectors.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sync-agent-connectors.js b/scripts/sync-agent-connectors.js index 342e839a0..0bba1c0c9 100644 --- a/scripts/sync-agent-connectors.js +++ b/scripts/sync-agent-connectors.js @@ -1260,7 +1260,7 @@ function generateMdxContent(provider, tools) { lines.push(` label: '${providerName.replace(/'/g, "''")}'`) lines.push(`overviewTitle: 'Quickstart'`) if (iconSrc) lines.push(`connectorIcon: ${iconSrc}`) - if (authTypeLabel) lines.push(`connectorAuthType: ${authTypeLabel}`) + if (authTypeLabel) lines.push(`connectorAuthType: ${authTypeLabel.replace(/'/g, "''")}`) if (categories.length) lines.push(`connectorCategories: [${categories.join(', ')}]`) // Static head CSS From ab969278d251e312a3889b2af528157a03708fbd Mon Sep 17 00:00:00 2001 From: Pranesh Date: Fri, 22 May 2026 19:05:20 +0530 Subject: [PATCH 04/10] docs(hubspot): add optional scopes, app type guidance, and legacy app notes --- .../hubspot/optional-scopes.png | Bin 0 -> 334336 bytes ...after-authentication-hubspot-app-types.mdx | 21 +++++++ ...fore-tool-list-hubspot-optional-scopes.mdx | 53 ++++++++++++++++++ .../agent-connectors/_setup-hubspot.mdx | 8 ++- 4 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 src/assets/docs/agent-connectors/hubspot/optional-scopes.png create mode 100644 src/components/templates/agent-connectors/_section-after-authentication-hubspot-app-types.mdx create mode 100644 src/components/templates/agent-connectors/_section-before-tool-list-hubspot-optional-scopes.mdx diff --git a/src/assets/docs/agent-connectors/hubspot/optional-scopes.png b/src/assets/docs/agent-connectors/hubspot/optional-scopes.png new file mode 100644 index 0000000000000000000000000000000000000000..2fae21a1f0019518bb15a84e070a584af609c08a GIT binary patch literal 334336 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

-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

#_M!6qL# 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

    pXD6qrCF;B@*;9(TbZ zTlKkw#}Qn*)%rjMj9=!{9|FG$EkaOhT~ztGsFnrlWMukoxtoUfG>R)WhD+@)e74U< zEOCR>?`NJv1f~9h+l66QJ5-IdzSj5YE4Di{T+9N`n1_T`OFZZxJGPnOO6Rj*WKOmgSm z3N7}lt{s@XNgMb@IC<_VzmcgFsp8jlv39&Afgy)#6P|a5$NluH#s*)+&;Q^ye?14t z6kwpxCLw~Rc5pB@1sgNnQ`WhBCxvEA^Wn|WdcxT_nVCJKM#9zp%K!iTVK9kb((089 zeKB;=A!8&uI~~?ZYG=KVEwDLPY}%-HO2y1E5k>Z!B+Uza*O8J5pe5KA(nIK~2G}Zq zxX848uBf6f4{8_=vbXa~lTz}~phxT+JwFLzRO^kVmfg!xq3}Pa-kqo^U+F{V*lzft z#brI+L-lj2@{u!z^&}8C>@m-%b=_^_2Sx9}EHlUZXQ2@k0cvT=dm`{i7HG6H(`y4L zRe}1w#G!Pn4hR~nuh%ag<9P{_Z=PagD%;$a4WN?xR!v2Q%YV&be^>u&VJvzbh)C(5 zEYO73b2gOzYpPDeqR^M;f7$Oj;FXjHg_V8TW0m@WD@HqGEA}y!vylW`3Ummi*4n`? z8J_^XiWVv0TEE2$ow2k>-#KH9%DNPh$m%)TKaHaWsR(*0z=3jTodoylVP8ld=f2zR z&dW26>!3K7!w{Qg&Q2Q;lWI5XMd7#qeW8<(xUO+i!115xv&hs!Ukq{4J;dOy>d0|B z%--cd#m=dcN-F}GMg;P+ky>pUcMiAH^Y%ENNUJb&K0VlwV=}Vfh9nrf^zCQ+qs-vb zSEch5E-baTe_{aR#kte5^BbTtYLtaK<9SYHSeAT;K!U>k-)&>K79AGR>*msR<+{GY z5{x&w#mJPHW^R*+6ZI0UQjmg*YgtVM{FXI7Dpsc185 z6yir7=1+rVtb~2+*GMJN`;xqH4+EKhaaa3=y$9ZE5uM6vuqIjebZCd&uc>v!QOKsr zX*fkwM(ie=fp}rJmC1(vpX5KQ>e`7aSfnn>gte@TpCVtCq;sYty0tX1dMHSk#CH;H zWC~R=EV_erCQ*1~Qfn9A^L#A*BOl&Ng)#;uEG?entz^+akyoA*Ew++_%@py62^A;` zt5u{nz-sNMgm)hp_6aypM*kwrev7Bd{$t#Qe&MzAPG`OK5j!JVN-0BeagL{8H6%At zsY3a;{Os!JUrrrmnOp%^xl1kk$jT4NU!(KZ0&+P}JfnFo!`0FqNC){6w2MDapz;TQ zF47?|eAv}G`D3@#4MNJ7yFtAoWo2t&|E>6YRRRM|*MH@-mhCn>928CqoZvdRyNmHy zk83cvY`N`V(ur@Avz0K==Gb=O^tTr$;w=$J$Mh-5Cs9Y1hl$*Y$2vu0PZ-|uQij>k zEC<_?#VnaG2&&sm`75m1kWd9)yH4ioNsi7R6V0x^dI8uD8Bmw%{nt~Q0z6jonzmn! zdF%9Syfz1J2lym+0aZAQn9Y|cyW)6NvOQI7LQ5=x|wYZ<; z4LLb}cVq7WL=HC4cirvs``AvO6r;VPiVJ%+_(~FnO~X6@ z`x>XKUY;5rQR7*GA*U~qNKu>_Fwv;N<^14C7c+P)5KkX#jHr2sah3;!$O&Mdel*&I z?g=J@>RMks`)L=AklmzvoS^u$&LG6B=?*WZ$ zfo@vgE_H^1MD-+OM>g1CsMP``u_!|j`K@#H&cAk`Md1dp{LKNd=Ra-_TU{z7o%(1O zk&4}gLjc-s1CdzO;a*viSX}AmM9Ff^6sKPB%T^$Tr3&llI({FcQ5gkzzQgPeGS&PX zZ3{SmbPee>ByO_llvh~}mc4XQJgkgye^}81p;b>-1%2VJvL|X;Ys!qdlA&yS6I2j@ zcuJT|e11!6KVGD@HDI#YzT!n93<)b2c_bhqw-_;!v*Do|Xj^t%|9dIx7ei0g6{s2%VJ$$?eZ7P(st&4-9#Dj7IQ$Zm{)&) z+0NIC-|o2e5?wT3qo)Pm5XBM)Q(4@2k8wPDmNJYavox7&wfIWL_Pd}o9k$~0o1}jiW=tr z|I9@F{H-KlO2Pk~KI&=1KmHWW=_Lo43+e%j=X7!w@4zv3ic-CS#K%ee&z%rVZ;^ zHR(GX?GApl?P~Yqc6?Cc{#9YhtrPVQIDZhzq!3(PU>!Pw7HfZAoksPH|1wV`genzr zNWMA-it||(9q=~uURk5~0S+<{Fd^b+Kj|U7M85C<%3j_eq_m3OiNyyJ{=G!G@=QVs z`}Srw1;o%1K=nGXZgBT&-7elecB&<>i1Pe zpD~ht0vw%3MU2jgT&=&M9RnAa-t*a+>MCq<(muv_XwX}MuK=j3eRP`76ECuTM7NRi^od?gi|Dp1t9am+EJZ# zYVe?DZF~}IU#OZ+vx+dGc$#x?kqMqyKMQ8u5XA)m4A1*>@qct)%Q=GE|03|j$S>lY zk|@xP%mLLOGFJ+VKbb(a#afq+fAMLv%asx0r(kt4UJFuj1Xwt9oia5)rSkzIqpS!A zjXxy$)rzR(>K@s|2(9CR7(B}HoyPG-mdWDt5KcW!YKgl5p!d(*vVDx(eC0M*GaH$N z6pTpGVPtnN>H#<4WIg|@w)KId1K9vC6Mpjhh!~%F-yGB<%0@ak@3vo}X@Fc#6^v&W z7jZ=NN?l*A(G+IUdy#y+E;YwNQ}2nAMg(ZGsepYMMfSE@G;=>xdq<3w*F=J!AWz% zwxAvDSKh%fuG*|1x6i%LXIfNE!s7P+Np;$~vPW)V-->N@J9| zq3lRIY-6eYc19VwXJNt8RtE}V2h^!R9~dBR=rfGfU!ly=*HC;1<)S1;wPiwlB`RT_@#ugK9^);OiOgc1nRyx^$IShcR_E}To$KgXn`aPER$Z6FjW zz0+4G^pv-`(Bcck?>_t0i$Fm7CwD2=eq&cP^XEC|f%e}vA&;k|6J5*v`fyZHpc4Y} z9Czx!N4U8X$LP$Ou@_Cwa@O_D0?mH;H1Vmmmu$0P+go(5F)i-~Lzm!71&S@0C3r?} z@tPd{VZ{8r;ULE`o0liYc&t?Yjc3P0D(ME;bsGk^TJN4k`r1tghp zx@Op0;7_izP;esH7!~!NNmI1xSxUF2iagvidnxzpPNhs}+bH6N2{}c&{@?_PD+uBy z?SXVK6`c1Jpg9pl{h-vrAraDxC5R?Cb?1VVlG?n_(VpX$60$Z?mnUHp!}D;u!u_Ym z@A1xUs5VwrbAiTI?~wjHljntD6p%2^B4xJP=()!ehPu=eledoMI>kSCr!T<cW0v}c5dHkRBcBw zX66#N0W^fG3pXh5q*1D?Ns7-hjOp}#GO#Ksv+nR-!g6;1Mh;k-i95k9N*y;Ur1L4> zz%BtHpUi|MsNOWplIV=kNIPyDW>1ZQ(Qwl?VN(}><(pzg{RsD*XE`?u2z&Pu^9D&-cq+PBl1?INe(UF=Lq4Ot!XESOIuvZ~bGv}ga}GuyiZhv{zxX6=%1Wxi0`o%NFrrgDceGdEtCw1n#%J=pKnN5oop1Nh zqqo3#q(DRUz!Jci!F`P8I6so-RR7JsWmt{NsN!#~gd{_)H{^db(0URK@#2w~e^OWN z#j@WZJmeh@2fb$_%?>YRUCpLx{^Ed=Fe1piiJONsB`M9G7(V*ju39Wy7}DjnX~V3p4m3V|&*Us9<#RQC zyj*@ul4{L+^c6?A3YTiMu`-#brbbr61ZS`cJ-?cGnVfGKO)|@5A_9ctrjY$hJw7aT z7V+bLUHYW-xqmuhb6?a;YP^R4J?~CeS!>fNIgHM)2cPm+EJMaz*1vw*-2Ycl!)WCH zBm~_VhVa}4hz=GX#x7L zdjQWA!Eb+=@vdtSIW^-3;jmkZVt?3e*gyPNN{xA5N@ezbwJ?PkzsN}9o_&v}Ls}Rq zPTtG$Chmy1o3wZu9U)okHr53-p~%Wy0*=+>>&3T1K-0^+q^ciL+z(QU$cJ~inrhmz z%vAo{?-W17Y5;%FB0&YTD0lKAc#vkS+hW*{O=Gu>R|#I0N0%icc#l)`LYrt*J4}kc zZjQfeoGWh=*}ra40AW$1x38-ORf3NCzT-@IZ%e>9|Df@K1tx$cnw%b zqa z?O(M4?YwIsynbv{U#f5M@NKXb*;qh{G4EuZ6e5Qao2kcVUsW6v92)r%*HGXYJ);^i zKu1v>1PIcuF?176B++S*xf>}*z#Z^R*j}Gs$wYuqNZ0Q!0Sra*-!bUASVHihF1SR|cH1L+NZY-^3|J zZ@y8w9v*bqRqEz*X|O)2S{g?w(gB=bpRP))d z6L?3R)&%vet|4^8gG44R$6RF=3@vvx^Q_tkKCeE1-E4bz{ztl1s0SfYVXwqhA((;y zN4E$m_J=Xe^n2btwg$rhj}oI4q*GAtA5)CBsxMP_fXw?Du+NA!;LZY681bI{jp|s7 z#*#G)++XCJ8Iy$nb3YRl>D}>1FnsQNK;M&MM#0s~3cn72sC$j2|L$u}FLZz*;8VH%) z!SH7pX|QSfnMHAtAoB|eW#H8bWUW-dGQn|(?fsvj)7toUk)=%NwPP_4Fm%YGfT3gl z{~kKkiNa!nD2K)xncZG?RN8EMt2cEprY{p*zK5!F&0Egm8-oazb;{Tb%;l?oBk6nQBO>C7TT=b}NZiknuUUGZLRm&*t6o{4E{jGl5-to#gyGnw zep?YXf`FB$w1C$yp>NPUGSM$PY~?-0lv$mhYrbMx#Tg?Vcll(aB^5<&pr?UMh+5d+ zud&Hm$~&GXw^c^c>qQ(WfnT$h{Z8wVQ8Q;i(VhKP)WMYyLbUy^MQ|0uYzrZtu+cxR zP{Qn<+S)Wa@uHgw zols&d+M6a^m?$o(5{2lLm|th=Yt0*>hgE8QI<7~{J{omL7N&3DP$w|^$e@ajPaY875*_7x`$ryOL=;UDrZ|@hJD)*02NwmldQUAjg!EBF{cHF@WL-^7C*v4gOvT$%rkB8 z)OY>tI&ny=-$jXtPfIR(Q=GST2zWxwQ;60qTT2^r0a7_+C^W7I1_e zELI6>eb3xM%e;g1*nw9nU=dl5a3E*Z^j-KAJ0`Z8M5FXCYdeA_b+3(4L7NK1?`zRQn*LzBAAXihg#NIfsnMUiMB`aB zZJQhEsJ&FH-ZU_qm}#!ep=2BV#~xb3X!)UG#2lb(c8S(vHRKby?YPr4Us;_~{?OCe z;=2yrMa9e=Q&=|x(ljW%idDXOfBsewXvBTwhvD>x!EYj97h#5)7i2}0afOcc`5LaeuN%;6E>R`8C|`Z~q6TR*$~_3z%uQvu!B{DoI`3&-r7l+dpt4?Ol%l zAga6uI@EB1)K*Ro0pgb)FC{IJjBvcf%$1QTUo$`id7xVV0CW4l70y*?+x=q_mcPOMhpv4S(q zI%x1T9RY%bR;br^w){HyW%L0jT?ue{e<`Co*2bH?9=QuF`lz8Bgfj_PC6kCOe<78B zeW3riLvk&0HMOQ*(v2RteI^o<%_$#BDp-^@WoR1Nefo-@gloQxz2)QaH+^u$n1V~K z9eIky6m7$@&+Sdx`Q1tvwPS&Txsg`_n($fC6g$D{N*iLYcCzP)&0pKKfYgdP4dyXS zo^EA{{K2?m=~xQxcZGA+8h_(Xi|~RXp~qQ5=Nwy&=Bmz(r%ANlZq~Zcma!`T+@C)m zLXhaD_H0&fIR%9dhus-c*fb=p4^?3Xb5cb*K!}wZrI*|?@lVHhk)uFTvxY{dl!8M4 zCwUE027?~Jpzw!s#ssqK_xFx6y;rwiVxFg(aqAv2Qau2M69bx1y+8YSi9n4MK&Mt@ zBA(KgkNU4Je3@F;d6w#@?Vi98<6T+h3f|X9`>oe%zNXbt!lah?ny$roK`vE`>zaJa ze4q4-(M=gDKi}+**+7#2tf)+U${&YW2LkaN7QK^5aHGD`5#TupcLs_c%b)rOIB%CvAc&{0<8=o0r6YO17rWkzS!)%sx%||N7hE+x45j}A5-ENqDcCd*RpKt z7hW6;$~gt_ZsExv#}

    5}cx#|4cDnJFIYchU6VwiN=OYK1e!!Hsf6mi(<$UoH~7C zs&V1Fy%JTW!f=Jp{xqau)z)9QkmU?+(-x|Clv*C8l{WY8q9M*qQ^`GQtQP2FI+P;{ zCW_YqDx$;<+t)W?Bbab(b?hMh1TB5p&`Pd0k_P#2)`bd?5p0;WC%4QI4E_|);CB3A zl>JfAd?@~pjYFUc!aDtrHs19JwA36tWe`PNgw1sx5)tVUY;)wTBW2{R_+7KCF|q8T zAn3cu-ghedKMPbftPb=2Kcil+y{b{Xm&^+POLOa@uLkUO5D=`TcH?^pVZIpSUGd^# zFwv9w^aa=KKh>F}-mOl}vmiCnAEi=wMUMqKOH>bSyHV72;{E`aD~I#k zBv;c-r4ed*9`$cQqLq){Z=AQ#fDgA=qh*)qK|rb3Fy=`4UUL4s%vl(fi}5e)e=iEZ zY3bW7qq83G6tGV3MpYhR2k}R1Q4?0 zns+Rn5`p^|eBDqSAv^b)1q%0jpX02%_Z96{m$-@zo8ngS8&7t;Eqy5@mN&6cEWUp1 zNWZr_$1K-rIS-<{){s>x{Zq*y3Kpd&XJFASADYMB`R~O6MjFabJG!4(!GKy1CiRTTGe7qS}IRB+T@PW)NG)EuTU4J7KuU4duAU8yR z3>VvUQ8_ndhlSs?l6$=;{M`>s1=Kk5BN(h-_dm!d`wTi8?$3nF96Qo>+T-Db3& z$ty{I{pfLQQBTNE(=fJydY4@WIXCjz6GasQYC05r82EbxIKzJ2c_ck;p8$NN>I(bF z3YvL;Tn&zmTorc8JsOGcLO6&C>)vD}?t*xR!7Yr_1?n~m>ZNGC&e~^J5;kn8a0&f7 zTOX8&rO$Wc{wuCWpQr5GJPXu8{Kg;OMr7z$EtJPSGR3#Y=8>S*rE@xp(o+h;rxxVh zu*qMZUv)ANsX>sLlDR6xRYgHmQ6~(=U;wlJy#J*>{c-7Ny2m_wXYh z4%|>9HTMvsa`dz0B(Ec3LZ3?ob$0LM(7hgaUUmHHbJl^6Ier4xxrB2(FP$;{KB;~F zyl)3>>%Z$^@Z1r8fABB2{#ee9s)dNTGtGMFxs33i1u(!aq=1I+&pTnnSo&(Cfkt_X znddL5R*dvZ3bOKz!{)#;pn&z~IXDpEx2xoRQ*puN>NWxDmyw%*dV9AV9SYK-CNcrF z_1l~3pOx*>_qokpRr}gRwViqo2cqIy`G9->I_ogg+>Zd)ju8w(+zJ8?K;wl z*F&*d`KfDt64^Y zd$5vH8}DZW@6c)}umz{@|D)_JfZ|%WbS0 zxVyUs_eO$S;|(-&Cu^;J-`V@Tch7xQv!J@Fd(MCUGV~kcLqFh*!2$?6N>c$Aq)L?S z&0Z2eE^Wl=Ig%DSfH7t3y}<$LPNQic&R_gK&-_u?!~k-Y+7*7F$@O{8*8h(a2i+Qq zyIk|3rD73Jl&Mzyez{MDku(Jhq>^=R_ z=RYZl2AgB?waUv{s=$Vkl84)rK;ygLef72a99?6ESWWwrv2<&4df!ehpEf>L zD^v{O6f1EF2CBq&b24v+>XdcIe>pCem7Oiym(J*j)44y z%J~y1zdRv_QMQ(vE^ff_6-l)-y6(V5ax^$VX<(${_jBo&13kS4qiW;FYBi~{0bW7|56Zs#vna2?YHym zy{&c38OY5NR1}>K?4m1+O(ftjkxM`GQpNjjnZ13c6{`IH|AXx+#z+45KF2Nr>hqfD z!LjFcgj8!M^7_dPN*Mml#dZ1v*rOg2KOWqknVNJIr6s%@1EeGp`ZWG$vMwr^rwjox zA2Q+nNp26|ett6{o%tyoN{L|{dHtmhng2+FoN(X~l7zoGNlBiM!Am>D7(LwKzWGf}XUx1+s5UqvM4D zrSMIqZJpP-{}u)RwtAbs&$9dF7H2%%^QNu-M|S_e&Rre~+<3a6-*fExVw9Z8Pzyy&k*w&)%wKpLG2pIi0saiiHj!?h5> zhIRbNA)v#CVUR8g40LpHDRgw9LJIKdc{jY{ zKg(EMTum_r%~OczM+Z=Ht1gIaeH5&I{Z<6#KdwcIbx6nKPdd7mlJF+#mlJU07<@bVctd~A`v^e#t0}%tUhseU(%(NI|AVYZ5Pzo9ix%t43P*=_4o^iz@$YkVDgq3Sl>A+YDa>mG zw~q-VFBe6OBn96k{m1G6ADhH{yR%n{WfBA7a$aS#(Y+xdrTUMX#l0AKc*q-Sq(d97 zvh+n4k5r)x6Z>zk8GQzfW%!1{0O3<7KJeIE|CpHnm}gh=&Tl@L(FDC5zzPfG4oCW0 zkyqztCd>T$+yamHTLE?!Fb&i)A7Cbt6bW8OU_{0I`*ykc1iYj7l#$kJgzbg*od}c< zxXs3gT)gKYJ=AM25%Yx49^yC4wOfoPI-Z6AbcxL4{cVQU(PE9H^D!v*di%=&3J#Z5^(d7u{tl!U>~(R zJqOgk=SDKU!S-UfJ2+)pIhzo+U-%gun3wd6KWEithrcx1otuXo{-Lu)CF{Uuw&APD zRUMw9SGm@I*(!e?TM_Qx0>>_klY^Xv3v0hDupG935HO_}B=H2b@Z?BXg2@u0WWzT| zENXR`2!cf(mQC$P+ZdN783==EU~jtjHfhYQ9u^G2UoVhp3`U!iKxkqwZa^hcyoCH^VOjg0ROLXi*{ zhh3B)&*&!i_A#BWi#b@ysVH=g8?Sa7VO83x4l|nZm6wk#-uvYN?or5>gZw<7zdoL7 z6=iPP9cPetZ)#eOo_dSmR}+GZ>Q+`4ljI zur*rniJ{Pspndsxorn`9+%Fz;zP5Z=mtfuTz!Gsd7u`~#f|N#zz>?~`N2}TJfMqcVBEWUie0uB09l>7*qUn5Q6ZfP-^bGf7yP5>OhxLox*6$QFo-+alM>yOqgQb zM&|agnlLTI~O;-9MDRm|v6Mh^Imc+=A__Zs0C^2?X-AEn?o zO40f42_S^m8bl5fZBh(VC0r0uXPc^Y@4z-}eRv$Ow~L{ycHEJocNQb+p{2W(iZgXC?BHan7nFh`FvrEq+e!1cUxdBS{tCknBSs|9l&GCQd#& zw8wq$l?0{(*_3Lu9y;k9Iz2OM&R|a^6{+ zOSevQ?Z0{f@a!Lh6Jl_72LUER+U<(A4<%~Nlk-P;(ga)EnT2eF^Cd>l!s7Xg#)0EG z$-8}&`)%rOn=L_L{g*B}6z zdmnEvlX=GuZ&xIc9;fYX9xb(LK0bO#YMmUf7q%Oe`9_-=bwt|FKCy6_rRzG&^3gSZ zfFYFW9BDf;-JwTADY!koGtCF$uI{@A+a{OsagmrPY!*{m+jnQ5d7MLY-1`bZrw;E<(Tyvj{Z<23V~v~H2Gwz!J5Dl`Dpc$2`YvlHWN6{}X#{^7kz+4Z z{IzXOqMx^I4SredkVB$$Xzq`pgIi2EGG$F2zI!qGYG*|Pqpo#}ek`f$=J8~IHY#Ys z-xH<|Oc=A9UD>E+wUXf*!J@)+w>$bXN{4RS2Pc5b^Ezi8GCYMp667`$q#8^bFe4t% z%88E>kUm01s|wg0p%$ZqAKqRFC6u%`hr{KwOXw>W%%NRK{L4gH=YAOph01Z-4oK=N zM$QTog^X4xj@I996pq=SBM-PcpTVCEE2McR`Z%A&=Z2BtPNT?DW*j`-*L-QeeU!w7 z{A7qQcqLj;QlsyK9H97nwFM#tw1wU3QGg|Bh+@g0l)y!-F^XU-0%;Fpx~aq+H~O@N zAX6d-I2Rr6YC1i{E6zubjmyy3$$32-W8N+CpDbXHe|1yYRwQ$yBr5-yg}!RzgYDvqfYBhd`JoaM(@d5AGkEE(~mG z9Y_|=#J@t$OXX{IVra_yB1(>#m5ZW@E0#bo@aK}l($WyxI~^Qwi!$XJ+fXevkJ?(z z0SWAyh}{5c7_a(yDx2B)Xi)Wa6|K`^94^AX)Qu#ttyaUxaRNn~ZXO~`$0jtr6V_&0 zHbMu;aOPX|+1FBcr28N=nJtCsuC2Bc%dTsa*ltkqf{ z)*U0CCGiprO2CwJE*_NK*>Y(Nqd_;?^fc*Mqu`KJQE&c_q`Z)yK{ z3GAVOtHV3c&6?kMTxu7jyYG_tv3G1atVPqtkDw)?kBA_%!=k}#+j{Yn>PMG% zV8@=nL!S1u$L#v%B zAVP_V1&vJ>-72&{^g$ZDMVLYrJw%aeCku1SQ z=>9Do!3ogcr6MVH*7oz9><4XeE7vopeQts1xzr$>_>gaLXrvs1MFJzHk%>5ws5bci z*i~HE=7y!y+X>vDIC#dn;a|4xrr<;+>WM_azA9Uuvn$7*By75yG&S1z5gbs?I$f`= zaYxxyb{?T$q2O3up_~)B{cE1zNe^52F*$cTQgcM+N}BuovDusV-y%CBX54l&DS-Oh z_k}_CEbew002A2^J2|}cPKcj<}yA9y?S}n!Is~t7f@ro!dm*I1|@q4ggt8+O* zV^h_iNs0?jCe*_;2`HK!`ch0@++m-R4mi_Ve@>Uv|{aaM)#UrgK1R3;h zxX2^VDXxX&>^0mNgbP(`+HP#IRCKIpQ7eCmQ-G*)G=qmns_1fqR@W>{8X#J9!$Mur z1-zqAC#B8~ieBP!gHCLj>`n3sMoZ|mPGM?7lwo9^Z;NCLNNt+SWz`|+gRp_rKyOOb zBE;$?|uX^$TAFu(fL-`B4$owqlCk$d!gag(I$qte}pJuEmnDc$=9i%#MP zymg{`zDj^8_Ke8~tjDW{HAc~!7<>QJ5G9dN{Whk0Xa&$EWQ4FV1KU28pBb(D0a`IE z9!{;QaWoA%x>e({St><RbZ|4$MUyv zOktb&wZ|K=AFmlo$60^ET}udNMR^+gv+ZGCMZTzlE#=-w!w{gLjBt55A~(#uq)=jm zp#)~3W#lftxoUoEA3-I@bbC&+ZYQbjQ>bNTt7@PgzrBYo$ve=x1rNKBJX(F+ur}+Z z`XTZ&L{nhC@DmjwU=x9lpoh@qOHzW2W-=`o;LQf9K7h}?~zhsUwlVb%Qw zvdl#0+kUqC!&Ewy(PvGaOGe(a!qA+TAy=JfA3VU1gtU`vrE@4Gm|rB0P~^&Dtfg$bqL}(evB;lUblWx{>W-15L9SE&>@q!UO>a`+&$R z;BlvFt?rwb%4e^VI%U2S(}1k*Y*(<`a)NqX^LwL&1DVVYM{C73@zQo95$PT1q93t7 z^`eKZR7Ji0P|z*|WGQO@5vN4~$4LWvEq#zy>F=&{oEC0Wz3ELW3H7rr<_0~I@1=^Y z!L5u+9N=@FohALFV5al7 zx5+JS_HJD-;CrcK5)lzxreR&Lzd06hn=Ml9^&pT*UHei_k<50)k>-)H+5ae2A#0gT z9Ffl0MM@TWJYw9Rafv^myQkiym$JR|9k<_bgCZmKj|{R(@y#33W7avP}HHB`)rX;rSH$WLg*k|VHu#cx&} zBoze~ZZ>~`YoYZOGuaZg`2bIl(pi7?q(2;qnB=7O)z?EWLqunE#_ldrq=4ZSCCT8! z$?{O;_WiGIk-}#nmmTp@kbeSJL&yX%cSj|;f0wg5)4MQz_iMt!VJEeOIoO>Y0&hkw zpE{rm*C+_r$*cb!(Rk^8`*V+;p3(52&Jsfq$!|R3OYoGEJBC}Q5EDU>x9enYbYxAo zhzB>ewV|w5RPp#CsD~zbtg^$I$P7j=8bwyWih4<@T-Ka9o=GXM5(g~+J_8z&n6&0P zu!wJyKWdCWw4Q1G0igsTB9rD9na5YuE~~C6{zzUK(%4TmiDsGgdm}q*bxvZ003-~m zY)W)|o9w5ZzF2w&8j%Ic=v) zyF(Dz>-AlMGfm%Tk|shKmZslcu0|gAvIPxZaGm^Re(3yTo36&yFOT^$(c|6k z_&RakR5X&M!s$`h?nMUz!APq*qcuH84johm!sYZx#G`tWl#qZ>;T2oTc_;RXB0D!b zu*?ph-GH$z5lAOVdkGvi01|EGtcN^e zRZfWE;NH;r{m9FW)6~A{?N?VMjer?3jIs{sqG)_m5c-$y_0T7-i{Z95=8nKYZ^LAUF<(E>Td+ws1a^$gsW zRbQlDSPpQnJ&@Pzu*S{f%0TSzs|E(O8&qNshjsP^Ojq<{oBF|}%Ubhm3Hhus*UWE* zSNbrAae#h$%7sN21?b?m7<~z~d8skkq_c?YmC89O`ZPp%Hi&k-e!>Z#hw3s;khAWf#DahZ(6l zV=5RQ<*fq!C9;2)6ncY8f8OD-A$KwX!NdTzz2*aSM{L-Z2Gz}r5jlHNRoOoe&Ju5v z1*Y=6*2rHu@~E0r_d$ehV)@_HI!#5@vb%}1HtpRzz)|XXIv7%l*XB<}%u6NBLEtsq zuD=kx1`FEW#ZJ1wG4ipt-l_H;NghA|5zT90;DLGb4eVqwDe`;mPv)RWVZ`>=1c4FdfFyb#cIEncVJhy$k&G=5jIUjQRWiI$sga&9DIPjGjqkqZsI+b#-(961 z0-VW-;R}3{GxbwHV}$z2V(U`)Y(rQ)88*WLG4KW-)1w~ExCDMWV_}wk&ixf+4JM5G zA|9TE>1H8S*gQmMAWPYii(F@#Q0bSu1ao?4yL#9yc`YL8vBL@Yw*tuf$xu+n2Z+5~ z|BQBWB+#oQ9r?m&T0$5N?S)C9L%Z9$sMv0cf+3kJ=)rIU|85oXzO;|4-qJq+9XUMZ zIP~@6B(IWIrUv@it24041RYjPk+gqrT8y$pQDqrd!%MXDYKLqTiU!P__{9r9-fK>@ zb8*zMF%oeEvEg7Am2rkqey9$f?3*{!2QkP;!N4Aaj_0kG53sqNT{T?M^uC&B z@UG+w>e^`lL8Vkn-MUjYg1Q8j8A8(NDMfc@crCC9Aj^vu_4!qN22){|{Dywm@W&*M zl7&nM$4b=X^g5+QtxspWOE6KdST}eM5N%9H4Nx&gh2jx6{R1!F7LyW-&iM%#9xsi6ZrgxfC86fRg;&w16dLK$RBPOlcud23vR zpw9>^j0L&46G$`kiO<%&LPm?0pcu-~>iZJCFRT-7_us44u`1tA&SP&~o-`_4x_oyR z<^j?SWAv|la(5K8ceA{1t$#Z`hwP2DEp>H{c1f1(M*GEyFl6-XB6gkS~ae6fut$~;b4iI=}I zHdPLbk2T@`T3t|N&q$W|h|#7z5N+`Nn06v|*@CdyE%;)RBGXbG5Oz2zReJdx>w%Cm z)d=w1z;7CEt7(~vT#^9l0#xbDV#M-yQrG_OY8?KywewinMDOMR=Gdu%hxj#7MDVqH6N1u zgKa~83@<5}8yjPTt18;AGE> zkoiW20M7688ik?ZkN8xsBB}(NcA>X|X%bP9%tkY?(*eCy*T{N&rssoLNgy)s^Cq-6 z?V@nA(J8M@k&S4w$J-a*pacWYHHg`B*Qr=;?@s%LQ z!xLXt)ywhvD%e)W6ETH)iW`VJe_neWrd9zWh#9-Q<@z%hZl+n~(7|>^@RF-7XWZ<^ z%YAY+-EX0xU+-Td^m$AW=|>NRuO^|Xxd04wCW^Y}U*CTlagNCth17iFn5tNVkS^7v zRkTR6wA={Lmn^wmHt9|61ZN?D%oxfgmx-)fR7(6}dp}Id!(0K2|SgvL6u5ZqIgn zM;9uJ&4jf^;Lwna?4gqHaruZ)XB*c)Z0zgd2B_b7qJpG+%e3zlHC1e`tH$8<)w}I! zvC)cdN9Qn>fGt{MefSLG{Bizek~TcDh!l1Ou#e-Ak)U001dz-1DmKC5vY6I%;nOpD zWkRqhLxU1dVVxD<}+8it#i zxdmgY1xRlenw};9xz>~2O+>Gip>Y_!Z!ed9(XfZT=PK?c`v%03m%A8P=L1ChsNL5D z^Z5#!(TRW6_{*a=9y+WYvTdx@iuo{Obc-CLybr@BAyc<1;Nh~dnf{b4htjw*#~hvWUA1jVKM&IJeNJ)DWpRrOI7SnUF^UlNc2Giu3Z>FC{3)-LTUl-X zHC`_=K28Dp4F4=y$XB589OFdWc>!p<9%R}b1eL3m4Pi`i&K=19cHUdVddQ^Gw(Y(@ zbuz8535*E4+hn%V#*N<<%R1Eq&s0uo& zp5CW%=qrXC%Bu?=Rg}u6?Bc>enbD+o+Gr+S=zE0cxMi!YL){*!1Zxd(W(3VK3-pD> z9m|-z$gXdh(fn}}cSx?iY&*}T;i*w1TW-rz_p0p2aw99@{e$QY5x%Q)RQ0h9QY8X9 zngYKF+`Kw0-TfVZrZd&}szCb!x^-uHt#R)Pd5GH59@#$H#P$0`5mMM%tqKPbJ%Pt_ zDW|Wo-R!hINV6}ij=#yeGiBvhCaN9Aju*#4@Z(lr$cb8VSt(g5BW2aBe`JUfye)Np zFxn&&EDBC{bFZ|_vSW(mJC|ybZbD@#Pj3GSr)%2=@eBR%2Bi6=M1=utWeA^W{iY71 zaWoKXJN4INAq{Oh6ZH@L>GH-zy7_v|dK;(l6mH{qybON+?$RSneXPt4ms!gVEn$3J zyUhB7FS1RE&IM~U>g(<7g$j|VbFf+D6;(XGk6{mxv3z6glT{QqIZ2> zQVp|YyC5_Ylh4|&XhW|nKfhX#)qr$x^~<(ny3iLF&QT}PC{Wb-UI(;zysOaM(Lv#y z)x`E&*BGRKbf4w~^)fs5M~^`#Gy>V1f zy!=97v^z2)Xp0)qdPzN@0uHM`Y&UApI&S^03Aq3T(3#yOdym7h#*u=kJ>-ob)|jcU9rm^uskZI0x@?{ex35Vh0jlruN51x*#Br(asl^YRHB4 z`3xxP4`V|j<7YI9Lf&`$XktYXAb9#iG_P9a;NZSlSh4LjrD`GHW~U?@pEXsAME@Cp zXP6pVq>Qn8ji9fH7T|OOZ|o^E*8UxyhC>G3M#Dx`RrM&SJKKvBkissAz3qxQ2vM2` z7)wjuNN!|S0u_RWwjX{Jf&xZ_GZ zgIhhR9)lve&qC=^4Wd4LX>0XfV4ulSnH&{$ZxhSW?WFU8sPA_Y#{q(+^hJx0rlE8+ z6V_^u0r8(s4<#E?-l00~;bE9P7+FWmx zfFJ|L0cVfB>C{6f5yn*e1Ubq_<_x#wm~_no{h{` z#C5coUEk??5AaAacR_Yx1xitp`G#2<*QeS;cQaMVvlJzy$Je2a&Xs&@K{%ykoQZI^BsPDf4A0P7}t_1yz}cn<}klg%n_6XER7mp#6IN#1JWPWqd4Cw zWJ6LtTyi4H4)j~wGw4ahEL~an;L+H9FlCxdC0<+%yxlZ;o+TBykYB z!1d5odRrQt0vCC^D^tJaOaqDq4whpp(pvgFrSguo`e z&j#Y&GLjyB#`u;yH0T#CR3GQIBII7soxtFcxUQpRJW@D+xRPLHzeLV&bPTw=x@&vNDK*_^XB7#Y&*^R_q9 zKFY`q2VE-KelX({9p&FN2^-Fn}r3KyYY&)ZvtlD?7zeS^kAhhkCI9LKkXq+8EFyjcr0RO-d?sCL%&9B|SQEypQ0;7pLFUS3OtPvJx9leyTW{a0+S)m$uzr6y|PV6S@+Y*N=oT*3;KMpn!T6NwzSnl!#%r7{zVwQV#zgiP)vq;2C z?b#L|5TbHYM1tF>&z0Q|%TxU6e=?nMEDlDb^(SDQEVoQ^0OGR*8c4iHSA0mk??y3L zCk~7bX9b>GwV>DU*8yNr6eQJkE#GS8Z_z_eQ@)xPCqF*oWQKWiM~`;*SwqBZr6BFg z(OJ*kFg?qmFVD@T1MA4(*>t*{C7uE%_SJ$x@?UtU;n*J@-&*cce`%R@y*F<(2HeyW zo0++)yQ!mgkGvfF-9I{3mO?yS&Qi9A8lC#flnG(P_q z>0Fn-oB8?POQl9Tii$!;HQ7h4KlN;M>F>#n_I^4Y8ZV{$>JjF=Q=exa0pi;+8-HNt zlw~r#3eb+1dG|=!H*`F=(Fr*%azL%SMut(=FSI;b!7$AFu!fdY59o; zb7$UL$iqvLV|SDL{}Bn=&zWFUGOfZecs0c`00%_op`1l_G%}c*saj~jZgNIr2&9{ zvgH{^BSb->i)yBy9Yzr-8A#VK-2t(|ZfU`8D0Fwyo?BgOroMbMXA+j?^ky9}bII6& z@G;ePISYx?oJ^^_Q*V&Qt=*w-%20m-{B^MAxj!4yiR*eI?aBxJ-$D#KR04^oU1%7F z&Uhl4mlmD6?E2K%3%GKK%H);8cZpEcqE?}aq9uaXli$d zC6Ro~{X-t695+o=AY&@TWU7?(D%rG9zhb$Y{HQ^@SFp;U*--RF zcMggR!qWR?hV5{@IlVmTh0i?xnn#hhWa?2!J%B{zT1afooZ6m4eNs=9MAKU?h<4Z+lxLKx8 z#EGiSpObdxug<-A?zi-4=YQI0KrZwx*^_{=VJ)-ShH=~_3}h%++wKa`hi+`wNee*p!UY(C4lI<(i*-lE8e>u+3Xsx{YpkZdQnx7>EpBTEM zfLfnty4elR1ah%Ji^wwVsxBDJl@_nE(!KjO!(g1F;i)7k2*xC{<@4RydAv?y$<=HY zg6|Vm$|YFav-61E_b3){zg1~)TPsR3tP*2&N(yv2byirev^y6@5m62hYp*244$iN6 zvoiBtJ6~7maE<}NX3boG)GE78-t>?=?MkbJNZ9gozB-W08to(*w%<*R-~GugROuJcBqtTka5u$x9fZLplTWozkvTsnz+^^Bl$78YxiO?xD6VO@*@ z@7kF!K4Y44G?LlP7w0sVIhzK)Jy?T=C=#_g40O|M#~q$h>t8{2y*VErrCdD!_hEk! z1>pYB0QZxEPtPDeW}=WwRWkszNH?S~9Dd(uj!L{X?7YvGTcBOjtY3yCai}awyr&KZ z63Kd8p>69_D_pQP_icq=2poY39NuX9Sv3LVjok*P@k~30sKdzv$({Lh&7PG-`O3z^ zNE8vb%u`I<6-y(DKYykai^|c~u3M^|we%~C1!XLOix+#U_yVLzdjp32jY#rke$!jKquz zG3tI+Uv{w!Bsh|+kCb8GqTXB!ESvVS(5Je$9ef#qw84 z(-uvK0WzCq6Re7&AtZOKiuv&zMh3XR^h!LqU!v-=0#zqbMnR$g&`HA`jkIuDHi&Hy zsI_E|!%QInQtc;Jb<7Bacs!YOUpki18pAzB1Z9NpFHwzX&5AW1@XS4J(cfcfEG*it zAx^@PRULGN{;u21?^$z_{%ulyD@N=2kSJK!BFS%13vcpn!pEv5NVMKAyT*Q6qiqxY zuGURvelRd4?6Ub7W{S(a0@M8-$I_&gL@vkpJa<(}e8&9bT??AdTm&1E{=3uKoykJu ze*XjtCuHZbH#70e3~K}iBorWMmrOer&61O~gZvI5E+cEG4r0}2-?wKw-~bn#y>q)u z>KYa=eDS#Zmoe~Wi#rn#4xay8IQS^4D%ezzVU^v`qkTPJ|C-WZl+WV4$S5PT%k>gp zfD5t4Cd|p*$tJ(FJb^v9H;e$mFRcz-9Ed4=aM4_A%>YDSQ*eUY3S%Pzp9L z0u5Ft$%dYqg)*7L2cLLAhi#9ip1QeyGlQ%ojw0L$NPChNZNQ|+7{+LfJ)nfcb zrbG4?#vZ#`m8Ij7a(~f0%b4^qx~91!P}DBtdOdZ(XwKhQUgrom#Hd7-fi-_zn0t%x zr?&8%9^sG_UH%tZQ1la$7FJ3C zEw_>R#k)-gfKRRL^ScAVRC;&UPVI}}EKdsbuaFreO|DWZr;{S1KjF^=dhS*T-qdb0nrLu8MjT7Zu0Lu<$ET{5WO4 zy3&eLf-JJyHLG606Ub;VAMhogNe@`FTN7xaL_0ssY;apV^j`JQp|wvD!q)8fJn?G2EC8Xt1Me%s*_I{p2!Do2A$w04Vr%CX7h>2rdOj0{V z^I(t8z1EU4!M2%8%W-qNy~Z?7j2L_9AfDe37WK7VX;+}(HU^m`^cl7HoPE%%kGeJ6 zO&M2j5$nSveoKWWT^muwjL>%o3#x}(uge`eeP_*EKTjv~sV|CeiWmiIi77u=7w=SCrk=rOB0 zLj}U_T`Q{G+})C@dnBRXKh-l=jc@_QP1d~Q^2=>D!4oF>ifsiX35W4z&8`nE4RK+t z0u$QGZ5i`HqIT~%%(ld5Grf;a{YI+TlXOdHHi@aI<5em!g>Pj|Mm0;KbiXb3P30P* z(pohpJW!*tyWReY60SR}!Pj-0uBtbR+<@faM8<(KG!Zp&>`?>0Uma6Y&%RA_O$2JZ zxE@+1PAn%Ehd}4NI3x|G_1jcP6BztQinLmJ2_x}l2agEQQXWZ^B<61N4p9D@>#mqN zh*xinFIMIVD1vc&Y)4ePXnSQItM>MKA#1OJW?U|q4QXHR(-sNy5>%Od&g-bU&mcO< zw!kM|;vy*?*XYts==u`1py;Sl5Or)1V-I|wvtFSur9}lQW+rsl=z95JcAHS z=49%3espJBl{F#Vn!vt#Df`1Y%})U`KpD$HW*+J}DgnT27v2@Mx^7ePsq@INPx8%v zi?ud4-8>~7*DK;*1tv4R4|%IAOobH9|GmY$q$zK#FL@#xQU-i7vein_0v?8Aug8-j zL2cCc+ah^!0yv!U9?1AiD9y@Z(pOK*YjTa?ovZCghV7n@dTDPXY0#<_A|2O6wd`D` zS@_HvJtiZmrkeFF!ip$^B5I$2a=7@GH%`BU^ds7= zoMBVl2VSoQ$1MY@uZ3~%Opl!tj0TA0%&>kr%(mlWH_bO=5*PMzupYAaHDj3U8sXuSy%QUlA zWzzpmr65$H^+RsvOs~`P&yH^1ZZzWMb^2Mr))9yNn{3*CKr9|Ch%z7jQB}Fy8Vm$gp>TK}hppJVj$uGB%Pc^W$m+aX4G`bW6 z`?&e~kPw%dbw~?wa`XK_tH7_gGBt;+1?%EZYY))-5nJhCA*xH82DZT&c#M816JV_O zXQ}wAb57?I467Mfdv&3-jVS0x zn{vwxcU#siMPx8FY16w^0az-YSuki9&%EDtJF@gf$i+y0%Od|%+R1s30?}2u{zJ3$ zP|ZXo=0M#^{bsfEPM*@U_JU64 zmqf1MNObk|F$DeS3>TzBkk=EH#?$4+IZ%Yi7aU3dS*sv|h?rAxsR^QZyZ%SPDR~DS zNM{WvIdpqyoE^S_7`)qiz!Z*Q@e1CzB5~S^VfUD_qYdMTm#Is@6fSSD?YP1#*4@R} zRj+1T1hnFX_7Yx)P);er@hwDmm*_<|xIH6nAgFG4{S2t`3A;--B~2xnba!Z!dd@j_ z1mreh*GM3reMLh_GOYlc?GTb4^O}mQG`&TuP7!?@Xp4T4NfIi-sUN+n%hT**dTcT; z-&4w}aa9zaDZp(SDC!Nm_#X3cIN!G0$No;-KpQc9a%g#ubBv!CgDII)Szh=`oIi}> zaEA|h-j)nIng5^SQgSh5paNNpkw&HlD4V9n_n@%FY-#W|B2lmFj^m?j~QRsZOhAUJwY=N`~;*kDZipDTtmsG zfNbjV2p(n`@M*yP0>=;n#O#kcUo|{p6&%InaDpt6 zp*Tl~&(6Z5h2Fts$fvH&zIPS~E)?7T@MtGRYx3R;ji1(+O#2(Xl{kk-*C*QVKaL9= z8<8}uiiUGJDL=`-DpNjQX_5(JT=N!Y0~lufk?obMs2m0A320)sDU#RPFWNEqvQik( zzCwB(rfhrPY8R;6yi_gsPy*7vXg7-ii{5Nyk>$Kl3K}6YM%B1ki zlQ5p7b`5;kZ)@P+Ofp%HDbhR?j-jg0pqjoLG*R2{x171SK|C%wjzyIj?$v*(#_UXJ zbp{T9_psIKfK6ss|EJIWucKcnQBa8oP$B%nvJ|4JXavV7T$G;!Rc<6M1=ncmI6{lM z%d5-rF>U!XZl(j_Q{`Wv-XU(ApcgV(+WJ;#!lgV>m%Vu;3)PLxA8e z!QEYhyVKplg1fsz@Zb&sf@^ShcW<2UaOd7x^S*QE{r-XZrPo=j>BBjXR6VqWk{lg0ThE5m!@S`14kOXGFe zbMpK*GfJ^KH;;JJiU{%SJwCR>+hF-}eVOYCR4kb9BW&**cGt2I9nTKxzsCbQLm2m8^$ zZjO`WSW{h3Wgu#o#SR>>ErVGH4;#g(7nO#Dt92o|pfiFU_K(X^Sh$JI?iu)H#iWVG z4L}3!S(@)&w(wJwi`C8aVC^*>Ujak%p%@CbSH;0UMKq4+OHwUop=fSTo)l zN)1z5HIGK zRsqk1Txc^0NI@OBC0DCM_ZEdbYl4k1TCe?&p<~sdc&EuGQ00A``xyDlh?y7Zrzfk)B(mm)gdg6wx&-S)7$>YR;oUmBCEs3*M zPww>q5Pk*!pfzaeSGTh46Xd(TaOGB80!rX7=bQjSZp3Jf(>`^ZT6YG{N`Rx-h#qbo zZ5$&(Zs&hB9|*eI!RC~%V}Hk9SA?&W^J9?>qPN*B5-%XLNX&>kN<+-Xq(4xG4RF2@ z-qjp#E~6y#))(s_UXE)$^9sbP>udU11UGpL9Th`Evi zxW>3tvse}2`8Zn4QSLv3DORR+KSl@LHb2vAzuBs}YtPq0_9TiXI(I z0a@$IkwO>RF;V-0u!3U>8Z^Uj+$!rG9OT+5St_|v@UX7Bi8w_ac?`%k2UrXm4u7FR zSMz5y+1*}L*bm5>M%KXMsgvoVmZVZcvp%WP2h;=LcC9pRBLGHgA{(rCsz;L3#I*pA z4BnWk3>SxM7aK~;#bWm;&`t(KaPfsG;dSfj3Wd@3ORwjQ@W}GmE3>j{T6iqRX&H)* z3fC5n8X$jJ1s06-vAsxN3!D%?5%~ErwR!sJ{jf#xNq9@_Z-BA!es(^|Nmr!@yMaGi zSrXG&_)*0NYc7Tpr7oQcus3;wUq|$Nrgv^`>Tidrqh#yzDzNKvify;<8&YaEC~kRs zSoHz<>LLwU!+>>@zLqd_#uP^Q+d(e0$w3269p>9(i|)W%_toPx5*0r*6sHQkPENY3 zBA{Gs8q?u(jZ|+H9uI72G)0UDCvB~AgFIj5@{2(oIr4cVcvF+=*~8aplPwSX4&@Ky z4rP>3R$cMnZ`G+nI3JGq?1SbNvn8f+N8pz-oMZ{Wz2}inMVb;>P@m{8A+c&N)dBuS zmNCi99ttUWUA)@xje&nYe{^Vy-mdG?CtxsSl_0 z#)uezQKHu*wF=Z`^R&>j7txPjetvXl<&HeDBtfnVBzlhrUt%k!gVC>s8lEWCm5N9g zgOx`fHe;J~FN)~8VAMp6%X1Se<_#EXa5kU9d`09=8zVw5eN5nM<*PBoy92C&%An$^ zhSoHIZFh53;4tnRXnN5C6z((JH~2laAaYW*i*mPTs3XPo2TeSetb1Zzf4e-u|DfQt z5kQhn!J%Tk{9r!+gI9qV0;X_E_M1zJKzJ*S^XkMPHtDsr+<{KfIT<$RoSNI-0;}Ky#q^@rnJtV(BBYrlP%ZM8I|4 zQlT0bS2OsI@&xj|XD2^2x!QKQhjB?p#&=Sp2Hq!P!)P(LgtY%~!DGF~-KwhY4Jjh> zsA1NtVq4loUQ+S8FX`B31jAPFTx>SiB5*rXxqkCXrBdRy=hCc4+;Xy%NlZ2AheQ&a znk*AQzH;&RzF@a|y5O`HI;=nylf`dpFUd=c@FfbFkK6++ct^q(*wVi^%^k(o4Z^UvcTduxVe#~LFiJom5H zWQm5zK_~5-Ph+hZ07E(m$2Qc)j|KZ$0^cd;NwmY*Z(G|<&z*l=Z&eBai)I4nV-0g? zVmUq_oD2rg$#sR|>*6+^uHdrP&;|GUT?jT(aq3%I95mL1`^_nU2BL4p(t(CCpfIU& zT7YY7Qtl_P?BtHKCrnNY9_HEm*xeUM_hNg#!b?eYtGg2L(53J`w)Zu=oYMt{1GKb7 zuN1LkUc6fW@|P9>w`35JoA2FsSSB{g-+p$naEqyL*~|KyaxIM72YwbaJ0AX&{&l^T z2JnTpg|94bohdj04#76aU&ap|!=yi`de5n;&h&RdAaknysNIXU2`(bfEMb9ur`b;} zwtb8f@Ly9)fdj2V{AGOKogn=dSj z6nlk$RO%JP9yfs;M(Lj5`LI#@q<*px7`le@Hl@^8OpWn)yngA6Rp9HnPv2xn*9f-< zU3lLlRD#9oX@A;x=H?oGe?vA~iTbGWl1|y2-KCVN?xPP`>PD|eZ?&X#u`8nPp9@xwkAT>a^3AQHq@xh=gWx)K$O-fBe&Az z_cImVNG_ci=7SGgy4_}R6Xo$A*f(>6;cH5j53A_W6WDt)*6|-10f70BY9cQL1(J9Rn^*TKO<5h!Bk9{Y{(LbBDt= z#sPU!)mpASssoir2?Tk_B{%jgct!U3#VY`VvRwj*wl>jxJQ|U#&$(0Y{??>YrXUce z636hUBDm2VqqYNZ*&G!95J4zN!@D%76c@(vt>e5O-N$`)2kMY2uG&~l6xCO_rKlG? zn^SUp^S&7JDz?{{#wgPSSj(B(iaFOgfv)WU8Vj+}t1L$Nc|=V554w=EX70NyMVW^o zjx$Hx#a4@ePa8npXVmkKZmt!%#knFCIq#XZoUchZK-*#yH{}Zm_v5LB#21f1$D<#z zj2kI$O*-Ly;!40;5sw#xSQh{+B*pe(F2W+awZe7i;_UcI*cl=xa#zb zpQW$Q`Pw*>uNUipg4gxaetM-PeN*_^$Soar#k@gOwI9C<3}GErpz>6o0Z$PNc#5Up zmb5yH`St=hz71t|x?K6&+8V4e!9#p==hJG*;R;;T@x_Z z6rKF(IM@ax^~<+eAO0Z)tw@oev`$aGQ*8?&9)8|D5%=BB8(0#e zm0toYr`VEjeI1^_QVnzjLB?%?1!|>_*50L2xM<&;cHwK=rTt=Z4YPhZMGFHqQ_6OD zq+yQN4(-xUlhGF0#c=!XtYLX^C+imhz}7YSrN~*^Fr0{Mg5(obf5bTQar6zGh?Ew= z7du_60+1LPKpt_lydpssY=~CcI!_@(73ufJ%8|lb5OdOjLv5Jz4ge0$y;V%)YnRJe zGg}XS5jNt(Yyzv~$U(^Rr6q(4EYGs(aD2O~^=i`->Sr^jjw1wAUAS%8*|K!IGaRIG z91SuL0;`CJ0p@8KR;zIZBm8x^GM2BGD+VdMnvflmkL~;)LKUuQ{KO}K+z<&3dOSIF zGUBGXh^rgOcw+-vCt+1`EM?MS1&X#7onW|t56FVYG9a_R_Bcd8TfG*G?|S z;kWfq}`1nJEL z!<56PZ4lP9`R<>2k%!Rr6`FcwD~ z4n%gGW=r`)G9mhHdOs>S{X2o;*i}y;6<{>(%YQeGQp+FmJhQ#tG#%Z38mq$>-|=93 zvNSQK{!U?PaYTCVLV5f5&ooR23YfsG4!>YA9N)9nt6jVuKFcPv}ym?aPwRHf##RA8q~qc)+_22Q+0rglbNy<+8- zzTIEikodyxvBGN?2pVYS^;m7`g*`O9tU-rO?A819?EyheCdBkJaNN26e6BsKja92G zk6){OSJ&Y&)8*?!esCiSVi0Nl`GfZ$6#=i;(;`m+$M=*R;I%oNp7O>bwG+qSzK8(i z(xy96)%|-w=U-(=?y=x;q;Y)LEQpqfUy8!a^BK%FFE@BMYD@7Bkm;lK?M(3;nQTrq z!>RV6xr^;Zi>68uOmO{53cr^@v8yfrb}&>lg8~gTZ!GY^Jix3JOJ2Ss`!mHA@&QP3 zg%rmX55DyiP}g)?VF45kx#N`%Qp=YGcp4YdBCST5i3)z;JRbwr+gPH}Fe$r!I%I>+ z?aM-RU(CIj00G&RZT&@@y?uBR8KJdFOT3KJfIU&Ji3iWcK8=8#VMd1febOwm?@4W{ z4DhUBxbz83%>Z^J=zsnV;nc-r0}qCNoKzi=SwEDrTascSZ?IK-!sF%U@^69TtJ8v6 zE!NcvI>f}f?EBgFj17xP8Vlx1M_Z4t^t0EOe_ejJW`s=qaJl47Ft}^*PD*l5Rw8`-dhEn0b5Ll9Kg##j>sm4sg`Dz+8V* zuF2hnOj}fHz|>3LGh~_2h-uiq&aCVmVjunHRO4Z>NG++f5RzU_`O6?;fumvNiTAgd zHho-ij>9cO@i^X>NJ5X@Jl`LAdbo&MOIL|iii|$B%rSnPHW%wuOjC`9Waaz`*qCQN zW?5FSQjrYW7YW?Ar+5O^`VkEC4z_Ks7aQ1yW9oN>a1?@5LGdV%DJp?v@cNN|I$Q5D z)0mL3EgF8UT-@Zt^%hZmts8r)^+$lV@~mpVkXHTs-t9_fbo*ksK%y$%Cpc)H)$x!q)|J74e$*V%NMv&*sstq&E^oO&Gb}Yj1plv_<(&GoDxRTh3 za2^7CoFi@*%3w1ziTWisTiF4iz}cn+Dle`X?oke^bf5K0ATR^Us6pVW3)j*;;dJ@m zqwL*L%_vgbhfA*M6M>UOpRre`>m^laB&n8?wQsN|clDeQC#gbRxqrrNvcMIKv&Q0yaDR58~B&FFRLh!us+MSMPo0~nvXI6l|E5*m$czT-Z zbU(OkS36a6iD-SY&(|lmQMBYmX%lf>5+9u-+Ht4qQcOW5mLGhK9#4UDXyL3vBzln+ zNW^Ss^b(8#`n5F3_ehE=m6)xy3`Tnci{%M^Yp)6=HjB23A15i9uSBYkiVL*^MS|WZTFn0tofmRG^(!RWAqN=H44Tl8c3 z%i7z$u`Ep~hrTDLLuqD9OSYMzml%?{cx91k1O`iRGG6bCJqu|0R}!JyioNfn?sh+<+NWX&jPQ6U70dG> ztIu%lC3x12vSJ%Gw1l6fj7CGxEgH=Uz8A+X>8aB|*OJ#QjLRLv3U6Kbu0F0e5@0dS z%|pU}MoHCmp4W@+(Fj3a&`Jn>HNl!M+D7^Uh@R{wc?gKgq@>EX6DyV)-9*Vx3b&@e z&KGY*Sn>emv10c=PW=ws9ut5ZWtPFky*uE=dsU~X?p#!KBOT;tceD+r@Ta+f%VSW& z3SC0#V{XX?U<%eG+0Bz|+=Yho)Jn%iC!ENy*MAkiJ$njpewFCSqy=EQP;6k<53inb z#Ok1zwG`VaUuD+;TrkZUHBW7V)n0b$Y^(tNwH6i$Xk1cYXAYZYzh6})! z#@Jq2_;#IAT=v_`hGb(gyUu>9i!9+8tN}#+5M_kQ{pWMIFY&4(sC*xPA$uOHFV-@` zf31^MJY32`;2`Zx*akuOYL+&(bZe;N86FXTN!!ZD@Iih$spV8DloR<(B*#hy0UBiR z^ARzW;2eBF5{o)22q&M&Y5?d8RbT=zO}SU-yPcOXne?5W`6Ox9S}ShmKz>`{X+_Rh zzsOE2dPP>}JmMAt;}p-!6NcP)(SaLy^TZmc=O&~9v4(=l=R-Rshs zRc&Gk@i;SPE7+lX(R!Pi0$5&IX1jav?J54Th zUaB&ENe@#wR9IMz7e0;rIuGNp3cb~a?^XOv7^>*$|;Gv`M&T&C`(qI*J>$phI)RjX7Qv0TeCn z`_sL$UC_#x13>lh_8T4Y?np&sOydpW0oH{D8F|M=xXY5y__8T!zjfz^*u}l~7H`Yz zaJeI<&flW>D_qD^Jf(?5v0pKdw7ZLr#vF4jKCLVe9OfP$stecmaLV)Gozbv6^wPUN zdL@7IbXe1T5GI?XR{Nn>@w*g5e7&9%3TT8*VyWIyBc`b)kKczweH3LcCyzF| zYx8ukQL$x#0@jt)UZh*Oqb2ZTcFWWW;lb7m>;PL`*hu*rNPKrcARNQ1;C`~`QBzG1 z@3VZS$l2+5i`3RavBTJx5V{&5$z$m0e}c|9CNChbJXwHzy%|xy^~sY#ZNCwVz}2 zpR8XuISfT*g1EXJBqn`RCcR(;yOU(6HMp z@QU^gAb{-+=r>EC;miId|11I!E}M}5Rcjbm4q@QMp8)kw-p4b9oCx5VseF_5#^1t{ z!H4CWy@1@En9hGV-56$oBU1Wscvi9ED}@c~wNfz=-X9wu8-)?Z#fcX|9@|auxE~_{ zoHBLiYPWD}%|1V0>jg?e1c2v2Y;XI^E(ZhyYiF&!^C#1j4)ja88UmA-kyfl-cYn%X z{55M4{GPxMgThrg1p$_4)x*x##-2^?+soM^hXBG;xvz}`G-6&EP%ofv=lYl1$1{Mv) z`Y+0h7ErcAgiQ|{CICoi<9w|+V8jcsEMnUHEAaczd0Ksc+##F1(farh{giV9G)G`$OBi?A7J|%zHko z*(@Jyu8Qw(sZtWA&z`gebs;wK0O2emTk`E$5_iX+BH8>Z7yundMOC-UIITS+q$p~g z`4=oH2blXWp}>DW8*s5o_Tylfpu%Gqa+22dBp9kLoWcL_GH08_uadHRfck&VI6vFd zt=Xn@HaAiMxsjsi9DCr_RG!?4e{S~waclD9;US*W?#ooW^ll8`n+pG*nIec1nch`# z(LAhODgR><`JJC`?L4KMw*fpgKo0zH)&WcU`73wo-`x5Q@$s$hW6#jSBe^ZPEHFqt zjxS)4)}uR6WCre~^WsCV|60g@Ie4ij2S4E6JE;X^FiTjmNtP^$Nx!aG|M~r&dcuEz zH*pd#p2r6Y2vw25Tew^_=4^7Wd;Vux89uSq8F$wx)2Ib3pa192yqY9{{o+==si?t_=Vxj$OX8^Z?r6Y<{p(==U)OrA06*&y+?nnWsE89| zsN4rj+D#qP`M-4I|8)rd*L9ELQ;}AFA=idqE+geez*zD#fP#H$V*WR;_ph(|uh+{I zz>C~|j!@=O#7uJv3;?iI{yEh%74K3zy0*$ezJ;gg$;^2YQQXqeQHJkWd9j# z^8RPvf&Y6FZ$7V$q{{F`|Ge;31l7sEe0Dg1Xa{C6?@cQO3eO(6W&O*|bT{(ENl;~??h z#qi(7@Xr(Ve;32wE(Yc@!N-|;v6`cKvPS4#yj!AS*q^BEr`TT@kJ1lu6Uw9_`p^Cp z{|b@*<=X8j@NuRB%5SK83!9r{o3v*7GSXyOK5Fjl2m*V&>fA3?1ZPI+g?1K<3Y9 zCl39yZJU`?_8)Q@9sb{Fc2pJsUOT2~{ZxQ7ondu9EGY}M<6JtI5j5?Q`8~@3%%7vM zPw|g&Mx|;>S1_#rkl3Tmk<79c<>RNY#|on*Xs%q`{)Y$3*dQ!F33R%EeMvl0b%hwx zT(p9i3MGZA@85;9q{&FBZd;BtAGZ?c22vdk>!E2LM+5T?ro3nF_X`{jo7}_PN2Wt} z8`q0l0?(emLgWAU59YjQYY(`UO9mH(2(X>z!#Sr7uKYP~hE~E4cx?w(-cX_Z@jI^& zD!EU(VIgiSTC6YNiN8Mk+mD?OKkFczZMRh#-U7UPYJ_OzzcXL?7-SRGAwKJ75jECt%1k07X2(Z`1LT>!OME!vqhJu%={}_c)-LHCbH_+#*|KUyG zi6hEi;XsGg?lJdNC4s7S4@$qO?w6!~di1F>j6Gy(K_X9M*<<_Sl@GI4yj|OW9uwN9 zF>(1iTu6blUWu~t93789f{~K##;fR$=@5rJ_ZHY$g425bH!s7#3sXbHO&UCD9k=S{ zAmL+A_Q7M4wtyi-mK4ng=+~JNtC&A5zB!Qi!6I&e$Iwo*Yhq7y~Lk_XmFz0ycA+2)^|7zSyzIq(`8uoO-oM>K#!2qR=R+T%gvH zlHxGL5f&p&@-&biyf7$a`hwEIkpx^Wk{#~Yl7Xut?^EMQ!qAcX&=!7)kp9gG3Zq?l z4vM<1MsG}VaVSx4cUaSXa3FsSMNi?lElc5c=rS*|CLy5=?wI02<-Ja_TqsxFohtnR znq@z8(qvIs0|s8a8S{1u7^llyN)gqbm!u+ErKwVkJ*=}IkO*0wvpg#;{p^Nb@^JPl z$Fqx{-hElRyXz-Ao%b!6+!4BgMmAti{m`lO0hZ|}I>yV~g40e_$zp?iS+LCM#-L&I zkT@4GZwfYcCI3EeUmIV*g{Q~xxg4-l7s!2VUGH@+ZN$tgKM%73ljAuP!BZLkl7780 ziX{0B|EwdJgXS@23;W)Zbwi8QVIZH!rbef7E#+s3+ft7|Qmbs$&y<M*YuyGn!8{j|lr3k98=a zzQb~2LRE_z>T>j@Wt{?8Da+r#rseMEv84+3?a!5DYdLJ>l5{ioA$ben=H}PQ{QF-2 zN#MosF#X{Sd@DJ5FwY<+lY&_ALA9n>q2SANGo7^;^;v>D5m1Ab&g1YF#r^;*#QK;( z7cIKjAWV3UO@HiHK23X_Q;XUk(!uwNF#W3s+=d25}`v`Q8?_UXZ z55|m{7gV5>lt!6j4$JoD!rW+e-M?J84`WZ$i&)Fq(IiFRcAP5jmvXroE=)b zG%B^Lt;Nz&11*_x*yxTe3YoElh3>`b&!JmjKLEuzeYG^;Dte361ayT4C4@aE1+MZ- z5Cu+*lFbR>zwfkVT`!QBY)^DLef-hm47&1rJRLcO8}?@5Qxg{mRwh)nG(NuddZMAU z!tbs*rX8!nG&h73DikniS^-dV|rx4{5Lz#m*T;y4gF%Qo9WgXm`5?AP=53|Xxe}#ab@4!Kz|7t-3lUu-)C${9i{rBBMoDGk!((kvxYutj* z<;1BRUu=q;G*gghq)I|kTN4B8Gv5%VMjfvg;nIw5#VD@(yY(?>K>df538ZSg?x%ss zY5%kU(0IdP=<}&}I6e>kqvZmbo5NO&LMI}*8(6|yz~hoAs)XzEGeY$%y_FYkQBAP- zCg!Hd5@tNTI^wY0UUrYj(`HPby@30yb5L+F<0e+f-n=s%eFKyX^6UfLm70TTDh`MB z2|3?)s87>x1pR*;3>h>m{lu zM)KMC8_t;uG9J)(V7ByzheqqRz5tEn#NUvJ4AO_^b$@^ z-&Ds;FN2#0YX!mImbfn2FL-Kf9-q%tdzAeS1Nv)9>_l}&A7FUk${glTwl{s_@qprj zqF60ds1zG=)<18i$?S6Fwc=^k97U{(1moP}4O%Lk@v2i|=!R;hl^QnA<%m?~ZRYyj zNfpYT2R1_Yqf^b*nGYiQbaklIvl7;OQ)zNSzUbskDmKoK=S3@b&exJ_-d?7zx3Kt+ z^E4|iXmXBcrE}ffrX@K~?@5_2-KFh4TKC0JH7p%}-X;9xaanvqWV*7kyyJl@@T z_dd%H33u4>7V=}JUwStwx)FO|nDYcQWxTUD3XKOlZ}dd+NP`3!d-e&yf8$Nt&|L4< zj*M1_lHYu+2}*+bu6%%~kSi>(wv?_?v=L?U@I&Q6j>PAmEUt!t+aT0$ z`z&~Uh{XL{rsD3>;=_FP(v>a>>w_J*tx2K$%fm70MqN_#m*Ew|u9LuENTkiAP4!T3 zahJGG>#fF`6V`>zx6ae9(C}^BvBme@C1>ZY&*KJwhI_qvAb+EdG@pvKWqHGIBs_TX zxdt#f{6m&194lO6GHFrw<~yto{iU<=l&a2a8`e&Pt=0?gZr_s1oG@ z9x@17Z^Q;ao!!>(m~ZA)DhMQM$$d)yk}ZzcmLX1kh%X74&?fH{hJmOFh&7weB1qD( z{vl}O$RE7+t9R^l^H#UFB7LfF<-HxW;riO%9MBs+D2+Xnc*};W&KHdYd!Pb6?`PqS zX5C}&r_x-O4QHP$RgmGVH6yKe=vpXi7#WVgBQ0xb9HD$Hz5&m&H-AW4tSF4-&;b>S z^?Xv5*ej3U>jrh*-%l6qOpyZzG}9xAL2hC#eQCSQ0tDFmO0(dmn@!8>hpj7CtHB`2 zSW5a58?!ub`qzRFsH2{bgX%~9AufC$by}FrLeO)rfo3gkRySM~CJXLoAJ$=utd}U*4k6WG@$gy6} zPAyxj&Y`t~Vi=&9Ct=kc6GEm9?&gxp>2|7P5MofGM&Mgk?f`|47&6>SfdOL zvV^;!^zkCav76#W^^-LQX6yDMs$C52$>J$pWGb=Nk^9@3ESnJHyn#gbeG26QB?0$E zm)exF7qXwN3NAd2roX5^PAwrIM;8{|HoNq`mM)XB?Hg`=ps(EWG@=tR;Uj@8HreMQ zLKp1Esuh0lw?78drYA>%2ud5vj`;W9a}K; zHRHCpfa;Gr$l`QgKsQTfhH`(uW_pYpZ?PRh%ea z>9=d`5{0;5(+H+{*GV50`a^kG&BAUrPP0k6J9OtAEDY-pPed)hhb?e@L7+cgd;v-vqNH)Bc*n9-Lv9n$X(~gV5;XxQSE7r9kRb2(UZqxOs(bn;d7@A2c)54vc%g@*=bgTy3w6i03Mhx>BQ#PhQE2vUqhCFxJ8LkKk*XR-42{1k}o{?&8( zyB$L5`@8oGoHfxVQ#zR7Pakk%mIr^l< zJwJZ_&F;$MraJA~a6KX3s4+=^xEvfruC;4b+|uCo71BVIf*Cl!iFZr$U{Mb5(P75=QTou zE#rHcBwY`5gJscdwTnjkdwgkb;0n)rqr?;U@d&U&iNqbmF}aPna(EHEC6vf}3)-u^ zOm(iUj^WbijKAH|eH333`!**VSeLHG*wcG-%f>1+x0bETXo3*rivCDoIkD<)w#0VI z2Nu4;e{v%DLjNA^xT8AW$L8y6(tSiU(;DkDUXQfc`-YDMVRBupJsnKf6hv9l$aSG!cK7X(AzEJyv-kW$sa(f?e}U(Unm=KKmtq zq&JTVL5H;^aeRFEBfA?xh5K6L#OZEr(SYKc`vM^WhWSOc!P2*_Z{N0M2-o97-m|t5 zgV1GVTxG%9XSLhvE_vZQ7TQz#tVPOD5(dr6>+w=|ukk`H6>1$hiTl%Cfor!5*lWST zRYPl8?r|A84A&QfwG9zU_Gc=38!qs2OfLHD&qD3S^k;npZnU&( z)2@wAYM1;6>@z!rw_>U3(>+hBc?YL;+&Ask-VIKf-512q?VgMnl6d*llqBH^L@$`n zU7cGu1ojTzgd-sg)X8Vba*Mo|o z>6J^5;?mWw%-r73>N^&Wo#nOxm#sit z>H_WNLUg$bnFpJ#qi+Rsn8M8UazQR{UWWu9W+25dwJiQ6{{7W^1aDuni*c5fZDW`V=j{>n#8zT!PPzM8!kph_gVGQ-`J+9nVICqsQLG!={A2`(BJi58{Cjshou(t915=Od*!r;5N5E~7cTzk{w z04C9yn>Bam^8Q_2gP5G#jRHH2P!P{q6v|;@G7lQ7;V#m*`s*}Y z$-U3k)lJELU;E06CdDb7Aj;)~pYq~uQlLAetR-cfZ8ZdZVA2mU@qo=JIBL|{-Ct>w z?bEn;#Bd**TD+{m5^YUYQKWr5@25_@c<|gqOebXHFVs?Mb59*dY0JoQbVdCe%p1=i zU)vH<%>`8t9bJjz(6)}^rv4Z)UL#AF?bP3INAo^mYl2o=IL*Sz?^;0t19?<3wAo!1 z!!VAp)>|O`;UPRk<41eL(7LnZC-LELMyMOYh_Ga;VKv$#dsr6g<>=-n*$m^zV!y3d zyh^HG`RM3gHa6uw#3z-2?y2p=Z*(JS#$kQ(Ajj316}WuGm2dlqu=n3VXFb&~$B1C{ zlkpg$v7~p&mhV<-Th|kN?OI1Pv;G?{mpHkyGf2gpwvHrv#i zysE%{*qkpjerT^-9@$1P>R5!zsT|%c)4I=c zcod%&66%ch6jim|r*`H4B$}A#o%I^l>dG|we3yN^P}1M^{0+Z*#8QiuiqAS{%vj4o zNtB2mOgp;=V~?k-|La55w)l3x)%XPFB^JmxI3H2&n+&GC5Rh}U{Z=}Kp%}0E`0dZ1 z=#v@cZl&rf8jxM%@x}XNjBFg9=%MeK_c@LQZ&b>=Wm6*L4awD>V>cTO2M?p5CZ2Q? zB9HpahI3CZz>g;QZ9jM95eme8@w+XkcQ{-MEroHo_HqAVS&t?mMu~AdBPlUYari-H zc_od@I(ANDQIDYyo@(K-2c8E1ybf`E`)4@FW4At#Is@~O=uHRVPEp)Zfi+*}RsU!= z^+%N~*T`2#GqP1sQ&+uCu+CKr%2#f_9o98lgG%9@)*qn8Rk8Qm%j@>CmlmIkI!}p| zV30l?9Yo z%AAI7skzyVXOZ`u3?Y^pcnqEmVF13+ygMvQdDkS<`?lsAF7`oB!=DjQn-=rR; z%gxgA;%V_N$3LCrHk}tE9{bTz#i_^^*;ZrlYDz0u)j+KKCl5w99t0*cr*z(xq$$Ic zOl=MwSxgrEP~VJ@i@es+0MDi;)>hXE9Lf)?G)sd)-v;itS&Ft@@}(K$dd4L2YYs=o zK9#m2DeB-Dr)IkVHvcR%Ihi%qxkR&YDXhnYP~!LSOKReYQinSmPhpGX*`wP5=%#vG zMLP^q9}Z>bmSn>K!?A{RY2gixWHj4O08c^tbwp3 zqaY*DITq~fYUp*>yp`c3LC<>D(_~FoJQWDz(}y`kanbiS-e))dAg*|+5d7`o)TZFB zKJLut^e-)djls*Q-rWNa;}8u4NgK%FyiKgdVGKjk(llMk5RtvmJi|13ZOn9`l}FCj zfQSkDq%27KH3KDyzidiW*`!t6J@u8*lH;dsAL~J~e#m22vKpf}17Dsg45#gWPE)l( zD8Awv{-xC{&y+?bs+IEdkXt3jy?{bR8+Vlq8tNFf7veMzGx`GwMvs;cDKkbxAa-^C zr}&Ov4mtkYUvd#O5>|}c$w#XF!8V@7!4Y8S0&R6sTr@!=RC1|1|6O-!v95H({O|GU z@N<8jUuW~nVG6~z^E^aUIOm=M&0obTJz%O(X;z)8K>rxkz1lXCMl(+d)t@%^IvTqd9`!p zJL;%-yIb!XSS=z@M8;b`IKCdu*_AkK=Hgnip(DXEn<2S(YaWo^;tf|53B_X-rl)mj zxtJwH-UWi%OpT!zn-H#*{!6LktKxTeVYk7uSM`@uzhQk^G)_}Pz`XR=#isbb`)g9O zw*-*q;=oWJ?t(aku{rG$8Y!IjqlYUCD~4Y0Oq6+GDYi#iejNU9ZuZb5X!Uu82oB)2&@gD@D~<%I&_n zh;w%`*U0BwF~iJr2EHDx#H!wz?x)_J+?>K=f!!F0?BLwo9I7~iM4@MQ<0(&@9_(`I z)!o&v5E<5_WOs-6D+{~2&^paL_}wMt~fD% z2i5wQ;Pyo!f}MA`dXf&zhmxbC?jLa%w7do6ojLPK{ykNLtEE?_F|<9|dnTx1=YvSk zJ)a}fQ~pbb`+5iQ+VX;r#Af(tQNcb9k9`uI3TJ#XN@8@Q;!3xWr&REBYCeQK8A^ac zwKV}0#LWnvv~F|kBBc4ZFjv@CF6ZoKl=Cmkp=t zyqj;`Z)(lN8S+CBsXph%@3bU|YTJ#~Fk%tb*@kR_x+^>x7tRWDS8dnG&ACap*7LQr zR(!C}IP_k;E#tEdLj*(oy-5?_!3-}+>vtRcs{4}%)1}_xYr7(HDdn~d{2JW$C?r@8 zqjDwd6=Vw1M=VWTKD^-H}7&?TJ5vu@tTzF!441!OiYj6n{}I63j7W-d$jlg2~t zR!twU(0(NEWJnm!Rj2{L6v%=V7`MMuGoE#^Zq4^+%^t3N4+{YC&sA;2w*z9F8M*O` zK~+}sO@kWN+o#_ya&*(_C(YdBV!%SHCLey^b11qABVwx)iJMSVw`D}<%k+LFkyQu0 zm-+d{c5ctPC9CoTv*5}~f)PDgrwy0B{!ybi3qv9{tHqFKBHJ3zn(9;tsOnomt|) zv+N;4NjfB)}WU3?mdsS6C-AY>qQt)~-)xn#gE<&n|@q^QM_P3pwC0VJ6uztFV zv2Xm=J0~+Gsdgm7)41sdDTZQMOdqRDGgn~9HUc+ahfYO$3%Do#C{AQi-`Yz(#!Wmd zR8{9>D}HAmmX<5-U%*_Tt1(&0ejtBuuW|2Dp;KBiyw4ysl)AXWX_&|g8VS^kpr=T( zm5UG(n56_J5%;VmvOb+|N~GsZi1Tx#x7)@6Dt13ydKqI_?s~Y#c$Dr`L2m0g7T_v+ zw%Iq12Dua!a_kO!{EuQPa@SOi#OZO?m3XLHMv#x6^6~r>#u<`8$ij=0CP@;=V24KC zZV6)`-$0ijxz$OSqQerIwemu@lGS}D5Gv_jWdPY-8rwzDya)1`MJi>{4?=4`jFmbN zrr(kfvp&4jNDW>|o7zRkRL8nAHUN79DU=?ZQu zI!XWD-zIMBA+aNY0X^Ko1S{FDORr_G9Em9ETyYct``!NhjRfbk9)Y@>lgV=w#A)>FDM<{Y#?|nLV2w>$!QXqwHec5t^|@QL9U*c@5kRd6p;fm8S8{sIL68P%}B)xX@q)BQC^{{CvCyJifUNBLwpIq6&Y!4o#SAfR?=Nemi~qiH z`>oLU?)=nh(?#zek&oO6g989;w40IuGEsiAayL z?qW7jZzL0gBKO)CwV3%LER9Nh80W3oURK<7#qhhFc)VnHQ>`CV+&FJrLXy-M2^9I_ z4&cHQ7&b0BF>^Ju-%VQZaQ*ggeIPpn&k^H636T*<)hTA2=iy;@R-+N&V0hlzAYnUOjTZ+3N_$+f)*bY5Gc&|e;q+>4jVUad8sFt ztZ5U)Wn+V@%p~v{b|!wn&2!`>z-Rc9#QR3)$qt5yx|2sWxt$49)2~mHQ9t`#ZK%1I z0CJ8>Ql{w#x>6W5$0t3_`oK+%^Oah? zk*9#Um>9PO9cJFag@PK8qK;ne3>J?R^jlA@Cn^93-5z|sJ**c>TCxoVA{oG%i8FkV zl4R_m6=G=16H=FKz5SgeFz6}!IG$Naa(^pcp5=GoKh{(h|7J`wXvgZfqgj|C^9s;; z4M1ts)@Tg_WOH!Wno$?iXhAoqwI+s1OcyXfnkxS!?b@FQCuW>kYxDZ|-T6lxqvTvE zUCom$k*s=QT+WQ}7Ef5UXJdDYNz?{`;jm_CsRC`9kj%9P(Q@OQ|40hlhGl&(pL5XW(i%s^-Z|`?6~8|!>5`a?(Uw8? z|Ju9Gs3w=SYXMONQ4j@@CPt9nIe>HvMXK~JRp~tt2t`CdTIdImqSR2OOIMKIlwQL@ zYCu3rLJ8#?JZGKj70%1h5h#L92&Zi*4?|SR+kNN(o)S5%tMX1Cw z+GLcWW*ew0+;&?}rq~?gQcGANWgAtr)2&<_lr!jyty5v57m*`bVM{}$I-a@}vZA|N z>j=ar;)VUC{N<@>{zOhO*w^1Lwhd;gHe2Zd$>dMzD|Ev})>ZcT`Yt&dvFt3@TU&~WRlsY~`Z?}cMx8^kFB~-T}d)vJH#}>szVR2az^a5mB}~jH@QzG)7%ol5p!WN&JW$_ zZCrR3zw{}v;`^$s!v`mGg@rJM@t1G!n$*O-q<$uW6rW-^nxEol$SJD6J=p#uwoWp? z*1mClx{zxBssrn8BZFgXOA+y?3WC08yPMIWwMXc5=Zw0UuO0FOBW4`4<_m zC7Rk`PlSlh-sPPC{hIB&$;Qo2=HO)Lo+8^)KiwJ!!vxRLBfg++`o-O~d+Y7fW%hML zXz;&{1?p|WVtK`F0?@U&j$3nPT~^g&Zu41gLtAJwPH7E8lEWm;RFvmz5#>?Jp}N+V zH#i_b_^S91;W$38z`}_tIL}k1Dix1=%F7@#iQPS8a<%G)nI>l#t7MXN1>dl;ZIny{ zOG7`Ic8-`n*YZl3XK=JSpi-if?B<04m4X-7WCW-bG$bB%z;X8t!7Bp~vv(%#F-{hu zJ?V|whX+l*{h7f$Ejev|OJ-o{phoxP8ADxaC*twbAIw$F>{#Z%Me#s^O8}DSPQq!> z_D)%9y53<LL$}AMr3wa&W#BRkAeH0FhyXls#GHc5~S^nTo7b zY!0KjHC$|7938c5v-OZ3Ug?6k6~ZC6?;H5)vB52-LPMz=wDN0j^$BGOSWt1eLVNxF zYPXrrR^!Osjs%{GSQ62l4$V_?1UiQT+_apLI)st6DcI}Y6?T0KU5&pav2*#W!Lmb8 zw6GGeqncI^mP!d52lB4p%>*DqNw&l%d)yr>i(9sr>q5UD3f3?Pa9tUR9R=|goO~KT zpFEOxZ?x->!GPTdUw~j(qtM>9Myt{GEiF=g zeOFeJ>-KuPCmdirRu6QE%C=*>B~(D(PF{!PdW=iKi!OE(l81tqh%ENn9vG4A^H!&% z5mo2sPYVg;^e;Dc*BCD?QkVNmR9>LI&@(E6$)OP2W|)x+WZT7R#NCiI7QjfA9I4!%_ z3b)2F@H*$1&-@M~bR^VX{%IelO^xEBlm+7e;72`IORH0W&|v*F(l@={&veOO5^IpS zA6ku*@OVFse7u(qK-z#HEGACbm{GGhV1C9g$qSZcvduA*uLxXMPV;Hy@$!%`Yku+? zr}(5{r_bcS71R_v+qg1%oJpebK)Wt*4wWu(P4_EavF1#6=5LqMD87*7keP)P% z{^Nmvh#R%k15w6_gWa4}6@PJ>r9n9h)tVNM(H&&N#q(F#`C}y8;`xG{$7+im2Wikl z#mUa|!F63)uIm^!?72RUsu-12?BN zw}MKvbGKHnQUaDPN3+JN?|>a?S~GAmlX9i&(PY@x#Mj^N*rY`<>GugWqYXdBPOwIr z>j#`ip!ea{UwF>dZmQ25EX`9|?+{U#QF|Kq{EpCyb&{T&>aL9nEKn%#LVGAuJ++t0 zveg#Jt3MbmB#;#(SLW@X7D!3}BWFn{I#DYzUM75O)tEz}gCeaRu3d_mdRxZN zq#=2q*On=+D=nL3}h^UN{g3nvezn2B990e`ah9SvQr4=J%uP=S&Ca6sNc3Kg@ zN+Z2wmICgHt#$;hExn|bLRpSxSCpvn*xoEd1G|ksO|hBPXX~2njKyGxPiQt}fYZ>E zhNi7jC}8GiKs}Co{Y5T2Rd1iJt8Z(uf%CZeT(h~Fj&?lfT2vGwLxdso7)^(bZ|%lvGyD}w0}Mpn8Z4yBkz@dbkIh^DX+6{N^pPwNeP%e5CxRlS6b&mUp{@=Onj+t#@`m@&oU4 ztKIcqY@eCl`bLXox7TM{0v{nQQuKE$25LHQTF!nN-e+$zF~i%j{|yNyL4b*s?8f zMd_}oH!tQS;vfcR;B{&HB|UTqWGz$xsWrtD7JRpU=m+*B3+@A{uAVp&}Gc z?n4jn>`Z(T$oVv8kWkhhs)v)x&%uPm%Cz6YNQR=X`m1?AdEaZ>mINmV*_6G)!i2F< z=R9@S@BDPQbrrT%fJMDMf_8vnWiU@!pXQx_=fm47oYKi#v4m8_G`KSI3)!B^T1b0k zN~B6{iOC}#W$TeLomtN^-F;MbFViM!V6cUc*pdP_OWTU?yWytLXFM>MnH-G6Aq9Ht z*zkON>PW8FoT9lH>X1?SHVV)8koB0lReLMwidTXa9CjvH-{Q)vZ=7vekkA^n?W9U&qVCdo4mSY=D-AE(FDCl78gCgeq02_L#+ z!q79N`tB@FvI;u(^i_dubtNkJQuo8$hY9DNd$eFBNp_(t95iCHqZ9JCM+*jmdO6sOD4UBDXVi`(ep~`;eXW}lMCff`4oElzz zB$-r$Ju%fJual0G@|6-51JZPautpccc*jp9fUL8aUE<`W3uzFFsGgN7t(psdqL{Id zcqe(*;kfSEK?8=((z*surq6IN0eZfj`Gvnr$0u6HMXpXTXeMn3(i>$}QDhozZd;+t zO#Y~t(9aqOT=fd)-LyD0T-^4SEg|L1gSCR-^lZ8?)4S|7mxK43${mh{*WktL-(s`H zI_5Pf;Q1!$Y(#eGRiK!8;=zgQGn1efNb1Y-X#DlLaDU-)#3At~boO9ul7aa;uaM~V z%loz4LXm`HnA)niUByn6sSRj$12_4adYxxd48tedvvlRQUbRw-&SyN|4T2tRMd@@= zw-4{?6ot6&$4hWB-507ywgdh<%4DQX2KYI1pY|^}uPtm0H?gwLa;=-Y@zJ5w+2+z> zNrOtzCz>~g9Ye~OE#So^wKGl9nULSi3>=z7?UILrB?=xU+;*I8&TAL`8eXfCsgA)j zT{!K&NsRz33jW>IG>u<@0(0 z5gygv94bnl-g!!I($NzCBtcUYqrvm%G#lGO7yGu>URb=yx<)lVesX5C&k3^>Kn1|3+;t4ZJG zSR;#=S5L}HwCBZNCb`LW+ZlH`m<;3;+?&uTwN&LJ@!Q>4Sl}uLAjSTyxSpo@SKUkV%Jhz_Z;xm+{1UqHM!+DDl$(?V&x|k zF^dD-W-~qXOz^seyua*^yx4{V>72}(J0d&?eb{0Zt!Ei6KNcg>BkmWy5dp)>cYCMd zj8}WeFD1M0j8VnwB4gq$Ejn%j;W7;lPgZa<&RC7fU!N4!OIvPyT^Dz8zk;NH(*p1k zTK@hUE5`8I+#SC7S*TMPs&^v%Hb-y~(8+d0_+>kWtL_soar855l+-0=?*aPF$q%_* zyV#939lpY<&C1ii2CLd!?)R7E7kQ+{!gqS4kuRrJ@Ic=0x`X6%P?K^a#qR9U{o|~+ zw|<7Lzm;!0TXwG1S7R{z)tp(Ns|BDJ=geAJdsUgTG*Qp%zRsBd2mjZV zQLOCBa8Lv>L3CTPj=qJXnlzKN7Yfj%p}r5&7lS!W4nC7rwq${AOPNd1vuA^(Hpb1s zBl$^%P<85Qe)6^$#G0vWOS&_AMDBv8f=%yaiWV(fG)EmyUI7_b^)(?WudX$nFMU|e zInA(k3|oE^X^0TDpBm8PHb#+dKkYZ5PwwS#qMLug!VzPsIy`*C1Dbl6i#;k~`_&Wt zz>GYQiXNo_X5_^c*QGmj*BRy2e1I7_jvQp_2C0Ft%MyRgS!T7OccoDXH--D#NP-N^ z*K3fMj7f$Hxokoo3-#FSOPxnA%pkhYYW^3&LFCZqlfKkdSPHp-L&5T_;7z__1*3cD6mRTrugxBO z=GmBsq^T4GDqcmc^128vik%T@7op|PKbEoFnYe)JNMwoC*3a_Z@epmj&Yzg$=4m8` z=`qETT#tG=(|(Vd^(+TV-W8#iH^fERrj;e8`DcsYKOaO7Si%cd#%h}9b*M`|!Id@H zykh(K&@)Y-B!Rv;G#Me8eejYzgk3jUlj@LWb=TGF&S29qOa)h`GtJN%d|!%rYM6mk|zY9H`%8Ri>E)e>*s0{ho}92#T$ z>d*GR87dX9SW=!$I0tO@-y9aB+1N$c3vSO{?TAdd4yU_Ap;{?!<2IGFNcsx59Urpx zk+D5*3Ksab+kL_U_%3&AHd6|92V*S-MoFk}u!`bYK6ZrgqM8Dyd${OiV)8(1kU?IF zXlCrA1V@80qJsg6QpY*V? z0Rk?KgNJ&inaWM**t=Gb{s-M2Gy+sL>`L7z-U6NTIaV&*q3m${^0v&T@uEy*hcqoVJ4xEPxreK1&loAd zyZB+3aaAWvwdDqb|2CQvN1+IIa%!kPJ(!vpfuB4 zI631NTHNDP&HX(_i=Z?wRA2LEok^I{mCMBeK&I8P0AFA!n&Bzqy0?7#&FSCL*JdKV zqPK#4Gy8JKgh{BQYaUEVDmAXpMo2QBh`ybNBqF=anYH_2EX`x3+|)X69@=1VF~Xs~$e?zNvjrq%WuV z5Na**34d=x<~*ov8u5pIuaX5H{NvL2h724V6Uof!y}iXiW$Wexu_jp-V1JfX{LP6P zEGEw$8gl^b&+LazC!fLoo#*U1SEG?DN$)`c@}S zAweTiLIR?GCr(j5@&>m`58D>P`tf{?O3hW=^gs>Mxw&u6XU_-{EhyU`RvQ(><|Fzo z52Er$U0PPB7}Ip)*3&w+)6*ozgVHT#2x;`r^&gfB?_Z*$m`<)ugB)#B97YJ5*R??K_rbVnT^AsW}FqpoWeZy^Iq@Ii#$f@qX84cUu( z8zN2z6sqDKHWEU{*xmBln9+F3=+D~elXyKcbc&%s?WlILzJ zO1apF%mqONcbO-3w}w72FiuaSi`k|dlz;cZaAY=xD( zU&9P)OH1cSD{N>k2EI>gm;@4bG=s$eUA+X_TQU0k2cVhlY+@cp0Eb(YV6Pw=My(op zl-v2M_*?w`WiZhgu-aesc|N2JEhVVxQIZ6x7FO)g*W?ZrMrKZL#BDj->g6Ho|IBA; z#*-p)O8lky?x9w>OGyfP;-&xCYtf6pB1^)#f0`7({8O41Xx_ce;{~OpAdkA&yuSfo z*7c(`f{`I4PB*m?lyphs2>#LRWFuMS1I=KKz$|{s!V&7a1RQkF&*m^90G+ zWM`(%f4U^#hhaJ!1?~&*S+E(T0(z#iku3`V_;~`Qzpxe^Y4wjZ@Th`?%9X?F&C_@2 zJO*C#68yMC{m{%0(}zy!R4|SpyGqZN^#k2tU`-zIrj?`mUK|<2BMo|cM}kL%kuq9% zz8)?l-;M+M!w4S-@@T&Nm{P|x^5^yK@2Pq`BmdgMe$1C2vgvqf{X12D&Y|Ny^61|G zL*~#O?~y-4oPTXu$6)7Y)c9lO9D|*I&YX+KVCUab<;cEu40e9rsQ%u;j=|0`*f~B& z{%aTh`M2Yx^>}GLMy>yhJ&sZ9F={;~1pbCoKjW-pLg1JXIQ4JG4?|I)46w!@-rf42 zktevFHU+OOik&nI+oK5u*JM^q#oMHl63Gg{n1LGj&r9-O5XQ)DeB;E4Gy5`kB~;&Y zfm?V(mCsbt9p1p|$wTq+P=k^CpEMYHpux~p4j11Ca#8R|!b_mROg&`#ubl_)_YOQ- zN0t474VVnOcajL6cMC<${ha5Vdk$ **Scopes** page. + +

    diff --git a/src/components/templates/agent-connectors/_section-before-tool-list-hubspot-optional-scopes.mdx b/src/components/templates/agent-connectors/_section-before-tool-list-hubspot-optional-scopes.mdx new file mode 100644 index 000000000..0ae1af050 --- /dev/null +++ b/src/components/templates/agent-connectors/_section-before-tool-list-hubspot-optional-scopes.mdx @@ -0,0 +1,53 @@ +import { Aside } from '@astrojs/starlight/components' + +export const sectionTitle = 'Required and optional scopes' + +HubSpot's OAuth connection requires one scope and supports up to 23 optional scopes. Grant only the scopes your tools actually need — a smaller scope set means a simpler consent screen and a faster app review for public listings. + +### Required scope + +`oauth` — included automatically on every HubSpot connection. You do not need to add it manually. + +### Optional scopes + +Add scopes that match the tools you plan to call. Common choices: + +| Scope | Enables | +| --- | --- | +| `crm.objects.contacts.read` | Read contacts | +| `crm.objects.contacts.write` | Create and update contacts | +| `crm.objects.companies.read` | Read companies | +| `crm.objects.companies.write` | Create and update companies | +| `crm.objects.deals.read` | Read deals | +| `crm.objects.deals.write` | Create and update deals | +| `crm.objects.line_items.read` | Read line items | +| `crm.objects.line_items.write` | Create and update line items | +| `crm.objects.quotes.read` | Read quotes | +| `crm.lists.read` | Read contact lists | +| `crm.lists.write` | Create and manage contact lists | +| `tickets` | Read and write support tickets | +| `forms` | Read forms and form submissions | +| `automation` | Read and trigger workflows and engagements | +| `e-commerce` | Products and orders | + +See HubSpot's [scope reference](https://developers.hubspot.com/docs/api/working-with-oauth#scopes) for the full list. + +### Configure optional scopes in your HubSpot app + +In your HubSpot app, go to **Auth** > **Auth settings** > **Scopes**. You'll see three categories: **Required scopes** (always requested), **Conditionally required scopes**, and **Optional scopes** (requested only when the user's account has access to them). + +![HubSpot Scopes page showing Required, Conditionally required, and Optional scopes sections](@/assets/docs/agent-connectors/hubspot/optional-scopes.png) + +Click **Add new scope** and select the optional scopes your app needs. Optional scopes let users without access to a feature still install your app — HubSpot simply skips those scopes at consent time. + +### Enable the same optional scopes in Scalekit + +![Selecting optional scopes in Scalekit](@/assets/docs/agent-connectors/hubspot/add-scopes.gif) + +1. Open the connection in **AgentKit** > **Connections**. +2. In the **Permissions** field, enter the scopes you need, space-separated. Example for a read-only CRM flow: `crm.objects.contacts.read crm.objects.companies.read crm.objects.deals.read`. +3. Make sure the scope set here matches exactly what you've configured in your HubSpot app. A mismatch causes an `invalid_scope` error when the user authorizes. + + diff --git a/src/components/templates/agent-connectors/_setup-hubspot.mdx b/src/components/templates/agent-connectors/_setup-hubspot.mdx index 48a4c5317..010c0a008 100644 --- a/src/components/templates/agent-connectors/_setup-hubspot.mdx +++ b/src/components/templates/agent-connectors/_setup-hubspot.mdx @@ -9,13 +9,13 @@ Register your Scalekit environment with the HubSpot connector so Scalekit handle ![Copy redirect URI from Scalekit dashboard](@/assets/docs/agent-connectors/hubspot/use-own-credentials-redirect-uri.png) - - Log in to your [HubSpot developer dashboard](https://developers.hubspot.com/), click **Manage apps**, click **Create app**, and select **Public app**. Do not select **Private app**; Private Apps use static API tokens and do not support OAuth redirect flows, so they do not show the Redirect URL field Scalekit needs. If you already have a HubSpot Public App, open that app instead. + - Log in to your [HubSpot developer dashboard](https://developers.hubspot.com/), click **Manage apps**, click **Create app**, and select **Public app**. If you already have an existing HubSpot app, open that app instead — see the **Choosing a HubSpot app type** section above for guidance on Public, Private, and legacy apps. - Go to **Auth** > **Auth settings** > **Redirect URL**, paste the redirect URI from Scalekit, and click **Save**. ![Adding redirect URL to HubSpot](@/assets/docs/agent-connectors/hubspot/add-redirect-url.png) - - Under **Auth** > **Auth settings** > **Scopes**, select the required scopes for your application. The scopes you select here must match exactly what you configure in Scalekit. For a read-only CRM enrichment flow that looks up contacts, companies, and deals, use: + - Under **Auth** > **Auth settings** > **Scopes**, select the scopes your application needs. The scopes you select here must match exactly what you configure in Scalekit. For a read-only CRM enrichment flow, start with: ```text crm.objects.contacts.read @@ -23,6 +23,8 @@ Register your Scalekit environment with the HubSpot connector so Scalekit handle crm.objects.deals.read ``` + These assume a modern Public app with dotted scope names. For legacy apps or the full scope reference, see the **Required and optional scopes** section on this page. + 2. ### Get client credentials - In your HubSpot app, go to **Auth** > **Auth settings**. @@ -36,7 +38,7 @@ Register your Scalekit environment with the HubSpot connector so Scalekit handle - Enter your credentials: - **Client ID** (from your HubSpot app) - **Client Secret** (from your HubSpot app) - - **Permissions** (OAuth scope strings such as `crm.objects.contacts.read`, entered exactly as configured in the HubSpot app) + - **Permissions** (OAuth scope strings such as `crm.objects.contacts.read`, entered exactly as configured in the HubSpot app). For a full list of available scopes and guidance on optional scopes, see the **Required and optional scopes** section on this page. ![Add credentials in Scalekit dashboard](@/assets/docs/agent-connectors/hubspot/add-credentials.png) From 2e8abfb247f6d06cc70f2cea85fce3d3640edd89 Mon Sep 17 00:00:00 2001 From: Pranesh Date: Fri, 22 May 2026 19:06:07 +0530 Subject: [PATCH 05/10] chore(docs): sync MCP connectors from prod catalog and fix duplicate clickhouse template --- .../templates/agent-connectors/index.ts | 2 + .../docs/agentkit/connectors/firecrawlmcp.mdx | 72 + .../docs/agentkit/connectors/gustomcp.mdx | 68 + .../docs/agentkit/connectors/hubspot.mdx | 10 + .../docs/agentkit/connectors/jotformmcp.mdx | 72 + .../docs/agentkit/connectors/lucidmcp.mdx | 72 + .../docs/agentkit/connectors/makemcp.mdx | 72 + .../docs/agentkit/connectors/tavilymcp.mdx | 71 + src/data/agent-connectors/catalog.ts | 1028 ++++---- src/data/agent-connectors/firecrawlmcp.ts | 712 ++++++ src/data/agent-connectors/gustomcp.ts | 892 +++++++ src/data/agent-connectors/jotformmcp.ts | 138 ++ src/data/agent-connectors/lucidmcp.ts | 330 +++ src/data/agent-connectors/makemcp.ts | 2202 +++++++++++++++++ src/data/agent-connectors/tavilymcp.ts | 276 +++ 15 files changed, 5518 insertions(+), 499 deletions(-) create mode 100644 src/content/docs/agentkit/connectors/firecrawlmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/gustomcp.mdx create mode 100644 src/content/docs/agentkit/connectors/jotformmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/lucidmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/makemcp.mdx create mode 100644 src/content/docs/agentkit/connectors/tavilymcp.mdx create mode 100644 src/data/agent-connectors/firecrawlmcp.ts create mode 100644 src/data/agent-connectors/gustomcp.ts create mode 100644 src/data/agent-connectors/jotformmcp.ts create mode 100644 src/data/agent-connectors/lucidmcp.ts create mode 100644 src/data/agent-connectors/makemcp.ts create mode 100644 src/data/agent-connectors/tavilymcp.ts diff --git a/src/components/templates/agent-connectors/index.ts b/src/components/templates/agent-connectors/index.ts index 5bce5fd2e..793c466d3 100644 --- a/src/components/templates/agent-connectors/index.ts +++ b/src/components/templates/agent-connectors/index.ts @@ -73,6 +73,7 @@ export { default as SetupZendeskSection } from './_setup-zendesk.mdx' export { default as SetupZoomSection } from './_setup-zoom.mdx' export { default as ConnectedAccountBigqueryserviceaccountSection } from './_connected-account-bigqueryserviceaccount.mdx' export { default as SectionAfterAuthenticationGoogledwdAuth } from './_section-after-authentication-googledwd-auth.mdx' +export { default as SectionAfterAuthenticationHubspotAppTypes } from './_section-after-authentication-hubspot-app-types.mdx' export { default as SectionAfterSetupAdobemarketingagentmcpCommonWorkflows } from './_section-after-setup-adobemarketingagentmcp-common-workflows.mdx' export { default as SectionAfterSetupAirtableCommonWorkflows } from './_section-after-setup-airtable-common-workflows.mdx' export { default as SectionAfterSetupApifymcpCommonWorkflows } from './_section-after-setup-apifymcp-common-workflows.mdx' @@ -155,6 +156,7 @@ export { default as SectionAfterSetupZoomCommonWorkflows } from './_section-afte export { default as SectionAfterToolListSalesforceMetadataApiSoap } from './_section-after-tool-list-salesforce-metadata-api-soap.mdx' export { default as SectionBeforeToolListDatadogResourceIds } from './_section-before-tool-list-datadog-resource-ids.mdx' export { default as SectionBeforeToolListGoogledwdCommonWorkflows } from './_section-before-tool-list-googledwd-common-workflows.mdx' +export { default as SectionBeforeToolListHubspotOptionalScopes } from './_section-before-tool-list-hubspot-optional-scopes.mdx' export { default as SectionBeforeToolListHubspotResourceIds } from './_section-before-tool-list-hubspot-resource-ids.mdx' export { default as SectionBeforeToolListLinearResourceIds } from './_section-before-tool-list-linear-resource-ids.mdx' export { default as SectionBeforeToolListMondayResourceIds } from './_section-before-tool-list-monday-resource-ids.mdx' diff --git a/src/content/docs/agentkit/connectors/firecrawlmcp.mdx b/src/content/docs/agentkit/connectors/firecrawlmcp.mdx new file mode 100644 index 000000000..2bc406e35 --- /dev/null +++ b/src/content/docs/agentkit/connectors/firecrawlmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Firecrawl MCP connector' +tableOfContents: true +description: 'Connect to Firecrawl MCP. Scrape, crawl, search, extract structured data, and monitor websites using Firecrawl''s AI-powered web scraping API.' +sidebar: + label: 'Firecrawl MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/firecrawl.svg +connectorAuthType: Bearer Token +connectorCategories: [AI, Developer Tools, Search] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/firecrawlmcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericApikeySection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Search firecrawl** — Send structured feedback on a previous search result to help improve future results +- **Scrape firecrawl** — Scrape a single URL and return its content in one or more formats (markdown, JSON, screenshot, etc.) +- **Update firecrawl monitor** — Update monitor settings such as name, status, schedule, or scrape options +- **Run firecrawl monitor** — Trigger an immediate check for a monitor outside its normal schedule +- **List firecrawl monitor, firecrawl browser** — List all monitors configured for the authenticated account, with pagination +- **Get firecrawl monitor** — Retrieve the configuration and status of a single monitor by its ID + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/gustomcp.mdx b/src/content/docs/agentkit/connectors/gustomcp.mdx new file mode 100644 index 000000000..aaefca7b5 --- /dev/null +++ b/src/content/docs/agentkit/connectors/gustomcp.mdx @@ -0,0 +1,68 @@ +--- +title: 'Gusto MCP connector' +tableOfContents: true +description: 'Connect to Gusto MCP. Manage employees, contractors, payroll, departments, and company data from your AI workflows.' +sidebar: + label: 'Gusto MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/gusto.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Accounting & Finance, Productivity] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/gustomcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **List time records, payrolls, payroll blockers** — List time records for the company over a pay period +- **Get token info, time sheet, payroll** — Return information about the current API token, including granted scopes and accessible resources + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/hubspot.mdx b/src/content/docs/agentkit/connectors/hubspot.mdx index 4bd8f66c7..c19660d4e 100644 --- a/src/content/docs/agentkit/connectors/hubspot.mdx +++ b/src/content/docs/agentkit/connectors/hubspot.mdx @@ -25,7 +25,9 @@ import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' import { AgentKitCredentials } from '@components/templates' import { SetupHubspotSection } from '@components/templates' import { QuickstartHubspotSection } from '@components/templates' +import { SectionAfterAuthenticationHubspotAppTypes } from '@components/templates' import { SectionAfterSetupHubspotCommonWorkflows } from '@components/templates' +import { SectionBeforeToolListHubspotOptionalScopes } from '@components/templates' import { SectionBeforeToolListHubspotResourceIds } from '@components/templates' @@ -79,10 +81,18 @@ Connect this agent connector to let your agent: - **Log engagements** — record calls, meetings, notes, and emails against any CRM record - **Search, associate, and extend** — full-text search across all CRM objects, batch-manage associations, list owners, discover properties, and work with custom objects +## Choosing a HubSpot app type + + + ## Common workflows +## Required and optional scopes + + + ## Getting resource IDs diff --git a/src/content/docs/agentkit/connectors/jotformmcp.mdx b/src/content/docs/agentkit/connectors/jotformmcp.mdx new file mode 100644 index 000000000..f01cdaeaa --- /dev/null +++ b/src/content/docs/agentkit/connectors/jotformmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Jotform MCP connector' +tableOfContents: true +description: 'Connect to Jotform MCP. Create and edit forms, retrieve submissions, assign forms, and search assets from your AI workflows.' +sidebar: + label: 'Jotform MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/jotform.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Productivity, Automation] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/jotformmcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Search records** — Search Jotform assets by query with optional filters, ordering, and limit +- **Get submissions** — List submission IDs for a form with optional filters +- **Fetch records** — Fetch metadata and information for a Jotform form by its ID or URL +- **Form edit, assign** — Edit an existing form using a natural-language instruction +- **Create form** — Create a new Jotform form based on a natural-language description +- **Submissions analyze** — Perform AI-powered analysis on one or more forms' submissions using a natural-language query + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/lucidmcp.mdx b/src/content/docs/agentkit/connectors/lucidmcp.mdx new file mode 100644 index 000000000..8f82c74e9 --- /dev/null +++ b/src/content/docs/agentkit/connectors/lucidmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Lucid MCP connector' +tableOfContents: true +description: 'Connect to Lucid. Create and edit Lucidchart diagrams, Lucidspark boards, and Lucidscale visualizations from your AI workflows.' +sidebar: + label: 'Lucid MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/lucid.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Design, Productivity, Collaboration] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/lucidmcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Collaborators share document with** — Share a Lucid document with collaborators by granting them access via email +- **Search records** — Search for Lucid documents by keyword with optional filters for product type and date range +- **Fetch lucid** — Fetch the source image attached to a specific item in a Lucid document +- **Png lucid export document as** — Export a page of a Lucid document as a PNG image +- **Item lucid edit** — Edit an existing block or line in a Lucid document — update position, size, text, or style +- **Delete lucid** — Delete one or more blocks or lines from a Lucid document by item ID + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/makemcp.mdx b/src/content/docs/agentkit/connectors/makemcp.mdx new file mode 100644 index 000000000..263b55d7f --- /dev/null +++ b/src/content/docs/agentkit/connectors/makemcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Make MCP connector' +tableOfContents: true +description: 'Connect to Make (formerly Integromat). Build, run, and manage automation scenarios, data stores, webhooks, and connections across thousands of apps from...' +sidebar: + label: 'Make MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/make.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Automation, Productivity, Developer Tools] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/makemcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Schema validate scheduling, validate blueprint** — Validates the Scheduling of the Scenario against the Schema +- **Configuration validate module, validate hook, validate epoch** — This tool validates that parameters and mapper collection are correctly configured for a given module in a given app +- **Me users** — Get current user (users): Get details of the current user +- **Update tools, scenarios, organizations** — This tool updates an existing Tool's details based on provided parameters +- **Get tools, teams, scenarios** — Retrieves details of a specific Tool by its ID +- **Create tools, teams, scenarios** — This tool creates a new Tool in the system based on provided parameters + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/content/docs/agentkit/connectors/tavilymcp.mdx b/src/content/docs/agentkit/connectors/tavilymcp.mdx new file mode 100644 index 000000000..25534edb2 --- /dev/null +++ b/src/content/docs/agentkit/connectors/tavilymcp.mdx @@ -0,0 +1,71 @@ +--- +title: 'Tavily MCP connector' +tableOfContents: true +description: 'Connect to Tavily MCP. Search the web, crawl websites, extract content, map site structure, and run deep research using Tavily''s AI-powered search API.' +sidebar: + label: 'Tavily MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/tavily.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Search, AI, Developer Tools] +head: + - tag: style + content: | + .sl-markdown-content h2 { + font-size: var(--sl-text-xl); + } + .sl-markdown-content h3 { + font-size: var(--sl-text-lg); + } +--- + +import ToolList from '@/components/ToolList.astro' +import { tools } from '@/data/agent-connectors/tavilymcp' +import { Steps, Tabs, TabItem } from '@astrojs/starlight/components' +import { AgentKitCredentials } from '@components/templates' +import { QuickstartGenericOauthSection } from '@components/templates' + + + +1. ### Install the SDK + + + + ```bash frame="terminal" + npm install @scalekit-sdk/node + ``` + + + ```bash frame="terminal" + pip install scalekit + ``` + + + + Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/) + +2. ### Set your credentials + + + +3. ### Authorize and make your first call + + + + + +## What you can do + +Connect this agent connector to let your agent: + +- **Search tavily** — Search the web for current information and return snippets with source URLs +- **Research tavily** — Run comprehensive multi-source research on a topic or question +- **Map tavily** — Map a website's URL structure starting from a base URL +- **Extract tavily** — Extract raw content from one or more URLs in markdown or plain text format +- **Crawl tavily** — Crawl a website from a starting URL and extract page content with configurable depth and breadth + +## Tool list + +Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first. + + diff --git a/src/data/agent-connectors/catalog.ts b/src/data/agent-connectors/catalog.ts index c74da4fa6..6871d3815 100644 --- a/src/data/agent-connectors/catalog.ts +++ b/src/data/agent-connectors/catalog.ts @@ -7,504 +7,534 @@ export interface ProviderMeta { } export const catalog: Record = { - 'adobemarketingagentmcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","Analytics","AI"], - }, - 'grainmcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/grain.svg", - authType: "OAuth 2.1/DCR", - categories: ["Transcription","Collaboration","AI"], - }, - 'leadiq': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/leadiq.svg", - authType: "API Key", - categories: ["CRM & Sales","Analytics"], - }, - 'adzvisermcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/adzviser.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","Analytics"], - }, - 'commonroommcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/commonroom.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","Analytics","CRM & Sales"], - }, - 'fellowaimcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/fellowai.svg", - authType: "OAuth 2.1/DCR", - categories: ["Productivity","Project Management"], - }, - 'supermetricsmcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/supermetrics.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","Analytics","CRM & Sales"], - }, - 'customeriomcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/customerio.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","Analytics","CRM & Sales"], - }, - 'zapiermcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/zapier.svg", - authType: "OAuth 2.1/DCR", - categories: ["Automation","Productivity","Developer Tools"], - }, - 'clickhouse': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickhouse.svg", - authType: "OAuth 2.1/DCR", - categories: ["Analytics","Developer Tools","Databases"], - }, - 'atlassianmcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/atlassian.svg", - authType: "OAuth 2.1/DCR", - categories: ["Project Management","Productivity","Collaboration"], - }, - 'ahrefsmcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/ahrefs.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","CRM & Sales"], - }, - 'clarifymcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clarify.svg", - authType: "OAuth 2.1/DCR", - categories: ["CRM & Sales","Productivity","Analytics"], - }, - 'bitlymcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitly.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","CRM & Sales"], - }, - 'klaviyomcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/klaviyo.svg", - authType: "OAuth 2.1/DCR", - categories: ["Marketing","CRM & Sales"], - }, - 'googledwd': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google.svg", - authType: "Service Account (DWD)", - categories: ["Productivity","Communication"], - }, - 'xero': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/xero.svg", - authType: "OAuth 2.0", - categories: ["Accounting & Finance"], - }, - 'mailchimp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/mailchimp.svg", - authType: "OAuth 2.0", - categories: ["Marketing","Automation","Analytics"], - }, - 'datadog': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/datadog.svg", - authType: "API Key", - categories: ["Developer Tools","Monitoring"], - }, - 'quickbooks': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/Quickbooks.svg", - authType: "OAuth 2.0", - categories: ["Accounting & Finance"], - }, - 'tableau': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/tableau.svg", - authType: "API Key", - categories: ["Analytics","Productivity"], - }, - 'heyreach': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/heyreach.svg", - authType: "API Key", - categories: ["CRM & Sales"], - }, - 'posthogmcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/posthog-1.svg", - authType: "OAuth 2.1/DCR", - categories: ["Analytics"], - }, - 'box': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/box.svg", - authType: "OAuth 2.0", - categories: ["Productivity","Files & Documents"], - }, - 'bigqueryserviceaccount': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg", - authType: "Service Account", - categories: ["Analytics","Databases"], - }, - 'close': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/close.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales","Communication"], - }, - 'miro': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/Miro.svg", - authType: "OAuth 2.0", - categories: ["Productivity","Collaboration","Design"], - }, - 'bitbucket': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitbucket.svg", - authType: "OAuth 2.0", - categories: ["Developer Tools","Collaboration"], - }, - 'dynamo': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/dynamo.svg", - authType: "Bearer Token", - categories: ["Accounting & Finance","CRM & Sales","Databases"], - }, - 'databricksworkspace': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/databricks-1.svg", - authType: "Service Principal (OAuth 2.0)", - categories: ["Analytics","Automation","Databases"], - }, - 'diarize': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/diarize.svg", - authType: "Bearer Token", - categories: ["Transcription","Media","Productivity","Analytics"], - }, - 'parallelaitaskmcp': { - iconUrl: "https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/parallel-ai.svg", - authType: "Bearer Token", - categories: ["Productivity","AI","Developer Tools"], - }, - 'calendly': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/calendly.svg", - authType: "OAuth 2.0", - categories: ["Productivity","Calendar"], - }, - 'apifymcp': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/apify.svg", - authType: "Bearer Token", - categories: ["AI","Automation","Developer Tools"], - }, - 'evertrace': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/evertrace.png", - authType: "Bearer Token", - categories: ["CRM & Sales"], - }, - 'figma': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/figma.svg", - authType: "OAuth 2.0", - categories: ["Design","Collaboration"], - }, - 'jiminny': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/jiminny.svg", - authType: "Bearer Token", - categories: ["CRM & Sales","AI","Automation","Transcription"], - }, - 'pagerduty': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/pagerduty.svg", - authType: "OAuth 2.0", - categories: ["Developer Tools","Monitoring"], - }, - 'vercel': { - iconUrl: "https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/vercel.svg", - authType: "OAuth 2.0", - categories: ["Developer Tools"], - }, - 'gitlab': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/gitlab.svg", - authType: "OAuth 2.0", - categories: ["Developer Tools","Collaboration"], - }, - 'pipedrive': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/pipedrive.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'linkedin': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'outreach': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/outreach.png", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'granolamcp': { - iconUrl: "https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/granola.svg", - authType: "OAuth 2.1/DCR", - categories: ["AI","Automation","Communication","Transcription"], - }, - 'twitter': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/X.svg", - authType: "Bearer Token", - categories: ["Communication","Marketing"], - }, - 'discord': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg", - authType: "OAuth 2.0", - categories: ["Communication","Collaboration"], - }, - 'phantombuster': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/phantombuster.svg", - authType: "API Key", - categories: ["AI","Automation"], - }, - 'affinity': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/affinity.svg", - authType: "Bearer Token", - categories: ["CRM & Sales"], - }, - 'supadata': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/supadata.svg", - authType: "API Key", - categories: ["Analytics","Search"], - }, - 'granola': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/granola.svg", - authType: "Bearer Token", - categories: ["AI","Automation","Communication","Transcription"], - }, - 'brave': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/brave.svg", - authType: "API Key", - categories: ["Analytics","Search"], - }, - 'harvestapi': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/harvestapi.svg", - authType: "API Key", - categories: ["Marketing","Analytics"], - }, - 'exa': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/exa.svg", - authType: "API Key", - categories: ["Analytics","AI","Automation","Search"], - }, - 'snowflakekeyauth': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg", - authType: "Bearer Token", - categories: ["Analytics","Databases"], - }, - 'attio': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/attio.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'apollo': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/apollo.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'vimeo': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/vimeo.svg", - authType: "OAuth 2.0", - categories: ["Media"], - }, - 'youtube': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/youtube.svg", - authType: "OAuth 2.0", - categories: ["Media","Marketing"], - }, - 'googleslides': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_slides.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'attention': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/attention.svg", - authType: "API Key", - categories: ["AI","Automation","CRM & Sales"], - }, - 'clari_copilot': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clari.svg", - authType: "API Key", - categories: ["CRM & Sales","AI","Automation","Transcription"], - }, - 'chorus': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/chorus.svg", - authType: "Basic Auth", - categories: ["CRM & Sales","AI","Automation","Transcription"], - }, - 'google_ads': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_ads.png", - authType: "OAuth 2.0", - categories: ["Marketing","CRM & Sales"], - }, - 'servicenow': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/servicenow.svg", - authType: "OAuth 2.0", - categories: ["Customer Support","Communication"], - }, - 'zendesk': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/zendesk.svg", - authType: "API KEY", - categories: ["Customer Support","Communication"], - }, - 'googleforms': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_forms.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'microsoftword': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/word.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'microsoftexcel': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/excel.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents","Analytics"], - }, - 'onenote': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/onenote.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'snowflake': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg", - authType: "OAuth 2.0", - categories: ["Analytics","Databases"], - }, - 'onedrive': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/onedrive.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'bigquery': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg", - authType: "OAuth 2.0", - categories: ["Analytics","Databases"], - }, - 'airtable': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/airtable.svg", - authType: "OAuth 2.0", - categories: ["Project Management","Analytics"], - }, - 'clickup': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickup.svg", - authType: "OAuth 2.0", - categories: ["Project Management","Collaboration","Productivity"], - }, - 'fathom': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/fathom.svg", - authType: "API Key", - categories: ["AI","Automation","Communication","Transcription"], - }, - 'googlemeet': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_meet.svg", - authType: "OAuth 2.0", - categories: ["Communication","Calendar"], - }, - 'googlesheets': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_sheets.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents","Analytics"], - }, - 'intercom': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/intercom.svg", - authType: "OAuth 2.0", - categories: ["Customer Support","Communication"], - }, - 'monday': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/monday.svg", - authType: "OAuth 2.0", - categories: ["Project Management","Collaboration","Productivity"], - }, - 'sharepoint': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/sharepoint.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'outlook': { - iconUrl: "https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/outlook.svg", - authType: "OAuth 2.0", - categories: ["Communication","Calendar"], - }, - 'confluence': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/confluence.svg", - authType: "OAuth 2.0", - categories: ["Project Management","Files & Documents","Collaboration"], - }, - 'gong': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/gong.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales","AI","Automation","Transcription"], - }, - 'slack': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/slack.svg", - authType: "OAuth 2.0", - categories: ["Communication","Collaboration"], - }, - 'hubspot': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/hub_spot.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'salesforce': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/sales_force.svg", - authType: "OAuth 2.0", - categories: ["CRM & Sales"], - }, - 'googledocs': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_docs.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'googledrive': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_drive.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'microsoftteams': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/microsoft-teams.svg", - authType: "OAuth 2.0", - categories: ["Communication","Collaboration"], - }, - 'zoom': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/zoom.svg", - authType: "OAuth 2.0", - categories: ["Communication","Calendar"], - }, - 'linear': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/linear.svg", - authType: "OAuth 2.0", - categories: ["Developer Tools","Project Management"], - }, - 'jira': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/jira.svg", - authType: "OAuth 2.0", - categories: ["Developer Tools","Project Management"], - }, - 'dropbox': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/drop_box.svg", - authType: "OAuth 2.0", - categories: ["Files & Documents"], - }, - 'asana': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/asana-n.svg", - authType: "OAuth 2.0", - categories: ["Project Management","Collaboration","Productivity"], - }, - 'trello': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/trello_n.svg", - authType: "OAuth 1.0a", - categories: ["Project Management","Collaboration","Productivity"], - }, - 'github': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/github.png", - authType: "OAuth 2.0", - categories: ["Developer Tools","Collaboration"], - }, - 'notion': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/notion.svg", - authType: "OAuth 2.0", - categories: ["Project Management","Files & Documents","Collaboration"], - }, - 'freshdesk': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/freshdesk.png", - authType: "Basic Auth", - categories: ["Customer Support","Communication"], - }, - 'googlecalendar': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_calendar.svg", - authType: "OAuth 2.0", - categories: ["Communication","Calendar"], - }, - 'gmail': { - iconUrl: "https://cdn.scalekit.com/sk-connect/assets/provider-icons/gmail.svg", - authType: "OAuth 2.0", - categories: ["Communication"], + makemcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/make.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Automation', 'Productivity', 'Developer Tools'], + }, + lucidmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/lucid.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Design', 'Productivity', 'Collaboration'], + }, + jotformmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/jotform.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Productivity', 'Automation'], + }, + gustomcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gusto.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Accounting & Finance', 'Productivity'], + }, + tavilymcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/tavily.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Search', 'AI', 'Developer Tools'], + }, + firecrawlmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/firecrawl.svg', + authType: 'Bearer Token', + categories: ['AI', 'Developer Tools', 'Search'], + }, + adobemarketingagentmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/adobe.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'Analytics', 'AI'], + }, + grainmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/grain.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Transcription', 'Collaboration', 'AI'], + }, + leadiq: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/leadiq.svg', + authType: 'API Key', + categories: ['CRM & Sales', 'Analytics'], + }, + adzvisermcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/adzviser.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'Analytics'], + }, + commonroommcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/commonroom.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'Analytics', 'CRM & Sales'], + }, + fellowaimcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fellowai.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Productivity', 'Project Management'], + }, + supermetricsmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/supermetrics.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'Analytics', 'CRM & Sales'], + }, + customeriomcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/customerio.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'Analytics', 'CRM & Sales'], + }, + zapiermcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zapier.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Automation', 'Productivity', 'Developer Tools'], + }, + clickhouse: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickhouse.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Analytics', 'Developer Tools', 'Databases'], + }, + atlassianmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/atlassian.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Project Management', 'Productivity', 'Collaboration'], + }, + ahrefsmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/ahrefs.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'CRM & Sales'], + }, + clarifymcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clarify.svg', + authType: 'OAuth 2.1/DCR', + categories: ['CRM & Sales', 'Productivity', 'Analytics'], + }, + bitlymcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitly.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'CRM & Sales'], + }, + klaviyomcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/klaviyo.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Marketing', 'CRM & Sales'], + }, + googledwd: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google.svg', + authType: 'Service Account (DWD)', + categories: ['Productivity', 'Communication'], + }, + xero: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/xero.svg', + authType: 'OAuth 2.0', + categories: ['Accounting & Finance'], + }, + mailchimp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mailchimp.svg', + authType: 'OAuth 2.0', + categories: ['Marketing', 'Automation', 'Analytics'], + }, + datadog: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/datadog.svg', + authType: 'API Key', + categories: ['Developer Tools', 'Monitoring'], + }, + quickbooks: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/Quickbooks.svg', + authType: 'OAuth 2.0', + categories: ['Accounting & Finance'], + }, + tableau: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/tableau.svg', + authType: 'API Key', + categories: ['Analytics', 'Productivity'], + }, + heyreach: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/heyreach.svg', + authType: 'API Key', + categories: ['CRM & Sales'], + }, + posthogmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/posthog-1.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Analytics'], + }, + box: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/box.svg', + authType: 'OAuth 2.0', + categories: ['Productivity', 'Files & Documents'], + }, + bigqueryserviceaccount: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg', + authType: 'Service Account', + categories: ['Analytics', 'Databases'], + }, + close: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/close.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales', 'Communication'], + }, + miro: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/Miro.svg', + authType: 'OAuth 2.0', + categories: ['Productivity', 'Collaboration', 'Design'], + }, + bitbucket: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bitbucket.svg', + authType: 'OAuth 2.0', + categories: ['Developer Tools', 'Collaboration'], + }, + dynamo: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/dynamo.svg', + authType: 'Bearer Token', + categories: ['Accounting & Finance', 'CRM & Sales', 'Databases'], + }, + databricksworkspace: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/databricks-1.svg', + authType: 'Service Principal (OAuth 2.0)', + categories: ['Analytics', 'Automation', 'Databases'], + }, + diarize: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/diarize.svg', + authType: 'Bearer Token', + categories: ['Transcription', 'Media', 'Productivity', 'Analytics'], + }, + parallelaitaskmcp: { + iconUrl: 'https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/parallel-ai.svg', + authType: 'Bearer Token', + categories: ['Productivity', 'AI', 'Developer Tools'], + }, + calendly: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/calendly.svg', + authType: 'OAuth 2.0', + categories: ['Productivity', 'Calendar'], + }, + apifymcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/apify.svg', + authType: 'Bearer Token', + categories: ['AI', 'Automation', 'Developer Tools'], + }, + evertrace: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/evertrace.png', + authType: 'Bearer Token', + categories: ['CRM & Sales'], + }, + figma: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/figma.svg', + authType: 'OAuth 2.0', + categories: ['Design', 'Collaboration'], + }, + jiminny: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/jiminny.svg', + authType: 'Bearer Token', + categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], + }, + pagerduty: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/pagerduty.svg', + authType: 'OAuth 2.0', + categories: ['Developer Tools', 'Monitoring'], + }, + vercel: { + iconUrl: 'https://raw.githubusercontent.com/simple-icons/simple-icons/develop/icons/vercel.svg', + authType: 'OAuth 2.0', + categories: ['Developer Tools'], + }, + gitlab: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gitlab.svg', + authType: 'OAuth 2.0', + categories: ['Developer Tools', 'Collaboration'], + }, + pipedrive: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/pipedrive.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + linkedin: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + outreach: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/outreach.png', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + granolamcp: { + iconUrl: 'https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/granola.svg', + authType: 'OAuth 2.1/DCR', + categories: ['AI', 'Automation', 'Communication', 'Transcription'], + }, + twitter: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/X.svg', + authType: 'Bearer Token', + categories: ['Communication', 'Marketing'], + }, + discord: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/discord.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Collaboration'], + }, + phantombuster: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/phantombuster.svg', + authType: 'API Key', + categories: ['AI', 'Automation'], + }, + affinity: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/affinity.svg', + authType: 'Bearer Token', + categories: ['CRM & Sales'], + }, + supadata: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/supadata.svg', + authType: 'API Key', + categories: ['Analytics', 'Search'], + }, + granola: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/granola.svg', + authType: 'Bearer Token', + categories: ['AI', 'Automation', 'Communication', 'Transcription'], + }, + brave: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/brave.svg', + authType: 'API Key', + categories: ['Analytics', 'Search'], + }, + harvestapi: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/harvestapi.svg', + authType: 'API Key', + categories: ['Marketing', 'Analytics'], + }, + exa: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/exa.svg', + authType: 'API Key', + categories: ['Analytics', 'AI', 'Automation', 'Search'], + }, + snowflakekeyauth: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg', + authType: 'Bearer Token', + categories: ['Analytics', 'Databases'], + }, + attio: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/attio.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + apollo: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/apollo.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + vimeo: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/vimeo.svg', + authType: 'OAuth 2.0', + categories: ['Media'], + }, + youtube: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/youtube.svg', + authType: 'OAuth 2.0', + categories: ['Media', 'Marketing'], + }, + googleslides: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_slides.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + attention: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/attention.svg', + authType: 'API Key', + categories: ['AI', 'Automation', 'CRM & Sales'], + }, + clari_copilot: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clari.svg', + authType: 'API Key', + categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], + }, + chorus: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/chorus.svg', + authType: 'Basic Auth', + categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], + }, + google_ads: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_ads.png', + authType: 'OAuth 2.0', + categories: ['Marketing', 'CRM & Sales'], + }, + servicenow: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/servicenow.svg', + authType: 'OAuth 2.0', + categories: ['Customer Support', 'Communication'], + }, + zendesk: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zendesk.svg', + authType: 'API KEY', + categories: ['Customer Support', 'Communication'], + }, + googleforms: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_forms.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + microsoftword: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/word.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + microsoftexcel: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/excel.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents', 'Analytics'], + }, + onenote: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/onenote.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + snowflake: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/snowflake.svg', + authType: 'OAuth 2.0', + categories: ['Analytics', 'Databases'], + }, + onedrive: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/onedrive.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + bigquery: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/bigquery.svg', + authType: 'OAuth 2.0', + categories: ['Analytics', 'Databases'], + }, + airtable: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/airtable.svg', + authType: 'OAuth 2.0', + categories: ['Project Management', 'Analytics'], + }, + clickup: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/clickup.svg', + authType: 'OAuth 2.0', + categories: ['Project Management', 'Collaboration', 'Productivity'], + }, + fathom: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fathom.svg', + authType: 'API Key', + categories: ['AI', 'Automation', 'Communication', 'Transcription'], + }, + googlemeet: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_meet.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Calendar'], + }, + googlesheets: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_sheets.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents', 'Analytics'], + }, + intercom: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/intercom.svg', + authType: 'OAuth 2.0', + categories: ['Customer Support', 'Communication'], + }, + monday: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/monday.svg', + authType: 'OAuth 2.0', + categories: ['Project Management', 'Collaboration', 'Productivity'], + }, + sharepoint: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/sharepoint.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + outlook: { + iconUrl: 'https://cdn.scalekit.cloud/sk-connect/assets/provider-icons/outlook.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Calendar'], + }, + confluence: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/confluence.svg', + authType: 'OAuth 2.0', + categories: ['Project Management', 'Files & Documents', 'Collaboration'], + }, + gong: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gong.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales', 'AI', 'Automation', 'Transcription'], + }, + slack: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/slack.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Collaboration'], + }, + hubspot: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/hub_spot.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + salesforce: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/sales_force.svg', + authType: 'OAuth 2.0', + categories: ['CRM & Sales'], + }, + googledocs: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_docs.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + googledrive: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_drive.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + microsoftteams: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/microsoft-teams.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Collaboration'], + }, + zoom: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zoom.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Calendar'], + }, + linear: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/linear.svg', + authType: 'OAuth 2.0', + categories: ['Developer Tools', 'Project Management'], + }, + jira: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/jira.svg', + authType: 'OAuth 2.0', + categories: ['Developer Tools', 'Project Management'], + }, + dropbox: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/drop_box.svg', + authType: 'OAuth 2.0', + categories: ['Files & Documents'], + }, + asana: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/asana-n.svg', + authType: 'OAuth 2.0', + categories: ['Project Management', 'Collaboration', 'Productivity'], + }, + trello: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/trello_n.svg', + authType: 'OAuth 1.0a', + categories: ['Project Management', 'Collaboration', 'Productivity'], + }, + github: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/github.png', + authType: 'OAuth 2.0', + categories: ['Developer Tools', 'Collaboration'], + }, + notion: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/notion.svg', + authType: 'OAuth 2.0', + categories: ['Project Management', 'Files & Documents', 'Collaboration'], + }, + freshdesk: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/freshdesk.png', + authType: 'Basic Auth', + categories: ['Customer Support', 'Communication'], + }, + googlecalendar: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/google_calendar.svg', + authType: 'OAuth 2.0', + categories: ['Communication', 'Calendar'], + }, + gmail: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/gmail.svg', + authType: 'OAuth 2.0', + categories: ['Communication'], }, } diff --git a/src/data/agent-connectors/firecrawlmcp.ts b/src/data/agent-connectors/firecrawlmcp.ts new file mode 100644 index 000000000..604f1bf60 --- /dev/null +++ b/src/data/agent-connectors/firecrawlmcp.ts @@ -0,0 +1,712 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'firecrawlmcp_firecrawl_agent', + description: `Start an autonomous AI research agent that browses the web to answer a prompt. Returns a job ID; poll with firecrawlmcp_firecrawl_agent_status for results.`, + params: [ + { + name: 'prompt', + type: 'string', + required: true, + description: `Natural-language instruction to guide extraction or crawling.`, + }, + { + name: 'schema', + type: 'object', + required: false, + description: `JSON Schema defining the structure of data to extract.`, + }, + { + name: 'urls', + type: 'array', + required: false, + description: `List of URLs to extract structured data from.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_agent_status', + description: `Retrieve the status and results of a running AI research agent job by its ID.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_browser_create', + description: `Create a persistent browser session for interactive scraping.`, + params: [ + { + name: 'activityTtl', + type: 'number', + required: false, + description: `Seconds of inactivity after which the session is automatically destroyed.`, + }, + { + name: 'profile', + type: 'object', + required: false, + description: `Named browser profile to use for authenticated scraping.`, + }, + { + name: 'streamWebView', + type: 'boolean', + required: false, + description: `Set to true to stream the browser viewport during the session.`, + }, + { + name: 'ttl', + type: 'number', + required: false, + description: `Session lifetime in seconds after creation.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_browser_delete', + description: `Destroy a browser session and release its resources.`, + params: [ + { + name: 'sessionId', + type: 'string', + required: true, + description: `The ID of the browser session. Get it from firecrawlmcp_firecrawl_browser_create.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_browser_list', + description: `List active or destroyed browser sessions for the account.`, + params: [ + { + name: 'status', + type: 'string', + required: false, + description: `Filter browser sessions by status. Accepted values: active, destroyed.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_check_crawl_status', + description: `Check the progress and results of an in-progress crawl job by its ID.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_crawl', + description: `Start a crawl job that extracts content from all pages of a website. Returns a job ID; use firecrawlmcp_firecrawl_check_crawl_status to poll for results.`, + params: [ + { + name: 'url', + type: 'string', + required: true, + description: `The URL of the page or website to scrape, crawl, or map.`, + }, + { + name: 'allowExternalLinks', + type: 'boolean', + required: false, + description: `Set to true to follow links to external domains.`, + }, + { + name: 'allowSubdomains', + type: 'boolean', + required: false, + description: `Set to true to crawl subdomains of the target domain.`, + }, + { + name: 'crawlEntireDomain', + type: 'boolean', + required: false, + description: `Set to true to crawl all paths on the domain, not just the starting URL subtree.`, + }, + { + name: 'deduplicateSimilarURLs', + type: 'boolean', + required: false, + description: `Set to true to skip URLs that are similar to already-crawled URLs.`, + }, + { + name: 'delay', + type: 'number', + required: false, + description: `Milliseconds to wait between requests to avoid rate limiting.`, + }, + { + name: 'excludePaths', + type: 'array', + required: false, + description: `URL path patterns to exclude from the crawl (e.g. ["/admin", "/login"]).`, + }, + { + name: 'ignoreQueryParameters', + type: 'boolean', + required: false, + description: `Set to true to treat URLs differing only by query string as duplicates.`, + }, + { + name: 'includePaths', + type: 'array', + required: false, + description: `URL path patterns to restrict the crawl to (e.g. ["/blog/*"]).`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'maxConcurrency', + type: 'number', + required: false, + description: `Maximum number of concurrent requests during a crawl.`, + }, + { + name: 'maxDiscoveryDepth', + type: 'number', + required: false, + description: `Maximum link depth to follow from the starting URL.`, + }, + { + name: 'prompt', + type: 'string', + required: false, + description: `Natural-language instruction to guide extraction or crawling.`, + }, + { + name: 'scrapeOptions', + type: 'object', + required: false, + description: `Scraping options applied to each page during crawl or search (formats, tags, etc.).`, + }, + { + name: 'sitemap', + type: 'string', + required: false, + description: `How to use the sitemap: include to discover URLs from it, only to crawl only sitemap URLs, skip to ignore it.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_extract', + description: `Extract structured data from one or more URLs using a natural-language prompt and optional JSON Schema.`, + params: [ + { + name: 'urls', + type: 'array', + required: true, + description: `List of URLs to extract structured data from.`, + }, + { + name: 'allowExternalLinks', + type: 'boolean', + required: false, + description: `Set to true to follow links to external domains.`, + }, + { + name: 'enableWebSearch', + type: 'boolean', + required: false, + description: `Set to true to supplement extraction with live web search results.`, + }, + { + name: 'includeSubdomains', + type: 'boolean', + required: false, + description: `Set to true to include subdomains of the target domain.`, + }, + { + name: 'prompt', + type: 'string', + required: false, + description: `Natural-language instruction to guide extraction or crawling.`, + }, + { + name: 'schema', + type: 'object', + required: false, + description: `JSON Schema defining the structure of data to extract.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_interact', + description: `Run code or a natural-language prompt in a live browser session for a previously scraped page.`, + params: [ + { + name: 'scrapeId', + type: 'string', + required: true, + description: `The ID of the active scrape session. Get it from firecrawlmcp_firecrawl_scrape when using interact.`, + }, + { + name: 'code', + type: 'string', + required: false, + description: `Code snippet to execute in the browser session.`, + }, + { + name: 'language', + type: 'string', + required: false, + description: `Programming language for the code snippet to execute in the browser session.`, + }, + { + name: 'prompt', + type: 'string', + required: false, + description: `Natural-language instruction to guide extraction or crawling.`, + }, + { + name: 'timeout', + type: 'number', + required: false, + description: `Milliseconds to wait for the browser interaction to complete.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_interact_stop', + description: `End an active browser interaction session and release its resources.`, + params: [ + { + name: 'scrapeId', + type: 'string', + required: true, + description: `The ID of the active scrape session. Get it from firecrawlmcp_firecrawl_scrape when using interact.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_map', + description: `Discover all indexed URLs on a website or within a URL subtree, with optional search filtering.`, + params: [ + { + name: 'url', + type: 'string', + required: true, + description: `The URL of the page or website to scrape, crawl, or map.`, + }, + { + name: 'ignoreQueryParameters', + type: 'boolean', + required: false, + description: `Set to true to treat URLs differing only by query string as duplicates.`, + }, + { + name: 'includeSubdomains', + type: 'boolean', + required: false, + description: `Set to true to include subdomains of the target domain.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'search', + type: 'string', + required: false, + description: `Search term to filter URLs returned by the map.`, + }, + { + name: 'sitemap', + type: 'string', + required: false, + description: `How to use the sitemap: include to discover URLs from it, only to crawl only sitemap URLs, skip to ignore it.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_check', + description: `Retrieve the page-level diff results for a single monitor check run.`, + params: [ + { + name: 'checkId', + type: 'string', + required: true, + description: `The ID of a specific monitor check. Get it from firecrawlmcp_firecrawl_monitor_checks.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'pageStatus', + type: 'string', + required: false, + description: `Filter check results to pages with this change status.`, + }, + { + name: 'skip', + type: 'integer', + required: false, + description: `Number of items to skip for pagination.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_checks', + description: `List the historical check runs for a monitor, with pagination.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'offset', + type: 'integer', + required: false, + description: `Number of items to skip for pagination.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_create', + description: `Create a recurring Firecrawl monitor that scrapes a URL on a schedule and diffs results against the previous run.`, + params: [ + { + name: 'body', + type: 'object', + required: true, + description: `Monitor configuration object. Include name, url, schedule (cron), and scrapeOptions.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_delete', + description: `Permanently delete a monitor and stop its scheduled checks.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_get', + description: `Retrieve the configuration and status of a single monitor by its ID.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_list', + description: `List all monitors configured for the authenticated account, with pagination.`, + params: [ + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'offset', + type: 'integer', + required: false, + description: `Number of items to skip for pagination.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_run', + description: `Trigger an immediate check for a monitor outside its normal schedule.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_monitor_update', + description: `Update monitor settings such as name, status, schedule, or scrape options.`, + params: [ + { + name: 'body', + type: 'object', + required: true, + description: `Monitor configuration object. Include name, url, schedule (cron), and scrapeOptions.`, + }, + { + name: 'id', + type: 'string', + required: true, + description: `The unique identifier of the resource.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_scrape', + description: `Scrape a single URL and return its content in one or more formats (markdown, JSON, screenshot, etc.).`, + params: [ + { + name: 'url', + type: 'string', + required: true, + description: `The URL of the page or website to scrape, crawl, or map.`, + }, + { + name: 'excludeTags', + type: 'array', + required: false, + description: `HTML tags or CSS selectors to remove from extracted content.`, + }, + { + name: 'formats', + type: 'array', + required: false, + description: `Output formats to return. Accepted values: markdown, html, rawHtml, screenshot, links, summary, branding, json, query, audio.`, + }, + { + name: 'includeTags', + type: 'array', + required: false, + description: `HTML tags or CSS selectors to restrict extraction to.`, + }, + { + name: 'jsonOptions', + type: 'object', + required: false, + description: `Options for JSON extraction: prompt and optional JSON Schema.`, + }, + { + name: 'location', + type: 'object', + required: false, + description: `Geographic location for localized content. Pass an object with country (ISO 3166-1 alpha-2 code) and optional languages array.`, + }, + { + name: 'lockdown', + type: 'boolean', + required: false, + description: `Set to true to serve from cache only, without any outbound network requests.`, + }, + { + name: 'maxAge', + type: 'number', + required: false, + description: `Maximum cache age in seconds; serve cached data up to this age for faster responses.`, + }, + { + name: 'mobile', + type: 'boolean', + required: false, + description: `Set to true to emulate a mobile browser viewport.`, + }, + { + name: 'onlyMainContent', + type: 'boolean', + required: false, + description: `Set to true to strip navigation, headers, footers, and other boilerplate.`, + }, + { + name: 'parsers', + type: 'array', + required: false, + description: `Additional parsers to apply. Accepted values: pdf.`, + }, + { + name: 'pdfOptions', + type: 'object', + required: false, + description: `Options for PDF parsing, such as the maximum number of pages.`, + }, + { + name: 'profile', + type: 'object', + required: false, + description: `Named browser profile to use for authenticated scraping.`, + }, + { + name: 'proxy', + type: 'string', + required: false, + description: `Proxy tier to use: basic for standard, stealth or enhanced for bot-resistant sites.`, + }, + { + name: 'queryOptions', + type: 'object', + required: false, + description: `Options for query-mode extraction: the prompt and response mode.`, + }, + { + name: 'removeBase64Images', + type: 'boolean', + required: false, + description: `Set to true to strip inline base64-encoded images from the output.`, + }, + { + name: 'screenshotOptions', + type: 'object', + required: false, + description: `Options for screenshot capture, such as full-page and quality settings.`, + }, + { + name: 'skipTlsVerification', + type: 'boolean', + required: false, + description: `Set to true to skip TLS certificate validation (use for self-signed certs).`, + }, + { + name: 'storeInCache', + type: 'boolean', + required: false, + description: `Set to true to cache this response for future maxAge-based lookups.`, + }, + { + name: 'waitFor', + type: 'number', + required: false, + description: `Milliseconds to wait for JavaScript to render before extracting content.`, + }, + { + name: 'zeroDataRetention', + type: 'boolean', + required: false, + description: `Set to true to prevent Firecrawl from storing any data for this request.`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_search', + description: `Search the web and optionally scrape content from the top results.`, + params: [ + { + name: 'query', + type: 'string', + required: true, + description: `The search query to send to Firecrawl web search.`, + }, + { + name: 'enterprise', + type: 'array', + required: false, + description: `Search mode tier. Accepted values: default, anon, zdr.`, + }, + { + name: 'excludeDomains', + type: 'array', + required: false, + description: `Domains to exclude from search results.`, + }, + { + name: 'filter', + type: 'string', + required: false, + description: `Advanced search filter string in Google tbs format.`, + }, + { + name: 'includeDomains', + type: 'array', + required: false, + description: `Restrict search results to these domains only.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'location', + type: 'string', + required: false, + description: `Geographic location for localized scraping or search results.`, + }, + { + name: 'scrapeOptions', + type: 'object', + required: false, + description: `Scraping options applied to each page during crawl or search (formats, tags, etc.).`, + }, + { + name: 'sources', + type: 'array', + required: false, + description: `Sources to include. Each item must have a type field. Accepted values for type: web, images, news.`, + }, + { + name: 'tbs', + type: 'string', + required: false, + description: `Time-based search filter (e.g. qdr:d for past day, qdr:w for past week).`, + }, + ], + }, + { + name: 'firecrawlmcp_firecrawl_search_feedback', + description: `Send structured feedback on a previous search result to help improve future results.`, + params: [ + { + name: 'rating', + type: 'string', + required: true, + description: `Your overall quality rating for the search result.`, + }, + { + name: 'searchId', + type: 'string', + required: true, + description: `The ID of a previous search result. Returned by firecrawlmcp_firecrawl_search.`, + }, + { + name: 'missingContent', + type: 'array', + required: false, + description: `Content types or topics that were missing from the search results.`, + }, + { + name: 'querySuggestions', + type: 'string', + required: false, + description: `Alternative search queries that might yield better results.`, + }, + { + name: 'valuableSources', + type: 'array', + required: false, + description: `URLs you found particularly useful in the search results.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/gustomcp.ts b/src/data/agent-connectors/gustomcp.ts new file mode 100644 index 000000000..67102807b --- /dev/null +++ b/src/data/agent-connectors/gustomcp.ts @@ -0,0 +1,892 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'gustomcp_get_company', + description: `Retrieve the company profile including legal name, entity type, EIN, and status.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_compensation', + description: `Retrieve a single pay rate record by UUID, including rate, frequency, and FLSA status.`, + params: [ + { + name: 'compensation_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the record`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_contractor', + description: `Retrieve full profile for a contractor by UUID, including name, email, and payment method.`, + params: [ + { + name: 'contractor_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the contractor`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_contractor_payment', + description: `Retrieve details for a single contractor payment by UUID, including amount and payment method.`, + params: [ + { + name: 'contractor_payment_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the contractor payment`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_contractor_payment_group', + description: `Retrieve all individual contractor payments within a batched payment group by UUID.`, + params: [ + { + name: 'contractor_payment_group_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the contractor payment group`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_department', + description: `Retrieve details for a single department by UUID, including name and assigned employees.`, + params: [ + { + name: 'department_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the department`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_employee', + description: `Retrieve full profile for an employee by UUID, including name, hire date, job, and location.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee to retrieve`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated fields to include: all_compensations, all_home_addresses, company_name, current_home_address, custom_fields, portal_invitations`, + }, + ], + }, + { + name: 'gustomcp_get_employee_earnings_summary', + description: `Return per-employee earning breakdowns aggregated across all payrolls in a date range.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'end_date', + type: 'string', + required: false, + description: `End of date range (YYYY-MM-DD). Defaults to today.`, + }, + { + name: 'start_date', + type: 'string', + required: false, + description: `Start of date range (YYYY-MM-DD). Defaults to Jan 1 of current year.`, + }, + ], + }, + { + name: 'gustomcp_get_employee_home_address', + description: `Retrieve a single home address record by UUID, including street, city, state, and ZIP.`, + params: [ + { + name: 'home_address_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the address`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_employee_rehire', + description: `Retrieve rehire details for an employee, including new start date and updated employment terms.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_employee_work_address', + description: `Retrieve a single work location assignment by UUID, including address and effective dates.`, + params: [ + { + name: 'work_address_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the work location`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_job', + description: `Retrieve details for a job position by UUID, including title, department, and current pay rate.`, + params: [ + { + name: 'job_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the job`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Use all_compensations to include all effective dated compensations instead of only the current compensation`, + }, + ], + }, + { + name: 'gustomcp_get_location', + description: `Retrieve details for a company location by UUID, including address and filing information.`, + params: [ + { + name: 'location_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the location`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_pay_schedule', + description: `Retrieve a pay schedule by UUID, including frequency and next scheduled pay dates.`, + params: [ + { + name: 'pay_schedule_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the pay schedule`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_payroll', + description: `Retrieve complete details for a payroll run by UUID, including earnings, taxes, and net pay.`, + params: [ + { + name: 'payroll_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the payroll`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'employee_compensations_page', + type: 'integer', + required: false, + description: `Page number for paginating employee compensations within the payroll. Defaults to 1.`, + }, + { + name: 'employee_compensations_per', + type: 'integer', + required: false, + description: `Number of employee compensations per page. Defaults to 100 (max).`, + }, + ], + }, + { + name: 'gustomcp_get_time_sheet', + description: `Retrieve time entries for a timesheet by UUID, including daily hours, overtime, and notes.`, + params: [ + { + name: 'time_sheet_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the timesheet`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_get_token_info', + description: `Return information about the current API token, including granted scopes and accessible resources.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_contractor_payment_groups', + description: `List batched contractor payment runs, showing payment group UUIDs and check dates.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'end_date', + type: 'string', + required: false, + description: `Optional end of date range (YYYY-MM-DD)`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + { + name: 'start_date', + type: 'string', + required: false, + description: `Optional start of date range (YYYY-MM-DD)`, + }, + ], + }, + { + name: 'gustomcp_list_contractor_payments', + description: `List payments made to contractors within a date range. Requires start_date and end_date.`, + params: [ + { + name: 'end_date', + type: 'string', + required: true, + description: `End of date range (YYYY-MM-DD) for contractor payments`, + }, + { + name: 'start_date', + type: 'string', + required: true, + description: `Start of date range (YYYY-MM-DD) for contractor payments`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'contractor_uuid', + type: 'string', + required: false, + description: `Filter payments by contractor UUID`, + }, + { + name: 'group_by_date', + type: 'boolean', + required: false, + description: `When true, groups results by check date`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + ], + }, + { + name: 'gustomcp_list_contractors', + description: `List all independent contractors for the company with pagination and search support.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated fields to include: company_name, portal_invitations`, + }, + { + name: 'onboarded', + type: 'boolean', + required: false, + description: `Filter by contractors who have completed onboarding`, + }, + { + name: 'onboarded_active', + type: 'boolean', + required: false, + description: `Filter by contractors who are onboarded and currently active`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + { + name: 'search_term', + type: 'string', + required: false, + description: `A string to search for in names`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Sort field and optional direction, e.g. name:asc. Supported fields: created_at, name, onboarding_status, type`, + }, + { + name: 'terminated', + type: 'boolean', + required: false, + description: `Filter by contractors who are no longer active`, + }, + { + name: 'terminated_today', + type: 'boolean', + required: false, + description: `Filter by contractors whose last day was today`, + }, + ], + }, + { + name: 'gustomcp_list_custom_fields_schema', + description: `Retrieve definitions of all custom fields configured for the company, including types and options.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for pagination (default 1)`, + }, + { + name: 'per', + type: 'integer', + required: false, + description: `Number of items per page (default 25, max 500)`, + }, + ], + }, + { + name: 'gustomcp_list_departments', + description: `List all departments in the company, including names, UUIDs, and assigned employees.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_earning_types', + description: `List all earning type categories for the company, such as regular pay, overtime, and bonuses.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_employee_custom_fields', + description: `Retrieve all custom field values set for a specific employee.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + ], + }, + { + name: 'gustomcp_list_employee_employment_history', + description: `Retrieve the work history timeline for an employee, including all roles and status changes.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_employee_home_addresses', + description: `List all home addresses on file for an employee, including current and historical entries.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_employee_jobs', + description: `List all job positions held by an employee, including title, location, and rate information.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Use all_compensations to include all effective dated compensations for each job`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + ], + }, + { + name: 'gustomcp_list_employee_terminations', + description: `Retrieve separation records for an employee, including departure dates and final pay details.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_employee_work_addresses', + description: `List all work locations assigned to an employee, with effective dates.`, + params: [ + { + name: 'employee_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the employee`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_employees', + description: `List all employees for the company with pagination and filtering by status, onboarding, or name.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated fields to include: all_compensations, all_home_addresses, company_name, current_home_address, custom_fields, portal_invitations`, + }, + { + name: 'location_uuid', + type: 'string', + required: false, + description: `Filter by employees assigned to a specific location UUID`, + }, + { + name: 'onboarded', + type: 'boolean', + required: false, + description: `Filter by employees who have completed onboarding`, + }, + { + name: 'onboarded_active', + type: 'boolean', + required: false, + description: `Filter by employees who are onboarded and currently active`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { + name: 'payroll_uuid', + type: 'string', + required: false, + description: `Filter by employees included in a specific payroll UUID`, + }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + { + name: 'search_term', + type: 'string', + required: false, + description: `A string to search for in names`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Sort field and optional direction, e.g. name:asc. Supported fields: created_at, name, onboarding_status`, + }, + { + name: 'terminated', + type: 'boolean', + required: false, + description: `Filter by employees who are no longer active with the company`, + }, + { + name: 'terminated_today', + type: 'boolean', + required: false, + description: `Filter by employees whose last day was today`, + }, + { + name: 'uuids', + type: 'string', + required: false, + description: `Comma-separated subset of employee UUIDs to fetch`, + }, + ], + }, + { + name: 'gustomcp_list_job_compensations', + description: `List the pay rate history for a job position, showing all rate changes over time.`, + params: [ + { + name: 'job_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the job`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Use all_compensations to include all effective dated compensations instead of only the current compensation`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + ], + }, + { + name: 'gustomcp_list_locations', + description: `List all physical office and work locations registered for the company.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + ], + }, + { + name: 'gustomcp_list_pay_periods', + description: `List all pay periods for the company, showing start and end dates and linked payroll runs.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'end_date', + type: 'string', + required: false, + description: `Filter pay periods ending on or before this date (YYYY-MM-DD). Defaults to today. Cannot be more than 3 months in the future.`, + }, + { + name: 'payroll_types', + type: 'string', + required: false, + description: `Comma-separated payroll types to include: regular, transition`, + }, + { + name: 'start_date', + type: 'string', + required: false, + description: `Filter pay periods starting on or after this date (YYYY-MM-DD). Defaults to 6 months ago. Must be within 1 year of end_date.`, + }, + ], + }, + { + name: 'gustomcp_list_pay_schedule_assignments', + description: `Show which employees are assigned to which pay schedules.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_pay_schedules', + description: `List all pay schedules for the company, showing frequency and schedule UUID.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { name: 'page', type: 'integer', required: false, description: `Page number for pagination` }, + { name: 'per', type: 'integer', required: false, description: `Number of items per page` }, + ], + }, + { + name: 'gustomcp_list_payroll_blockers', + description: `Identify issues preventing a payroll from being processed, such as missing setup or documents.`, + params: [ + { + name: 'payroll_uuid', + type: 'string', + required: true, + description: `The unique identifier (UUID) for the payroll to check blockers for`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, + { + name: 'gustomcp_list_payrolls', + description: `List all payroll runs for the company with optional filtering by type, date, and status.`, + params: [ + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + { + name: 'date_filter_by', + type: 'string', + required: false, + description: `Specifies which date field to use when filtering with start_date and end_date. Only applies to regular processed payrolls. Defaults to pay period if not provided. Valid value is check_date.`, + }, + { + name: 'end_date', + type: 'string', + required: false, + description: `Filters where the pay period ends on or before this date (YYYY-MM-DD). Cannot be more than 3 months in the future and must be within 1 year of start_date.`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated: taxes, totals, payroll_status_meta, risk_blockers, reversals`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `The page that is requested. When unspecified, will load all objects unless endpoint forces pagination.`, + }, + { + name: 'payroll_types', + type: 'string', + required: false, + description: `Comma-separated: regular,off_cycle,external`, + }, + { + name: 'per', + type: 'integer', + required: false, + description: `Number of objects per page. For majority of endpoints will default to 25.`, + }, + { + name: 'processing_statuses', + type: 'string', + required: false, + description: `Comma-separated: processed,unprocessed`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Sort field: pay_period or check_date`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort payrolls in ascending (asc) or descending (desc) chronological order. Defaults to asc.`, + }, + { + name: 'start_date', + type: 'string', + required: false, + description: `Filters where the pay period starts on or after this date (YYYY-MM-DD). Must be within 1 year of end_date.`, + }, + ], + }, + { + name: 'gustomcp_list_time_records', + description: `List time records for the company over a pay period. Requires pay_period with start and end dates.`, + params: [ + { + name: 'pay_period', + type: 'object', + required: true, + description: `Date range to query. Pass as an object with start_date and end_date in YYYY-MM-DD format.`, + }, + { + name: '_context', + type: 'string', + required: false, + description: `The original user question or request that prompted this tool call`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/jotformmcp.ts b/src/data/agent-connectors/jotformmcp.ts new file mode 100644 index 000000000..4914f2304 --- /dev/null +++ b/src/data/agent-connectors/jotformmcp.ts @@ -0,0 +1,138 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'jotformmcp_analyze_submissions', + description: `Perform AI-powered analysis on one or more forms' submissions using a natural-language query.`, + params: [ + { + name: 'analysisQuery', + type: 'string', + required: true, + description: `A natural-language query describing the desired analysis. Examples: "What are the most common responses?", "Show submission trends by month", "Analyze sentiment in feedback", "Give me a statistical breakdown of all answers".`, + }, + { + name: 'formIDs', + type: 'array', + required: true, + description: `Form IDs whose submissions will be analyzed. Provide a single form ID by default. Only supply more than one ID when the user explicitly requests cross-form comparison or combined analysis. Use the search_asset tool first if you need to find the form ID.`, + }, + { + name: 'limit', + type: 'number', + required: true, + description: `Maximum number of submissions to include in the analysis. Higher values provide more comprehensive results but increase processing time.`, + }, + ], + }, + { + name: 'jotformmcp_assign_form', + description: `Assign a form to a user by email address with an optional message.`, + params: [ + { + name: 'assignee_email', + type: 'string', + required: true, + description: `The email address to assign the form to`, + }, + { + name: 'assignee_message', + type: 'string', + required: true, + description: `The message to assign the form to. This will be used in the email that will be sent to the assignee.`, + }, + { + name: 'assignee_name', + type: 'string', + required: true, + description: `The name of the assignee. This will be used in the email that will be sent to the assignee.`, + }, + { + name: 'form_id', + type: 'string', + required: true, + description: `The ID of the form to assign`, + }, + ], + }, + { + name: 'jotformmcp_create_form', + description: `Create a new Jotform form based on a natural-language description.`, + params: [ + { + name: 'description', + type: 'string', + required: true, + description: `Description of the form to create`, + }, + ], + }, + { + name: 'jotformmcp_edit_form', + description: `Edit an existing form using a natural-language instruction.`, + params: [ + { + name: 'description', + type: 'string', + required: true, + description: `High-level natural-language instruction describing what to change (e.g., add/move/rename questions). Avoid specifying internal types or identifiers; another agent will infer the appropriate field types.`, + }, + { + name: 'form_id', + type: 'string', + required: true, + description: `The ID of the form to edit`, + }, + ], + }, + { + name: 'jotformmcp_fetch', + description: `Fetch metadata and information for a Jotform form by its ID or URL.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The form id or the submission id to fetch information and metadata from`, + }, + ], + }, + { + name: 'jotformmcp_get_submissions', + description: `List submission IDs for a form with optional filters.`, + params: [ + { name: 'filter', type: 'object', required: true, description: `No description.` }, + { + name: 'form_id', + type: 'string', + required: true, + description: `The ID of the form to list submissions from`, + }, + ], + }, + { + name: 'jotformmcp_search', + description: `Search Jotform assets by query with optional filters, ordering, and limit.`, + params: [ + { name: 'filter', type: 'object', required: true, description: `No description.` }, + { + name: 'limit', + type: 'number', + required: true, + description: `Maximum items fetched per underlying request (default: 20).`, + }, + { + name: 'order_by', + type: 'string', + required: true, + description: `Sort order for the results. The default value is "last_activity", only use another option if a sorting is really needed.`, + }, + { + name: 'user_query', + type: 'string', + required: true, + description: `A natural-language instruction describing what the user wants to find and list from assets.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/lucidmcp.ts b/src/data/agent-connectors/lucidmcp.ts new file mode 100644 index 000000000..3f8dfe0b1 --- /dev/null +++ b/src/data/agent-connectors/lucidmcp.ts @@ -0,0 +1,330 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'lucidmcp__lucid_create_embed', + description: `Create an embed for a Lucid document. Internal tool for MCP Apps extension only.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + ], + }, + { + name: 'lucidmcp__lucid_create_embed_session_token', + description: `Create a session token for an existing Lucid embed. Internal tool for MCP Apps extension only.`, + params: [ + { name: 'embed_id', type: 'string', required: true, description: `No description.` }, + { name: 'origin', type: 'string', required: true, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_fetch', + description: `Retrieve the structured content of a Lucid document by ID, including pages, blocks, and lines.`, + params: [ + { name: 'id', type: 'string', required: true, description: `No description.` }, + { name: 'page_index', type: 'string', required: false, description: `No description.` }, + { name: 'region_index', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_get_mcp_resource', + description: `Read a resource from the Lucid MCP server by its URI.`, + params: [ + { name: 'resource_uri', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_add_block', + description: `Add a new shape or block to a Lucid document with optional position, size, text, and style properties.`, + params: [ + { name: 'block_type', type: 'string', required: true, description: `No description.` }, + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'bold', type: 'string', required: false, description: `No description.` }, + { name: 'container_id', type: 'string', required: false, description: `No description.` }, + { name: 'fill_color', type: 'string', required: false, description: `No description.` }, + { name: 'font_family', type: 'string', required: false, description: `No description.` }, + { name: 'font_size', type: 'string', required: false, description: `No description.` }, + { name: 'height', type: 'string', required: false, description: `No description.` }, + { name: 'highlight_color', type: 'string', required: false, description: `No description.` }, + { name: 'italic', type: 'string', required: false, description: `No description.` }, + { name: 'line_color', type: 'string', required: false, description: `No description.` }, + { name: 'line_width', type: 'string', required: false, description: `No description.` }, + { name: 'page_id', type: 'string', required: false, description: `No description.` }, + { name: 'rotation', type: 'string', required: false, description: `No description.` }, + { name: 'strike', type: 'string', required: false, description: `No description.` }, + { name: 'stroke_style', type: 'string', required: false, description: `No description.` }, + { name: 'subscript', type: 'string', required: false, description: `No description.` }, + { name: 'superscript', type: 'string', required: false, description: `No description.` }, + { name: 'text', type: 'string', required: false, description: `No description.` }, + { name: 'text_align', type: 'string', required: false, description: `No description.` }, + { name: 'text_color', type: 'string', required: false, description: `No description.` }, + { name: 'text_v_align', type: 'string', required: false, description: `No description.` }, + { name: 'underline', type: 'string', required: false, description: `No description.` }, + { name: 'width', type: 'string', required: false, description: `No description.` }, + { name: 'x', type: 'number', required: false, description: `No description.` }, + { name: 'y', type: 'number', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_add_line', + description: `Add a new line or connector to a Lucid document, optionally linking two shapes.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'bold', type: 'string', required: false, description: `No description.` }, + { + name: 'endpoint1_auto_link', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint1_position_x', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint1_position_y', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint1_shape_id', + type: 'string', + required: false, + description: `No description.`, + }, + { name: 'endpoint1_style', type: 'string', required: false, description: `No description.` }, + { name: 'endpoint1_x', type: 'string', required: false, description: `No description.` }, + { name: 'endpoint1_y', type: 'string', required: false, description: `No description.` }, + { + name: 'endpoint2_auto_link', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint2_position_x', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint2_position_y', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint2_shape_id', + type: 'string', + required: false, + description: `No description.`, + }, + { name: 'endpoint2_style', type: 'string', required: false, description: `No description.` }, + { name: 'endpoint2_x', type: 'string', required: false, description: `No description.` }, + { name: 'endpoint2_y', type: 'string', required: false, description: `No description.` }, + { name: 'font_family', type: 'string', required: false, description: `No description.` }, + { name: 'font_size', type: 'string', required: false, description: `No description.` }, + { name: 'highlight_color', type: 'string', required: false, description: `No description.` }, + { name: 'italic', type: 'string', required: false, description: `No description.` }, + { name: 'line_color', type: 'string', required: false, description: `No description.` }, + { name: 'line_shape', type: 'string', required: false, description: `No description.` }, + { name: 'line_width', type: 'string', required: false, description: `No description.` }, + { name: 'page_id', type: 'string', required: false, description: `No description.` }, + { name: 'strike', type: 'string', required: false, description: `No description.` }, + { name: 'stroke_style', type: 'string', required: false, description: `No description.` }, + { name: 'subscript', type: 'string', required: false, description: `No description.` }, + { name: 'superscript', type: 'string', required: false, description: `No description.` }, + { name: 'text', type: 'string', required: false, description: `No description.` }, + { name: 'text_color', type: 'string', required: false, description: `No description.` }, + { name: 'underline', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_create_diagram_from_specification', + description: `Create a Lucid document from a Standard Import JSON specification (.lucid file format).`, + params: [ + { name: 'product', type: 'string', required: true, description: `No description.` }, + { + name: 'standard_import_json', + type: 'string', + required: true, + description: `No description.`, + }, + { name: 'title', type: 'string', required: true, description: `No description.` }, + { + name: 'use_assisted_layout', + type: 'boolean', + required: false, + description: `No description.`, + }, + ], + }, + { + name: 'lucidmcp_lucid_create_document_share_link', + description: `Generate a share link for a Lucid document with configurable permissions and optional expiry.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'role', type: 'string', required: true, description: `No description.` }, + { name: 'allow_anonymous', type: 'boolean', required: false, description: `No description.` }, + { name: 'expires', type: 'string', required: false, description: `No description.` }, + { + name: 'restrict_to_account', + type: 'boolean', + required: false, + description: `No description.`, + }, + ], + }, + { + name: 'lucidmcp_lucid_create_mind_map', + description: `Create a Lucid document containing a mind map from structured node data.`, + params: [ + { name: 'nodes', type: 'array', required: true, description: `No description.` }, + { name: 'title', type: 'string', required: true, description: `No description.` }, + { name: 'product', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_create_org_chart', + description: `Create a Lucidchart document containing an org chart from a list of nodes with parent relationships.`, + params: [ + { name: 'nodes', type: 'array', required: true, description: `No description.` }, + { name: 'title', type: 'string', required: true, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_create_sequence_diagram', + description: `Create a Lucid document containing a UML sequence diagram from PlantUML markup.`, + params: [ + { name: 'markup', type: 'string', required: true, description: `No description.` }, + { name: 'product', type: 'string', required: true, description: `No description.` }, + { name: 'title', type: 'string', required: true, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_delete_items', + description: `Delete one or more blocks or lines from a Lucid document by item ID.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'item_ids', type: 'array', required: true, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_edit_item', + description: `Edit an existing block or line in a Lucid document — update position, size, text, or style.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'item_id', type: 'string', required: true, description: `No description.` }, + { name: 'bold', type: 'string', required: false, description: `No description.` }, + { + name: 'endpoint1_position_x', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint1_position_y', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint1_shape_id', + type: 'string', + required: false, + description: `No description.`, + }, + { name: 'endpoint1_x', type: 'string', required: false, description: `No description.` }, + { name: 'endpoint1_y', type: 'string', required: false, description: `No description.` }, + { + name: 'endpoint2_position_x', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint2_position_y', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'endpoint2_shape_id', + type: 'string', + required: false, + description: `No description.`, + }, + { name: 'endpoint2_x', type: 'string', required: false, description: `No description.` }, + { name: 'endpoint2_y', type: 'string', required: false, description: `No description.` }, + { name: 'fill_color', type: 'string', required: false, description: `No description.` }, + { name: 'font_family', type: 'string', required: false, description: `No description.` }, + { name: 'font_size', type: 'string', required: false, description: `No description.` }, + { name: 'height', type: 'string', required: false, description: `No description.` }, + { name: 'highlight_color', type: 'string', required: false, description: `No description.` }, + { name: 'italic', type: 'string', required: false, description: `No description.` }, + { name: 'line_color', type: 'string', required: false, description: `No description.` }, + { name: 'line_width', type: 'string', required: false, description: `No description.` }, + { name: 'rotation', type: 'string', required: false, description: `No description.` }, + { name: 'strike', type: 'string', required: false, description: `No description.` }, + { name: 'stroke_style', type: 'string', required: false, description: `No description.` }, + { name: 'subscript', type: 'string', required: false, description: `No description.` }, + { name: 'superscript', type: 'string', required: false, description: `No description.` }, + { name: 'text', type: 'string', required: false, description: `No description.` }, + { name: 'text_align', type: 'string', required: false, description: `No description.` }, + { name: 'text_color', type: 'string', required: false, description: `No description.` }, + { name: 'text_v_align', type: 'string', required: false, description: `No description.` }, + { name: 'underline', type: 'string', required: false, description: `No description.` }, + { name: 'width', type: 'string', required: false, description: `No description.` }, + { name: 'x', type: 'string', required: false, description: `No description.` }, + { name: 'y', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_export_document_as_png', + description: `Export a page of a Lucid document as a PNG image.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'page', type: 'integer', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_lucid_fetch_item_image', + description: `Fetch the source image attached to a specific item in a Lucid document.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'item_id', type: 'string', required: true, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_search', + description: `Search for Lucid documents by keyword with optional filters for product type and date range. Returns up to 200 results.`, + params: [ + { name: 'query', type: 'string', required: true, description: `No description.` }, + { name: 'created_end_time', type: 'string', required: false, description: `No description.` }, + { + name: 'created_start_time', + type: 'string', + required: false, + description: `No description.`, + }, + { + name: 'last_modified_after', + type: 'string', + required: false, + description: `No description.`, + }, + { name: 'product', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'lucidmcp_share_document_with_collaborators', + description: `Share a Lucid document with collaborators by granting them access via email.`, + params: [ + { name: 'document_id', type: 'string', required: true, description: `No description.` }, + { name: 'emails', type: 'array', required: true, description: `No description.` }, + { name: 'role', type: 'string', required: false, description: `No description.` }, + ], + }, +] diff --git a/src/data/agent-connectors/makemcp.ts b/src/data/agent-connectors/makemcp.ts new file mode 100644 index 000000000..80cc78c1f --- /dev/null +++ b/src/data/agent-connectors/makemcp.ts @@ -0,0 +1,2202 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'makemcp_app_documentation_get', + description: `Retrieves markdown documentation for the specific Make App. Use when configuring Make Apps and Modules and when you need to learn more about the available capabilities.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App to get the documentation for.`, + }, + ], + }, + { + name: 'makemcp_app-module_get', + description: `Retrieves a single Module from the given App in the given Organization.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App from which Module should be retrieved.`, + }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `Version of the App from which Module should be retrieved.`, + }, + { + name: 'moduleName', + type: 'string', + required: true, + description: `Name of the Module to retrieve.`, + }, + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization to get App Module for.`, + }, + { + name: 'format', + type: 'string', + required: false, + description: `Format of the output allowing transformation before being returned.`, + }, + ], + }, + { + name: 'makemcp_app-modules_list', + description: `Retrieves a list of Modules available for the given App in the given Organization and Team.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App from which Modules should be listed.`, + }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `Version of the App from which Modules should be listed.`, + }, + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization to list App Modules for.`, + }, + { + name: 'usage', + type: 'string', + required: false, + description: `Optionally applies usage filter to return only modules that are relevant for it.`, + }, + ], + }, + { + name: 'makemcp_apps_recommend', + description: `Based on the user's intention, recommend applications that can assist in achieving their goals. This tool should provide a list of applications that are relevant to the user's needs, including their names and versions.`, + params: [ + { + name: 'intention', + type: 'string', + required: true, + description: `The intention for which the recommended apps are requested. This should be a clear and concise description of the user's needs or goals.`, + }, + ], + }, + { + name: 'makemcp_connection-metadata_get', + description: `Retrieves metadata of the given connection, or returns an error when the connection type doesn't exist.`, + params: [ + { + name: 'typeName', + type: 'string', + required: true, + description: `Name of the Connection to retrieve metadata for.`, + }, + ], + }, + { + name: 'makemcp_connections_get', + description: `Get connection (connections): Get details of a specific connection.`, + params: [ + { + name: 'connectionId', + type: 'number', + required: true, + description: `The connection ID to get`, + }, + ], + }, + { + name: 'makemcp_connections_list', + description: `List connections (connections): List connections for a team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to list connections for`, + }, + { + name: 'scopes', + type: 'object', + required: false, + description: `Scopes that are required on the requested connection types. Each connection type is a key in this object with an array of scopes as the value.`, + }, + { name: 'type', type: 'array', required: false, description: `Filter by connection type` }, + ], + }, + { + name: 'makemcp_credential-requests_create', + description: `Create credential request (credential-requests): Create a credential request for the currently authenticated user to set up connections and keys. This will return a URL where the user can authorize the credentials, so that they can be used in scenarios.`, + params: [ + { + name: 'credentials', + type: 'array', + required: true, + description: `Array of app/module selections to derive credentials from.`, + }, + { name: 'teamId', type: 'number', required: true, description: `Team ID` }, + { + name: 'description', + type: 'string', + required: false, + description: `Description of the Request which will be displayed to the End Users who open it.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Name of the Request which will be displayed to the End Users who open it.`, + }, + ], + }, + { + name: 'makemcp_credential-requests_create-by-credentials', + description: `Create credential request by connection/key types (credential-requests): Create a credential request for one or more connections (OAuth) and/or keys (API keys) by their type identifiers (e.g. "google", "slack", "apikeyauth"). Use this when you know the exact connection or key types needed. The response includes the created request, an array of credentials associated with the request, and a publicUri where the end-user must go to authorize the requested credentials. At least one connection or one key must be provided.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The numeric ID of the Make team where the connections/keys will be created once authorized.`, + }, + { + name: 'connections', + type: 'array', + required: false, + description: `Array of OAuth or basic-auth connections to request. Each item needs at least a "type" (e.g. "google", "slack", "github").`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Instructions or context for the end-user, displayed on the authorization page.`, + }, + { + name: 'keys', + type: 'array', + required: false, + description: `Array of API keys to request. Each item needs at least a "type" (e.g. "apikeyauth", "basicauth").`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Human-readable name for the credential request, displayed to the end-user who will authorize it.`, + }, + ], + }, + { + name: 'makemcp_credential-requests_credential-decline', + description: `Decline credential (credential-requests): Decline a credential authorization request by ID, setting its status to "declined" and preventing it from being authorized. An optional reason can be provided to explain the decision. This operation is idempotent - declining an already-declined credential has no additional effect.`, + params: [ + { + name: 'credentialId', + type: 'string', + required: true, + description: `The credential ID to decline`, + }, + { + name: 'reason', + type: 'string', + required: false, + description: `Optional reason for declining`, + }, + ], + }, + { + name: 'makemcp_credential-requests_credential-delete', + description: `Delete credential (credential-requests): Delete a credential (e.g., revoke OAuth tokens or remove stored API keys) and reset its state to pending. Use this when a credential needs re-authorization with updated permissions, tokens have become stale, or you want to force re-authentication. After deletion, the credential can be authorized again through the normal flow.`, + params: [ + { + name: 'credentialId', + type: 'string', + required: true, + description: `The credential ID to delete`, + }, + ], + }, + { + name: 'makemcp_credential-requests_delete', + description: `Delete credential request (credential-requests): Permanently delete a credential request and all associated credentials (connections and API keys) by ID. Any scenarios using connections from this request will lose access to the corresponding services. This action cannot be undone.`, + params: [ + { + name: 'requestId', + type: 'string', + required: true, + description: `The credential request ID to delete`, + }, + ], + }, + { + name: 'makemcp_credential-requests_extend-connection', + description: `Extend connection OAuth scopes (credential-requests): Add new OAuth scopes to an existing connection. Use this when a connection exists but lacks the permissions (scopes) needed for a specific operation. Creates a credential request that the end-user must authorize via the returned publicUri to grant the additional scopes. Fails if all requested scopes are already present on the connection.`, + params: [ + { + name: 'connectionId', + type: 'number', + required: true, + description: `The numeric ID of an existing Make connection whose OAuth scopes need to be expanded.`, + }, + { + name: 'scopes', + type: 'array', + required: true, + description: `One or more new OAuth scope strings to add to the connection. At least one scope must be new (not already granted).`, + }, + ], + }, + { + name: 'makemcp_credential-requests_get', + description: `Get credential request details (credential-requests): Retrieve detailed information about a specific credential request by its ID. Returns all associated credentials with their authorization status, provider configuration, user details, and authorization URLs for pending credentials. Use this to check the state of credentials within a request.`, + params: [ + { + name: 'requestId', + type: 'string', + required: true, + description: `The credential request ID to get details for`, + }, + ], + }, + { + name: 'makemcp_credential-requests_list', + description: `List credential requests (credential-requests): Retrieve a list of credential requests. Each request can contain multiple credentials (connections and API keys). Filter by team, user, provider, status, or name to find specific requests.`, + params: [ + { name: 'teamId', type: 'number', required: true, description: `Filter by team ID` }, + { + name: 'makeProviderId', + type: 'string', + required: false, + description: `Filter by Make provider ID`, + }, + { name: 'name', type: 'string', required: false, description: `Filter by name` }, + { name: 'status', type: 'string', required: false, description: `Filter by status` }, + { name: 'userId', type: 'number', required: false, description: `Filter by user ID` }, + ], + }, + { + name: 'makemcp_credential-requests_list-app-modules-with-creden', + description: `List app modules with credentials (credential-requests): List all modules of a given Make app (and version) that require credentials, along with the required credential type and OAuth scopes. Use this to discover which modules exist for an app before constructing a credential request — the returned \`id\` values are what you pass in \`credentials[].appModules\` for \`credential-requests_create\`. For custom/SDK apps, prefix the app name with \`app#\` (e.g. \`app#my-custom-app\`).`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `App name (e.g. \`slack\`). For custom/SDK apps, prefix with \`app#\` (e.g. \`app#my-custom-app\`).`, + }, + { + name: 'appVersion', + type: 'string', + required: true, + description: `App major version number (e.g. \`4\`), or the literal string \`"latest"\`.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_connections_configure', + description: `Create new connection or update existing connection.`, + params: [ + { + name: 'mode', + type: 'string', + required: true, + description: `Specify whether to create a new connection or update an existing one`, + }, + { + name: 'appName', + type: 'string', + required: false, + description: `Required for CREATE mode. The name of the app to create the connection for`, + }, + { + name: 'connectionName', + type: 'string', + required: false, + description: `Required for UPDATE mode only. The connection ID (auto-generated during creation, typically appName or appName with suffix)`, + }, + { + name: 'label', + type: 'string', + required: false, + description: `Required for CREATE mode. The title of the connection, visible in the scenario builder. Will update when in UPDATE mode`, + }, + { + name: 'sections', + type: 'object', + required: false, + description: `Configure connection sections: api, parameters, scopes, scope. Each section value can be a JSON value (object/array) or a JSONC string (to preserve comments). Example: {"api": {"baseUrl": "https://api.example.com"}, "parameters": [{"name": "apikey", "type": "text", "required": true}]}`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Required for CREATE mode. The type of the connection`, + }, + ], + }, + { + name: 'makemcp_custom_apps_connections_delete', + description: `Delete a connection`, + params: [ + { + name: 'connectionName', + type: 'string', + required: true, + description: `The name of the connection`, + }, + ], + }, + { + name: 'makemcp_custom_apps_connections_fetch', + description: `List all connections for an app or get metadata for a specific connection with optional sections.`, + params: [ + { + name: 'appName', + type: 'string', + required: false, + description: `The name of the app. Required when listing all connections for an app.`, + }, + { + name: 'connectionName', + type: 'string', + required: false, + description: `The connection ID (often identical to the app name). If provided, gets this specific connection.`, + }, + { + name: 'sections', + type: 'array', + required: false, + description: `Optional sections to include when fetching a specific connection.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_create', + description: `Create new custom app. This is is the first step in creating a new custom app for Make.com Note that the "name" that you pass in is just a prefix and the "name" in the response is the identifier for the app that needs to be passed in later requests`, + params: [ + { + name: 'label', + type: 'string', + required: true, + description: `The title of your custom app. This field is required, and users will see it in the app list.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Optional short description of your custom app.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `The prefix for the app id, the created app will contain a random string postfix, which should be included when referencing the app for later operations`, + }, + { + name: 'theme', + type: 'string', + required: false, + description: `The color that Make uses for your custom app modules and forms.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_delete', + description: `Delete a custom app by name and version`, + params: [ + { name: 'name', type: 'string', required: true, description: `The name of the app` }, + { name: 'version', type: 'number', required: true, description: `The version of the app` }, + ], + }, + { + name: 'makemcp_custom_apps_fetch', + description: `List existing custom apps or get metadata for a specific app with optional sections and/or docs.`, + params: [ + { + name: 'appName', + type: 'string', + required: false, + description: `The name of the app. If not provided, all apps will be listed.`, + }, + { + name: 'appVersion', + type: 'number', + required: false, + description: `The version of the app. Required only when appName is provided.`, + }, + { + name: 'includeDocs', + type: 'boolean', + required: false, + description: `Whether to include app documentation (readme) in the response.`, + }, + { + name: 'sections', + type: 'array', + required: false, + description: `Optional sections to include when fetching a specific app. Available sections: base, groups, install, installSpec.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_functions_create', + description: `Create a new function`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { name: 'name', type: 'string', required: true, description: `The name of the function` }, + ], + }, + { + name: 'makemcp_custom_apps_functions_delete', + description: `Delete a function`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'functionName', + type: 'string', + required: true, + description: `The name of the function`, + }, + ], + }, + { + name: 'makemcp_custom_apps_functions_fetch', + description: `List all functions for an app or get a specific function by name`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of the app` }, + { name: 'appVersion', type: 'number', required: true, description: `The version of the app` }, + { + name: 'functionName', + type: 'string', + required: false, + description: `The name of the function. If not provided, all functions will be listed.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_functions_get_code', + description: `Get function code`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'functionName', + type: 'string', + required: true, + description: `The name of the function`, + }, + ], + }, + { + name: 'makemcp_custom_apps_functions_get_test', + description: `Get function test code`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'functionName', + type: 'string', + required: true, + description: `The name of the function`, + }, + ], + }, + { + name: 'makemcp_custom_apps_functions_set_code', + description: `Set/update function code`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { name: 'code', type: 'string', required: true, description: `The function code` }, + { + name: 'functionName', + type: 'string', + required: true, + description: `The name of the function`, + }, + ], + }, + { + name: 'makemcp_custom_apps_functions_set_test', + description: `Set/update function test code`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'functionName', + type: 'string', + required: true, + description: `The name of the function`, + }, + { name: 'test', type: 'string', required: true, description: `The test code` }, + ], + }, + { + name: 'makemcp_custom_apps_get_example', + description: `Retrieve an example for a specific tool input.`, + params: [ + { + name: 'tool', + type: 'string', + required: true, + description: `Name of tool, excluding the custom_apps_ prefix. only connections_configure is available.`, + }, + { name: 'example_key', type: 'string', required: false, description: `No description.` }, + ], + }, + { + name: 'makemcp_custom_apps_modules_configure', + description: `Create new modules or update existing modules and their sections in a single operation.`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'mode', + type: 'string', + required: true, + description: `Specify whether to create a new module or update an existing one`, + }, + { + name: 'moduleName', + type: 'string', + required: true, + description: `The name (id) of the module`, + }, + { + name: 'connection', + type: 'string', + required: false, + description: `The name (id) of the connection to link to this module`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `Short description of the module`, + }, + { + name: 'label', + type: 'string', + required: false, + description: `Required for CREATE mode. The title of the module, visible to users in the scenario builder`, + }, + { + name: 'sections', + type: 'object', + required: false, + description: `Configure module sections: communication, mappable_parameters, interface, scope, epoch, etc. Each section value can be a JSON value (object/array) or a JSONC string (to preserve comments). Example: {"communication": {"url": "/api/endpoint", "method": "GET"}, "mappable_parameters": [{"name": "id", "type": "text", "required": true}]}`, + }, + { + name: 'typeId', + type: 'number', + required: false, + description: `Required for CREATE mode. The type ID of the module - see description for mapping`, + }, + ], + }, + { + name: 'makemcp_custom_apps_modules_delete', + description: `Delete a module`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { name: 'moduleName', type: 'string', required: true, description: `The name of the module` }, + ], + }, + { + name: 'makemcp_custom_apps_modules_fetch', + description: `List all modules for an app or get metadata for a specific module with optional sections.`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of the app` }, + { name: 'appVersion', type: 'number', required: true, description: `The version of the app` }, + { + name: 'moduleName', + type: 'string', + required: false, + description: `The name of the module. If not provided, all modules will be listed.`, + }, + { + name: 'sections', + type: 'array', + required: false, + description: `Optional sections to include when fetching a specific module. Available sections: communication, mappable_parameters, interface, scope, epoch, samples, static_parameters.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_rpcs_configure', + description: `Create new RPC or update existing RPC and their sections in a single operation.`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'mode', + type: 'string', + required: true, + description: `Specify whether to create a new RPC or update an existing one`, + }, + { + name: 'rpcName', + type: 'string', + required: true, + description: `For CREATE mode: The identifier to assign to the new RPC. For UPDATE mode: The existing RPC identifier to modify.`, + }, + { name: 'connection', type: 'string', required: false, description: `Connection name` }, + { + name: 'label', + type: 'string', + required: false, + description: `The title of the RPC visible in the scenario builder`, + }, + { + name: 'sections', + type: 'object', + required: false, + description: `Configure RPC sections: api, parameters. Each section value can be a JSON value (object/array) or a JSONC string (to preserve comments). Example: {"api": {"url": "/api/endpoint", "method": "POST"}, "parameters": [{"name": "param1", "type": "text", "required": true}]}`, + }, + ], + }, + { + name: 'makemcp_custom_apps_rpcs_delete', + description: `Delete an RPC`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { name: 'rpcName', type: 'string', required: true, description: `The name of the RPC` }, + ], + }, + { + name: 'makemcp_custom_apps_rpcs_fetch', + description: `List all RPCs for an app or get metadata for a specific RPC with optional sections.`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'rpcName', + type: 'string', + required: false, + description: `The name of the RPC. If not provided, all RPCs will be listed.`, + }, + { + name: 'sections', + type: 'array', + required: false, + description: `Optional sections to include when fetching a specific RPC. Available sections: api, parameters.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_rpcs_test', + description: `Test an RPC with provided data and schema`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { name: 'data', type: 'object', required: true, description: `Test data object` }, + { name: 'rpcName', type: 'string', required: true, description: `The name of the RPC` }, + { name: 'schema', type: 'array', required: true, description: `Schema definition array` }, + ], + }, + { + name: 'makemcp_custom_apps_set_base', + description: `Set the base section of a custom app. This is the structure all modules and remote procedures inherit from.`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { + name: 'base', + type: 'string', + required: true, + description: `The base section data. Can be a JSON object or a JSONC string (to preserve comments). Key properties: baseUrl (required, the base URL prefix for modules), headers (optional, object of header key-value pairs), qs (optional, query string key-value pairs), log (optional, { sanitize: string[] } for redacting sensitive paths).`, + }, + ], + }, + { + name: 'makemcp_custom_apps_set_docs', + description: `Set app documentation (readme)`, + params: [ + { + name: 'docs', + type: 'string', + required: true, + description: `The documentation content in markdown format`, + }, + { name: 'name', type: 'string', required: true, description: `The name of the app` }, + { name: 'version', type: 'number', required: true, description: `The version of the app` }, + ], + }, + { + name: 'makemcp_custom_apps_set_groups', + description: `Set the groups section of an custom app. This defines module groupings for the app.`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of an app.` }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `The version of the app`, + }, + { name: 'groups', type: 'array', required: true, description: `No description.` }, + ], + }, + { + name: 'makemcp_custom_apps_update', + description: `Update an existing custom app`, + params: [ + { name: 'name', type: 'string', required: true, description: `The name of the app` }, + { name: 'version', type: 'number', required: true, description: `The version of the app` }, + { + name: 'description', + type: 'string', + required: false, + description: `The description of the app`, + }, + { + name: 'label', + type: 'string', + required: false, + description: `The label of the app visible in the scenario builder`, + }, + { name: 'theme', type: 'string', required: false, description: `The color of the app logo` }, + ], + }, + { + name: 'makemcp_custom_apps_webhooks_create', + description: `Create a new webhook for an app`, + params: [ + { name: 'appName', type: 'string', required: true, description: `The name of the app` }, + { + name: 'label', + type: 'string', + required: true, + description: `The label of the webhook visible in the scenario builder`, + }, + { name: 'type', type: 'string', required: true, description: `The type of the webhook` }, + ], + }, + { + name: 'makemcp_custom_apps_webhooks_delete', + description: `Delete a webhook`, + params: [ + { + name: 'webhookName', + type: 'string', + required: true, + description: `The name of the webhook`, + }, + ], + }, + { + name: 'makemcp_custom_apps_webhooks_fetch', + description: `List all webhooks for an app or get metadata for a specific webhook with optional sections.`, + params: [ + { + name: 'appName', + type: 'string', + required: false, + description: `The name of the app. Required when listing all webhooks.`, + }, + { + name: 'sections', + type: 'array', + required: false, + description: `Optional sections to include when fetching a specific webhook. Available sections: api, parameters, attach, detach, scope.`, + }, + { + name: 'webhookName', + type: 'string', + required: false, + description: `The webhook ID (often identical to the app name). If provided, gets this specific webhook.`, + }, + ], + }, + { + name: 'makemcp_custom_apps_webhooks_set_section', + description: `Set a specific section of a webhook.`, + params: [ + { + name: 'body', + type: 'string', + required: true, + description: `The section data to set. Can be a JSON object or a JSONC string (to preserve comments).`, + }, + { name: 'section', type: 'string', required: true, description: `The section to set` }, + { + name: 'webhookName', + type: 'string', + required: true, + description: `The name of the webhook`, + }, + ], + }, + { + name: 'makemcp_custom_apps_webhooks_update', + description: `Update an existing webhook`, + params: [ + { + name: 'webhookName', + type: 'string', + required: true, + description: `The name of the webhook`, + }, + { + name: 'label', + type: 'string', + required: false, + description: `The label of the webhook visible in the scenario builder`, + }, + ], + }, + { + name: 'makemcp_data-store-records_create', + description: `Create data store record (data-store-records): Create a new record in a data store.`, + params: [ + { name: 'data', type: 'object', required: true, description: `Record data` }, + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID to create the record in`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `Unique key for the record (optional)`, + }, + ], + }, + { + name: 'makemcp_data-store-records_delete', + description: `Delete data store records (data-store-records): Delete specific records from a data store by keys.`, + params: [ + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID to delete records from`, + }, + { + name: 'keys', + type: 'array', + required: true, + description: `Array of record keys to delete`, + }, + ], + }, + { + name: 'makemcp_data-store-records_list', + description: `List data store records (data-store-records): List all records in a data store.`, + params: [ + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID to list records from`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of records to return`, + }, + ], + }, + { + name: 'makemcp_data-store-records_replace', + description: `Replace data store record (data-store-records): Replace an existing record in a data store or create if it doesn't exist.`, + params: [ + { name: 'data', type: 'object', required: true, description: `New record data` }, + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID containing the record`, + }, + { + name: 'key', + type: 'string', + required: true, + description: `Unique key of the record to replace`, + }, + ], + }, + { + name: 'makemcp_data-store-records_update', + description: `Update data store record (data-store-records): Update an existing record in a data store.`, + params: [ + { name: 'data', type: 'object', required: true, description: `Updated record data` }, + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID containing the record`, + }, + { + name: 'key', + type: 'string', + required: true, + description: `Unique key of the record to update`, + }, + ], + }, + { + name: 'makemcp_data-stores_create', + description: `Create data store (data-stores): Create a new data store.`, + params: [ + { + name: 'maxSizeMB', + type: 'number', + required: true, + description: `Maximum size in MB for the data store`, + }, + { name: 'name', type: 'string', required: true, description: `Name of the data store` }, + { + name: 'teamId', + type: 'number', + required: true, + description: `ID of the team to create the data store in`, + }, + { + name: 'datastructureId', + type: 'number', + required: false, + description: `ID of the data structure defining the record format`, + }, + ], + }, + { + name: 'makemcp_data-stores_delete', + description: `Delete data store (data-stores): Delete a data store.`, + params: [ + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID to delete`, + }, + ], + }, + { + name: 'makemcp_data-stores_get', + description: `Get data store (data-stores): Get data store details by ID.`, + params: [ + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID to retrieve`, + }, + ], + }, + { + name: 'makemcp_data-stores_list', + description: `List data stores (data-stores): List all data stores for a team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to filter data stores by`, + }, + ], + }, + { + name: 'makemcp_data-stores_update', + description: `Update data store (data-stores): Update a data store.`, + params: [ + { + name: 'dataStoreId', + type: 'number', + required: true, + description: `The data store ID to update`, + }, + { + name: 'datastructureId', + type: 'number', + required: false, + description: `New data structure ID`, + }, + { + name: 'maxSizeMB', + type: 'number', + required: false, + description: `New maximum size in MB for the data store`, + }, + { name: 'name', type: 'string', required: false, description: `New name for the data store` }, + ], + }, + { + name: 'makemcp_data-structures_create', + description: `Create data structure (data-structures): Create a new data structure.`, + params: [ + { + name: 'name', + type: 'string', + required: true, + description: `The name of the data structure. The maximum length of the name is 128 characters`, + }, + { + name: 'spec', + type: 'array', + required: true, + description: `Sets the data structure specification. Each item follows the Make Parameters Syntax.`, + }, + { + name: 'strict', + type: 'boolean', + required: true, + description: `Set to true to enforce strict validation of the data put in the data structure`, + }, + { + name: 'teamId', + type: 'number', + required: true, + description: `The unique ID of the team in which the data structure will be created`, + }, + ], + }, + { + name: 'makemcp_data-structures_delete', + description: `Delete data structure (data-structures): Delete a data structure.`, + params: [ + { + name: 'dataStructureId', + type: 'number', + required: true, + description: `The data structure ID to delete`, + }, + ], + }, + { + name: 'makemcp_data-structures_generate', + description: `Generates Data Structure Definition in Make Parameters Format from the sample data provided as input.`, + params: [ + { + name: 'data', + type: 'string', + required: true, + description: `The input data from which the specification should be generated. The content of this field should match the format specified in the 'type' field.`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `The format of the input data from which the specification should be generated.`, + }, + ], + }, + { + name: 'makemcp_data-structures_get', + description: `Get data structure (data-structures): Get details of a specific data structure.`, + params: [ + { + name: 'dataStructureId', + type: 'number', + required: true, + description: `The data structure ID to retrieve`, + }, + ], + }, + { + name: 'makemcp_data-structures_list', + description: `List data structures (data-structures): List data structures for a team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to list data structures for`, + }, + ], + }, + { + name: 'makemcp_data-structures_update', + description: `Update data structure (data-structures): Update an existing data structure.`, + params: [ + { + name: 'dataStructureId', + type: 'number', + required: true, + description: `The data structure ID to update`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `The name of the data structure. The maximum length of the name is 128 characters`, + }, + { + name: 'spec', + type: 'array', + required: false, + description: `Sets the data structure specification. Each item follows the Make Parameters Syntax.`, + }, + { + name: 'strict', + type: 'boolean', + required: false, + description: `Set to true to enforce strict validation of the data put in the data structure`, + }, + ], + }, + { + name: 'makemcp_enums_countries', + description: `List countries (enums): List all available countries.`, + params: [], + }, + { + name: 'makemcp_enums_regions', + description: `List regions (enums): List all available regions.`, + params: [], + }, + { + name: 'makemcp_enums_timezones', + description: `List timezones (enums): List all available timezones.`, + params: [], + }, + { + name: 'makemcp_executions_get', + description: `Get execution (executions): Get details of a specific execution.`, + params: [ + { + name: 'executionId', + type: 'string', + required: true, + description: `The execution ID to retrieve`, + }, + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID the execution belongs to`, + }, + ], + }, + { + name: 'makemcp_executions_get-detail', + description: `Get execution detail (executions): Get detailed result of a specific execution.`, + params: [ + { + name: 'executionId', + type: 'string', + required: true, + description: `The execution ID to retrieve`, + }, + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID the execution belongs to`, + }, + ], + }, + { + name: 'makemcp_executions_list', + description: `List executions (executions): List executions for a scenario.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to list executions for`, + }, + { + name: 'from', + type: 'number', + required: false, + description: `Start timestamp for filtering`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by execution status`, + }, + { name: 'to', type: 'number', required: false, description: `End timestamp for filtering` }, + ], + }, + { + name: 'makemcp_extract_blueprint_components', + description: `This tool analyzes a given Blueprint and extracts a list of various Connections, Keys, Hooks and other components that are required to be provided in order to map the Blueprint properly.`, + params: [ + { + name: 'blueprint', + type: 'object', + required: true, + description: `A blueprint of a Make Scenario.`, + }, + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization in which context the extraction should operate.`, + }, + { + name: 'teamId', + type: 'integer', + required: true, + description: `The ID of the Team in which context the extraction should operate.`, + }, + ], + }, + { + name: 'makemcp_extract_module_components', + description: `Extracts the list of Components required by the particular Module. Use to identify what Connections, Keys, Hooks and other resources are needed to work with the Module.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App to which the module belongs.`, + }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `Version of the App to which the module belongs.`, + }, + { + name: 'moduleName', + type: 'string', + required: true, + description: `The name of the module to extract components from.`, + }, + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization in which context the extraction should operate.`, + }, + { + name: 'teamId', + type: 'integer', + required: true, + description: `The ID of the Team in which context the extraction should operate.`, + }, + { + name: 'includeOptions', + type: 'boolean', + required: false, + description: `When enabled, the Tool will also include available options for each extracted component, which are especially useful when configuring a module with Scoped Connections.`, + }, + { + name: 'moduleIdOverride', + type: 'integer', + required: false, + description: `When extracting the Components from Module, an artificial single-module Blueprint is created to run the extraction on. By default, the generated Module ID is #1. This parameter allows overriding the generated value.`, + }, + ], + }, + { + name: 'makemcp_folders_create', + description: `Create folder (folders): Create a new folder.`, + params: [ + { name: 'name', type: 'string', required: true, description: `Name of the folder` }, + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID where the folder will be created`, + }, + ], + }, + { + name: 'makemcp_folders_delete', + description: `Delete folder (folders): Delete a folder.`, + params: [ + { name: 'folderId', type: 'number', required: true, description: `The folder ID to delete` }, + ], + }, + { + name: 'makemcp_folders_list', + description: `List folders (folders): List folders for a team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to list folders for`, + }, + ], + }, + { + name: 'makemcp_folders_update', + description: `Update folder (folders): Update an existing folder.`, + params: [ + { name: 'folderId', type: 'number', required: true, description: `The folder ID to update` }, + { name: 'name', type: 'string', required: false, description: `New name for the folder` }, + ], + }, + { + name: 'makemcp_hook-config_get', + description: `Retrieves the manifest and form configuration of a hook of the given type. Use this to understand what fields are required when configuring a hook.`, + params: [ + { + name: 'typeName', + type: 'string', + required: true, + description: `The type name of the hook (e.g. "slack-events", "gateway-webhook", "gateway-mailhook").`, + }, + { + name: 'format', + type: 'string', + required: false, + description: `Format of the output allowing transformation before being returned.`, + }, + ], + }, + { + name: 'makemcp_hook-metadata_get', + description: `Retrieves metadata of the given hook, or returns an error when the hook type doesn't exist.`, + params: [ + { + name: 'typeName', + type: 'string', + required: true, + description: `Name of the Hook to retrieve metadata for.`, + }, + ], + }, + { + name: 'makemcp_hooks_create', + description: `Create webhook/mailhook (hooks): Create a new webhook/mailhook.`, + params: [ + { name: 'name', type: 'string', required: true, description: `The name of the webhook` }, + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID where the hook will be created`, + }, + { + name: 'typeName', + type: 'string', + required: true, + description: `The hook type related to the app for which it will be created`, + }, + { + name: 'data', + type: 'object', + required: false, + description: `Additional data specific to the hook type`, + }, + ], + }, + { + name: 'makemcp_hooks_delete', + description: `Delete webhook/mailhook (hooks): Delete a webhook/mailhook.`, + params: [ + { name: 'hookId', type: 'number', required: true, description: `The hook ID to delete` }, + ], + }, + { + name: 'makemcp_hooks_get', + description: `Get webhook/mailhook (hooks): Get details of a specific webhook/mailhook.`, + params: [ + { name: 'hookId', type: 'number', required: true, description: `The hook ID to retrieve` }, + ], + }, + { + name: 'makemcp_hooks_list', + description: `List webhooks/mailhooks (hooks): List webhooks/mailhooks for a specific team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to list hooks for`, + }, + ], + }, + { + name: 'makemcp_hooks_update', + description: `Update webhook/mailhook (hooks): Update an existing webhook/mailhook.`, + params: [ + { + name: 'data', + type: 'object', + required: true, + description: `New data configuration for the hook`, + }, + { name: 'hookId', type: 'number', required: true, description: `The hook ID to update` }, + ], + }, + { + name: 'makemcp_key-metadata_get', + description: `Retrieves metadata of the given key, or returns an error when the key type doesn't exist.`, + params: [ + { + name: 'typeName', + type: 'string', + required: true, + description: `Name of the Key to retrieve metadata for.`, + }, + ], + }, + { + name: 'makemcp_keys_delete', + description: `Delete key (keys): Delete a key.`, + params: [ + { name: 'keyId', type: 'number', required: true, description: `The key ID to delete` }, + ], + }, + { + name: 'makemcp_keys_get', + description: `Get key (keys): Get details of a specific key.`, + params: [ + { name: 'keyId', type: 'number', required: true, description: `The key ID to retrieve` }, + ], + }, + { + name: 'makemcp_keys_list', + description: `List keys (keys): List all keys for a team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to list keys for`, + }, + ], + }, + { + name: 'makemcp_organizations_create', + description: `Create organization (organizations): Create a new organization.`, + params: [ + { name: 'countryId', type: 'number', required: true, description: `The ID of the country` }, + { name: 'name', type: 'string', required: true, description: `Name of the organization` }, + { + name: 'regionId', + type: 'number', + required: true, + description: `The ID of the region the organization will be created in`, + }, + { name: 'timezoneId', type: 'number', required: true, description: `The ID of the timezone` }, + ], + }, + { + name: 'makemcp_organizations_delete', + description: `Delete organization (organizations): Delete an organization.`, + params: [ + { + name: 'organizationId', + type: 'number', + required: true, + description: `The organization ID to delete`, + }, + ], + }, + { + name: 'makemcp_organizations_get', + description: `Get organization (organizations): Get details of a specific organization.`, + params: [ + { + name: 'organizationId', + type: 'number', + required: true, + description: `The organization ID to retrieve`, + }, + ], + }, + { + name: 'makemcp_organizations_list', + description: `List organizations (organizations): List organizations for the current user.`, + params: [], + }, + { + name: 'makemcp_organizations_update', + description: `Update organization (organizations): Update an existing organization.`, + params: [ + { + name: 'organizationId', + type: 'number', + required: true, + description: `The organization ID to update`, + }, + { name: 'countryId', type: 'number', required: false, description: `New country ID` }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the organization`, + }, + { name: 'timezoneId', type: 'number', required: false, description: `New timezone ID` }, + ], + }, + { + name: 'makemcp_public-templates_get', + description: `Get public template (public-templates): Get details of a public template by its URL slug (e.g. "12289-add-webhook-data-to-a-google-sheet"). Use this for templates discovered via public-templates_list.`, + params: [ + { + name: 'templateUrl', + type: 'string', + required: true, + description: `The URL slug of the public template (e.g. "12289-add-webhook-data-to-a-google-sheet")`, + }, + ], + }, + { + name: 'makemcp_public-templates_get-blueprint', + description: `Get public template blueprint (public-templates): Get the full blueprint of a public template including scenario flow, controller configuration, scheduling, and metadata. Use this for templates discovered via public-templates_list.`, + params: [ + { + name: 'templateUrl', + type: 'string', + required: true, + description: `The URL slug of the public template (e.g. "12289-add-webhook-data-to-a-google-sheet")`, + }, + ], + }, + { + name: 'makemcp_public-templates_list', + description: `List public templates (public-templates): Search and list public (approved) templates available for anyone. Supports name-based search for template discovery. Results are sorted by usage by default.`, + params: [ + { + name: 'includeEn', + type: 'boolean', + required: false, + description: `Whether to include English-language public templates in results`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Search public templates by name`, + }, + { + name: 'usedApps', + type: 'array', + required: false, + description: `Filter public templates by apps used`, + }, + ], + }, + { + name: 'makemcp_rpc_execute', + description: `Executes a Make Remote Procedure Call (RPC) with the provided input.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App from which the RPC should be executed.`, + }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `Version of the App from which the RPC should be executed.`, + }, + { + name: 'data', + type: 'object', + required: true, + description: `Object containing input values of the RPC.`, + }, + { + name: 'rpcName', + type: 'string', + required: true, + description: `Name of the RPC to be executed.`, + }, + { + name: 'format', + type: 'string', + required: false, + description: `Format of the output allowing transformation before being returned.`, + }, + ], + }, + { + name: 'makemcp_scenarios_activate', + description: `Activate scenario (scenarios): Activate a scenario.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to activate`, + }, + ], + }, + { + name: 'makemcp_scenarios_create', + description: `Create scenario (scenarios): Create a new scenario.`, + params: [ + { + name: 'blueprint', + type: 'string', + required: true, + description: `Blueprint containing the scenario configuration`, + }, + { + name: 'scheduling', + type: 'string', + required: true, + description: `Scheduling configuration for the scenario`, + }, + { + name: 'teamId', + type: 'number', + required: true, + description: `ID of the team where the scenario will be created`, + }, + { + name: 'basedon', + type: 'string', + required: false, + description: `ID of an existing template to base this one on`, + }, + { + name: 'confirmed', + type: 'boolean', + required: false, + description: `Confirmation in case the scenario uses apps that are not yet installed`, + }, + { + name: 'folderId', + type: 'number', + required: false, + description: `ID of the folder where the scenario will be placed`, + }, + ], + }, + { + name: 'makemcp_scenarios_deactivate', + description: `Deactivate scenario (scenarios): Deactivate a scenario.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to deactivate`, + }, + ], + }, + { + name: 'makemcp_scenarios_delete', + description: `Delete scenario (scenarios): Delete a scenario.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to delete`, + }, + ], + }, + { + name: 'makemcp_scenarios_get', + description: `Get scenario (scenarios): Get a scenario and its blueprint by ID.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to retrieve`, + }, + ], + }, + { + name: 'makemcp_scenarios_interface', + description: `Get scenario interface (scenarios): Get the interface for a scenario.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to get the interface for`, + }, + ], + }, + { + name: 'makemcp_scenarios_list', + description: `List scenarios (scenarios): List all scenarios for a team.`, + params: [ + { + name: 'teamId', + type: 'number', + required: true, + description: `The team ID to filter scenarios by`, + }, + ], + }, + { + name: 'makemcp_scenarios_run', + description: `Run scenario (scenarios): Execute a scenario with optional input data.`, + params: [ + { name: 'scenarioId', type: 'number', required: true, description: `The scenario ID to run` }, + { + name: 'callbackUrl', + type: 'string', + required: false, + description: `URL to call once the scenario execution finishes`, + }, + { + name: 'data', + type: 'object', + required: false, + description: `Optional input data for the scenario`, + }, + { + name: 'responsive', + type: 'boolean', + required: false, + description: `Whether to run responsively`, + }, + ], + }, + { + name: 'makemcp_scenarios_set-interface', + description: `Set scenario interface (scenarios): Update the interface for a scenario.`, + params: [ + { + name: 'interface', + type: 'object', + required: true, + description: `The interface definition with input and output specifications`, + }, + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to update the interface for`, + }, + ], + }, + { + name: 'makemcp_scenarios_update', + description: `Update scenario (scenarios): Update a scenario.`, + params: [ + { + name: 'scenarioId', + type: 'number', + required: true, + description: `The scenario ID to update`, + }, + { + name: 'blueprint', + type: 'string', + required: false, + description: `Updated blueprint configuration`, + }, + { + name: 'confirmed', + type: 'boolean', + required: false, + description: `Confirmation in case the scenario uses apps that are not yet installed`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `New description for the scenario`, + }, + { + name: 'folderId', + type: 'number', + required: false, + description: `New folder ID for the scenario`, + }, + { name: 'name', type: 'string', required: false, description: `New name for the scenario` }, + { + name: 'scheduling', + type: 'string', + required: false, + description: `Updated scheduling configuration`, + }, + ], + }, + { + name: 'makemcp_teams_create', + description: `Create team (teams): Create a new team.`, + params: [ + { name: 'name', type: 'string', required: true, description: `Name for the new team` }, + { + name: 'organizationId', + type: 'number', + required: true, + description: `ID of the organization where the team will be created`, + }, + { + name: 'operationsLimit', + type: 'number', + required: false, + description: `Maximum operations limit for the team`, + }, + { + name: 'transferLimit', + type: 'number', + required: false, + description: `Maximum data transfer limit for the team`, + }, + ], + }, + { + name: 'makemcp_teams_delete', + description: `Delete team (teams): Delete a team.`, + params: [ + { name: 'teamId', type: 'number', required: true, description: `The team ID to delete` }, + ], + }, + { + name: 'makemcp_teams_get', + description: `Get team (teams): Get details of a specific team.`, + params: [ + { name: 'teamId', type: 'number', required: true, description: `The team ID to retrieve` }, + ], + }, + { + name: 'makemcp_teams_list', + description: `List teams (teams): List teams for the current user.`, + params: [ + { + name: 'organizationId', + type: 'number', + required: true, + description: `The organization ID to list teams for`, + }, + ], + }, + { + name: 'makemcp_tools_create', + description: `This tool creates a new Tool in the system based on provided parameters.`, + params: [ + { + name: 'description', + type: 'string', + required: true, + description: `A brief description of what the Tool does.`, + }, + { + name: 'inputs', + type: 'array', + required: true, + description: `An array of input parameters that the Tool accepts.`, + }, + { + name: 'module', + type: 'object', + required: true, + description: `Details of the module that the Tool will encapsulate.`, + }, + { name: 'name', type: 'string', required: true, description: `The name of the Tool.` }, + { + name: 'teamId', + type: 'integer', + required: true, + description: `The ID of the Team under which the Tool will be created.`, + }, + ], + }, + { + name: 'makemcp_tools_get', + description: `Retrieves details of a specific Tool by its ID.`, + params: [ + { + name: 'toolId', + type: 'integer', + required: true, + description: `The ID of the Tool to be retrieved.`, + }, + ], + }, + { + name: 'makemcp_tools_update', + description: `This tool updates an existing Tool's details based on provided parameters.`, + params: [ + { + name: 'toolId', + type: 'integer', + required: true, + description: `The ID of the Tool to be updated.`, + }, + { + name: 'description', + type: 'string', + required: false, + description: `A brief description of what the Tool does.`, + }, + { + name: 'inputs', + type: 'array', + required: false, + description: `An array of input parameters that the Tool accepts.`, + }, + { + name: 'module', + type: 'object', + required: false, + description: `Details of the module that the Tool will encapsulate.`, + }, + { name: 'name', type: 'string', required: false, description: `The name of the Tool.` }, + ], + }, + { + name: 'makemcp_users_me', + description: `Get current user (users): Get details of the current user.`, + params: [], + }, + { + name: 'makemcp_validate_blueprint_schema', + description: `Validates the overall structure of the Scenario Blueprint against the Schema.`, + params: [ + { + name: 'blueprint', + type: 'object', + required: true, + description: `A blueprint of a Make Scenario.`, + }, + ], + }, + { + name: 'makemcp_validate_epoch_configuration', + description: `Validates the Epoch Configuration of particular Trigger Module.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App to which the module belongs.`, + }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `Version of the App to which the module belongs.`, + }, + { + name: 'epoch', + type: 'object', + required: true, + description: `Module "epoch" configuration to be validated. This collection represents settings for trigger pointer (what epoch to watch).`, + }, + { + name: 'moduleName', + type: 'string', + required: true, + description: `The name of the module to validate the configuration for.`, + }, + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization in which context the Validation should operate.`, + }, + { + name: 'parameters', + type: 'object', + required: true, + description: `Module "parameters" configuration. Since Epoch exists only on triggers, there are no dynamic parameters. This collection is not directly validated, but serves as context for RPC calls, which are based on the module configuration.`, + }, + { + name: 'teamId', + type: 'integer', + required: true, + description: `The ID of the Team in which context the Validation should operate.`, + }, + { + name: 'strict', + type: 'boolean', + required: false, + description: `Enforces strict validation mode, which is guarding against unknown parameters in the configuration. Don't turn off unless necessary.`, + }, + ], + }, + { + name: 'makemcp_validate_hook_configuration', + description: `This tool validates that hook configuration values are correctly set for a given hook type.`, + params: [ + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization in which context the Validation should operate.`, + }, + { + name: 'teamId', + type: 'integer', + required: true, + description: `The ID of the Team in which context the Validation should operate.`, + }, + { + name: 'typeName', + type: 'string', + required: true, + description: `The type name of the hook to validate the configuration for (e.g. "slack-events", "gateway-webhook", "gateway-mailhook").`, + }, + { + name: 'values', + type: 'object', + required: true, + description: `Hook configuration values to be validated against the form schema.`, + }, + { + name: 'strict', + type: 'boolean', + required: false, + description: `Enforces strict validation mode, which is guarding against unknown parameters in the configuration. Don't turn off unless necessary.`, + }, + ], + }, + { + name: 'makemcp_validate_module_configuration', + description: `This tool validates that parameters and mapper collection are correctly configured for a given module in a given app.`, + params: [ + { + name: 'appName', + type: 'string', + required: true, + description: `Name of the App to which the module belongs.`, + }, + { + name: 'appVersion', + type: 'integer', + required: true, + description: `Version of the App to which the module belongs.`, + }, + { + name: 'mapper', + type: 'object', + required: true, + description: `Module "mapper" configuration to be validated. These are dynamic parameters.`, + }, + { + name: 'moduleName', + type: 'string', + required: true, + description: `The name of the module to validate the configuration for.`, + }, + { + name: 'organizationId', + type: 'integer', + required: true, + description: `The ID of the Organization in which context the Validation should operate.`, + }, + { + name: 'parameters', + type: 'object', + required: true, + description: `Module "parameters" configuration to be validated. These are static parameters.`, + }, + { + name: 'teamId', + type: 'integer', + required: true, + description: `The ID of the Team in which context the Validation should operate.`, + }, + { + name: 'restoreExtras', + type: 'object', + required: false, + description: `Dictionary of values to be stored as part of 'extra' entry in the field's restore object.`, + }, + { + name: 'schemas', + type: 'boolean', + required: false, + description: `Enables generation of fully expanded Forman schemas with all dynamic nested fields resolved.`, + }, + { + name: 'states', + type: 'boolean', + required: false, + description: `Enables generation of Field States, which can be fed into Make Frontend Components for better user experience.`, + }, + { + name: 'strict', + type: 'boolean', + required: false, + description: `Enforces strict validation mode, which is guarding against unknown parameters in the configuration. Don't turn off unless necessary.`, + }, + ], + }, + { + name: 'makemcp_validate_scheduling_schema', + description: `Validates the Scheduling of the Scenario against the Schema.`, + params: [ + { + name: 'scheduling', + type: 'object', + required: true, + description: `A scheduling configuration of a Make Scenario.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/tavilymcp.ts b/src/data/agent-connectors/tavilymcp.ts new file mode 100644 index 000000000..d62bd1dd5 --- /dev/null +++ b/src/data/agent-connectors/tavilymcp.ts @@ -0,0 +1,276 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'tavilymcp_tavily_crawl', + description: `Crawl a website from a starting URL and extract page content with configurable depth and breadth.`, + params: [ + { + name: 'url', + type: 'string', + required: true, + description: `The root URL to begin the crawl`, + }, + { + name: 'allow_external', + type: 'boolean', + required: false, + description: `Whether to return external links in the final response`, + }, + { + name: 'extract_depth', + type: 'string', + required: false, + description: `Advanced extraction retrieves more data, including tables and embedded content, with higher success but may increase latency`, + }, + { + name: 'format', + type: 'string', + required: false, + description: `The format of the extracted web page content. markdown returns content in markdown format. text returns plain text and may increase latency.`, + }, + { + name: 'include_favicon', + type: 'boolean', + required: false, + description: `Whether to include the favicon URL for each result`, + }, + { + name: 'instructions', + type: 'string', + required: false, + description: `Natural language instructions for the crawler. Instructions specify which types of pages the crawler should return.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Total number of links the crawler will process before stopping`, + }, + { + name: 'max_breadth', + type: 'integer', + required: false, + description: `Max number of links to follow per level of the tree (i.e., per page)`, + }, + { + name: 'max_depth', + type: 'integer', + required: false, + description: `Max depth of the crawl. Defines how far from the base URL the crawler can explore.`, + }, + { + name: 'select_domains', + type: 'array', + required: false, + description: `Regex patterns to restrict crawling to specific domains or subdomains (e.g., ^docs\\.example\\.com$)`, + }, + { + name: 'select_paths', + type: 'array', + required: false, + description: `Regex patterns to select only URLs with specific path patterns (e.g., /docs/.*, /api/v1.*)`, + }, + ], + }, + { + name: 'tavilymcp_tavily_extract', + description: `Extract raw content from one or more URLs in markdown or plain text format.`, + params: [ + { + name: 'urls', + type: 'array', + required: true, + description: `List of URLs to extract content from`, + }, + { + name: 'extract_depth', + type: 'string', + required: false, + description: `Use 'advanced' for LinkedIn, protected sites, or tables/embedded content`, + }, + { name: 'format', type: 'string', required: false, description: `Output format` }, + { + name: 'include_favicon', + type: 'boolean', + required: false, + description: `Include favicon URLs`, + }, + { + name: 'include_images', + type: 'boolean', + required: false, + description: `Include images from pages`, + }, + { + name: 'query', + type: 'string', + required: false, + description: `Query to rerank content chunks by relevance`, + }, + ], + }, + { + name: 'tavilymcp_tavily_map', + description: `Map a website's URL structure starting from a base URL.`, + params: [ + { + name: 'url', + type: 'string', + required: true, + description: `The root URL to begin the mapping`, + }, + { + name: 'allow_external', + type: 'boolean', + required: false, + description: `Whether to return external links in the final response`, + }, + { + name: 'instructions', + type: 'string', + required: false, + description: `Natural language instructions for the crawler`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Total number of links the crawler will process before stopping`, + }, + { + name: 'max_breadth', + type: 'integer', + required: false, + description: `Max number of links to follow per level of the tree (i.e., per page)`, + }, + { + name: 'max_depth', + type: 'integer', + required: false, + description: `Max depth of the mapping. Defines how far from the base URL the crawler can explore`, + }, + { + name: 'select_domains', + type: 'array', + required: false, + description: `Regex patterns to restrict crawling to specific domains or subdomains (e.g., ^docs\\.example\\.com$)`, + }, + { + name: 'select_paths', + type: 'array', + required: false, + description: `Regex patterns to select only URLs with specific path patterns (e.g., /docs/.*, /api/v1.*)`, + }, + ], + }, + { + name: 'tavilymcp_tavily_research', + description: `Run comprehensive multi-source research on a topic or question.`, + params: [ + { + name: 'input', + type: 'string', + required: true, + description: `A comprehensive description of the research task`, + }, + { + name: 'model', + type: 'string', + required: false, + description: `Defines the degree of depth of the research. 'mini' is good for narrow tasks with few subtopics. 'pro' is good for broad tasks with many subtopics`, + }, + ], + }, + { + name: 'tavilymcp_tavily_search', + description: `Search the web for current information and return snippets with source URLs.`, + params: [ + { name: 'query', type: 'string', required: true, description: `Search query` }, + { + name: 'country', + type: 'string', + required: false, + description: `Boost search results from a specific country. Must be a full country name (e.g., 'United States', 'Japan', 'Germany'). ISO country codes (e.g., 'us', 'jp') are not supported. Available only if topic is general. See https://docs.tavily.com/documentation/api-reference/search for the full list of supported countries.`, + }, + { + name: 'end_date', + type: 'string', + required: false, + description: `Will return all results before the specified end date. Required to be written in the format YYYY-MM-DD`, + }, + { + name: 'exact_match', + type: 'string', + required: false, + description: `Only return results containing the exact phrase(s) in quotes in your query`, + }, + { + name: 'exclude_domains', + type: 'array', + required: false, + description: `List of domains to specifically exclude, if the user asks to exclude a domain set this to the domain of the site`, + }, + { + name: 'include_domains', + type: 'array', + required: false, + description: `A list of domains to specifically include in the search results, if the user asks to search on specific sites set this to the domain of the site`, + }, + { + name: 'include_favicon', + type: 'boolean', + required: false, + description: `Whether to include the favicon URL for each result`, + }, + { + name: 'include_image_descriptions', + type: 'boolean', + required: false, + description: `Include a list of query-related images and their descriptions in the response`, + }, + { + name: 'include_images', + type: 'boolean', + required: false, + description: `Include a list of query-related images in the response`, + }, + { + name: 'include_raw_content', + type: 'boolean', + required: false, + description: `Include the cleaned and parsed HTML content of each search result`, + }, + { + name: 'max_results', + type: 'integer', + required: false, + description: `The maximum number of search results to return`, + }, + { + name: 'search_depth', + type: 'string', + required: false, + description: `The depth of the search. 'basic' for generic results, 'advanced' for more thorough search, 'fast' for optimized low latency with high relevance, 'ultra-fast' for prioritizing latency above all else`, + }, + { + name: 'start_date', + type: 'string', + required: false, + description: `Will return all results after the specified start date. Required to be written in the format YYYY-MM-DD.`, + }, + { + name: 'time_range', + type: 'string', + required: false, + description: `The time range back from the current date to include in the search results`, + }, + { + name: 'topic', + type: 'string', + required: false, + description: `The category of the search. This will determine which of our agents will be used for the search`, + }, + ], + }, +] From 774ae9c24845e0015fdcf24210a910351c607848 Mon Sep 17 00:00:00 2001 From: Pranesh Date: Fri, 22 May 2026 21:32:46 +0530 Subject: [PATCH 06/10] revert: restore svg files unchanged from main --- public/d2/docs/agentkit/authentication/token-management-0.svg | 2 +- public/d2/docs/agentkit/mcp/configure-mcp-server-0.svg | 2 +- public/d2/docs/agentkit/mcp/configure-mcp-server-1.svg | 2 +- public/d2/docs/agentkit/mcp/configure-mcp-server-2.svg | 2 +- public/d2/docs/agentkit/openclaw-0.svg | 2 +- public/d2/docs/agentkit/overview-0.svg | 2 +- public/d2/docs/agentkit/user-verification-0.svg | 2 +- .../authenticate/implement-workflows/implement-webhooks-0.svg | 2 +- .../docs/authenticate/interceptors/auth-flow-interceptors-0.svg | 2 +- public/d2/docs/authenticate/mcp/auth-patterns-0.svg | 2 +- public/d2/docs/authenticate/mcp/auth-patterns-1.svg | 2 +- public/d2/docs/authenticate/mcp/auth-patterns-2.svg | 2 +- public/d2/docs/authenticate/mcp/auth-patterns-3.svg | 2 +- public/d2/docs/authenticate/mcp/auth-patterns-4.svg | 2 +- public/d2/docs/authenticate/mcp/custom-auth-0.svg | 2 +- public/d2/docs/authenticate/mcp/expressjs-quickstart-0.svg | 2 +- .../d2/docs/authenticate/mcp/fastapi-fastmcp-quickstart-0.svg | 2 +- public/d2/docs/authenticate/mcp/fastmcp-quickstart-0.svg | 2 +- public/d2/docs/authenticate/mcp/intro-to-mcp-auth-0.svg | 2 +- public/d2/docs/authenticate/mcp/intro-to-mcp-auth-1.svg | 2 +- public/d2/docs/authenticate/mcp/intro-to-mcp-auth-2.svg | 2 +- public/d2/docs/authenticate/mcp/overview-0.svg | 2 +- public/d2/docs/authenticate/mcp/overview-1.svg | 2 +- public/d2/docs/authenticate/mcp/overview-2.svg | 2 +- public/d2/docs/authenticate/mcp/overview-3.svg | 2 +- public/d2/docs/authenticate/mcp/topologies/agent-mcp-0.svg | 2 +- public/d2/docs/authenticate/mcp/topologies/human-mcp-0.svg | 2 +- public/d2/docs/authenticate/mcp/topologies/mcp-api-0.svg | 2 +- public/d2/docs/authenticate/mcp/topologies/mcp-api-1.svg | 2 +- public/d2/docs/authenticate/mcp/topologies/mcp-api-2.svg | 2 +- public/d2/docs/dev-kit/tools/use-scalekit-credentials-0.svg | 2 +- .../d2/docs/directory/guides/group-based-role-assignment-0.svg | 2 +- public/d2/docs/fsa/guides/manage-users-0.svg | 2 +- public/d2/docs/fsa/guides/user-invitations-0.svg | 2 +- public/d2/docs/guides/integrations/auth-systems/firebase-0.svg | 2 +- public/d2/docs/guides/integrations/auth-systems/firebase-1.svg | 2 +- public/d2/docs/guides/sso/sso-migration-strategy-0.svg | 2 +- public/d2/docs/guides/sso/sso-migration-strategy-1.svg | 2 +- public/d2/docs/mcp/auth-methods/custom-auth-0.svg | 2 +- public/d2/docs/mcp/auth-methods/enterprise-0.svg | 2 +- public/d2/docs/passwordless/oidc-0.svg | 2 +- public/d2/docs/sso/guides/idp-init-sso-0.svg | 2 +- public/d2/docs/sso/guides/idp-init-sso-1.svg | 2 +- 43 files changed, 43 insertions(+), 43 deletions(-) diff --git a/public/d2/docs/agentkit/authentication/token-management-0.svg b/public/d2/docs/agentkit/authentication/token-management-0.svg index 36ba4c950..e658be0fa 100644 --- a/public/d2/docs/agentkit/authentication/token-management-0.svg +++ b/public/d2/docs/agentkit/authentication/token-management-0.svg @@ -1,4 +1,4 @@ -