From bc2c60013ded089fe1cf4719e476bdfa242f719f Mon Sep 17 00:00:00 2001 From: Pranesh Date: Mon, 1 Jun 2026 17:53:41 +0530 Subject: [PATCH 1/6] =?UTF-8?q?chore(docs):=20sync=20agent=20connector=20b?= =?UTF-8?q?acklog=20=E2=80=94=20add=208=20new=20connector=20pages,=20fix?= =?UTF-8?q?=20broken=20/agentkit=20link,=20remove=20hubspot=20gif?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Synced 126 connector pages from prod catalog - Added 8 new connector setup guides: firefliesmcp, googlelooker, lunarcrushmcp, mercurymcp, sybilmcp, ticktickmcp, tinyfishmcp, zenrowsmcp - Fixed broken `/agentkit` link in fastrouter cookbook → `/agentkit/connections` - Removed missing `add-scopes.gif` reference from HubSpot optional-scopes section template - Updated connector configs and metadata across 21 existing connector pages --- ...fore-tool-list-hubspot-optional-scopes.mdx | 2 - .../docs/agentkit/connectors/firefliesmcp.mdx | 72 ++ .../docs/agentkit/connectors/googlelooker.mdx | 69 ++ .../docs/agentkit/connectors/linkedin.mdx | 4 +- .../agentkit/connectors/lunarcrushmcp.mdx | 72 ++ .../docs/agentkit/connectors/mercurymcp.mdx | 72 ++ .../docs/agentkit/connectors/sybilmcp.mdx | 69 ++ .../docs/agentkit/connectors/ticktickmcp.mdx | 72 ++ .../docs/agentkit/connectors/tinyfishmcp.mdx | 72 ++ .../docs/agentkit/connectors/zendesk.mdx | 12 +- .../docs/agentkit/connectors/zenrowsmcp.mdx | 72 ++ .../fastrouter-agentkit-tool-calling.mdx | 2 +- src/data/agent-connectors/catalog.ts | 42 +- src/data/agent-connectors/firefliesmcp.ts | 333 +++++++ src/data/agent-connectors/gainsight.ts | 17 +- src/data/agent-connectors/googlelooker.ts | 334 +++++++ src/data/agent-connectors/hubspot.ts | 114 +++ src/data/agent-connectors/linkedin.ts | 810 +++++++++++++--- src/data/agent-connectors/lunarcrushmcp.ts | 370 ++++++++ src/data/agent-connectors/mercurymcp.ts | 612 +++++++++++++ src/data/agent-connectors/sybilmcp.ts | 250 +++++ src/data/agent-connectors/ticktickmcp.ts | 635 +++++++++++++ src/data/agent-connectors/tinyfishmcp.ts | 545 +++++++++++ src/data/agent-connectors/zendesk.ts | 863 ++++++++++++++++-- src/data/agent-connectors/zenrowsmcp.ts | 773 ++++++++++++++++ 25 files changed, 6086 insertions(+), 202 deletions(-) create mode 100644 src/content/docs/agentkit/connectors/firefliesmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/googlelooker.mdx create mode 100644 src/content/docs/agentkit/connectors/lunarcrushmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/mercurymcp.mdx create mode 100644 src/content/docs/agentkit/connectors/sybilmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/ticktickmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/tinyfishmcp.mdx create mode 100644 src/content/docs/agentkit/connectors/zenrowsmcp.mdx create mode 100644 src/data/agent-connectors/firefliesmcp.ts create mode 100644 src/data/agent-connectors/googlelooker.ts create mode 100644 src/data/agent-connectors/lunarcrushmcp.ts create mode 100644 src/data/agent-connectors/mercurymcp.ts create mode 100644 src/data/agent-connectors/sybilmcp.ts create mode 100644 src/data/agent-connectors/ticktickmcp.ts create mode 100644 src/data/agent-connectors/tinyfishmcp.ts create mode 100644 src/data/agent-connectors/zenrowsmcp.ts 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 index 0ae1af050..bd6b3d364 100644 --- 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 @@ -42,8 +42,6 @@ Click **Add new scope** and select the optional scopes your app needs. Optional ### 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/content/docs/agentkit/connectors/firefliesmcp.mdx b/src/content/docs/agentkit/connectors/firefliesmcp.mdx new file mode 100644 index 000000000..9483fde3b --- /dev/null +++ b/src/content/docs/agentkit/connectors/firefliesmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Fireflies MCP connector' +tableOfContents: true +description: 'Connect to Fireflies MCP. Search meeting transcripts, fetch recordings, manage channels, create soundbites, and retrieve analytics from your AI workflows.' +sidebar: + label: 'Fireflies MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/fireflies.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Transcription, 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/firefliesmcp' +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 fireflies** — Rename a meeting transcript by its ID +- **Meeting fireflies share, fireflies move** — Share a meeting transcript with one or more email addresses +- **Search fireflies** — Search meeting transcripts using keywords or Fireflies mini-grammar syntax +- **Access fireflies revoke meeting** — Revoke a previously shared meeting access for a specific email address +- **List fireflies** — List all channels (folders) available to the authenticated user +- **Get fireflies** — Fetch user groups for the authenticated user or their team + +## 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/googlelooker.mdx b/src/content/docs/agentkit/connectors/googlelooker.mdx new file mode 100644 index 000000000..74fb9a39d --- /dev/null +++ b/src/content/docs/agentkit/connectors/googlelooker.mdx @@ -0,0 +1,69 @@ +--- +title: 'Google Looker connector' +tableOfContents: true +description: 'Connect to Google Looker or self-hosted Looker Core. Browse dashboards, run Looks, query LookML models, and access BI data programmatically.' +sidebar: + label: 'Google Looker' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/googlelooker.svg +connectorAuthType: OAuth 2.0 +connectorCategories: [analytics, business_intelligence, data_visualization, 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/googlelooker' +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: + +- **Run look, inline query** — Run a saved Look and return the results in the specified format +- **List models, looks, folders** — List all available LookML models in the Looker instance +- **Get look results, dashboard** — Run a saved Look and return results in the specified format + +## 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/linkedin.mdx b/src/content/docs/agentkit/connectors/linkedin.mdx index 23b7ee377..55b8921ee 100644 --- a/src/content/docs/agentkit/connectors/linkedin.mdx +++ b/src/content/docs/agentkit/connectors/linkedin.mdx @@ -1,13 +1,13 @@ --- title: 'LinkedIn connector' tableOfContents: true -description: 'Connect to LinkedIn to manage user authentication, profile data, email, and professional identity via OAuth 2.0' +description: 'Connect to LinkedIn to manage posts, ads, organizations, analytics, and professional profiles from your AI workflows.' sidebar: label: 'LinkedIn' overviewTitle: 'Quickstart' connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg connectorAuthType: OAuth 2.0 -connectorCategories: [CRM & Sales] +connectorCategories: [CRM & Sales, Marketing, Communication] head: - tag: style content: | diff --git a/src/content/docs/agentkit/connectors/lunarcrushmcp.mdx b/src/content/docs/agentkit/connectors/lunarcrushmcp.mdx new file mode 100644 index 000000000..e9409715e --- /dev/null +++ b/src/content/docs/agentkit/connectors/lunarcrushmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Lunarcrush MCP connector' +tableOfContents: true +description: 'Connect to LunarCrush MCP. Access social intelligence, sentiment analytics, and market data for crypto assets from your AI workflows.' +sidebar: + label: 'Lunarcrush MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/lunarcrush.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Analytics, AI, Accounting & Finance] +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/lunarcrushmcp' +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: + +- **Series topic time, keyword time, creator time** — Get historical time-series social metrics for a social topic, keyword, cryptocurrency, or stock +- **Posts topic, keyword, creator** — Get top social posts by interactions for a topic over a given time period +- **Topic records** — Get a summary snapshot of all social metrics and insights for any social topic, keyword, or asset +- **Stocks records** — Get a list of stocks sorted by social metrics and optionally filtered by sector +- **Search records** — Search for any keyword or account and return matching topics, creators, and assets +- **Post records** — Get details for a specific social post by network and post 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/mercurymcp.mdx b/src/content/docs/agentkit/connectors/mercurymcp.mdx new file mode 100644 index 000000000..131dcdc73 --- /dev/null +++ b/src/content/docs/agentkit/connectors/mercurymcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Mercury MCP connector' +tableOfContents: true +description: 'Connect to Mercury. Access accounts, transactions, recipients, invoices, treasury, webhooks, and approval requests for startup banking workflows.' +sidebar: + label: 'Mercury MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/mercury.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Accounting & Finance, Analytics, 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/mercurymcp' +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: + +- **Listtransactions records** — Retrieve a paginated list of transactions across all accounts with advanced filtering +- **Listsendmoneyapprovalrequests records** — Retrieve a paginated list of send money approval requests with optional filtering +- **Listrecipientsattachments records** — Retrieve a paginated list of all recipient tax form attachments across the organization +- **Listinvoices records** — Retrieve a paginated list of all invoices +- **Listinvoiceattachments records** — Retrieve all attachments for a specific invoice +- **Listcustomers records** — Retrieve a paginated list of all customers + +## 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/sybilmcp.mdx b/src/content/docs/agentkit/connectors/sybilmcp.mdx new file mode 100644 index 000000000..173dd0622 --- /dev/null +++ b/src/content/docs/agentkit/connectors/sybilmcp.mdx @@ -0,0 +1,69 @@ +--- +title: 'Sybill MCP connector' +tableOfContents: true +description: 'Connect to Sybill. Access AI-generated summaries of sales calls, deals, accounts, and conversations to accelerate B2B revenue workflows.' +sidebar: + label: 'Sybill MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/sybill.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [CRM & Sales, AI, 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/sybilmcp' +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: + +- **Sybill ask** — Ask Sybill AI about your sales calls, deals, accounts, or contacts +- **List conversations, accounts, deals** — List sales conversations with optional filters for date range, meeting type, and attendees +- **Get conversation, deal, account** — Get full details of a single conversation including summary, transcript, and recording URLs + +## 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/ticktickmcp.mdx b/src/content/docs/agentkit/connectors/ticktickmcp.mdx new file mode 100644 index 000000000..2ab6595c6 --- /dev/null +++ b/src/content/docs/agentkit/connectors/ticktickmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'TickTick MCP connector' +tableOfContents: true +description: 'Connect to TickTick MCP. Manage tasks, projects, habits, and focus sessions in your TickTick account from AI workflows.' +sidebar: + label: 'TickTick MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/ticktick .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/ticktickmcp' +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: + +- **Checkins upsert habit** — Create or update check-in records for a habit by habitId +- **Update task, project group, project** — Update an existing task's fields +- **Search task** — Search tasks by keyword and return matching taskId, title, and URL +- **Task move, complete** — Move tasks to different projects +- **List undone tasks by time query, undone tasks by date, tags** — List undone tasks using a predefined time query: today, last24hour, last7day, tomorrow, or nextWeek +- **Get user preference, task in project, task by id** — Get user preferences including timezone and display settings + +## 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/tinyfishmcp.mdx b/src/content/docs/agentkit/connectors/tinyfishmcp.mdx new file mode 100644 index 000000000..513e3c9a8 --- /dev/null +++ b/src/content/docs/agentkit/connectors/tinyfishmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'Tinyfish MCP connector' +tableOfContents: true +description: 'Connect to Tinyfish MCP. Run browser-based web automations, fetch page content, and search the web using a real cloud Chrome browser.' +sidebar: + label: 'Tinyfish MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/tinyfish.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Automation, 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/tinyfishmcp' +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 the web and return structured results with titles, snippets, and URLs +- **Run web automation async, web automation, discover** — Start a single web automation in the background and return the run ID immediately without waiting for completion +- **Status poll, batch** — Return the current status, step count, and progress for an automation run +- **List runs, fetch usage, browser sessions** — List automation runs with optional filtering by status, goal text, and date range, with cursor-based pagination +- **Get steps, search usage, run** — Retrieve the step-by-step execution trace for an automation run, including screenshots captured at each step +- **Fetch content** — Render up to 10 URLs in a real browser and return clean structured content (markdown, HTML, or JSON) plus metadata like title, author, and publish date + +## 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/zendesk.mdx b/src/content/docs/agentkit/connectors/zendesk.mdx index abde8c4df..004b31ab4 100644 --- a/src/content/docs/agentkit/connectors/zendesk.mdx +++ b/src/content/docs/agentkit/connectors/zendesk.mdx @@ -66,12 +66,12 @@ import { SectionAfterSetupZendeskCommonWorkflows } from '@components/templates' Connect this agent connector to let your agent: -- **Get side conversation, user, ticket** — Retrieve a specific side conversation on a Zendesk ticket by its ID -- **List side conversations, tickets, views** — List all side conversations on a Zendesk ticket -- **Update ticket** — Update an existing Zendesk ticket -- **Reply ticket** — Add a public reply or internal note to a Zendesk ticket -- **Search tickets** — Search Zendesk tickets using a query string -- **Create user, ticket** — Create a new user in Zendesk +- **List help center sections, help center categories, help center articles** — List all Help Center sections +- **Get help center section, help center category, help center article** — Retrieve a single Help Center section by its ID +- **Search help center articles, tickets** — Search Help Center articles by keyword +- **Update help center article, ticket** — Update article-level metadata: promoted status, position, comments setting, labels, and content tags +- **Create help center article, help center article comment, user** — Create a new Help Center article in a section +- **Archive help center article** — Archive (delete) a Help Center article by ID ## Common workflows diff --git a/src/content/docs/agentkit/connectors/zenrowsmcp.mdx b/src/content/docs/agentkit/connectors/zenrowsmcp.mdx new file mode 100644 index 000000000..dffc1e3f1 --- /dev/null +++ b/src/content/docs/agentkit/connectors/zenrowsmcp.mdx @@ -0,0 +1,72 @@ +--- +title: 'ZenRows MCP connector' +tableOfContents: true +description: 'Connect to ZenRows MCP. Scrape any webpage with anti-bot bypass, render JavaScript-heavy sites, and automate browsers through ZenRows'' cloud...' +sidebar: + label: 'ZenRows MCP' +overviewTitle: 'Quickstart' +connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/zenrows.svg +connectorAuthType: OAuth 2.1/DCR +connectorCategories: [Developer Tools, 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/zenrowsmcp' +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: + +- **Scrape records** — Scrape any webpage and return its content using ZenRows +- **Selector browser wait for** — Wait until an element matching a CSS selector appears in the DOM +- **Navigation browser wait for** — Wait for a page navigation to complete after triggering a link or form submission +- **Wait browser** — Pause execution for a specified number of milliseconds +- **Uncheck browser** — Uncheck a checkbox identified by a CSS selector +- **Type browser** — Type text into the focused element character by character, simulating real keyboard input + +## 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/cookbooks/fastrouter-agentkit-tool-calling.mdx b/src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx index e9b02b7bb..7ee2e1845 100644 --- a/src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx +++ b/src/content/docs/cookbooks/fastrouter-agentkit-tool-calling.mdx @@ -420,7 +420,7 @@ const { tools } = await scalekit.tools.listScopedTools('user_123', { ## Next steps -- **[Scalekit AgentKit overview](/agentkit)** — Understand connected accounts, tool discovery, and tool execution in depth. +- **[Scalekit AgentKit overview](/agentkit/connections)** — Understand connected accounts, tool discovery, and tool execution in depth. - **[AgentKit connections](/agentkit/connectors)** — Set up Gmail, GitHub, Slack, and other connections. - **[OpenAI example](/agentkit/examples/openai)** — See the same tool-calling pattern with OpenAI directly. - **[LiteLLM inbox triage cookbook](/cookbooks/litellm-agentkit-inbox-triage)** — A more complex multi-connection agent with a web approval interface. diff --git a/src/data/agent-connectors/catalog.ts b/src/data/agent-connectors/catalog.ts index ebae58019..b43da9a8c 100644 --- a/src/data/agent-connectors/catalog.ts +++ b/src/data/agent-connectors/catalog.ts @@ -7,6 +7,46 @@ export interface ProviderMeta { } export const catalog: Record = { + sybilmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/sybill.svg', + authType: 'OAuth 2.1/DCR', + categories: ['CRM & Sales', 'AI', 'Analytics'], + }, + ticktickmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/ticktick .svg', + authType: 'OAuth 2.1/DCR', + categories: ['Productivity', 'Project Management'], + }, + tinyfishmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/tinyfish.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Automation', 'AI', 'Developer Tools'], + }, + zenrowsmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/zenrows.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Developer Tools', 'Automation'], + }, + mercurymcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mercury.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Accounting & Finance', 'Analytics', 'Productivity'], + }, + lunarcrushmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/lunarcrush.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Analytics', 'AI', 'Accounting & Finance'], + }, + firefliesmcp: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fireflies.svg', + authType: 'OAuth 2.1/DCR', + categories: ['Transcription', 'Productivity', 'Collaboration'], + }, + googlelooker: { + iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/googlelooker.svg', + authType: 'OAuth 2.0', + categories: ['analytics', 'business_intelligence', 'data_visualization', 'productivity'], + }, cloudfaremcp: { iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/cloudflare.svg', authType: 'OAuth 2.1/DCR', @@ -305,7 +345,7 @@ export const catalog: Record = { linkedin: { iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/linkedin.svg', authType: 'OAuth 2.0', - categories: ['CRM & Sales'], + categories: ['CRM & Sales', 'Marketing', 'Communication'], }, outreach: { iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/outreach.png', diff --git a/src/data/agent-connectors/firefliesmcp.ts b/src/data/agent-connectors/firefliesmcp.ts new file mode 100644 index 000000000..8a2626f0d --- /dev/null +++ b/src/data/agent-connectors/firefliesmcp.ts @@ -0,0 +1,333 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'firefliesmcp_fireflies_create_soundbite', + description: `Create a short audio or transcript clip from a meeting recording by specifying start and end times.`, + params: [ + { + name: 'endTime', + type: 'number', + required: true, + description: `End time of the soundbite clip in seconds from the beginning of the recording.`, + }, + { + name: 'startTime', + type: 'number', + required: true, + description: `Start time of the soundbite clip in seconds from the beginning of the recording.`, + }, + { + name: 'transcriptId', + type: 'string', + required: true, + description: `The Fireflies transcript ID of the meeting to clip. Get it from the search or fetch tool.`, + }, + { + name: 'mediaType', + type: 'string', + required: false, + description: `The media type for the soundbite clip (e.g. audio or video).`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `A short label for the soundbite clip.`, + }, + { + name: 'privacies', + type: 'array', + required: false, + description: `Access levels for the soundbite. Pass as a JSON array via the SDK.`, + }, + { + name: 'summary', + type: 'string', + required: false, + description: `A brief description of what this soundbite captures.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_fetch', + description: `Retrieve the full transcript, metadata, and insights for a single Fireflies meeting by its ID.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The Fireflies transcript ID of the meeting to fetch. Get it from the search tool.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_analytics', + description: `Retrieve team and per-user meeting analytics for a given date range.`, + params: [ + { + name: 'endTime', + type: 'string', + required: false, + description: `End of the analytics date range (ISO 8601 datetime).`, + }, + { + name: 'startTime', + type: 'string', + required: false, + description: `Start of the analytics date range (ISO 8601 datetime).`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_channel', + description: `Retrieve details of a specific Fireflies channel (folder) by its ID.`, + params: [ + { + name: 'channelId', + type: 'string', + required: true, + description: `The ID of the channel/folder. Get it from the list_channels tool.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_rule_executions', + description: `Retrieve automation rule execution logs grouped by meeting, with optional filters.`, + params: [ + { + name: 'cursor', + type: 'string', + required: false, + description: `Pagination cursor from the previous response to fetch the next page.`, + }, + { + name: 'dateFrom', + type: 'string', + required: false, + description: `Filter rule executions on or after this date (YYYY-MM-DD).`, + }, + { + name: 'dateTo', + type: 'string', + required: false, + description: `Filter rule executions on or before this date (YYYY-MM-DD).`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return.`, + }, + { + name: 'meetingId', + type: 'string', + required: false, + description: `The Fireflies transcript ID of the meeting. Get it from the search tool.`, + }, + { + name: 'ruleId', + type: 'string', + required: false, + description: `The ID of the automation rule to filter by.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_soundbites', + description: `Fetch a list of soundbite clips, optionally filtered by meeting or ownership.`, + params: [ + { + name: 'format', + type: 'string', + required: false, + description: `Response format. Accepted values: json, text, toon.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of items to return.`, + }, + { + name: 'mine', + type: 'boolean', + required: false, + description: `Set to true to return only your own items.`, + }, + { + name: 'my_team', + type: 'boolean', + required: false, + description: `Set to true to include items from your team members.`, + }, + { + name: 'skip', + type: 'number', + required: false, + description: `Number of items to skip for pagination.`, + }, + { + name: 'transcript_id', + type: 'string', + required: false, + description: `Filter soundbites to a specific meeting transcript ID. Get it from the search tool.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_user', + description: `Fetch account details for a Fireflies user; defaults to the currently authenticated user.`, + params: [ + { + name: 'userId', + type: 'string', + required: false, + description: `The Fireflies user ID. Leave empty to fetch the currently authenticated user.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_user_contacts', + description: `Fetch the contact list for the authenticated Fireflies user.`, + params: [ + { + name: 'format', + type: 'string', + required: false, + description: `Response format. Accepted values: json, text, toon.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_get_usergroups', + description: `Fetch user groups for the authenticated user or their team.`, + params: [ + { + name: 'mine', + type: 'boolean', + required: false, + description: `Set to true to return only your own items.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_list_channels', + description: `List all channels (folders) available to the authenticated user.`, + params: [], + }, + { + name: 'firefliesmcp_fireflies_move_meeting', + description: `Move one or more meeting transcripts to a specified channel or folder.`, + params: [ + { + name: 'channelId', + type: 'string', + required: true, + description: `The ID of the channel/folder. Get it from the list_channels tool.`, + }, + { + name: 'meetingIds', + type: 'array', + required: true, + description: `Array of meeting IDs / transcript IDs to move (max 5)`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_revoke_meeting_access', + description: `Revoke a previously shared meeting access for a specific email address.`, + params: [ + { + name: 'email', + type: 'string', + required: true, + description: `The email address of the user whose access to revoke.`, + }, + { + name: 'meetingId', + type: 'string', + required: true, + description: `The Fireflies transcript ID of the meeting. Get it from the search tool.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_search', + description: `Search meeting transcripts using keywords or Fireflies mini-grammar syntax.`, + params: [ + { + name: 'query', + type: 'string', + required: true, + description: `Search query using the mini grammar syntax. Can be simple keywords or complex filters using the grammar.`, + }, + { + name: 'format', + type: 'string', + required: false, + description: `Response format. Accepted values: json, text, toon.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_share_meeting', + description: `Share a meeting transcript with one or more email addresses.`, + params: [ + { + name: 'emails', + type: 'array', + required: true, + description: `Array of email addresses to share the meeting with (max 100)`, + }, + { + name: 'meetingId', + type: 'string', + required: true, + description: `The Fireflies transcript ID of the meeting. Get it from the search tool.`, + }, + { + name: 'expiryDays', + type: 'number', + required: false, + description: `Number of days before the shared link expires. Leave empty for no expiry.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_update_meeting_privacy', + description: `Update the privacy level of a meeting transcript.`, + params: [ + { + name: 'meetingId', + type: 'string', + required: true, + description: `The Fireflies transcript ID of the meeting. Get it from the search tool.`, + }, + { + name: 'privacy', + type: 'string', + required: true, + description: `Who can view this meeting. Accepted values: link, owner, participants, participatingteammates, teammatesandparticipants, teammates.`, + }, + ], + }, + { + name: 'firefliesmcp_fireflies_update_meeting_title', + description: `Rename a meeting transcript by its ID.`, + params: [ + { + name: 'meetingId', + type: 'string', + required: true, + description: `The Fireflies transcript ID of the meeting. Get it from the search tool.`, + }, + { + name: 'title', + type: 'string', + required: true, + description: `The new title for the meeting transcript.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/gainsight.ts b/src/data/agent-connectors/gainsight.ts index 43e6056d0..da71508cc 100644 --- a/src/data/agent-connectors/gainsight.ts +++ b/src/data/agent-connectors/gainsight.ts @@ -225,25 +225,25 @@ export const tools: Tool[] = [ name: 'children_level', type: 'integer', required: false, - description: `Depth of child relationships to include when include_children is true. Default: 0.`, + description: `Depth of child levels to include.`, }, { name: 'include_children', type: 'boolean', required: false, - description: `Include child object relationships in the response. Default: false.`, + description: `Include child objects in the response.`, }, { name: 'include_hidden_columns', type: 'boolean', required: false, - description: `Include hidden fields in the schema response. Default: false.`, + description: `Include hidden columns in the response.`, }, { name: 'include_picklist_details', type: 'boolean', required: false, - description: `Include picklist option values in the response. Default: true.`, + description: `Include picklist field details in the response.`, }, ], }, @@ -255,14 +255,9 @@ export const tools: Tool[] = [ name: 'em', type: 'boolean', required: false, - description: `Set to true to exclude related child objects from the results.`, - }, - { - name: 'po', - type: 'string', - required: false, - description: `Filter to objects related to this parent object, e.g. company. Omit to return all objects.`, + description: `Exclude object mappings from the response.`, }, + { name: 'po', type: 'string', required: false, description: `Filter by parent object name.` }, ], }, { diff --git a/src/data/agent-connectors/googlelooker.ts b/src/data/agent-connectors/googlelooker.ts new file mode 100644 index 000000000..da7ae92ac --- /dev/null +++ b/src/data/agent-connectors/googlelooker.ts @@ -0,0 +1,334 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'googlelooker_get_dashboard', + description: `Retrieve the full metadata of a Looker dashboard by its ID, including all tile definitions (charts, tables, text, filters), layout, linked Looks, and underlying queries.`, + params: [ + { + name: 'dashboard_id', + type: 'string', + required: true, + description: `The ID of the Looker dashboard to retrieve`, + }, + { + name: 'fields', + type: 'string', + required: false, + description: `Comma-separated list of dashboard fields to include in the response`, + }, + ], + }, + { + name: 'googlelooker_get_look_results', + description: `Run a saved Look and return results in the specified format. Executes the Look's underlying query against the connected database. Use result_format to control the output: json for structured data, csv for tabular export, xlsx for Excel.`, + params: [ + { + name: 'look_id', + type: 'string', + required: true, + description: `The numeric ID of the Look to fetch results from`, + }, + { + name: 'result_format', + type: 'string', + required: true, + description: `Desired output format for results. Accepted values: json, json_detail, json_bi, csv, txt, html, md, xlsx, sql, png, jpg`, + }, + { + name: 'apply_formatting', + type: 'boolean', + required: false, + description: `Apply model-specified formatting to each result value`, + }, + { + name: 'apply_vis', + type: 'boolean', + required: false, + description: `Apply visualization options to results`, + }, + { + name: 'cache', + type: 'boolean', + required: false, + description: `Get results from cache if available. Set to false to force a fresh database query.`, + }, + { + name: 'cache_only', + type: 'boolean', + required: false, + description: `Retrieve any results from cache even if expired`, + }, + { + name: 'force_production', + type: 'boolean', + required: false, + description: `Override development mode settings to force use of production models`, + }, + { + name: 'generate_drill_links', + type: 'boolean', + required: false, + description: `Generate drill links for json_detail format`, + }, + { + name: 'image_height', + type: 'integer', + required: false, + description: `Render height for image formats (png, jpg)`, + }, + { + name: 'image_width', + type: 'integer', + required: false, + description: `Render width for image formats (png, jpg)`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of rows to return. May override the limit in the saved query.`, + }, + { + name: 'path_prefix', + type: 'string', + required: false, + description: `Prefix to use for drill links (URL encoded)`, + }, + { + name: 'rebuild_pdts', + type: 'boolean', + required: false, + description: `Rebuild Persistent Derived Tables (PDTs) used in the query`, + }, + { + name: 'server_table_calcs', + type: 'boolean', + required: false, + description: `Perform table calculations on query results server-side`, + }, + ], + }, + { + name: 'googlelooker_list_dashboards', + description: `List all dashboards in a Looker instance that the caller has access to. Returns dashboard metadata including ID, title, folder, description, and last updated time.`, + params: [ + { + name: 'fields', + type: 'string', + required: false, + description: `Comma-separated list of dashboard fields to include in the response`, + }, + ], + }, + { + name: 'googlelooker_list_explores', + description: `Retrieve a LookML model by name. The response includes an explores array listing all available explores in that model. Use fields=explores to limit the response to just explore metadata.`, + params: [ + { + name: 'model_name', + type: 'string', + required: true, + description: `The LookML model name to retrieve explores for`, + }, + { + name: 'fields', + type: 'string', + required: false, + description: `Comma-separated list of model fields to include in the response`, + }, + ], + }, + { + name: 'googlelooker_list_folders', + description: `List all folders (spaces) in the Looker instance including personal folders. Returns folder ID, name, parent folder, creator, and content counts. Use folder IDs to filter Looks and Dashboards by location.`, + params: [ + { + name: 'fields', + type: 'string', + required: false, + description: `Comma-separated list of folder fields to include in the response`, + }, + ], + }, + { + name: 'googlelooker_list_looks', + description: `List all Looks the caller has access to. Returns Look metadata including ID, title, folder, owner, and last run time. Soft-deleted Looks are excluded.`, + params: [ + { + name: 'fields', + type: 'string', + required: false, + description: `Comma-separated list of Look fields to include in the response`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of Looks to return`, + }, + { + name: 'offset', + type: 'integer', + required: false, + description: `Number of results to skip before returning any`, + }, + { + name: 'sorts', + type: 'string', + required: false, + description: `Comma-separated list of fields to sort results by`, + }, + ], + }, + { + name: 'googlelooker_list_models', + description: `List all available LookML models in the Looker instance. Returns each model's name, project, allowed database connections, and explore count. Use this to discover which models and explores are available before running queries.`, + params: [ + { + name: 'fields', + type: 'string', + required: false, + description: `Comma-separated list of model fields to include in the response`, + }, + ], + }, + { + name: 'googlelooker_run_inline_query', + description: `Execute an ad-hoc query against a LookML model and explore without saving it as a Look. Specify fields, filters, sorts, and a row limit. Useful for one-off analysis and agent-driven data exploration. Complex queries may take longer; 120s timeout applied.`, + params: [ + { + name: 'fields', + type: 'string', + required: true, + description: `Comma-separated list of LookML field names to include (e.g., orders.count,orders.total_revenue)`, + }, + { + name: 'model', + type: 'string', + required: true, + description: `The LookML model name to query against`, + }, + { + name: 'result_format', + type: 'string', + required: true, + description: `Output format for the query results. Accepted values: json, json_detail, json_bi, csv, txt, html, md, xlsx, sql, png, jpg`, + }, + { + name: 'view', + type: 'string', + required: true, + description: `The explore (view) name within the model to query`, + }, + { + name: 'filters', + type: 'object', + required: false, + description: `Filter conditions as a JSON object (field_name: filter_value pairs)`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of rows to return from the query`, + }, + { + name: 'sorts', + type: 'string', + required: false, + description: `Comma-separated list of sort fields with optional direction (e.g., orders.total_revenue desc)`, + }, + ], + }, + { + name: 'googlelooker_run_look', + description: `Run a saved Look and return the results in the specified format. Executes the Look's underlying query against the connected database and returns the current data.`, + params: [ + { + name: 'look_id', + type: 'string', + required: true, + description: `The numeric ID of the Look to run`, + }, + { + name: 'result_format', + type: 'string', + required: true, + description: `Desired output format for results. Accepted values: json, json_detail, csv, txt, html, md, xlsx, sql, png, jpg`, + }, + { + name: 'apply_formatting', + type: 'boolean', + required: false, + description: `Apply model-specified formatting to each result value`, + }, + { + name: 'apply_vis', + type: 'boolean', + required: false, + description: `Apply visualization options to results`, + }, + { + name: 'cache', + type: 'boolean', + required: false, + description: `Get results from cache if available. Set to false to force a fresh database query.`, + }, + { + name: 'cache_only', + type: 'boolean', + required: false, + description: `Retrieve any results from cache even if expired`, + }, + { + name: 'force_production', + type: 'boolean', + required: false, + description: `Override development mode settings to force use of production models`, + }, + { + name: 'generate_drill_links', + type: 'boolean', + required: false, + description: `Generate drill links for json_detail format`, + }, + { + name: 'image_height', + type: 'integer', + required: false, + description: `Render height for image formats (png, jpg)`, + }, + { + name: 'image_width', + type: 'integer', + required: false, + description: `Render width for image formats (png, jpg)`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of rows to return. May override the limit in the saved query.`, + }, + { + name: 'path_prefix', + type: 'string', + required: false, + description: `Prefix to use for drill links (URL encoded)`, + }, + { + name: 'rebuild_pdts', + type: 'boolean', + required: false, + description: `Rebuild Persistent Derived Tables (PDTs) used in the query`, + }, + { + name: 'server_table_calcs', + type: 'boolean', + required: false, + description: `Perform table calculations on query results server-side`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/hubspot.ts b/src/data/agent-connectors/hubspot.ts index 4206ced9f..6fbf7dc9b 100644 --- a/src/data/agent-connectors/hubspot.ts +++ b/src/data/agent-connectors/hubspot.ts @@ -1171,6 +1171,72 @@ export const tools: Tool[] = [ }, ], }, + { + name: 'hubspot_email_statistics_histogram', + description: `Retrieve a time-series histogram of marketing email statistics (opens, clicks, deliveries, etc.) bucketed by a specified interval over a time range.`, + params: [ + { + name: 'endTimestamp', + type: 'string', + required: true, + description: `End of the time range for the histogram in ISO 8601 date-time format`, + }, + { + name: 'interval', + type: 'string', + required: true, + description: `Time bucket interval for grouping histogram data`, + }, + { + name: 'startTimestamp', + type: 'string', + required: true, + description: `Start of the time range for the histogram in ISO 8601 date-time format`, + }, + { + name: 'after', + type: 'string', + required: false, + description: `Pagination cursor to get the next set of results`, + }, + { + name: 'emailIds', + type: 'array', + required: false, + description: `List of marketing email IDs to filter histogram data by`, + }, + ], + }, + { + name: 'hubspot_email_statistics_list', + description: `Retrieve aggregated send, open, click, and other statistics for marketing emails over a specified time range. Optionally filter by specific email IDs.`, + params: [ + { + name: 'endTimestamp', + type: 'string', + required: true, + description: `End of the time range for statistics in ISO 8601 date-time format`, + }, + { + name: 'startTimestamp', + type: 'string', + required: true, + description: `Start of the time range for statistics in ISO 8601 date-time format`, + }, + { + name: 'emailIds', + type: 'array', + required: false, + description: `List of marketing email IDs to filter statistics by`, + }, + { + name: 'property', + type: 'string', + required: false, + description: `Comma-separated list of metric properties to include in the response`, + }, + ], + }, { 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.`, @@ -1424,6 +1490,54 @@ export const tools: Tool[] = [ }, ], }, + { + name: 'hubspot_marketing_email_get', + description: `Retrieve a single marketing email by its ID, including subject, body, send configuration, and metadata.`, + params: [ + { + name: 'emailId', + type: 'string', + required: true, + description: `The ID of the marketing email to retrieve`, + }, + { + name: 'archived', + type: 'boolean', + required: false, + description: `Whether to return the email even if it has been archived`, + }, + { + name: 'includedProperties', + type: 'string', + required: false, + description: `Comma-separated list of property names to include in the response, limiting which fields are returned`, + }, + { + name: 'includeStats', + type: 'boolean', + required: false, + description: `Whether to include send, open, click, and other statistics in the response`, + }, + { + name: 'marketingCampaignNames', + type: 'boolean', + required: false, + description: `Whether to include the names of marketing campaigns associated with the email`, + }, + { + name: 'variantStats', + type: 'boolean', + required: false, + description: `Whether to include statistics broken down by A/B test variant`, + }, + { + name: 'workflowNames', + type: 'boolean', + required: false, + description: `Whether to include the names of workflows in which this email is used`, + }, + ], + }, { 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.`, diff --git a/src/data/agent-connectors/linkedin.ts b/src/data/agent-connectors/linkedin.ts index d1063d741..cdd394bdb 100644 --- a/src/data/agent-connectors/linkedin.ts +++ b/src/data/agent-connectors/linkedin.ts @@ -5,385 +5,930 @@ export const tools: Tool[] = [ name: 'linkedin_ad_account_create', description: `Create a new LinkedIn ad account for running advertising campaigns.`, params: [ - { name: 'currency', type: 'string', required: true, description: `The currency code for the ad account (e.g. 'USD', 'EUR').` }, - { name: 'name', type: 'string', required: true, description: `The name of the new ad account.` }, - { name: 'reference', type: 'string', required: true, description: `Reference URN for the account owner (e.g. organization URN 'urn:li:organization:12345').` }, + { + name: 'currency', + type: 'string', + required: true, + description: `The currency code for the ad account (e.g. 'USD', 'EUR').`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the new ad account.`, + }, + { + name: 'reference', + type: 'string', + required: true, + description: `Reference URN for the account owner (e.g. organization URN 'urn:li:organization:12345').`, + }, ], }, { name: 'linkedin_ad_account_get', description: `Get a LinkedIn ad account by its ID.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to retrieve.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to retrieve.`, + }, ], }, { name: 'linkedin_ad_account_update', description: `Partially update a LinkedIn ad account's name or status.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to update.` }, - { name: 'name', type: 'string', required: false, description: `New name for the ad account.` }, - { name: 'status', type: 'string', required: false, description: `New status for the ad account (e.g. ACTIVE, CANCELED).` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to update.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the ad account.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `New status for the ad account (e.g. ACTIVE, CANCELED).`, + }, ], }, { name: 'linkedin_ad_account_users_list', description: `List all users who have access to a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to list users for.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to list users for.`, + }, ], }, { name: 'linkedin_ad_accounts_search', description: `Search LinkedIn ad accounts by status or name.`, params: [ - { name: 'name', type: 'string', required: false, description: `Filter by account name (partial match).` }, - { name: 'status', type: 'string', required: false, description: `Filter by account status. One of: ACTIVE, CANCELED, DRAFT.` }, + { + name: 'name', + type: 'string', + required: false, + description: `Filter by account name (partial match).`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by account status. One of: ACTIVE, CANCELED, DRAFT.`, + }, ], }, { name: 'linkedin_ad_analytics_get', - description: `Get campaign analytics data for a LinkedIn ad campaign including impressions, clicks, and spend.`, - params: [ - { name: 'campaigns', type: 'string', required: true, description: `The campaign URN to retrieve analytics for (e.g. 'urn:li:sponsoredCampaign:712345678').` }, - { name: 'date_range_end', type: 'string', required: true, description: `End date for the analytics period (YYYY-MM-DD format).` }, - { name: 'date_range_start', type: 'string', required: true, description: `Start date for the analytics period (YYYY-MM-DD format).` }, - { name: 'time_granularity', type: 'string', required: true, description: `Granularity of the analytics data. One of: DAILY, MONTHLY, ALL.` }, + description: `Get analytics data for a LinkedIn ad campaign including impressions, clicks, and spend. Requires r_ads_reporting scope and Marketing Developer Platform access.`, + params: [ + { + name: 'date_range_end', + type: 'string', + required: true, + description: `End date for the analytics period in YYYY-MM-DD format.`, + }, + { + name: 'date_range_start', + type: 'string', + required: true, + description: `Start date for the analytics period in YYYY-MM-DD format.`, + }, + { + name: 'pivot', + type: 'string', + required: true, + description: `Dimension to pivot analytics by. One of: CREATIVE, CAMPAIGN, CAMPAIGN_GROUP, ACCOUNT, MEMBER_COMPANY, MEMBER_COUNTRY_V2, MEMBER_REGION_V2, MEMBER_JOB_TITLE.`, + }, + { + name: 'time_granularity', + type: 'string', + required: true, + description: `Time granularity for grouping analytics data. One of: DAILY, MONTHLY, ALL.`, + }, + { + name: 'campaigns', + type: 'string', + required: false, + description: `Campaign URN to filter analytics (e.g. 'urn:li:sponsoredCampaign:712345678'). Provide this or account_id.`, + }, ], }, { name: 'linkedin_asset_get', - description: `Get the status and details of an uploaded LinkedIn media asset.`, + description: `Get the status and details of a LinkedIn image upload by its image URN.`, params: [ - { name: 'asset_id', type: 'string', required: true, description: `The ID of the media asset to retrieve.` }, + { + name: 'asset_id', + type: 'string', + required: true, + description: `The image URN returned from the initializeUpload response (e.g. urn:li:image:C4E22AQGadflBbEegg).`, + }, ], }, { name: 'linkedin_campaign_create', description: `Create a new ad campaign within a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to create the campaign in.` }, - { name: 'campaign_group_id', type: 'string', required: true, description: `The ID of the campaign group this campaign belongs to.` }, - { name: 'cost_type', type: 'string', required: true, description: `The cost type for the campaign (e.g. 'CPM', 'CPC', 'CPV').` }, - { name: 'daily_budget_amount', type: 'string', required: true, description: `The daily budget amount as a decimal string (e.g. '100.00').` }, - { name: 'daily_budget_currency', type: 'string', required: true, description: `The currency code for the daily budget (e.g. 'USD', 'EUR').` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to create the campaign in.`, + }, + { + name: 'campaign_group_id', + type: 'string', + required: true, + description: `The ID of the campaign group this campaign belongs to.`, + }, + { + name: 'cost_type', + type: 'string', + required: true, + description: `The cost type for the campaign (e.g. 'CPM', 'CPC', 'CPV').`, + }, + { + name: 'daily_budget_amount', + type: 'string', + required: true, + description: `The daily budget amount as a decimal string (e.g. '100.00').`, + }, + { + name: 'daily_budget_currency', + type: 'string', + required: true, + description: `The currency code for the daily budget (e.g. 'USD', 'EUR').`, + }, { name: 'name', type: 'string', required: true, description: `The name of the campaign.` }, - { name: 'objective_type', type: 'string', required: true, description: `The objective type for the campaign (e.g. 'AWARENESS', 'WEBSITE_VISIT', 'LEAD_GENERATION').` }, + { + name: 'objective_type', + type: 'string', + required: true, + description: `The objective type for the campaign (e.g. 'AWARENESS', 'WEBSITE_VISIT', 'LEAD_GENERATION').`, + }, + { + name: 'campaign_type', + type: 'string', + required: false, + description: `The campaign type. One of: SPONSORED_UPDATES, TEXT_AD, SPONSORED_INMAILS, DYNAMIC. Defaults to TEXT_AD.`, + }, + { + name: 'locale_country', + type: 'string', + required: false, + description: `ISO 3166-1 alpha-2 country code for the campaign locale (e.g. US). Defaults to US.`, + }, + { + name: 'locale_language', + type: 'string', + required: false, + description: `ISO 639-1 language code for the campaign locale (e.g. en). Defaults to en.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Initial campaign status. One of: ACTIVE, PAUSED, DRAFT. Defaults to DRAFT.`, + }, ], }, { name: 'linkedin_campaign_delete', description: `Delete a DRAFT LinkedIn ad campaign. Only campaigns in DRAFT status can be deleted.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the campaign.` }, - { name: 'campaign_id', type: 'string', required: true, description: `The ID of the DRAFT campaign to delete.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the campaign.`, + }, + { + name: 'campaign_id', + type: 'string', + required: true, + description: `The ID of the DRAFT campaign to delete.`, + }, ], }, { name: 'linkedin_campaign_get', description: `Get a specific ad campaign by ID within a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the campaign.` }, - { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign to retrieve.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the campaign.`, + }, + { + name: 'campaign_id', + type: 'string', + required: true, + description: `The ID of the campaign to retrieve.`, + }, ], }, { name: 'linkedin_campaign_group_create', description: `Create a new campaign group within a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to create the campaign group in.` }, - { name: 'name', type: 'string', required: true, description: `The name of the campaign group.` }, - { name: 'status', type: 'string', required: false, description: `Status of the campaign group. One of: ACTIVE, ARCHIVED, CANCELED, DRAFT, PAUSED. Defaults to ACTIVE.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to create the campaign group in.`, + }, + { + name: 'name', + type: 'string', + required: true, + description: `The name of the campaign group.`, + }, + { + name: 'start_time', + type: 'integer', + required: false, + description: `Start time for the campaign group as Unix epoch milliseconds. If omitted, the group starts immediately.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Status of the campaign group. One of: ACTIVE, ARCHIVED, CANCELED, DRAFT, PAUSED. Defaults to ACTIVE.`, + }, ], }, { name: 'linkedin_campaign_group_get', description: `Get a specific campaign group by ID within a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the campaign group.` }, - { name: 'group_id', type: 'string', required: true, description: `The ID of the campaign group to retrieve.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the campaign group.`, + }, + { + name: 'group_id', + type: 'string', + required: true, + description: `The ID of the campaign group to retrieve.`, + }, ], }, { name: 'linkedin_campaign_group_update', description: `Partially update a LinkedIn campaign group's name or status.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the campaign group.` }, - { name: 'group_id', type: 'string', required: true, description: `The ID of the campaign group to update.` }, - { name: 'name', type: 'string', required: false, description: `New name for the campaign group.` }, - { name: 'status', type: 'string', required: false, description: `New status for the campaign group (e.g. ACTIVE, PAUSED, ARCHIVED).` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the campaign group.`, + }, + { + name: 'group_id', + type: 'string', + required: true, + description: `The ID of the campaign group to update.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `New name for the campaign group.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `New status for the campaign group (e.g. ACTIVE, PAUSED, ARCHIVED).`, + }, ], }, { name: 'linkedin_campaign_groups_list', description: `List campaign groups for a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to list campaign groups for.` }, - { name: 'count', type: 'integer', required: false, description: `Number of results to return per page.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to list campaign groups for.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Number of results to return per page.`, + }, { name: 'start', type: 'integer', required: false, description: `Offset for pagination.` }, - { name: 'status', type: 'string', required: false, description: `Filter by campaign group status (e.g. ACTIVE, PAUSED, ARCHIVED).` }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by campaign group status (e.g. ACTIVE, PAUSED, ARCHIVED).`, + }, ], }, { name: 'linkedin_campaign_update', description: `Partially update a LinkedIn ad campaign's name or status.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the campaign.` }, - { name: 'campaign_id', type: 'string', required: true, description: `The ID of the campaign to update.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the campaign.`, + }, + { + name: 'campaign_id', + type: 'string', + required: true, + description: `The ID of the campaign to update.`, + }, { name: 'name', type: 'string', required: false, description: `New name for the campaign.` }, - { name: 'status', type: 'string', required: false, description: `New status for the campaign (e.g. ACTIVE, PAUSED, ARCHIVED, CANCELED).` }, + { + name: 'status', + type: 'string', + required: false, + description: `New status for the campaign (e.g. ACTIVE, PAUSED, ARCHIVED, CANCELED).`, + }, ], }, { name: 'linkedin_campaigns_list', description: `List ad campaigns for a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to list campaigns for.` }, - { name: 'count', type: 'integer', required: false, description: `Number of results to return per page.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to list campaigns for.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Number of results to return per page.`, + }, { name: 'start', type: 'integer', required: false, description: `Offset for pagination.` }, - { name: 'status', type: 'string', required: false, description: `Filter by campaign status (e.g. ACTIVE, PAUSED, ARCHIVED, CANCELED, DRAFT).` }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by campaign status (e.g. ACTIVE, PAUSED, ARCHIVED, CANCELED, DRAFT).`, + }, ], }, { name: 'linkedin_comment_delete', description: `Delete a specific comment on a LinkedIn post.`, params: [ - { name: 'actor_urn', type: 'string', required: true, description: `The URN of the actor (person) deleting the comment.` }, - { name: 'comment_id', type: 'string', required: true, description: `The ID of the comment to delete.` }, - { name: 'entity_urn', type: 'string', required: true, description: `The URN of the post the comment belongs to.` }, + { + name: 'actor_urn', + type: 'string', + required: true, + description: `The URN of the actor (person) deleting the comment.`, + }, + { + name: 'comment_id', + type: 'string', + required: true, + description: `The numeric ID of the comment to delete.`, + }, + { + name: 'entity_urn', + type: 'string', + required: true, + description: `URL-encoded URN of the parent post. Example: urn%3Ali%3AugcPost%3A7123456789.`, + }, ], }, { name: 'linkedin_comment_get', description: `Get a specific comment on a LinkedIn post by entity URN and comment ID.`, params: [ - { name: 'comment_id', type: 'string', required: true, description: `The ID of the comment to retrieve.` }, - { name: 'entity_urn', type: 'string', required: true, description: `The URN of the post the comment belongs to.` }, + { + name: 'comment_id', + type: 'string', + required: true, + description: `The numeric ID of the comment to retrieve.`, + }, + { + name: 'entity_urn', + type: 'string', + required: true, + description: `URL-encoded URN of the parent post. Example: urn%3Ali%3AugcPost%3A7123456789.`, + }, ], }, { name: 'linkedin_creative_create', description: `Create a new ad creative for a LinkedIn ad campaign.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to create the creative in.` }, - { name: 'campaign_id', type: 'string', required: true, description: `The campaign URN this creative belongs to (e.g. 'urn:li:sponsoredCampaign:712345678').` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to create the creative in.`, + }, + { + name: 'campaign_id', + type: 'string', + required: true, + description: `The numeric ID of the campaign this creative belongs to.`, + }, { name: 'name', type: 'string', required: true, description: `The name of the creative.` }, - { name: 'status', type: 'string', required: false, description: `Status of the creative. Defaults to ACTIVE.` }, + { + name: 'status', + type: 'string', + required: false, + description: `Status of the creative. Defaults to ACTIVE.`, + }, ], }, { name: 'linkedin_creative_get', description: `Get a specific ad creative by ID within a LinkedIn ad account.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the creative.` }, - { name: 'creative_id', type: 'string', required: true, description: `The ID of the creative to retrieve.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the creative.`, + }, + { + name: 'creative_id', + type: 'string', + required: true, + description: `The ID of the creative to retrieve.`, + }, ], }, { name: 'linkedin_creative_update', description: `Partially update a LinkedIn ad creative's name or status.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account that owns the creative.` }, - { name: 'creative_id', type: 'string', required: true, description: `The ID of the creative to update.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account that owns the creative.`, + }, + { + name: 'creative_id', + type: 'string', + required: true, + description: `The ID of the creative to update.`, + }, { name: 'name', type: 'string', required: false, description: `New name for the creative.` }, - { name: 'status', type: 'string', required: false, description: `New status for the creative (e.g. ACTIVE, PAUSED, ARCHIVED).` }, + { + name: 'status', + type: 'string', + required: false, + description: `New status for the creative (e.g. ACTIVE, PAUSED, ARCHIVED).`, + }, ], }, { name: 'linkedin_creatives_list', description: `List ad creatives for a LinkedIn ad account, with optional filtering by campaign or status.`, params: [ - { name: 'account_id', type: 'string', required: true, description: `The ID of the ad account to list creatives for.` }, - { name: 'campaign_id', type: 'string', required: false, description: `Filter creatives by campaign URN.` }, - { name: 'count', type: 'integer', required: false, description: `Number of results to return per page.` }, + { + name: 'account_id', + type: 'string', + required: true, + description: `The ID of the ad account to list creatives for.`, + }, + { + name: 'campaign_id', + type: 'string', + required: false, + description: `Filter creatives by campaign URN.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Number of results to return per page.`, + }, { name: 'start', type: 'integer', required: false, description: `Offset for pagination.` }, - { name: 'status', type: 'string', required: false, description: `Filter by creative status (e.g. ACTIVE, PAUSED, ARCHIVED).` }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by creative status (e.g. ACTIVE, PAUSED, ARCHIVED).`, + }, ], }, { name: 'linkedin_email_get', - description: `Retrieve the authenticated user's primary email address from LinkedIn.`, - params: [ - ], + description: `Retrieve the authenticated user's email address via the OpenID Connect userinfo endpoint. Requires openid and email scopes.`, + params: [], }, { name: 'linkedin_job_posting_get', - description: `Get details of a specific LinkedIn job posting by its ID.`, + description: `Check the status of a LinkedIn job posting submitted via the Apply Connect API. Requires LinkedIn Apply Connect partner program access.`, params: [ - { name: 'job_id', type: 'string', required: true, description: `The ID of the job posting to retrieve.` }, + { + name: 'job_id', + type: 'string', + required: true, + description: `Your external job ID as submitted to LinkedIn via the Apply Connect API.`, + }, ], }, { name: 'linkedin_media_upload_register', - description: `Register a media asset upload with LinkedIn (step 1 of image/video upload). Returns an upload URL and asset ID to use for subsequent upload steps.`, + description: `Initialize an image upload with LinkedIn (step 1 of image upload). Returns an uploadUrl to PUT the image bytes to. Requires w_member_social or w_organization_social scope.`, params: [ - { name: 'owner_urn', type: 'string', required: true, description: `The URN of the person or organization that owns the media (e.g. 'urn:li:person:{id}').` }, - { name: 'recipe', type: 'string', required: true, description: `The media recipe type. One of: feedshare-image, feedshare-video, messaging-attachment.` }, + { + name: 'owner_urn', + type: 'string', + required: true, + description: `URN of the person or organization that owns the image (e.g. urn:li:person:{id} or urn:li:organization:{id}).`, + }, ], }, { name: 'linkedin_member_search', - description: `Search LinkedIn members by keyword for at-mention typeahead (requires Marketing API access).`, - params: [ - { name: 'keywords', type: 'string', required: true, description: `Keywords to search for members.` }, - { name: 'count', type: 'integer', required: false, description: `Number of results to return.` }, + description: `Search members who follow a specific organization by keyword (typeahead). Requires Community Management API enrollment and r_organization_followers scope.`, + params: [ + { + name: 'keywords', + type: 'string', + required: true, + description: `Keywords to search for members.`, + }, + { + name: 'organization_urn', + type: 'string', + required: true, + description: `URN of the organization whose followers to search within.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Number of results to return.`, + }, ], }, { name: 'linkedin_message_create', - description: `Send a LinkedIn message via the Messaging API (requires LinkedIn Messaging API partner access). Uses /rest/messages endpoint.`, - params: [ - { name: 'body', type: 'string', required: true, description: `The text content of the message.` }, - { name: 'recipients', type: 'string', required: true, description: `Comma-separated list of recipient person URNs (e.g. 'urn:li:person:abc123,urn:li:person:def456').` }, - { name: 'subject', type: 'string', required: false, description: `Optional subject line for the message.` }, + description: `Send a direct message to a first-degree LinkedIn connection. Requires LinkedIn Messaging API partner access — usage is restricted to approved partners per LinkedIn's API agreement.`, + params: [ + { + name: 'body', + type: 'string', + required: true, + description: `The text content of the message.`, + }, + { + name: 'recipients', + type: 'string', + required: true, + description: `Comma-separated list of recipient person URNs. Recipients must be first-degree connections of the authenticated member.`, + }, + { + name: 'subject', + type: 'string', + required: false, + description: `Optional subject line for the message.`, + }, ], }, { name: 'linkedin_organization_access_control_list', description: `List organizations where the authenticated user has admin access via the Organizational Entity ACLs API.`, params: [ - { name: 'role_assignee_urn', type: 'string', required: true, description: `URN of the person whose org access to check, e.g. urn:li:person:{id}.` }, + { + name: 'role_assignee_urn', + type: 'string', + required: true, + description: `URN of the person whose org access to check, e.g. urn:li:person:{id}.`, + }, ], }, { name: 'linkedin_organization_admins_get', description: `List administrators of a LinkedIn organization page using the Organizational Entity ACLs API.`, params: [ - { name: 'id', type: 'string', required: true, description: `Numeric LinkedIn organization ID.` }, + { + name: 'id', + type: 'string', + required: true, + description: `Numeric LinkedIn organization ID.`, + }, ], }, { name: 'linkedin_organization_by_vanity_get', description: `Find a LinkedIn organization by its vanity name (the custom URL slug used in the company's LinkedIn URL).`, params: [ - { name: 'vanity_name', type: 'string', required: true, description: `The vanity name (URL slug) of the organization to look up.` }, + { + name: 'vanity_name', + type: 'string', + required: true, + description: `The vanity name (URL slug) of the organization to look up.`, + }, ], }, { name: 'linkedin_organization_followers_count', description: `Get the follower count for a LinkedIn organization using its URL-encoded URN.`, params: [ - { name: 'organization_urn', type: 'string', required: true, description: `URL-encoded URN of the organization, e.g. urn%3Ali%3Aorganization%3A{id}.` }, + { + name: 'organization_urn', + type: 'string', + required: true, + description: `URL-encoded URN of the organization, e.g. urn%3Ali%3Aorganization%3A{id}.`, + }, ], }, { name: 'linkedin_organization_get', description: `Retrieve details of a LinkedIn organization (company page) by its numeric ID.`, params: [ - { name: 'id', type: 'string', required: true, description: `The numeric ID of the LinkedIn organization.` }, + { + name: 'id', + type: 'string', + required: true, + description: `The numeric ID of the LinkedIn organization.`, + }, ], }, { name: 'linkedin_organization_post_create', description: `Create a UGC post on behalf of a LinkedIn organization. The post will appear on the organization's page.`, params: [ - { name: 'organization_id', type: 'string', required: true, description: `The numeric ID of the organization to post on behalf of.` }, - { name: 'text', type: 'string', required: true, description: `The text content of the post.` }, - { name: 'visibility', type: 'string', required: false, description: `Visibility of the post. PUBLIC or CONNECTIONS.` }, + { + name: 'organization_id', + type: 'string', + required: true, + description: `The numeric ID of the organization to post on behalf of.`, + }, + { + name: 'text', + type: 'string', + required: true, + description: `The text content of the post.`, + }, + { + name: 'visibility', + type: 'string', + required: false, + description: `Visibility of the post. PUBLIC or CONNECTIONS.`, + }, ], }, { name: 'linkedin_organization_search', description: `Search LinkedIn organizations by keyword using the company search API.`, params: [ - { name: 'keywords', type: 'string', required: true, description: `Keywords to search for organizations.` }, - { name: 'count', type: 'integer', required: false, description: `Number of results to return.` }, + { + name: 'keywords', + type: 'string', + required: true, + description: `Keywords to search for organizations.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Number of results to return.`, + }, + { name: 'start', type: 'integer', required: false, description: `Offset for pagination.` }, ], }, { name: 'linkedin_organizations_batch_get', description: `Batch get multiple LinkedIn organizations by their numeric IDs. Works without admin access.`, params: [ - { name: 'ids', type: 'string', required: true, description: `Comma-separated list of organization IDs to retrieve (e.g. '12345,67890').` }, + { + name: 'ids', + type: 'string', + required: true, + description: `Comma-separated list of organization IDs to retrieve (e.g. '12345,67890').`, + }, ], }, { name: 'linkedin_post_comment_create', description: `Add a comment to a LinkedIn UGC post on behalf of a member.`, params: [ - { name: 'actor', type: 'string', required: true, description: `URN of the member leaving the comment, e.g. urn:li:person:{id}.` }, - { name: 'text', type: 'string', required: true, description: `The text content of the comment.` }, - { name: 'ugc_post_urn', type: 'string', required: true, description: `URL-encoded URN of the UGC post to comment on, e.g. urn%3Ali%3AugcPost%3A{id}.` }, + { + name: 'actor', + type: 'string', + required: true, + description: `URN of the member leaving the comment, e.g. urn:li:person:{id}.`, + }, + { + name: 'text', + type: 'string', + required: true, + description: `The text content of the comment.`, + }, + { + name: 'ugc_post_urn', + type: 'string', + required: true, + description: `URL-encoded URN of the UGC post to comment on, e.g. urn%3Ali%3AugcPost%3A{id}.`, + }, ], }, { name: 'linkedin_post_comments_list', description: `List comments on a LinkedIn UGC post.`, params: [ - { name: 'ugc_post_urn', type: 'string', required: true, description: `URL-encoded URN of the UGC post to retrieve comments for, e.g. urn%3Ali%3AugcPost%3A{id}.` }, - { name: 'count', type: 'integer', required: false, description: `Maximum number of comments to return.` }, - { name: 'start', type: 'integer', required: false, description: `Pagination start index (0-based offset).` }, + { + name: 'ugc_post_urn', + type: 'string', + required: true, + description: `URL-encoded URN of the UGC post to retrieve comments for, e.g. urn%3Ali%3AugcPost%3A{id}.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Maximum number of comments to return.`, + }, + { + name: 'start', + type: 'integer', + required: false, + description: `Pagination start index (0-based offset).`, + }, ], }, { name: 'linkedin_post_create', description: `Create a UGC post on LinkedIn on behalf of the authenticated user or organization.`, params: [ - { name: 'author', type: 'string', required: true, description: `URN of the post author, e.g. urn:li:person:{id} or urn:li:organization:{id}.` }, - { name: 'text', type: 'string', required: true, description: `The text content of the post.` }, - { name: 'visibility', type: 'string', required: false, description: `Visibility of the post. Options: PUBLIC, CONNECTIONS. Defaults to PUBLIC.` }, + { + name: 'author', + type: 'string', + required: true, + description: `URN of the post author, e.g. urn:li:person:{id} or urn:li:organization:{id}.`, + }, + { + name: 'text', + type: 'string', + required: true, + description: `The text content of the post.`, + }, + { + name: 'visibility', + type: 'string', + required: false, + description: `Visibility of the post. Options: PUBLIC, CONNECTIONS. Defaults to PUBLIC.`, + }, ], }, { name: 'linkedin_post_delete', description: `Delete a UGC post from LinkedIn by its ID. This action is irreversible.`, params: [ - { name: 'id', type: 'string', required: true, description: `URL-encoded post URN, e.g. urn%3Ali%3AugcPost%3A12345.` }, + { + name: 'id', + type: 'string', + required: true, + description: `URL-encoded post URN, e.g. urn%3Ali%3AugcPost%3A12345.`, + }, ], }, { name: 'linkedin_post_get', description: `Get a specific LinkedIn post by its URL-encoded URN (e.g. urn%3Ali%3AugcPost%3A12345).`, params: [ - { name: 'id', type: 'string', required: true, description: `URL-encoded post URN, e.g. urn%3Ali%3AugcPost%3A12345.` }, + { + name: 'id', + type: 'string', + required: true, + description: `URL-encoded post URN, e.g. urn%3Ali%3AugcPost%3A12345.`, + }, ], }, { name: 'linkedin_post_like', description: `Like a LinkedIn post on behalf of a person or organization. Uses the Reactions API.`, params: [ - { name: 'actor_urn', type: 'string', required: true, description: `URN of the person or org liking the post, e.g. urn:li:person:{id}.` }, - { name: 'entity_urn', type: 'string', required: true, description: `URN of the post to like, e.g. urn:li:ugcPost:{id} or urn:li:share:{id}.` }, + { + name: 'actor_urn', + type: 'string', + required: true, + description: `Raw (unencoded) URN of the person or organization liking the post, e.g. urn:li:person:abc123.`, + }, + { + name: 'entity_urn', + type: 'string', + required: true, + description: `Raw (unencoded) URN of the post to like, e.g. urn:li:ugcPost:7123456789.`, + }, ], }, { name: 'linkedin_posts_list', description: `List posts by a specific author (person or organization URN).`, params: [ - { name: 'author', type: 'string', required: true, description: `URL-encoded author URN, e.g. urn%3Ali%3Aperson%3A{id} or urn%3Ali%3Aorganization%3A{id}.` }, - { name: 'count', type: 'integer', required: false, description: `Maximum number of results to return.` }, - { name: 'start', type: 'integer', required: false, description: `Pagination start index (0-based offset).` }, + { + name: 'author', + type: 'string', + required: true, + description: `URL-encoded author URN, e.g. urn%3Ali%3Aperson%3A{id} or urn%3Ali%3Aorganization%3A{id}.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'start', + type: 'integer', + required: false, + description: `Pagination start index (0-based offset).`, + }, ], }, { name: 'linkedin_profile_get', - description: `Retrieve the current authenticated user's LinkedIn profile including first name, last name, ID, and profile picture.`, - params: [ - ], + description: `Retrieve the authenticated user's LinkedIn profile (name, picture, locale) via the OpenID Connect userinfo endpoint. Requires openid and profile scopes.`, + params: [], }, { name: 'linkedin_reaction_create', description: `Create a reaction (like, praise, empathy, etc.) on a LinkedIn post or comment.`, params: [ - { name: 'actor_urn', type: 'string', required: true, description: `The URN of the person reacting (e.g. 'urn:li:person:abc123').` }, - { name: 'entity_urn', type: 'string', required: true, description: `The URN of the post or comment to react to.` }, - { name: 'reaction_type', type: 'string', required: true, description: `The type of reaction. One of: LIKE, PRAISE, EMPATHY, INTEREST, APPRECIATION, ENTERTAINMENT.` }, + { + name: 'actor_urn', + type: 'string', + required: true, + description: `The URN of the person reacting (e.g. 'urn:li:person:abc123').`, + }, + { + name: 'entity_urn', + type: 'string', + required: true, + description: `The URN of the post or comment to react to.`, + }, + { + name: 'reaction_type', + type: 'string', + required: true, + description: `The type of reaction. One of: LIKE, PRAISE, EMPATHY, INTEREST, APPRECIATION, ENTERTAINMENT.`, + }, ], }, { name: 'linkedin_reaction_delete', description: `Delete a reaction from a LinkedIn post or comment.`, params: [ - { name: 'actor_urn', type: 'string', required: true, description: `The URN of the person whose reaction is being deleted (e.g. 'urn:li:person:abc123').` }, - { name: 'entity_urn', type: 'string', required: true, description: `The URN of the post or comment the reaction was made on.` }, + { + name: 'actor_urn', + type: 'string', + required: true, + description: `The URN of the person whose reaction is being deleted (e.g. 'urn:li:person:abc123').`, + }, + { + name: 'entity_urn', + type: 'string', + required: true, + description: `The URN of the post or comment the reaction was made on.`, + }, ], }, { name: 'linkedin_reactions_list', description: `List all reactions on a LinkedIn post or entity.`, params: [ - { name: 'entity_urn', type: 'string', required: true, description: `The URN of the post or entity to list reactions for.` }, - { name: 'count', type: 'integer', required: false, description: `Number of reactions to return per page.` }, + { + name: 'entity_urn', + type: 'string', + required: true, + description: `URL-encoded URN of the post or entity to list reactions for. Example: urn%3Ali%3AugcPost%3A7123456789.`, + }, + { + name: 'count', + type: 'integer', + required: false, + description: `Number of reactions to return per page.`, + }, { name: 'start', type: 'integer', required: false, description: `Offset for pagination.` }, ], }, @@ -391,22 +936,41 @@ export const tools: Tool[] = [ name: 'linkedin_share_create', description: `Create a post on LinkedIn on behalf of a person or organization.`, params: [ - { name: 'owner', type: 'string', required: true, description: `URN of the share owner, e.g. urn:li:person:{id} or urn:li:organization:{id}.` }, - { name: 'text', type: 'string', required: true, description: `The text content of the share.` }, - { name: 'visibility_code', type: 'string', required: false, description: `Visibility of the share. Options: anyone, connectionsOnly. Defaults to anyone.` }, + { + name: 'owner', + type: 'string', + required: true, + description: `URN of the share owner, e.g. urn:li:person:{id} or urn:li:organization:{id}.`, + }, + { + name: 'text', + type: 'string', + required: true, + description: `The text content of the share.`, + }, + { + name: 'visibility_code', + type: 'string', + required: false, + description: `Visibility of the share. Options: anyone, connectionsOnly. Defaults to anyone.`, + }, ], }, { name: 'linkedin_social_metadata_get', description: `Get engagement metadata (likes, comments, reaction counts) for a post or share by its URN.`, params: [ - { name: 'share_urn', type: 'string', required: true, description: `URL-encoded post/share URN, e.g. urn%3Ali%3AugcPost%3A12345.` }, + { + name: 'share_urn', + type: 'string', + required: true, + description: `URL-encoded post/share URN, e.g. urn%3Ali%3AugcPost%3A12345.`, + }, ], }, { name: 'linkedin_userinfo_get', description: `Get the authenticated user's OpenID Connect userinfo including id, name, email, and profile picture.`, - params: [ - ], + params: [], }, ] diff --git a/src/data/agent-connectors/lunarcrushmcp.ts b/src/data/agent-connectors/lunarcrushmcp.ts new file mode 100644 index 000000000..e83817545 --- /dev/null +++ b/src/data/agent-connectors/lunarcrushmcp.ts @@ -0,0 +1,370 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'lunarcrushmcp_auth', + description: `Check subscription and rate limit information for the current API key, or test an alternate API key.`, + params: [ + { + name: 'apiKey', + type: 'string', + required: false, + description: `Optional alternate API key to use for this request.`, + }, + ], + }, + { + name: 'lunarcrushmcp_creator', + description: `Get a summary snapshot of social metrics and insights for a specific social media account.`, + params: [ + { + name: 'network', + type: 'string', + required: true, + description: `Social network to filter by.`, + }, + { + name: 'screenName', + type: 'string', + required: true, + description: `Screen name or unique ID of the social media account.`, + }, + ], + }, + { + name: 'lunarcrushmcp_creator_posts', + description: `Get top social posts for a specific social media account by screen name or unique ID.`, + params: [ + { + name: 'network', + type: 'string', + required: true, + description: `Social network to filter by.`, + }, + { + name: 'screenName', + type: 'string', + required: true, + description: `Screen name or unique ID of the social media account.`, + }, + { + name: 'from_date', + type: 'string', + required: false, + description: `Start date for the date range (YYYY-MM-DD). Use with to_date instead of interval.`, + }, + { + name: 'interval', + type: 'string', + required: false, + description: `Time window for the data. Defaults to 1w (hourly). Use 1m or longer for daily data.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'to_date', + type: 'string', + required: false, + description: `End date for the date range (YYYY-MM-DD). Leave blank to get posts up to now.`, + }, + ], + }, + { + name: 'lunarcrushmcp_creator_time_series', + description: `Get historical time-series social metrics for a specific social media account.`, + params: [ + { + name: 'network', + type: 'string', + required: true, + description: `Social network to filter by.`, + }, + { + name: 'screenName', + type: 'string', + required: true, + description: `Screen name or unique ID of the social media account.`, + }, + { + name: 'interval', + type: 'string', + required: false, + description: `Time window for the data. Defaults to 1w (hourly). Use 1m or longer for daily data.`, + }, + { + name: 'metrics', + type: 'array', + required: false, + description: `One or more metrics to include. Leave blank to return all metrics.`, + }, + ], + }, + { + name: 'lunarcrushmcp_cryptocurrencies', + description: `Get a list of cryptocurrencies sorted by social metrics and optionally filtered by sector.`, + params: [ + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'sector', + type: 'string', + required: false, + description: `Filter results to a specific sector.`, + }, + { + name: 'sort', + type: 'string', + required: false, + description: `Sort results by this metric.`, + }, + ], + }, + { + name: 'lunarcrushmcp_fetch', + description: `Fetch a LunarCrush context using a URL-friendly path such as /topic/bitcoin.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `URL-friendly path to the LunarCrush context (e.g. /topic/bitcoin or /creator/x/elonmusk).`, + }, + ], + }, + { + name: 'lunarcrushmcp_keyword_posts', + description: `Get top social posts for a keyword or phrase over a given time period.`, + params: [ + { + name: 'keyword', + type: 'string', + required: true, + description: `Keyword or phrase to search. Use lowercase a-z, 0-9, #, $, _ and spaces only.`, + }, + { + name: 'from_date', + type: 'string', + required: false, + description: `Start date for the date range (YYYY-MM-DD). Use with to_date instead of interval.`, + }, + { + name: 'interval', + type: 'string', + required: false, + description: `Time window for the data. Defaults to 1w (hourly). Use 1m or longer for daily data.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'network', + type: 'string', + required: false, + description: `Social network to filter by.`, + }, + { + name: 'to_date', + type: 'string', + required: false, + description: `End date for the date range (YYYY-MM-DD). Leave blank to get posts up to now.`, + }, + ], + }, + { + name: 'lunarcrushmcp_keyword_time_series', + description: `Get historical time-series social metrics for a keyword or phrase.`, + params: [ + { + name: 'keyword', + type: 'string', + required: true, + description: `Keyword or phrase to search. Use lowercase a-z, 0-9, #, $, _ and spaces only.`, + }, + { + name: 'interval', + type: 'string', + required: false, + description: `Time window for the data. Defaults to 1w (hourly). Use 1m or longer for daily data.`, + }, + { + name: 'metrics', + type: 'array', + required: false, + description: `One or more metrics to include. Leave blank to return all metrics.`, + }, + { + name: 'network', + type: 'string', + required: false, + description: `Social network to filter by.`, + }, + ], + }, + { + name: 'lunarcrushmcp_list', + description: `Get a list of social topics in a category sorted and filtered by available metrics.`, + params: [ + { + name: 'category', + type: 'string', + required: false, + description: `Filter topics by category. Leave blank for all categories.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'sort', + type: 'string', + required: false, + description: `Sort results by this metric.`, + }, + ], + }, + { + name: 'lunarcrushmcp_post', + description: `Get details for a specific social post by network and post ID.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `URL-friendly path to the LunarCrush context (e.g. /topic/bitcoin or /creator/x/elonmusk).`, + }, + { + name: 'network', + type: 'string', + required: true, + description: `Social network to filter by.`, + }, + ], + }, + { + name: 'lunarcrushmcp_search', + description: `Search for any keyword or account and return matching topics, creators, and assets.`, + params: [ + { + name: 'query', + type: 'string', + required: true, + description: `Search query or phrase to find matching topics, creators, or assets.`, + }, + ], + }, + { + name: 'lunarcrushmcp_stocks', + description: `Get a list of stocks sorted by social metrics and optionally filtered by sector.`, + params: [ + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'sector', + type: 'string', + required: false, + description: `Filter results to a specific sector.`, + }, + { + name: 'sort', + type: 'string', + required: false, + description: `Sort results by this metric.`, + }, + ], + }, + { + name: 'lunarcrushmcp_topic', + description: `Get a summary snapshot of all social metrics and insights for any social topic, keyword, or asset.`, + params: [ + { + name: 'topic', + type: 'string', + required: true, + description: `Topic slug (lowercase a-z, 0-9, #, $, _ and spaces). Example: bitcoin.`, + }, + ], + }, + { + name: 'lunarcrushmcp_topic_posts', + description: `Get top social posts by interactions for a topic over a given time period.`, + params: [ + { + name: 'topic', + type: 'string', + required: true, + description: `Topic slug (lowercase a-z, 0-9, #, $, _ and spaces). Example: bitcoin.`, + }, + { + name: 'from_date', + type: 'string', + required: false, + description: `Start date for the date range (YYYY-MM-DD). Use with to_date instead of interval.`, + }, + { + name: 'interval', + type: 'string', + required: false, + description: `Time window for the data. Defaults to 1w (hourly). Use 1m or longer for daily data.`, + }, + { + name: 'limit', + type: 'number', + required: false, + description: `Maximum number of results to return.`, + }, + { + name: 'network', + type: 'string', + required: false, + description: `Social network to filter by.`, + }, + { + name: 'to_date', + type: 'string', + required: false, + description: `End date for the date range (YYYY-MM-DD). Leave blank to get posts up to now.`, + }, + ], + }, + { + name: 'lunarcrushmcp_topic_time_series', + description: `Get historical time-series social metrics for a social topic, keyword, cryptocurrency, or stock.`, + params: [ + { + name: 'topic', + type: 'string', + required: true, + description: `Topic slug (lowercase a-z, 0-9, #, $, _ and spaces). Example: bitcoin.`, + }, + { + name: 'interval', + type: 'string', + required: false, + description: `Time window for the data. Defaults to 1w (hourly). Use 1m or longer for daily data.`, + }, + { + name: 'metrics', + type: 'array', + required: false, + description: `One or more metrics to include. Leave blank to return all metrics.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/mercurymcp.ts b/src/data/agent-connectors/mercurymcp.ts new file mode 100644 index 000000000..060bbceb1 --- /dev/null +++ b/src/data/agent-connectors/mercurymcp.ts @@ -0,0 +1,612 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'mercurymcp_getaccount', + description: `Retrieve details of a specific Mercury account by its ID.`, + params: [ + { + name: 'accountId', + type: 'string', + required: true, + description: `Mercury account ID. Get it from Get Accounts.`, + }, + ], + }, + { + name: 'mercurymcp_getaccountcards', + description: `Retrieve all debit and credit cards associated with a specific account.`, + params: [ + { + name: 'accountId', + type: 'string', + required: true, + description: `Mercury account ID. Get it from Get Accounts.`, + }, + ], + }, + { + name: 'mercurymcp_getaccounts', + description: `Retrieve a paginated list of all Mercury accounts for the organization.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_getaccountstatements', + description: `Retrieve a paginated list of monthly statements for a specific account.`, + params: [ + { + name: 'accountId', + type: 'string', + required: true, + description: `Mercury account ID. Get it from Get Accounts.`, + }, + { + name: 'end', + type: 'string', + required: false, + description: `Filter by end date (YYYY-MM-DD).`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start', + type: 'string', + required: false, + description: `Filter by start date (YYYY-MM-DD).`, + }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_getattachment', + description: `Retrieve attachment details including the download URL.`, + params: [ + { + name: 'attachmentId', + type: 'string', + required: true, + description: `Mercury attachment ID.`, + }, + ], + }, + { + name: 'mercurymcp_getcurrentdate', + description: `Get the current date and time.`, + params: [], + }, + { + name: 'mercurymcp_getcustomer', + description: `Retrieve details of a specific customer by their ID.`, + params: [ + { + name: 'customerId', + type: 'string', + required: true, + description: `Mercury customer ID. Get it from List Customers.`, + }, + ], + }, + { + name: 'mercurymcp_getinvoice', + description: `Retrieve details of an invoice by its ID.`, + params: [ + { + name: 'invoiceId', + type: 'string', + required: true, + description: `Mercury invoice ID. Get it from List Invoices.`, + }, + ], + }, + { + name: 'mercurymcp_getorganization', + description: `Retrieve organization details including EIN, legal business name, and DBAs.`, + params: [], + }, + { + name: 'mercurymcp_getrecipient', + description: `Retrieve details of a specific payment recipient by their ID.`, + params: [ + { + name: 'recipientId', + type: 'string', + required: true, + description: `Mercury recipient ID. Get it from Get Recipients.`, + }, + ], + }, + { + name: 'mercurymcp_getrecipients', + description: `Retrieve a paginated list of all payment recipients.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_getsaferequest', + description: `Retrieve a specific SAFE (Simple Agreement for Future Equity) request by its ID.`, + params: [ + { + name: 'safeRequestId', + type: 'string', + required: true, + description: `Mercury SAFE request ID. Get it from Get SAFE Requests.`, + }, + ], + }, + { + name: 'mercurymcp_getsaferequests', + description: `Retrieve all SAFE requests for the organization.`, + params: [], + }, + { + name: 'mercurymcp_gettransaction', + description: `Retrieve a transaction by account ID and transaction ID.`, + params: [ + { + name: 'accountId', + type: 'string', + required: true, + description: `Mercury account ID. Get it from Get Accounts.`, + }, + { + name: 'transactionId', + type: 'string', + required: true, + description: `Mercury transaction ID. Get it from List Transactions.`, + }, + ], + }, + { + name: 'mercurymcp_gettransactionbyid', + description: `Retrieve a single transaction by its ID including attachments and check images.`, + params: [ + { + name: 'transactionId', + type: 'string', + required: true, + description: `Mercury transaction ID. Get it from List Transactions.`, + }, + ], + }, + { + name: 'mercurymcp_gettreasury', + description: `Retrieve a paginated list of all treasury accounts for the organization.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_gettreasurystatements', + description: `Retrieve a paginated list of statements for a specific treasury account.`, + params: [ + { + name: 'treasuryId', + type: 'string', + required: true, + description: `Mercury treasury account ID. Get it from Get Treasury.`, + }, + { + name: 'documentType', + type: 'string', + required: false, + description: `Filter statements by document type.`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_gettreasurytransactions', + description: `Retrieve paginated transactions for a specific treasury account.`, + params: [ + { + name: 'treasuryId', + type: 'string', + required: true, + description: `Mercury treasury account ID. Get it from Get Treasury.`, + }, + { + name: 'cursor', + type: 'number', + required: false, + description: `Numeric pagination cursor from the previous response.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + ], + }, + { + name: 'mercurymcp_getuser', + description: `Retrieve details of a specific user by their ID.`, + params: [ + { + name: 'userId', + type: 'string', + required: true, + description: `Mercury user ID. Get it from Get Users.`, + }, + ], + }, + { + name: 'mercurymcp_getusers', + description: `Retrieve a paginated list of all users in the organization.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_getwebhook', + description: `Retrieve details of a specific webhook endpoint by its ID.`, + params: [ + { + name: 'webhookEndpointId', + type: 'string', + required: true, + description: `Mercury webhook endpoint ID. Get it from Get Webhooks.`, + }, + ], + }, + { + name: 'mercurymcp_getwebhooks', + description: `Retrieve a paginated list of all webhook endpoints with optional status filtering.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + { name: 'status', type: 'array', required: false, description: `No description.` }, + ], + }, + { + name: 'mercurymcp_listcategories', + description: `Retrieve a paginated list of all custom expense categories for the organization.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_listcredit', + description: `Retrieve a list of all credit accounts for the organization.`, + params: [], + }, + { + name: 'mercurymcp_listcustomers', + description: `Retrieve a paginated list of all customers.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_listinvoiceattachments', + description: `Retrieve all attachments for a specific invoice.`, + params: [ + { + name: 'invoiceId', + type: 'string', + required: true, + description: `Mercury invoice ID. Get it from List Invoices.`, + }, + ], + }, + { + name: 'mercurymcp_listinvoices', + description: `Retrieve a paginated list of all invoices.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_listrecipientsattachments', + description: `Retrieve a paginated list of all recipient tax form attachments across the organization.`, + params: [ + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + ], + }, + { + name: 'mercurymcp_listsendmoneyapprovalrequests', + description: `Retrieve a paginated list of send money approval requests with optional filtering.`, + params: [ + { + name: 'accountId', + type: 'string', + required: false, + description: `Mercury account ID. Get it from Get Accounts.`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + { name: 'status', type: 'string', required: false, description: `Filter by status.` }, + ], + }, + { + name: 'mercurymcp_listtransactions', + description: `Retrieve a paginated list of transactions across all accounts with advanced filtering.`, + params: [ + { name: 'accountId', type: 'array', required: false, description: `No description.` }, + { name: 'cardId', type: 'array', required: false, description: `No description.` }, + { + name: 'categoryId', + type: 'string', + required: false, + description: `Filter by custom expense category ID.`, + }, + { + name: 'end', + type: 'string', + required: false, + description: `Filter by end date (YYYY-MM-DD).`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Cursor to fetch the page before this position.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { + name: 'mercuryCategory', + type: 'string', + required: false, + description: `Filter by Mercury built-in transaction category.`, + }, + { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc.` }, + { + name: 'postedEnd', + type: 'string', + required: false, + description: `Filter transactions posted on or before this date (YYYY-MM-DD).`, + }, + { + name: 'postedStart', + type: 'string', + required: false, + description: `Filter transactions posted on or after this date (YYYY-MM-DD).`, + }, + { + name: 'search', + type: 'string', + required: false, + description: `Search term to filter transactions by description or counterparty.`, + }, + { + name: 'start', + type: 'string', + required: false, + description: `Filter by start date (YYYY-MM-DD).`, + }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Cursor from the previous response to fetch the next page.`, + }, + { + name: 'start_at', + type: 'string', + required: false, + description: `Filter by start datetime (ISO 8601).`, + }, + { name: 'status', type: 'array', required: false, description: `No description.` }, + ], + }, +] diff --git a/src/data/agent-connectors/sybilmcp.ts b/src/data/agent-connectors/sybilmcp.ts new file mode 100644 index 000000000..5d57ace71 --- /dev/null +++ b/src/data/agent-connectors/sybilmcp.ts @@ -0,0 +1,250 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'sybilmcp_ask_sybill', + description: `Ask Sybill AI about your sales calls, deals, accounts, or contacts.`, + params: [ + { + name: 'message', + type: 'string', + required: true, + description: `Your question about sales calls, deals, accounts, or contacts.`, + }, + ], + }, + { + name: 'sybilmcp_get_account', + description: `Get full details of a single CRM account including contacts, owner, and synced CRM fields.`, + params: [ + { + name: 'account_id', + type: 'string', + required: true, + description: `Unique ID of the account. Get it from List Accounts.`, + }, + ], + }, + { + name: 'sybilmcp_get_conversation', + description: `Get full details of a single conversation including summary, transcript, and recording URLs.`, + params: [ + { + name: 'conversation_id', + type: 'string', + required: true, + description: `Unique ID of the conversation. Get it from List Conversations.`, + }, + ], + }, + { + name: 'sybilmcp_get_deal', + description: `Get full details of a single CRM deal including summary, contacts, owner, pipeline, and stage.`, + params: [ + { + name: 'deal_id', + type: 'string', + required: true, + description: `Unique ID of the deal. Get it from List Deals.`, + }, + ], + }, + { + name: 'sybilmcp_list_accounts', + description: `List CRM accounts with optional filters for name, website, owner, and date ranges.`, + params: [ + { + name: 'created_after', + type: 'string', + required: false, + description: `Return records created after this ISO 8601 datetime.`, + }, + { + name: 'created_before', + type: 'string', + required: false, + description: `Return records created before this ISO 8601 datetime.`, + }, + { + name: 'cursor', + type: 'string', + required: false, + description: `Pagination cursor from the previous response to fetch the next page.`, + }, + { + name: 'last_activity_after', + type: 'string', + required: false, + description: `Return records with last activity after this ISO 8601 datetime.`, + }, + { + name: 'last_activity_before', + type: 'string', + required: false, + description: `Return records with last activity before this ISO 8601 datetime.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Filter by account or deal name (partial match supported).`, + }, + { + name: 'owner', + type: 'string', + required: false, + description: `Filter by owner email address.`, + }, + { + name: 'website', + type: 'string', + required: false, + description: `Filter by account website domain.`, + }, + ], + }, + { + name: 'sybilmcp_list_conversations', + description: `List sales conversations with optional filters for date range, meeting type, and attendees.`, + params: [ + { + name: 'attendees', + type: 'string', + required: false, + description: `Filter conversations by attendee email address.`, + }, + { + name: 'crm_name', + type: 'string', + required: false, + description: `Filter by CRM name (e.g. Salesforce, HubSpot).`, + }, + { + name: 'cursor', + type: 'string', + required: false, + description: `Pagination cursor from the previous response to fetch the next page.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { + name: 'meeting_type', + type: 'string', + required: false, + description: `Filter conversations by meeting category (e.g. prospect_demo, customer_onboarding, one_on_one).`, + }, + { + name: 'source_id', + type: 'string', + required: false, + description: `Filter by source/integration ID.`, + }, + { + name: 'started_after', + type: 'string', + required: false, + description: `Return conversations that started after this ISO 8601 datetime.`, + }, + { + name: 'started_before', + type: 'string', + required: false, + description: `Return conversations that started before this ISO 8601 datetime.`, + }, + { + name: 'title', + type: 'string', + required: false, + description: `Filter conversations by title (partial match supported).`, + }, + ], + }, + { + name: 'sybilmcp_list_deals', + description: `List CRM deals with optional filters for name, stage, amount, owner, and close date.`, + params: [ + { + name: 'amount_max', + type: 'string', + required: false, + description: `Return deals with amount less than or equal to this value.`, + }, + { + name: 'amount_min', + type: 'string', + required: false, + description: `Return deals with amount greater than or equal to this value.`, + }, + { + name: 'close_date_after', + type: 'string', + required: false, + description: `Return deals with close date after this date (YYYY-MM-DD).`, + }, + { + name: 'close_date_before', + type: 'string', + required: false, + description: `Return deals with close date before this date (YYYY-MM-DD).`, + }, + { + name: 'closed', + type: 'string', + required: false, + description: `Filter by closed status: true for closed deals, false for open.`, + }, + { + name: 'cursor', + type: 'string', + required: false, + description: `Pagination cursor from the previous response to fetch the next page.`, + }, + { + name: 'last_activity_after', + type: 'string', + required: false, + description: `Return records with last activity after this ISO 8601 datetime.`, + }, + { + name: 'last_activity_before', + type: 'string', + required: false, + description: `Return records with last activity before this ISO 8601 datetime.`, + }, + { + name: 'limit', + type: 'integer', + required: false, + description: `Maximum number of items to return per page.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Filter by account or deal name (partial match supported).`, + }, + { + name: 'owner', + type: 'string', + required: false, + description: `Filter by owner email address.`, + }, + { + name: 'stage', + type: 'string', + required: false, + description: `Filter deals by pipeline stage name.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/ticktickmcp.ts b/src/data/agent-connectors/ticktickmcp.ts new file mode 100644 index 000000000..56a9f97da --- /dev/null +++ b/src/data/agent-connectors/ticktickmcp.ts @@ -0,0 +1,635 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'ticktickmcp_add_comment', + description: `Add a plain-text comment (max 1024 characters) to a task.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + { + name: 'title', + type: 'string', + required: true, + description: `Text content of the comment (plain text, max 1024 characters).`, + }, + ], + }, + { + name: 'ticktickmcp_batch_add_tasks', + description: `Create multiple tasks in one request. Each task must include a title and projectId.`, + params: [{ name: 'tasks', type: 'array', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_batch_update_tasks', + description: `Update multiple existing tasks in one request. Each task must include its taskId.`, + params: [{ name: 'tasks', type: 'array', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_complete_task', + description: `Mark a task as completed by projectId and taskId.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_complete_tasks_in_project', + description: `Mark up to 20 tasks as completed in a project.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { name: 'task_ids', type: 'array', required: true, description: `No description.` }, + ], + }, + { + name: 'ticktickmcp_create_column', + description: `Create a new Kanban column in a project.`, + params: [ + { name: 'column', type: 'string', required: true, description: `No description.` }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + ], + }, + { + name: 'ticktickmcp_create_focus', + description: `Create a focus session record. Type 0 = Pomodoro, type 1 = timer.`, + params: [ + { + name: 'end_time', + type: 'string', + required: true, + description: `End time of the focus session in ISO 8601 format, e.g. 2026-06-01T10:00:00+0000.`, + }, + { + name: 'start_time', + type: 'string', + required: true, + description: `Start time of the focus session in ISO 8601 format, e.g. 2026-06-01T09:00:00+0000.`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Focus session type: 0 for Pomodoro, 1 for timer.`, + }, + { + name: 'habit_id', + type: 'string', + required: false, + description: `Unique ID of the habit. Get it from list_habits.`, + }, + { + name: 'note', + type: 'string', + required: false, + description: `Optional text note to attach to the focus session.`, + }, + { + name: 'task_id', + type: 'string', + required: false, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_create_habit', + description: `Create a new habit to track in TickTick.`, + params: [{ name: 'habit', type: 'string', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_create_project', + description: `Create a new project (list) in TickTick.`, + params: [ + { + name: 'name', + type: 'string', + required: true, + description: `Display name for the project.`, + }, + { + name: 'color', + type: 'string', + required: false, + description: `Hex color code for the project, e.g. #FF6B6B.`, + }, + { + name: 'group_id', + type: 'string', + required: false, + description: `ID of the project group to place this project in.`, + }, + { + name: 'kind', + type: 'string', + required: false, + description: `Project kind. Accepted values: TASK, NOTE.`, + }, + { + name: 'sort_order', + type: 'integer', + required: false, + description: `Integer sort order for positioning the project in the list.`, + }, + { + name: 'view_mode', + type: 'string', + required: false, + description: `Default view mode. Accepted values: list, kanban, timeline.`, + }, + ], + }, + { + name: 'ticktickmcp_create_project_group', + description: `Create a new project group for organizing projects.`, + params: [ + { name: 'project_group', type: 'string', required: true, description: `No description.` }, + ], + }, + { + name: 'ticktickmcp_create_tag', + description: `Create a new tag for labeling tasks.`, + params: [{ name: 'tag', type: 'string', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_create_task', + description: `Create a new task in a TickTick project.`, + params: [{ name: 'task', type: 'string', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_delete_comment', + description: `Delete a comment from a task by comment ID.`, + params: [ + { name: 'id', type: 'string', required: true, description: `Unique ID of the resource.` }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_delete_focus', + description: `Delete a focus session record by focusId and type.`, + params: [ + { + name: 'focus_id', + type: 'string', + required: true, + description: `Unique ID of the focus session.`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Focus session type: 0 for Pomodoro, 1 for timer.`, + }, + ], + }, + { + name: 'ticktickmcp_delete_project_group', + description: `Delete a project group permanently by its ID.`, + params: [ + { + name: 'project_group_id', + type: 'string', + required: true, + description: `Unique ID of the project group. Get it from list_project_groups.`, + }, + ], + }, + { + name: 'ticktickmcp_delete_task', + description: `Permanently delete a task by projectId and taskId.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_fetch', + description: `Fetch the full contents of a task by its ID.`, + params: [ + { name: 'id', type: 'string', required: true, description: `Unique ID of the resource.` }, + ], + }, + { + name: 'ticktickmcp_filter_tasks', + description: `Filter tasks by date range, project IDs, priority, tags, kind, or status.`, + params: [{ name: 'filter', type: 'string', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_get_comment', + description: `Get all comments for a task by projectId and taskId.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_get_focus', + description: `Get a single focus session record by focusId and type.`, + params: [ + { + name: 'focus_id', + type: 'string', + required: true, + description: `Unique ID of the focus session.`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Focus session type: 0 for Pomodoro, 1 for timer.`, + }, + ], + }, + { + name: 'ticktickmcp_get_focuses_by_time', + description: `Get focus sessions within a time range (max one month) filtered by type.`, + params: [ + { + name: 'from_time', + type: 'string', + required: true, + description: `Start of the time range in ISO 8601 format.`, + }, + { + name: 'to_time', + type: 'string', + required: true, + description: `End of the time range in ISO 8601 format. Range must not exceed one month.`, + }, + { + name: 'type', + type: 'integer', + required: true, + description: `Focus session type: 0 for Pomodoro, 1 for timer.`, + }, + ], + }, + { + name: 'ticktickmcp_get_habit', + description: `Get details of a habit by habitId.`, + params: [ + { + name: 'habit_id', + type: 'string', + required: true, + description: `Unique ID of the habit. Get it from list_habits.`, + }, + ], + }, + { + name: 'ticktickmcp_get_habit_checkins', + description: `Get habit check-ins for one or more habits within a date range.`, + params: [ + { + name: 'from_stamp', + type: 'integer', + required: true, + description: `Start date as an integer date stamp, e.g. 20260101 for January 1 2026.`, + }, + { name: 'habit_ids', type: 'array', required: true, description: `No description.` }, + { + name: 'to_stamp', + type: 'integer', + required: true, + description: `End date as an integer date stamp, e.g. 20260630 for June 30 2026.`, + }, + ], + }, + { + name: 'ticktickmcp_get_project_by_id', + description: `Get project details by projectId.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + ], + }, + { + name: 'ticktickmcp_get_project_with_undone_tasks', + description: `Get a project and all its undone tasks by projectId.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + ], + }, + { + name: 'ticktickmcp_get_task_by_id', + description: `Get full task details by taskId.`, + params: [ + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_get_task_in_project', + description: `Get a specific task by projectId and taskId.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_get_user_preference', + description: `Get user preferences including timezone and display settings.`, + params: [], + }, + { + name: 'ticktickmcp_list_columns', + description: `List all Kanban columns in a project.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + ], + }, + { + name: 'ticktickmcp_list_completed_tasks_by_date', + description: `List completed tasks filtered by project IDs and date range.`, + params: [{ name: 'search', type: 'string', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_list_countdowns', + description: `List all countdown tasks for the current user.`, + params: [], + }, + { + name: 'ticktickmcp_list_habit_sections', + description: `List all habit sections for the current user.`, + params: [], + }, + { + name: 'ticktickmcp_list_habits', + description: `List all habits for the current user.`, + params: [], + }, + { + name: 'ticktickmcp_list_project_groups', + description: `List all project groups for the current user.`, + params: [], + }, + { + name: 'ticktickmcp_list_projects', + description: `List all projects for the current user.`, + params: [], + }, + { + name: 'ticktickmcp_list_tags', + description: `List all tags for the current user.`, + params: [], + }, + { + name: 'ticktickmcp_list_undone_tasks_by_date', + description: `List undone tasks within a date range (max 14 days between start and end).`, + params: [{ name: 'search', type: 'string', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_list_undone_tasks_by_time_query', + description: `List undone tasks using a predefined time query: today, last24hour, last7day, tomorrow, or nextWeek.`, + params: [ + { + name: 'query_command', + type: 'string', + required: false, + description: `Predefined time query. Accepted values: today, last24hour, last7day, tomorrow, nextWeek.`, + }, + ], + }, + { + name: 'ticktickmcp_move_task', + description: `Move tasks to different projects.`, + params: [{ name: 'moves', type: 'array', required: true, description: `No description.` }], + }, + { + name: 'ticktickmcp_search', + description: `Search TickTick and return matching results with IDs, titles, and URLs.`, + params: [ + { + name: 'query', + type: 'string', + required: true, + description: `Search keyword to filter tasks by name or content.`, + }, + ], + }, + { + name: 'ticktickmcp_search_task', + description: `Search tasks by keyword and return matching taskId, title, and URL.`, + params: [ + { + name: 'query', + type: 'string', + required: true, + description: `Search keyword to filter tasks by name or content.`, + }, + ], + }, + { + name: 'ticktickmcp_update_column', + description: `Update an existing Kanban column by columnId.`, + params: [ + { name: 'column', type: 'string', required: true, description: `No description.` }, + { + name: 'column_id', + type: 'string', + required: true, + description: `Unique ID of the column. Get it from list_columns.`, + }, + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + ], + }, + { + name: 'ticktickmcp_update_habit', + description: `Update an existing habit by habitId.`, + params: [ + { name: 'habit', type: 'string', required: true, description: `No description.` }, + { + name: 'habit_id', + type: 'string', + required: true, + description: `Unique ID of the habit. Get it from list_habits.`, + }, + ], + }, + { + name: 'ticktickmcp_update_project', + description: `Update an existing project's name, color, group, or display settings.`, + params: [ + { + name: 'project_id', + type: 'string', + required: true, + description: `Unique ID of the project. Get it from list_projects.`, + }, + { + name: 'closed', + type: 'string', + required: false, + description: `Whether the project is archived.`, + }, + { + name: 'color', + type: 'string', + required: false, + description: `Hex color code for the project, e.g. #FF6B6B.`, + }, + { + name: 'group_id', + type: 'string', + required: false, + description: `ID of the project group to place this project in.`, + }, + { + name: 'kind', + type: 'string', + required: false, + description: `Project kind. Accepted values: TASK, NOTE.`, + }, + { + name: 'name', + type: 'string', + required: false, + description: `Display name for the project.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Integer sort order for positioning the project in the list.`, + }, + { + name: 'view_mode', + type: 'string', + required: false, + description: `Default view mode. Accepted values: list, kanban, timeline.`, + }, + ], + }, + { + name: 'ticktickmcp_update_project_group', + description: `Update an existing project group by projectGroupId.`, + params: [ + { name: 'project_group', type: 'string', required: true, description: `No description.` }, + { + name: 'project_group_id', + type: 'string', + required: true, + description: `Unique ID of the project group. Get it from list_project_groups.`, + }, + ], + }, + { + name: 'ticktickmcp_update_task', + description: `Update an existing task's fields. To remove a parent-child relationship, set parentId to empty string.`, + params: [ + { name: 'task', type: 'string', required: true, description: `No description.` }, + { + name: 'task_id', + type: 'string', + required: true, + description: `Unique ID of the task. Get it from search_task or get_task_in_project.`, + }, + ], + }, + { + name: 'ticktickmcp_upsert_habit_checkins', + description: `Create or update check-in records for a habit by habitId.`, + params: [ + { name: 'checkin_data', type: 'string', required: true, description: `No description.` }, + { + name: 'habit_id', + type: 'string', + required: true, + description: `Unique ID of the habit. Get it from list_habits.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/tinyfishmcp.ts b/src/data/agent-connectors/tinyfishmcp.ts new file mode 100644 index 000000000..732a4737e --- /dev/null +++ b/src/data/agent-connectors/tinyfishmcp.ts @@ -0,0 +1,545 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'tinyfishmcp_batch_cancel', + description: `Cancel up to 8 running or pending automation runs by their IDs. Already-terminal runs are returned with their current status.`, + params: [ + { + name: 'run_ids', + type: 'array', + required: true, + description: `List of run IDs to cancel or check status for (up to 8).`, + }, + ], + }, + { + name: 'tinyfishmcp_batch_create', + description: `Start up to 8 web automations simultaneously and return all run IDs immediately. Poll progress with batch_status.`, + params: [ + { + name: 'runs', + type: 'array', + required: true, + description: `Array of 1–8 run configurations to start simultaneously.`, + }, + { + name: 'profile_id', + type: 'string', + required: false, + description: `Browser profile ID to use when use_profile is true.`, + }, + ], + }, + { + name: 'tinyfishmcp_batch_status', + description: `Check the status, result, and error for up to 8 automation runs by their IDs.`, + params: [ + { + name: 'run_ids', + type: 'array', + required: true, + description: `List of run IDs to cancel or check status for (up to 8).`, + }, + ], + }, + { + name: 'tinyfishmcp_cancel_run', + description: `Cancel a running or pending automation run by its ID. Returns current status without error if the run has already reached a terminal state.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique run ID to retrieve or cancel.`, + }, + ], + }, + { + name: 'tinyfishmcp_create_browser_session', + description: `Create a remote stealth Chrome browser session in the cloud and return CDP connection details (session_id, cdp_url) for use with Playwright, Puppeteer, or Selenium. Sessions auto-terminate after the configured inactivity timeout.`, + params: [ + { + name: 'timeout_seconds', + type: 'integer', + required: false, + description: `Browser session timeout in seconds.`, + }, + { + name: 'url', + type: 'string', + required: false, + description: `Target website URL to automate.`, + }, + ], + }, + { + name: 'tinyfishmcp_discover_run', + description: `Return the run ID of the currently active automation for the given session, or null if no run is in progress.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `The browser session ID to look up the running automation for.`, + }, + ], + }, + { + name: 'tinyfishmcp_fetch_content', + description: `Render up to 10 URLs in a real browser and return clean structured content (markdown, HTML, or JSON) plus metadata like title, author, and publish date. Fetches run in parallel; per-URL errors are reported without blocking the rest.`, + params: [ + { + name: 'format', + type: 'string', + required: true, + description: `Output format for extracted content. Accepted values: markdown, html, json.`, + }, + { + name: 'image_links', + type: 'boolean', + required: true, + description: `Set to true to extract all image URLs from each page.`, + }, + { + name: 'include_html_head', + type: 'boolean', + required: true, + description: `Set to true to return a full HTML document with when format is html.`, + }, + { + name: 'links', + type: 'boolean', + required: true, + description: `Set to true to extract all hyperlinks from each page.`, + }, + { + name: 'urls', + type: 'array', + required: true, + description: `List of URLs to fetch content from.`, + }, + { + name: 'ttl', + type: 'integer', + required: false, + description: `Cache TTL in seconds for fetched content. Omit to disable caching.`, + }, + ], + }, + { + name: 'tinyfishmcp_get_run', + description: `Retrieve status, result, error, and metadata for a specific automation run by its ID.`, + params: [ + { + name: 'id', + type: 'string', + required: true, + description: `The unique run ID to retrieve or cancel.`, + }, + ], + }, + { + name: 'tinyfishmcp_get_search_usage', + description: `List past search usage records with optional filtering by date range and status, for auditing query history and credit consumption.`, + params: [ + { + name: 'limit', + type: 'integer', + required: true, + description: `Maximum number of results to return per page.`, + }, + { + name: 'page', + type: 'integer', + required: true, + description: `Page number for paginated results.`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Return records ending before this ISO 8601 timestamp.`, + }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Return records starting after this ISO 8601 timestamp.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by run or session status (e.g. completed, failed, running).`, + }, + ], + }, + { + name: 'tinyfishmcp_get_steps', + description: `Retrieve the step-by-step execution trace for an automation run, including screenshots captured at each step.`, + params: [ + { + name: 'runId', + type: 'string', + required: true, + description: `The unique run ID to retrieve steps or poll status for.`, + }, + ], + }, + { + name: 'tinyfishmcp_list_browser_sessions', + description: `List browser sessions with optional filtering by session ID, time range, and status, returning duration, data usage, and connection metadata.`, + params: [ + { + name: 'limit', + type: 'integer', + required: true, + description: `Maximum number of results to return per page.`, + }, + { + name: 'page', + type: 'integer', + required: true, + description: `Page number for paginated results.`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Return records ending before this ISO 8601 timestamp.`, + }, + { + name: 'session_id', + type: 'string', + required: false, + description: `The browser session ID for an active cloud session.`, + }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Return records starting after this ISO 8601 timestamp.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by run or session status (e.g. completed, failed, running).`, + }, + ], + }, + { + name: 'tinyfishmcp_list_fetch_usage', + description: `List past fetch content requests with optional filtering by date range and status. Does not include the fetched text content.`, + params: [ + { + name: 'limit', + type: 'integer', + required: true, + description: `Maximum number of results to return per page.`, + }, + { + name: 'page', + type: 'integer', + required: true, + description: `Page number for paginated results.`, + }, + { + name: 'end_before', + type: 'string', + required: false, + description: `Return records ending before this ISO 8601 timestamp.`, + }, + { + name: 'start_after', + type: 'string', + required: false, + description: `Return records starting after this ISO 8601 timestamp.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by run or session status (e.g. completed, failed, running).`, + }, + ], + }, + { + name: 'tinyfishmcp_list_runs', + description: `List automation runs with optional filtering by status, goal text, and date range, with cursor-based pagination.`, + params: [ + { + name: 'limit', + type: 'integer', + required: true, + description: `Maximum number of results to return per page.`, + }, + { + name: 'sort_direction', + type: 'string', + required: true, + description: `Sort direction. Accepted values: asc, desc.`, + }, + { + name: 'created_after', + type: 'string', + required: false, + description: `Return runs created after this ISO 8601 timestamp.`, + }, + { + name: 'created_before', + type: 'string', + required: false, + description: `Return runs created before this ISO 8601 timestamp.`, + }, + { + name: 'cursor', + type: 'string', + required: false, + description: `Pagination cursor from the previous response to fetch the next page.`, + }, + { + name: 'goal', + type: 'string', + required: false, + description: `Natural language description of what to accomplish on the website.`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Filter by run or session status (e.g. completed, failed, running).`, + }, + ], + }, + { + name: 'tinyfishmcp_poll_status', + description: `Return the current status, step count, and progress for an automation run.`, + params: [ + { + name: 'runId', + type: 'string', + required: true, + description: `The unique run ID to retrieve steps or poll status for.`, + }, + ], + }, + { + name: 'tinyfishmcp_run_web_automation', + description: `Execute multi-step web automation on a URL using a natural language goal — clicks, form fills, and navigation. If the tool times out, the run is still executing on the server; use get_run or list_runs to check status.`, + params: [ + { + name: 'goal', + type: 'string', + required: true, + description: `Natural language description of what to accomplish on the website.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `The browser session ID for an active cloud session.`, + }, + { + name: 'url', + type: 'string', + required: true, + description: `Target website URL to automate.`, + }, + { + name: 'agent_config', + type: 'object', + required: false, + description: `Agent behavior configuration (max_steps, mode, cursor_style, max_duration_seconds).`, + }, + { + name: 'api_integration', + type: 'string', + required: false, + description: `Name of the integration making this call (e.g. zapier, n8n). Used for analytics.`, + }, + { + name: 'browser_profile', + type: 'string', + required: false, + description: `Browser execution profile. Accepted values: lite, stealth.`, + }, + { + name: 'capture_config', + type: 'object', + required: false, + description: `Configure which data to capture during the run (screenshots, recording, html, etc.).`, + }, + { + name: 'credential_item_ids', + type: 'array', + required: false, + description: `Scope vault credentials to specific credential URIs. Requires use_vault to be true.`, + }, + { + name: 'feature_flags', + type: 'object', + required: false, + description: `Feature flags to enable for this run.`, + }, + { + name: 'profile_id', + type: 'string', + required: false, + description: `Browser profile ID to use when use_profile is true.`, + }, + { + name: 'proxy_config', + type: 'object', + required: false, + description: `Proxy configuration for this run (enabled, type, url, country_code).`, + }, + { + name: 'use_profile', + type: 'boolean', + required: false, + description: `Set to true to use the default browser profile if profiles are enabled.`, + }, + { + name: 'use_vault', + type: 'boolean', + required: false, + description: `Set to true to include enabled vault credentials for this run.`, + }, + { + name: 'webhook_url', + type: 'string', + required: false, + description: `HTTPS URL to receive webhook notifications for run lifecycle events.`, + }, + ], + }, + { + name: 'tinyfishmcp_run_web_automation_async', + description: `Start a single web automation in the background and return the run ID immediately without waiting for completion. Poll with get_run every 30–60 seconds.`, + params: [ + { + name: 'goal', + type: 'string', + required: true, + description: `Natural language description of what to accomplish on the website.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `The browser session ID for an active cloud session.`, + }, + { + name: 'url', + type: 'string', + required: true, + description: `Target website URL to automate.`, + }, + { + name: 'agent_config', + type: 'object', + required: false, + description: `Agent behavior configuration (max_steps, mode, cursor_style, max_duration_seconds).`, + }, + { + name: 'api_integration', + type: 'string', + required: false, + description: `Name of the integration making this call (e.g. zapier, n8n). Used for analytics.`, + }, + { + name: 'browser_profile', + type: 'string', + required: false, + description: `Browser execution profile. Accepted values: lite, stealth.`, + }, + { + name: 'capture_config', + type: 'object', + required: false, + description: `Configure which data to capture during the run (screenshots, recording, html, etc.).`, + }, + { + name: 'credential_item_ids', + type: 'array', + required: false, + description: `Scope vault credentials to specific credential URIs. Requires use_vault to be true.`, + }, + { + name: 'feature_flags', + type: 'object', + required: false, + description: `Feature flags to enable for this run.`, + }, + { + name: 'profile_id', + type: 'string', + required: false, + description: `Browser profile ID to use when use_profile is true.`, + }, + { + name: 'proxy_config', + type: 'object', + required: false, + description: `Proxy configuration for this run (enabled, type, url, country_code).`, + }, + { + name: 'use_profile', + type: 'boolean', + required: false, + description: `Set to true to use the default browser profile if profiles are enabled.`, + }, + { + name: 'use_vault', + type: 'boolean', + required: false, + description: `Set to true to include enabled vault credentials for this run.`, + }, + { + name: 'webhook_url', + type: 'string', + required: false, + description: `HTTPS URL to receive webhook notifications for run lifecycle events.`, + }, + ], + }, + { + name: 'tinyfishmcp_search', + description: `Search the web and return structured results with titles, snippets, and URLs. Supports geo-targeting and language filtering.`, + params: [ + { name: 'query', type: 'string', required: true, description: `Search query to run.` }, + { + name: 'fetch', + type: 'string', + required: false, + description: `Fetch mode for search results. Accepted values: none, snippet, full.`, + }, + { + name: 'include_thumbnail', + type: 'string', + required: false, + description: `Set to true to include thumbnail images in search results.`, + }, + { + name: 'language', + type: 'string', + required: false, + description: `Language code to filter search results (e.g. en).`, + }, + { + name: 'location', + type: 'string', + required: false, + description: `Location to filter search results (e.g. United States).`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for paginated results.`, + }, + ], + }, +] diff --git a/src/data/agent-connectors/zendesk.ts b/src/data/agent-connectors/zendesk.ts index 0928c9fbd..ba358837a 100644 --- a/src/data/agent-connectors/zendesk.ts +++ b/src/data/agent-connectors/zendesk.ts @@ -6,15 +6,501 @@ export const tools: Tool[] = [ description: `List all groups in Zendesk. Groups are used to organize agents and route tickets.`, params: [ { name: 'page', type: 'number', required: false, description: `Page number for pagination` }, - { name: 'per_page', type: 'number', required: false, description: `Number of groups per page (max 100)` }, + { + name: 'per_page', + type: 'number', + required: false, + description: `Number of groups per page (max 100)`, + }, + ], + }, + { + name: 'zendesk_help_center_article_archive', + description: `Archive (delete) a Help Center article by ID. The article can be restored from the Zendesk Help Center UI.`, + params: [ + { + name: 'article_id', + type: 'number', + required: true, + description: `The ID of the article to archive.`, + }, + ], + }, + { + name: 'zendesk_help_center_article_comment_create', + description: `Add a comment to a Help Center article. Requires article ID, comment body, and locale.`, + params: [ + { + name: 'article_id', + type: 'number', + required: true, + description: `The ID of the article to comment on.`, + }, + { name: 'body', type: 'string', required: true, description: `HTML body of the comment.` }, + { + name: 'locale', + type: 'string', + required: true, + description: `Locale for the comment (e.g., en-us).`, + }, + { + name: 'author_id', + type: 'number', + required: false, + description: `User ID of the comment author (Help Center managers only).`, + }, + { + name: 'notify_subscribers', + type: 'boolean', + required: false, + description: `Whether to notify article subscribers of the new comment. Default: true.`, + }, + ], + }, + { + name: 'zendesk_help_center_article_comments_list', + description: `List all comments on a Help Center article.`, + params: [ + { + name: 'article_id', + type: 'number', + required: true, + description: `The ID of the article whose comments to list.`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated sideloads: users (authors), articles.`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for offset pagination.`, + }, + { + name: 'per_page', + type: 'integer', + required: false, + description: `Number of results per page (max 100).`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc. Default: desc.`, + }, + ], + }, + { + name: 'zendesk_help_center_article_create', + description: `Create a new Help Center article in a section. Requires a title, locale, and section ID.`, + params: [ + { + name: 'locale', + type: 'string', + required: true, + description: `Locale for the article (e.g., en-us).`, + }, + { + name: 'section_id', + type: 'number', + required: true, + description: `The ID of the section to create the article in.`, + }, + { name: 'title', type: 'string', required: true, description: `The title of the article.` }, + { + name: 'author_id', + type: 'number', + required: false, + description: `User ID of the article author.`, + }, + { + name: 'body', + type: 'string', + required: false, + description: `HTML body content of the article.`, + }, + { + name: 'comments_disabled', + type: 'boolean', + required: false, + description: `Whether to disable comments on this article.`, + }, + { + name: 'content_tag_ids', + type: 'array', + required: false, + description: `IDs of existing content tags to attach to the article.`, + }, + { + name: 'draft', + type: 'boolean', + required: false, + description: `If true, the article is saved as a draft and not published.`, + }, + { + name: 'notify_subscribers', + type: 'boolean', + required: false, + description: `Set to false to suppress email notifications to article subscribers on creation. Default: true.`, + }, + { + name: 'permission_group_id', + type: 'number', + required: false, + description: `The permission group that determines who can view this article.`, + }, + { + name: 'promoted', + type: 'boolean', + required: false, + description: `Whether to pin this article to the top of its section.`, + }, + { + name: 'user_segment_id', + type: 'number', + required: false, + description: `The user segment that can view this article. Omit for a public article.`, + }, + ], + }, + { + name: 'zendesk_help_center_article_get', + description: `Retrieve a single Help Center article by its ID.`, + params: [ + { + name: 'article_id', + type: 'number', + required: true, + description: `The ID of the article to retrieve.`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated sideloads: users, sections, categories, translations.`, + }, + ], + }, + { + name: 'zendesk_help_center_article_update', + description: `Update article-level metadata: promoted status, position, comments setting, labels, and content tags. Does not update title or body — use the Translations API for those.`, + params: [ + { + name: 'article_id', + type: 'number', + required: true, + description: `The ID of the article to update.`, + }, + { + name: 'comments_disabled', + type: 'boolean', + required: false, + description: `Whether to disable comments on this article.`, + }, + { + name: 'content_tag_ids', + type: 'array', + required: false, + description: `IDs of content tags to attach to the article.`, + }, + { + name: 'label_names', + type: 'array', + required: false, + description: `Labels to assign to the article.`, + }, + { + name: 'position', + type: 'integer', + required: false, + description: `Position of the article within its section.`, + }, + { + name: 'promoted', + type: 'boolean', + required: false, + description: `Whether to pin this article to the top of its section.`, + }, + ], + }, + { + name: 'zendesk_help_center_articles_list', + description: `List Help Center articles. Filter by section or category, sort, and paginate results.`, + params: [ + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated sideloads: users, sections, categories, translations.`, + }, + { + name: 'label_names', + type: 'string', + required: false, + description: `Comma-separated list of labels to filter articles by.`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for offset pagination.`, + }, + { + name: 'per_page', + type: 'integer', + required: false, + description: `Number of results per page (max 100).`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Field to sort by: position, title, created_at, updated_at, or edited_at.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc.`, + }, + { + name: 'start_time', + type: 'integer', + required: false, + description: `Unix epoch timestamp to fetch only articles updated after this time (for incremental sync).`, + }, + ], + }, + { + name: 'zendesk_help_center_articles_search', + description: `Search Help Center articles by keyword. Filter by category, section, locale, labels, and date range.`, + params: [ + { + name: 'brand_id', + type: 'integer', + required: false, + description: `Scope the search to a specific brand ID.`, + }, + { + name: 'category', + type: 'number', + required: false, + description: `Filter results to a specific category ID.`, + }, + { + name: 'created_after', + type: 'string', + required: false, + description: `Limit results to articles created after this date (YYYY-MM-DD).`, + }, + { + name: 'created_at', + type: 'string', + required: false, + description: `Limit results to articles created on this date (YYYY-MM-DD).`, + }, + { + name: 'created_before', + type: 'string', + required: false, + description: `Limit results to articles created before this date (YYYY-MM-DD).`, + }, + { + name: 'label_names', + type: 'string', + required: false, + description: `Comma-separated list of labels to filter by.`, + }, + { + name: 'locale', + type: 'string', + required: false, + description: `Filter results to a specific locale.`, + }, + { + name: 'multibrand', + type: 'boolean', + required: false, + description: `Search across all brands when true. Defaults to false.`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for offset pagination.`, + }, + { + name: 'per_page', + type: 'integer', + required: false, + description: `Number of results per page (max 100).`, + }, + { name: 'query', type: 'string', required: false, description: `Full-text search query.` }, + { + name: 'section', + type: 'number', + required: false, + description: `Filter results to a specific section ID.`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Sort by relevance, created_at, or updated_at.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc.`, + }, + { + name: 'updated_after', + type: 'string', + required: false, + description: `Limit results to articles updated after this date (YYYY-MM-DD).`, + }, + { + name: 'updated_at', + type: 'string', + required: false, + description: `Limit results to articles updated on this date (YYYY-MM-DD).`, + }, + { + name: 'updated_before', + type: 'string', + required: false, + description: `Limit results to articles updated before this date (YYYY-MM-DD).`, + }, + ], + }, + { + name: 'zendesk_help_center_categories_list', + description: `List all Help Center categories in your Zendesk account. Returns categories with IDs, names, and positions.`, + params: [ + { + name: 'include', + type: 'string', + required: false, + description: `Sideload related data. Use 'translations' to include category translations.`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for offset pagination.`, + }, + { + name: 'per_page', + type: 'integer', + required: false, + description: `Number of results per page (max 100).`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Field to sort by: position, created_at, or updated_at.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc.`, + }, + ], + }, + { + name: 'zendesk_help_center_category_get', + description: `Retrieve a single Help Center category by its ID.`, + params: [ + { + name: 'category_id', + type: 'number', + required: true, + description: `The ID of the category to retrieve.`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Sideload related data. Use 'translations' to include category translations.`, + }, + ], + }, + { + name: 'zendesk_help_center_section_get', + description: `Retrieve a single Help Center section by its ID.`, + params: [ + { + name: 'section_id', + type: 'number', + required: true, + description: `The ID of the section to retrieve.`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated sideloads: 'categories' to include the parent category, 'translations' to include translations.`, + }, + ], + }, + { + name: 'zendesk_help_center_sections_list', + description: `List all Help Center sections. Filter by category to narrow results.`, + params: [ + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated sideloads: 'categories' to include the parent category, 'translations' to include translations.`, + }, + { + name: 'page', + type: 'integer', + required: false, + description: `Page number for offset pagination.`, + }, + { + name: 'per_page', + type: 'integer', + required: false, + description: `Number of results per page (max 100).`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Field to sort by: position, created_at, or updated_at.`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc.`, + }, ], }, { name: 'zendesk_organization_get', description: `Retrieve details of a specific Zendesk organization by ID. Returns organization name, domain names, tags, notes, shared ticket settings, and custom fields.`, params: [ - { name: 'organization_id', type: 'number', required: true, description: `The ID of the organization to retrieve` }, - { name: 'include', type: 'string', required: false, description: `Additional related data to include (e.g., lookup_relationship_fields)` }, + { + name: 'organization_id', + type: 'number', + required: true, + description: `The ID of the organization to retrieve`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Additional related data to include (e.g., lookup_relationship_fields)`, + }, ], }, { @@ -22,90 +508,270 @@ export const tools: Tool[] = [ description: `List all organizations in Zendesk with pagination support.`, params: [ { name: 'page', type: 'number', required: false, description: `Page number for pagination` }, - { name: 'per_page', type: 'number', required: false, description: `Number of organizations per page (max 100)` }, + { + name: 'per_page', + type: 'number', + required: false, + description: `Number of organizations per page (max 100)`, + }, ], }, { name: 'zendesk_search_tickets', description: `Search Zendesk tickets using a query string. Supports Zendesk's search syntax (e.g., 'type:ticket status:open'). Zendesk limits search results to 1,000 total — the maximum valid page is floor(1000 / per_page) (e.g., per_page=100 → max page 10, per_page=25 → max page 40). Stop paginating when next_page is null or you reach the max page; requesting beyond the limit returns a 400 error.`, params: [ - { name: 'query', type: 'string', required: true, description: `Search query string using Zendesk search syntax (e.g., 'type:ticket status:open assignee:me')` }, - { name: 'page', type: 'number', required: false, description: `Page number for pagination. Max valid page = floor(1000 / per_page). Do not exceed this — Zendesk returns a 400 error beyond the 1,000 result limit.` }, - { name: 'per_page', type: 'number', required: false, description: `Number of results per page (max 100). Determines the max page ceiling: floor(1000 / per_page). Higher values mean fewer pages but a lower max page number.` }, - { name: 'sort_by', type: 'string', required: false, description: `Field to sort results by (updated_at, created_at, priority, status, ticket_type)` }, - { name: 'sort_order', type: 'string', required: false, description: `Sort direction: asc or desc (default: desc)` }, + { + name: 'query', + type: 'string', + required: true, + description: `Search query string using Zendesk search syntax (e.g., 'type:ticket status:open assignee:me')`, + }, + { + name: 'page', + type: 'number', + required: false, + description: `Page number for pagination. Max valid page = floor(1000 / per_page). Do not exceed this — Zendesk returns a 400 error beyond the 1,000 result limit.`, + }, + { + name: 'per_page', + type: 'number', + required: false, + description: `Number of results per page (max 100). Determines the max page ceiling: floor(1000 / per_page). Higher values mean fewer pages but a lower max page number.`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Field to sort results by (updated_at, created_at, priority, status, ticket_type)`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc (default: desc)`, + }, ], }, { name: 'zendesk_side_conversation_get', description: `Retrieve a specific side conversation on a Zendesk ticket by its ID. Returns the side conversation's state, subject, participants, preview text, and timestamps. Requires the Collaboration add-on.`, params: [ - { name: 'side_conversation_id', type: 'string', required: true, description: `The ID of the side conversation to retrieve` }, - { name: 'ticket_id', type: 'number', required: true, description: `The ID of the parent ticket` }, - { name: 'include', type: 'string', required: false, description: `Sideloads to include alongside the response. Use 'side_conversation_events' to include the full event history of the side conversation.` }, + { + name: 'side_conversation_id', + type: 'string', + required: true, + description: `The ID of the side conversation to retrieve`, + }, + { + name: 'ticket_id', + type: 'number', + required: true, + description: `The ID of the parent ticket`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Sideloads to include alongside the response. Use 'side_conversation_events' to include the full event history of the side conversation.`, + }, ], }, { name: 'zendesk_side_conversations_list', description: `List all side conversations on a Zendesk ticket. Returns side conversations including their state, subject, participants, and preview text. Requires the Collaboration add-on.`, params: [ - { name: 'ticket_id', type: 'number', required: true, description: `The ID of the ticket whose side conversations to list` }, - { name: 'include', type: 'string', required: false, description: `Sideloads to include alongside the response. Use 'side_conversation_events' to include the full event history for each side conversation.` }, + { + name: 'ticket_id', + type: 'number', + required: true, + description: `The ID of the ticket whose side conversations to list`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Sideloads to include alongside the response. Use 'side_conversation_events' to include the full event history for each side conversation.`, + }, ], }, { name: 'zendesk_ticket_comments_list', description: `Retrieve all comments (public replies and internal notes) for a specific Zendesk ticket. Returns comment body, author, timestamps, and attachments.`, params: [ - { name: 'ticket_id', type: 'number', required: true, description: `The ID of the ticket whose comments to list` }, - { name: 'include', type: 'string', required: false, description: `Sideloads to include. Accepts 'users' to list email CCs.` }, - { name: 'include_inline_images', type: 'boolean', required: false, description: `When true, inline images are listed as attachments (default: false)` }, - { name: 'sort_order', type: 'string', required: false, description: `Sort direction for comments: asc or desc (default: asc)` }, + { + name: 'ticket_id', + type: 'number', + required: true, + description: `The ID of the ticket whose comments to list`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Sideloads to include. Accepts 'users' to list email CCs.`, + }, + { + name: 'include_inline_images', + type: 'boolean', + required: false, + description: `When true, inline images are listed as attachments (default: false)`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction for comments: asc or desc (default: asc)`, + }, ], }, { name: 'zendesk_ticket_create', description: `Create a new support ticket in Zendesk. Requires a comment/description and optionally a subject, priority, assignee, and tags.`, params: [ - { name: 'comment_body', type: 'string', required: true, description: `The description or first comment of the ticket` }, - { name: 'assignee_email', type: 'string', required: false, description: `Email of the agent to assign the ticket to` }, - { name: 'priority', type: 'string', required: false, description: `Ticket priority: urgent, high, normal, or low` }, - { name: 'status', type: 'string', required: false, description: `Ticket status: new, open, pending, hold, solved, or closed` }, - { name: 'subject', type: 'string', required: false, description: `The subject/title of the ticket` }, - { name: 'tags', type: 'array', required: false, description: `List of tags to apply to the ticket` }, - { name: 'type', type: 'string', required: false, description: `Ticket type: problem, incident, question, or task` }, + { + name: 'comment_body', + type: 'string', + required: true, + description: `The description or first comment of the ticket`, + }, + { + name: 'assignee_email', + type: 'string', + required: false, + description: `Email of the agent to assign the ticket to`, + }, + { + name: 'priority', + type: 'string', + required: false, + description: `Ticket priority: urgent, high, normal, or low`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Ticket status: new, open, pending, hold, solved, or closed`, + }, + { + name: 'subject', + type: 'string', + required: false, + description: `The subject/title of the ticket`, + }, + { + name: 'tags', + type: 'array', + required: false, + description: `List of tags to apply to the ticket`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Ticket type: problem, incident, question, or task`, + }, ], }, { name: 'zendesk_ticket_get', description: `Retrieve details of a specific Zendesk ticket by ID. Returns ticket properties including status, priority, subject, requester, assignee, and timestamps.`, params: [ - { name: 'ticket_id', type: 'number', required: true, description: `The ID of the ticket to retrieve` }, - { name: 'include', type: 'string', required: false, description: `Comma-separated list of sideloads to include (e.g., users, groups, organizations)` }, + { + name: 'ticket_id', + type: 'number', + required: true, + description: `The ID of the ticket to retrieve`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated list of sideloads to include (e.g., users, groups, organizations)`, + }, ], }, { name: 'zendesk_ticket_reply', description: `Add a public reply or internal note to a Zendesk ticket. Set public to false for internal notes visible only to agents.`, params: [ - { name: 'body', type: 'string', required: true, description: `The reply message content (plain text, markdown supported)` }, - { name: 'ticket_id', type: 'number', required: true, description: `The ID of the ticket to reply to` }, - { name: 'public', type: 'boolean', required: false, description: `Whether the comment is public (true) or an internal note (false). Defaults to true.` }, + { + name: 'body', + type: 'string', + required: true, + description: `The reply message content (plain text, markdown supported)`, + }, + { + name: 'ticket_id', + type: 'number', + required: true, + description: `The ID of the ticket to reply to`, + }, + { + name: 'public', + type: 'boolean', + required: false, + description: `Whether the comment is public (true) or an internal note (false). Defaults to true.`, + }, ], }, { name: 'zendesk_ticket_update', description: `Update an existing Zendesk ticket. Change status, priority, assignee, subject, tags, or any other writable ticket field.`, params: [ - { name: 'ticket_id', type: 'number', required: true, description: `The ID of the ticket to update` }, - { name: 'assignee_email', type: 'string', required: false, description: `Email of the agent to assign the ticket to` }, - { name: 'assignee_id', type: 'number', required: false, description: `ID of the agent to assign the ticket to` }, - { name: 'group_id', type: 'number', required: false, description: `ID of the group to assign the ticket to` }, - { name: 'priority', type: 'string', required: false, description: `Ticket priority: urgent, high, normal, or low` }, - { name: 'status', type: 'string', required: false, description: `Ticket status: new, open, pending, hold, solved, or closed` }, - { name: 'subject', type: 'string', required: false, description: `New subject/title for the ticket` }, - { name: 'tags', type: 'array', required: false, description: `List of tags to set on the ticket (replaces existing tags)` }, - { name: 'type', type: 'string', required: false, description: `Ticket type: problem, incident, question, or task` }, + { + name: 'ticket_id', + type: 'number', + required: true, + description: `The ID of the ticket to update`, + }, + { + name: 'assignee_email', + type: 'string', + required: false, + description: `Email of the agent to assign the ticket to`, + }, + { + name: 'assignee_id', + type: 'number', + required: false, + description: `ID of the agent to assign the ticket to`, + }, + { + name: 'group_id', + type: 'number', + required: false, + description: `ID of the group to assign the ticket to`, + }, + { + name: 'priority', + type: 'string', + required: false, + description: `Ticket priority: urgent, high, normal, or low`, + }, + { + name: 'status', + type: 'string', + required: false, + description: `Ticket status: new, open, pending, hold, solved, or closed`, + }, + { + name: 'subject', + type: 'string', + required: false, + description: `New subject/title for the ticket`, + }, + { + name: 'tags', + type: 'array', + required: false, + description: `List of tags to set on the ticket (replaces existing tags)`, + }, + { + name: 'type', + type: 'string', + required: false, + description: `Ticket type: problem, incident, question, or task`, + }, ], }, { @@ -113,9 +779,24 @@ export const tools: Tool[] = [ description: `List tickets in Zendesk with sorting and pagination. Returns tickets for the authenticated agent's account.`, params: [ { name: 'page', type: 'number', required: false, description: `Page number for pagination` }, - { name: 'per_page', type: 'number', required: false, description: `Number of tickets per page (max 100)` }, - { name: 'sort_by', type: 'string', required: false, description: `Field to sort by: created_at, updated_at, priority, status, ticket_type` }, - { name: 'sort_order', type: 'string', required: false, description: `Sort direction: asc or desc (default: desc)` }, + { + name: 'per_page', + type: 'number', + required: false, + description: `Number of tickets per page (max 100)`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Field to sort by: created_at, updated_at, priority, status, ticket_type`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc (default: desc)`, + }, ], }, { @@ -123,19 +804,54 @@ export const tools: Tool[] = [ description: `Create a new user in Zendesk. Can create end-users (customers), agents, or admins. Email is required for end-users.`, params: [ { name: 'name', type: 'string', required: true, description: `Full name of the user` }, - { name: 'email', type: 'string', required: false, description: `Primary email address of the user` }, - { name: 'organization_id', type: 'number', required: false, description: `ID of the organization to associate the user with` }, - { name: 'phone', type: 'string', required: false, description: `Primary phone number (E.164 format, e.g. +15551234567)` }, - { name: 'role', type: 'string', required: false, description: `User role: end-user, agent, or admin. Defaults to end-user.` }, - { name: 'verified', type: 'boolean', required: false, description: `Whether the user's identity is verified. Defaults to false.` }, + { + name: 'email', + type: 'string', + required: false, + description: `Primary email address of the user`, + }, + { + name: 'organization_id', + type: 'number', + required: false, + description: `ID of the organization to associate the user with`, + }, + { + name: 'phone', + type: 'string', + required: false, + description: `Primary phone number (E.164 format, e.g. +15551234567)`, + }, + { + name: 'role', + type: 'string', + required: false, + description: `User role: end-user, agent, or admin. Defaults to end-user.`, + }, + { + name: 'verified', + type: 'boolean', + required: false, + description: `Whether the user's identity is verified. Defaults to false.`, + }, ], }, { name: 'zendesk_user_get', description: `Retrieve details of a specific Zendesk user by ID. Returns user profile including name, email, role, organization, and account status.`, params: [ - { name: 'user_id', type: 'number', required: true, description: `The ID of the user to retrieve` }, - { name: 'include', type: 'string', required: false, description: `Comma-separated list of sideloads to include` }, + { + name: 'user_id', + type: 'number', + required: true, + description: `The ID of the user to retrieve`, + }, + { + name: 'include', + type: 'string', + required: false, + description: `Comma-separated list of sideloads to include`, + }, ], }, { @@ -143,20 +859,55 @@ export const tools: Tool[] = [ description: `List users in Zendesk. Filter by role (end-user, agent, admin) with pagination support.`, params: [ { name: 'page', type: 'number', required: false, description: `Page number for pagination` }, - { name: 'per_page', type: 'number', required: false, description: `Number of users per page (max 100)` }, - { name: 'role', type: 'string', required: false, description: `Filter by role: end-user, agent, or admin` }, - { name: 'sort', type: 'string', required: false, description: `Field to sort by. Prefix with - for descending (e.g. -created_at)` }, + { + name: 'per_page', + type: 'number', + required: false, + description: `Number of users per page (max 100)`, + }, + { + name: 'role', + type: 'string', + required: false, + description: `Filter by role: end-user, agent, or admin`, + }, + { + name: 'sort', + type: 'string', + required: false, + description: `Field to sort by. Prefix with - for descending (e.g. -created_at)`, + }, ], }, { name: 'zendesk_views_list', description: `List ticket views in Zendesk. Views are saved filters for organizing tickets by status, assignee, tags, and more.`, params: [ - { name: 'access', type: 'string', required: false, description: `Filter by access level: personal, shared, or account` }, + { + name: 'access', + type: 'string', + required: false, + description: `Filter by access level: personal, shared, or account`, + }, { name: 'page', type: 'number', required: false, description: `Page number for pagination` }, - { name: 'per_page', type: 'number', required: false, description: `Number of views per page (max 100)` }, - { name: 'sort_by', type: 'string', required: false, description: `Field to sort by: title, updated_at, created_at, or position` }, - { name: 'sort_order', type: 'string', required: false, description: `Sort direction: asc or desc` }, + { + name: 'per_page', + type: 'number', + required: false, + description: `Number of views per page (max 100)`, + }, + { + name: 'sort_by', + type: 'string', + required: false, + description: `Field to sort by: title, updated_at, created_at, or position`, + }, + { + name: 'sort_order', + type: 'string', + required: false, + description: `Sort direction: asc or desc`, + }, ], }, ] diff --git a/src/data/agent-connectors/zenrowsmcp.ts b/src/data/agent-connectors/zenrowsmcp.ts new file mode 100644 index 000000000..d7a92579a --- /dev/null +++ b/src/data/agent-connectors/zenrowsmcp.ts @@ -0,0 +1,773 @@ +import type { Tool } from '../../types/agent-connectors' + +export const tools: Tool[] = [ + { + name: 'zenrowsmcp_browser_batch', + description: `Execute a sequence of browser actions in a single call against an existing session. Actions run sequentially and stop at the first failure unless stop_on_error is false.`, + params: [ + { + name: 'actions', + type: 'array', + required: true, + description: `Ordered list of actions to perform. Each action has a 'type' field plus type-specific parameters.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'stop_on_error', + type: 'boolean', + required: false, + description: `If true (default), stop executing actions when one fails. Set false to continue on errors.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_check', + description: `Check a checkbox or radio button by CSS selector.`, + params: [ + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_clear_cookies', + description: `Clear all cookies for the current browser session.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_click', + description: `Click an element identified by a CSS selector.`, + params: [ + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_close', + description: `Close a browser session and free its resources. Always call this when done to avoid session leaks.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_drag', + description: `Drag an element from a source to a target CSS selector.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'source_selector', + type: 'string', + required: true, + description: `CSS selector for the element to drag from.`, + }, + { + name: 'target_selector', + type: 'string', + required: true, + description: `CSS selector for the element to drop onto.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_evaluate', + description: `Execute a JavaScript expression in the page context and return its result.`, + params: [ + { + name: 'script', + type: 'string', + required: true, + description: `JavaScript expression to evaluate in the page context. Return value is serialized to JSON.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_fill', + description: `Fill an input, textarea, or contenteditable element with text.`, + params: [ + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'value', + type: 'string', + required: true, + description: `Text value to set (fill) or option value to select.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_focus', + description: `Move keyboard focus to an element identified by a CSS selector.`, + params: [ + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_generate_pdf', + description: `Render the current page as a PDF document.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'landscape', + type: 'boolean', + required: false, + description: `Render PDF in landscape orientation (default false).`, + }, + { + name: 'print_background', + type: 'boolean', + required: false, + description: `Include CSS background graphics in the PDF (default false).`, + }, + { + name: 'scale', + type: 'number', + required: false, + description: `Page scale factor for PDF rendering, 0.1–2 (default 1).`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_accessibility_tree', + description: `Return the accessibility tree of the current page for element discovery and screen-reader testing.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_attribute', + description: `Get the value of a specific HTML attribute from an element matching a CSS selector.`, + params: [ + { + name: 'attribute', + type: 'string', + required: true, + description: `HTML attribute name to read, e.g. href, src, data-id.`, + }, + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_cookies', + description: `Return all cookies set in the current browser session.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_html', + description: `Return the outer HTML of an element or the full page if no selector is given.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'selector', + type: 'string', + required: false, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_text', + description: `Return the visible text content of an element or the full page if no selector is given.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'selector', + type: 'string', + required: false, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_title', + description: `Return the current page title.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_get_url', + description: `Return the current page URL.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_go_back', + description: `Navigate to the previous page in the browser history.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_go_forward', + description: `Navigate to the next page in the browser history.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_hover', + description: `Move the mouse pointer over an element identified by a CSS selector.`, + params: [ + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_local_storage', + description: `Read, write, or clear localStorage in the current page context.`, + params: [ + { + name: 'action', + type: 'string', + required: true, + description: `Operation: get a value, set a value, or clear all`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'key', + type: 'string', + required: false, + description: `localStorage key to read or write.`, + }, + { + name: 'value', + type: 'string', + required: false, + description: `Text value to set (fill) or option value to select.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_navigate', + description: `Open a ZenRows browser session and navigate to a URL. Returns a session_id required by all subsequent browser_* tools; always call browser_close when done.`, + params: [ + { + name: 'url', + type: 'string', + required: true, + description: `Full URL to navigate to or scrape (must include scheme, e.g. https://).`, + }, + { + name: 'proxy_country', + type: 'string', + required: false, + description: `ISO 3166-1 alpha-2 country code for geo-targeted proxy, e.g. US, GB, DE.`, + }, + { + name: 'proxy_region', + type: 'string', + required: false, + description: `World region for geo-targeted proxy: eu, na, ap, sa, af, or me.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_new_tab', + description: `Open a new browser tab and navigate to a URL in the current session.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'url', + type: 'string', + required: false, + description: `Full URL to navigate to or scrape (must include scheme, e.g. https://).`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_press_key', + description: `Simulate pressing a keyboard key, optionally combined with modifier keys.`, + params: [ + { + name: 'key', + type: 'string', + required: true, + description: `localStorage key to read or write.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_query_selector_all', + description: `Return all elements matching a CSS selector as an array of handles.`, + params: [ + { + name: 'selector', + type: 'string', + required: true, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_reload', + description: `Reload the current page.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_screenshot', + description: `Capture a screenshot of the current page or a specific element.`, + params: [ + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'full_page', + type: 'boolean', + required: false, + description: `Capture the full scrollable page, not just the visible viewport.`, + }, + { + name: 'selector', + type: 'string', + required: false, + description: `CSS selector identifying the target element, e.g. #submit-button or .product-card.`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_scroll', + description: `Scroll the page in a given direction by a specified pixel distance.`, + params: [ + { name: 'direction', type: 'string', required: true, description: `Scroll direction` }, + { + name: 'session_id', + type: 'string', + required: true, + description: `Session ID returned by browser_navigate. Required by all browser_* tools.`, + }, + { + name: 'distance', + type: 'integer', + required: false, + description: `Pixels to scroll (default 500).`, + }, + ], + }, + { + name: 'zenrowsmcp_browser_select_option', + description: `Select an option in a