diff --git a/src/assets/docs/agent-connectors/devrevmcp/personal-access-token.png b/src/assets/docs/agent-connectors/devrevmcp/personal-access-token.png
new file mode 100644
index 000000000..775f24c2e
Binary files /dev/null and b/src/assets/docs/agent-connectors/devrevmcp/personal-access-token.png differ
diff --git a/src/assets/docs/agent-connectors/twilio/account-sid-auth-token.png b/src/assets/docs/agent-connectors/twilio/account-sid-auth-token.png
new file mode 100644
index 000000000..726710ba0
Binary files /dev/null and b/src/assets/docs/agent-connectors/twilio/account-sid-auth-token.png differ
diff --git a/src/components/templates/agent-connectors/_setup-devrevmcp.mdx b/src/components/templates/agent-connectors/_setup-devrevmcp.mdx
new file mode 100644
index 000000000..80928a52c
--- /dev/null
+++ b/src/components/templates/agent-connectors/_setup-devrevmcp.mdx
@@ -0,0 +1,25 @@
+import { Steps } from '@astrojs/starlight/components'
+
+Connect DevRev to Scalekit using a Personal Access Token (PAT). Scalekit stores the token securely and injects it into every tool call — your agent code never handles it directly.
+
+
+
+1. ### Generate a Personal Access Token
+
+ - Log in to the [DevRev dashboard](https://rev.auth.devrev.ai/).
+ - Click the **Settings** icon in the top-right corner.
+ - In the left sidebar, select **Account**.
+ - Scroll down to the **Personal access tokens** section and click **New token**.
+ - Enter a name (e.g. `mcp`), set an expiry date, and click **Create**.
+ - Copy the token — it is shown only once.
+
+ 
+
+2. ### Create a connection in Scalekit
+
+ - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**.
+ - Search for **DevRev MCP** and click **Create**.
+ - Paste your Personal Access Token into the **Token** field.
+ - Click **Save** and note the **Connection name** — use this as `connection_name` in your code.
+
+
diff --git a/src/components/templates/agent-connectors/_setup-twilio.mdx b/src/components/templates/agent-connectors/_setup-twilio.mdx
new file mode 100644
index 000000000..6ea34308a
--- /dev/null
+++ b/src/components/templates/agent-connectors/_setup-twilio.mdx
@@ -0,0 +1,24 @@
+import { Steps } from '@astrojs/starlight/components'
+
+Connect Twilio to Scalekit using your Account SID and Auth Token. Scalekit stores these credentials securely and injects them into every tool call — your agent code never handles them directly.
+
+
+
+1. ### Get your Account SID and Auth Token
+
+ - Log in to the [Twilio Console](https://console.twilio.com).
+ - On the **Account Dashboard**, scroll down to the **Account Info** section.
+ - Copy your **Account SID** (starts with `AC`).
+ - Click **Show** next to **Auth Token** to reveal it, then copy it.
+
+ 
+
+2. ### Create a connection in Scalekit
+
+ - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** → **Connections** → **Create Connection**.
+ - Search for **Twilio** and click **Create**.
+ - Enter your **Account SID** in the **Account SID** field.
+ - Enter your **Auth Token** in the **Auth Token** field.
+ - Click **Save** and note the **Connection name** — use this as `connection_name` in your code.
+
+
diff --git a/src/components/templates/agent-connectors/index.ts b/src/components/templates/agent-connectors/index.ts
index 0dd2c3d9b..21a83eb82 100644
--- a/src/components/templates/agent-connectors/index.ts
+++ b/src/components/templates/agent-connectors/index.ts
@@ -21,6 +21,7 @@ export { default as SetupConfluenceSection } from './_setup-confluence.mdx'
export { default as SetupCustomeriomcpSection } from './_setup-customeriomcp.mdx'
export { default as SetupDatabricksSection } from './_setup-databricks.mdx'
export { default as SetupDatadogSection } from './_setup-datadog.mdx'
+export { default as SetupDevrevmcpSection } from './_setup-devrevmcp.mdx'
export { default as SetupDiarizeSection } from './_setup-diarize.mdx'
export { default as SetupDiscordSection } from './_setup-discord.mdx'
export { default as SetupDropboxSection } from './_setup-dropbox.mdx'
@@ -78,6 +79,7 @@ export { default as SetupSnowflakeSection } from './_setup-snowflake.mdx'
export { default as SetupSupadataSection } from './_setup-supadata.mdx'
export { default as SetupSupermetricsmcpSection } from './_setup-supermetricsmcp.mdx'
export { default as SetupTableauSection } from './_setup-tableau.mdx'
+export { default as SetupTwilioSection } from './_setup-twilio.mdx'
export { default as SetupTwitterSection } from './_setup-twitter.mdx'
export { default as SetupVercelSection } from './_setup-vercel.mdx'
export { default as SetupVimeoSection } from './_setup-vimeo.mdx'
diff --git a/src/content/docs/agentkit/connectors/convertapimcp.mdx b/src/content/docs/agentkit/connectors/convertapimcp.mdx
new file mode 100644
index 000000000..e03327022
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/convertapimcp.mdx
@@ -0,0 +1,70 @@
+---
+title: 'ConvertAPI MCP connector'
+tableOfContents: true
+description: 'Connect to ConvertAPI MCP. Convert, merge, split, and transform files across 200+ formats including PDF, Word, Excel, images, and more.'
+sidebar:
+ label: 'ConvertAPI MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/convertapi.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Files & Documents, 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/convertapimcp'
+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 converters** — Search for available ConvertAPI converters that match the specified search terms
+- **Url request upload** — Generate a curl command to upload a local file to ConvertAPI and obtain a FileId
+- **Get converters by tags, conversion parameters** — Retrieve a list of available ConvertAPI converters that match all specified tags
+- **Convert records** — Convert a file from one format to another using ConvertAPI
+
+## 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/databoxmcp.mdx b/src/content/docs/agentkit/connectors/databoxmcp.mdx
new file mode 100644
index 000000000..f9875f892
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/databoxmcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Databox MCP connector'
+tableOfContents: true
+description: 'Connect to Databox MCP. Query metrics, manage dashboards, and push custom data to your Databox analytics and reporting platform.'
+sidebar:
+ label: 'Databox MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/databox.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Analytics, Monitoring]
+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/databoxmcp'
+import { Steps, Tabs, TabItem } from '@astrojs/starlight/components'
+import { AgentKitCredentials } from '@components/templates'
+import { QuickstartGenericOauthSection } from '@components/templates'
+
+
+
+1. ### Install the SDK
+
+
+
+ ```bash frame="terminal"
+ npm install @scalekit-sdk/node
+ ```
+
+
+ ```bash frame="terminal"
+ pip install scalekit
+ ```
+
+
+
+ Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/)
+
+2. ### Set your credentials
+
+
+
+3. ### Authorize and make your first call
+
+
+
+
+
+## What you can do
+
+Connect this agent connector to let your agent:
+
+- **Data load metric, ingest** — Retrieve data points for a Databox metric over a date range with optional time-series granulation and dimension breakdown
+- **List metrics, merged datasets, data sources** — List all metrics available for a Databox data source, including metric keys, names, descriptions, and available dimensions
+- **Get ingestion, dataset ingestions, current datetime** — Get detailed information for a specific ingestion event, including status, timestamps, dataset metrics, and per-record ingestion outcomes
+- **Delete dataset, data source** — Permanently delete a dataset and all its data from Databox
+- **Create dataset, data source** — Create a structured dataset within a Databox data source, optionally defining a column schema and primary keys for tabular data storage
+- **Genie ask** — Ask Genie, the Databox AI data analyst, to explore and analyze a dataset using natural language
+
+## 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/deepgrammcp.mdx b/src/content/docs/agentkit/connectors/deepgrammcp.mdx
new file mode 100644
index 000000000..195f2a910
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/deepgrammcp.mdx
@@ -0,0 +1,67 @@
+---
+title: 'Deepgram MCP connector'
+tableOfContents: true
+description: 'Connect to Deepgram MCP. Transcribe audio, generate speech, and manage transcription projects using Deepgram''s AI-powered speech recognition API.'
+sidebar:
+ label: 'Deepgram MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/deepgram.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Transcription, AI]
+head:
+ - tag: style
+ content: |
+ .sl-markdown-content h2 {
+ font-size: var(--sl-text-xl);
+ }
+ .sl-markdown-content h3 {
+ font-size: var(--sl-text-lg);
+ }
+---
+
+import ToolList from '@/components/ToolList.astro'
+import { tools } from '@/data/agent-connectors/deepgrammcp'
+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 deepgram knowledge sources** — Search Deepgram documentation and knowledge sources for the most relevant results for a given query
+
+## Tool list
+
+Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.
+
+
diff --git a/src/content/docs/agentkit/connectors/devrevmcp.mdx b/src/content/docs/agentkit/connectors/devrevmcp.mdx
new file mode 100644
index 000000000..bb1b184ab
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/devrevmcp.mdx
@@ -0,0 +1,84 @@
+---
+title: 'Dev Rev MCP connector'
+tableOfContents: true
+description: 'Connect to DevRev MCP. Manage issues, work items, conversations, and customer data in the DevRev product development platform.'
+sidebar:
+ label: 'Dev Rev MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/devrev.svg
+connectorAuthType: Bearer Token
+connectorCategories: [Developer Tools, Customer Support]
+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/devrevmcp'
+import { Steps, Tabs, TabItem } from '@astrojs/starlight/components'
+import { AgentKitCredentials } from '@components/templates'
+import { SetupDevrevmcpSection } from '@components/templates'
+import { QuickstartGenericApikeySection } from '@components/templates'
+
+
+
+1. ### Install the SDK
+
+
+
+ ```bash frame="terminal"
+ npm install @scalekit-sdk/node
+ ```
+
+
+ ```bash frame="terminal"
+ pip install scalekit
+ ```
+
+
+
+ Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/)
+
+2. ### Set your credentials
+
+
+
+3. ### Set up the connector
+
+ Register your Dev Rev MCP credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment.
+
+
+ Dashboard setup steps
+
+
+
+
+
+4. ### Make your first call
+
+
+
+
+
+## What you can do
+
+Connect this agent connector to let your agent:
+
+- **Update object** — Update fields on an existing DevRev object using a specified update action
+- **List objects** — List DevRev objects (issues, tickets, etc.) with optional filters using a specified list action
+- **Objects link** — Create a link between two DevRev objects using a specified link action
+- **Search hybrid** — Search across DevRev's knowledge graph using natural language to find issues, tickets, articles, and other objects
+- **Get valid stage transitions, tool metadata, sprint board** — Return valid stage transitions for a given DevRev object type and its current stage
+- **Fetch object context** — Fetch contextual information about any DevRev object by its DON ID or display 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/docsautomatormcp.mdx b/src/content/docs/agentkit/connectors/docsautomatormcp.mdx
new file mode 100644
index 000000000..39239c011
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/docsautomatormcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Docsautomator MCP connector'
+tableOfContents: true
+description: 'Connect to DocsAutomator MCP. Generate documents and PDFs from templates using your data, automating document creation workflows.'
+sidebar:
+ label: 'Docsautomator MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/docsautomator.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Automation, Files & Documents]
+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/docsautomatormcp'
+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 automation esignature, automation** — Update the e-signature configuration of an automation: enable/disable signing, set signers, customize email templates and language, configure save-to-Drive
+- **Send test email** — Send a test email with a sample PDF to verify email configuration
+- **Invite resend esign** — Resend the signing invitation email to a specific signer
+- **Complete poll job until** — Poll a job until it completes or times out
+- **List placeholders, esign sessions, automations** — Extract all placeholders from a Google Doc template
+- **Get signing links, queue stats, job status** — Get signing links for all signers in a session
+
+## 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/echtpostmcp.mdx b/src/content/docs/agentkit/connectors/echtpostmcp.mdx
new file mode 100644
index 000000000..2da54d44a
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/echtpostmcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Echtpost MCP connector'
+tableOfContents: true
+description: 'Connect to Echtpost MCP. Send physical postcards and letters programmatically via the Echtpost API.'
+sidebar:
+ label: 'Echtpost MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/echtpost.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Communication, 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/echtpostmcp'
+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 group, contact** — Update a contact group
+- **Fit preview** — Check if a message fits on a postcard with the given font settings
+- **List templates, motives, groups** — List available card templates for the account
+- **Get template, motive, me** — Get details of a specific template by ID
+- **Delete group, contact** — Delete a contact group
+- **Create group, contact, card from template** — Create a new contact group
+
+## 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/erasermcp.mdx b/src/content/docs/agentkit/connectors/erasermcp.mdx
new file mode 100644
index 000000000..18ba13c28
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/erasermcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Eraser MCP connector'
+tableOfContents: true
+description: 'Connect to Eraser MCP. Create and edit diagrams, flowcharts, and technical documentation using Eraser''s AI-powered diagramming tools.'
+sidebar:
+ label: 'Eraser MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/eraser.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Design, 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/erasermcp'
+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 template or reference, rules, preset** — Rename a template or reference file
+- **Team select** — Set the active team for the session when the user belongs to multiple teams (OAuth only)
+- **Search records** — Full-text and semantic search across files or diagrams
+- **Reference publish template or, add or remove template or** — Publish a new version of a template/reference file
+- **Create manually, template or reference** — ADVANCED — most callers should use create_document instead
+- **List teams, presets, folders** — List the teams the current user belongs to (OAuth only)
+
+## Tool list
+
+Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.
+
+
diff --git a/src/content/docs/agentkit/connectors/fiberymcp.mdx b/src/content/docs/agentkit/connectors/fiberymcp.mdx
new file mode 100644
index 000000000..2dd4fe89d
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/fiberymcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Fibery MCP connector'
+tableOfContents: true
+description: 'Connect to Fibery MCP. Query, create, and update entities across your Fibery workspace using the Fibery API and AI assistant.'
+sidebar:
+ label: 'Fibery MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/fibery.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Project Management, 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/fiberymcp'
+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 workflow field, view, single select fields** — Updates the options of an existing workflow (state) field
+- **State set** — Sets the workflow state of a Fibery entity
+- **Content set document, append document** — Sets (replaces) the content of a document field on a Fibery entity
+- **Search history, guide** — Searches the workspace activity history and returns matching history events
+- **Detailed schema** — Returns detailed schema for specified databases, including fields and related databases
+- **Schema records** — Returns the high-level workspace structure showing all spaces and databases
+
+## Tool list
+
+Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.
+
+
diff --git a/src/content/docs/agentkit/connectors/figma.mdx b/src/content/docs/agentkit/connectors/figma.mdx
index 6fce8ebcf..b070eda9b 100644
--- a/src/content/docs/agentkit/connectors/figma.mdx
+++ b/src/content/docs/agentkit/connectors/figma.mdx
@@ -71,11 +71,11 @@ import { SectionAfterSetupFigmaCommonWorkflows } from '@components/templates'
Connect this agent connector to let your agent:
+- **Get project meta, webhook, file variables local** — Retrieve metadata for a Figma project by its project ID
- **Delete comment reaction, dev resource, file comment** — Removes the authenticated user's emoji reaction from a comment in a Figma file
- **List file components, file component sets, file styles** — Returns a list of all published components in a Figma file, including their keys, names, descriptions, and thumbnails
- **Create file comment, webhook, comment reaction** — Posts a new comment on a Figma file
-- **Get webhook, file variables local, file image fills** — Returns details of a specific Figma webhook by its ID, including event type, endpoint, and status
-- **Update file variables, webhook, dev resource** — Creates, updates, or deletes variables and variable collections in a Figma file
+- **Update file variables, webhook, dev resource** — Create, update, or delete variables, variable collections, and modes in a Figma file
- **Render file images** — Renders nodes from a Figma file as images (PNG, JPG, SVG, or PDF) and returns URLs to download them
## Common workflows
diff --git a/src/content/docs/agentkit/connectors/fullenrichmcp.mdx b/src/content/docs/agentkit/connectors/fullenrichmcp.mdx
new file mode 100644
index 000000000..ca75629f7
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/fullenrichmcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Fullenrich MCP connector'
+tableOfContents: true
+description: 'Connect to FullEnrich MCP. Enrich contacts with verified email addresses and phone numbers using waterfall enrichment across multiple data providers.'
+sidebar:
+ label: 'Fullenrich MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/fullenrich.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [CRM & Sales, Marketing]
+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/fullenrichmcp'
+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 people, contact by email, companies** — Search for contacts in the FullEnrich database using filters such as name, company, job title, location, and skills
+- **List industries** — List all valid industry values that can be used as filter inputs in search_people, search_companies, export_contacts, and export_companies
+- **Get enrichment results, credits** — Get the current status and up to 10 result rows from an enrichment job by enrichment ID
+- **Results export enrichment** — Export all results from a completed enrichment job to a CSV or JSON file
+- **Contacts export** — Export contact search results to a CSV or JSON file
+- **Companies export** — Export company search results to a CSV or JSON file
+
+## 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/huggingfacemcp.mdx b/src/content/docs/agentkit/connectors/huggingfacemcp.mdx
new file mode 100644
index 000000000..1bb49231a
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/huggingfacemcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Hugging face MCP connector'
+tableOfContents: true
+description: 'Connect to Hugging Face MCP. Search and manage models, datasets, spaces, and collections on the Hugging Face Hub.'
+sidebar:
+ label: 'Hugging face MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/huggingface.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [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/huggingfacemcp'
+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 space, paper, hub repo** — Search Hugging Face Spaces by query and return matching spaces with relevance scores
+- **Details hub repo** — Retrieve details for one or more Hugging Face Hub repositories by their IDs
+- **Whoami hf** — Return the currently authenticated Hugging Face user's profile information
+- **Query hf hub** — Ask a natural language question about the Hugging Face Hub and get an AI-generated answer
+- **Fetch hf doc** — Fetch the content of a Hugging Face documentation page by URL, with optional character offset for pagination
+- **Generate gr1 z image turbo** — Generate an image from a text prompt using the Image Turbo model hosted on Hugging Face Spaces
+
+## 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/kitmcp.mdx b/src/content/docs/agentkit/connectors/kitmcp.mdx
new file mode 100644
index 000000000..7f75dc431
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/kitmcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Kit MCP connector'
+tableOfContents: true
+description: 'Connect to Kit MCP. Manage email subscribers, sequences, broadcasts, tags, and forms for your email marketing workflows.'
+sidebar:
+ label: 'Kit MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/kit.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Marketing, 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/kitmcp'
+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 tag, subscriber, snippet** — Rename a tag by ID
+- **Subscriber untag, tag** — Remove a tag from a subscriber by subscriber ID and tag ID
+- **Unsubscribe records** — Cancel a subscriber's subscription by subscriber ID
+- **List webhooks, tags, tag subscribers** — List all registered webhooks in the account
+- **Get subscriber tags, subscriber stats, subscriber** — Retrieve all tags applied to a specific subscriber, paginated
+- **Subscribers filter, bulk untag, bulk tag** — Search and filter subscribers by engagement events (opens, clicks, sends, deliveries) or sign-up 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/lemlistmcp.mdx b/src/content/docs/agentkit/connectors/lemlistmcp.mdx
new file mode 100644
index 000000000..b0e579d99
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/lemlistmcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Lemlist MCP connector'
+tableOfContents: true
+description: 'Connect to Lemlist MCP. Manage outbound sales campaigns, leads, email sequences, and LinkedIn outreach from your AI workflows.'
+sidebar:
+ label: 'Lemlist MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/lemlist.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Marketing, CRM & Sales]
+head:
+ - tag: style
+ content: |
+ .sl-markdown-content h2 {
+ font-size: var(--sl-text-xl);
+ }
+ .sl-markdown-content h3 {
+ font-size: var(--sl-text-lg);
+ }
+---
+
+import ToolList from '@/components/ToolList.astro'
+import { tools } from '@/data/agent-connectors/lemlistmcp'
+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:
+
+- **Readiness validate campaign** — Validate that a campaign is ready to launch by checking step content, sender configuration, DNS health, and daily limits
+- **Update settings, sequence step, lead variables** — Update settings for a campaign or warmup mailbox entity
+- **Account test email, disconnect email, connect email** — Test SMTP/IMAP connectivity of an email account
+- **State set campaign** — Start, pause, archive, or unarchive a campaign to change its running state
+- **Senders set campaign** — Assign team members as senders for a campaign's outreach messages
+- **Send message** — Send a message to a contact or lead via email, LinkedIn, WhatsApp, or SMS from the Lemlist inbox
+
+## 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/mem0mcp.mdx b/src/content/docs/agentkit/connectors/mem0mcp.mdx
new file mode 100644
index 000000000..9e0c66bde
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/mem0mcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Mem0 MCP connector'
+tableOfContents: true
+description: 'Connect to Mem0 MCP. Store, search, and retrieve persistent memory for AI agents and applications using semantic search.'
+sidebar:
+ label: 'Mem0 MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/mem0.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [AI, Databases]
+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/mem0mcp'
+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 memory** — Overwrite an existing memory's text
+- **Search memories** — Run a semantic search over existing memories
+- **List events, entities** — List memory operation events with optional filters and pagination
+- **Get memory, memories, event status** — Fetch a single memory by ID
+- **Delete memory, entities, all memories** — Delete one memory after the user confirms its memory_id
+- **Memory add** — Store a new preference, fact, or conversation snippet
+
+## 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/memberstackmcp.mdx b/src/content/docs/agentkit/connectors/memberstackmcp.mdx
new file mode 100644
index 000000000..ad46895c7
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/memberstackmcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'MEMBERSTACK MCP connector'
+tableOfContents: true
+description: 'Connect to Memberstack MCP. Manage members, plans, form submissions, and permissions for your membership-based application.'
+sidebar:
+ label: 'MEMBERSTACK MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/memberstack.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Customer Support, 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/memberstackmcp'
+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:
+
+- **Switchmemberstackenvironment records** — Switch the environment (LIVE or SANDBOX) used for member operations
+- **Switchapp records** — Set the active app context so all subsequent operations target the specified app
+- **Listapps records** — List all Memberstack apps accessible to the dashboard user, including roles and creation dates
+- **Getmemberstackenvironment records** — Get the current environment (LIVE or SANDBOX) used for member-related operations
+- **Get tool schema** — Load the full input schema and usage instructions for a specific Memberstack tool by name
+- **Tools explore** — Browse available Memberstack tools by category or search term
+
+## 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/motionmcp.mdx b/src/content/docs/agentkit/connectors/motionmcp.mdx
new file mode 100644
index 000000000..e3fb48e69
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/motionmcp.mdx
@@ -0,0 +1,69 @@
+---
+title: 'Motion MCP connector'
+tableOfContents: true
+description: 'Connect to Motion MCP. Manage tasks, projects, workspaces, and schedules in the Motion AI-powered project management platform.'
+sidebar:
+ label: 'Motion MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/motion.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Project Management, 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/motionmcp'
+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:
+
+- **Feedback submit** — Submit feedback about this Motion MCP server to the Motion product team
+- **Search brands** — Search for brands by name or domain query
+- **Get workspace competitors, workspace brand, reports** — List competitor brands the workspace is tracking, with optional filtering by specific brand IDs
+
+## Tool list
+
+Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.
+
+
diff --git a/src/content/docs/agentkit/connectors/outlook.mdx b/src/content/docs/agentkit/connectors/outlook.mdx
index 0e4233538..15ea3fbf4 100644
--- a/src/content/docs/agentkit/connectors/outlook.mdx
+++ b/src/content/docs/agentkit/connectors/outlook.mdx
@@ -71,12 +71,12 @@ import { SectionAfterSetupOutlookCommonWorkflows } from '@components/templates'
Connect this agent connector to let your agent:
-- **Update todo checklist items, todo tasks, todo lists** — Update a checklist item (subtask) in a Microsoft To Do task
-- **List todo checklist items, todo tasks, todo lists** — List all checklist items (subtasks) for a specific task in a Microsoft To Do task list
-- **Get todo checklist items, todo tasks, todo lists** — Get a specific checklist item (subtask) from a task in a Microsoft To Do task list
-- **Delete todo checklist items, todo tasks, todo lists** — Permanently delete a checklist item (subtask) from a task in a Microsoft To Do task list
-- **Create todo checklist items, todo tasks, todo lists** — Add a checklist item (subtask) to a specific task in a Microsoft To Do task list
-- **Message reply to** — Reply to an existing email message
+- **Update message rule, message, mail folder** — Update an existing inbox message rule
+- **Event tentatively accept, forward, decline** — Tentatively accept a calendar event invitation
+- **Search people, messages** — Search for people relevant to the signed-in user by name or email
+- **Message move, reply to** — Move a message to a different mail folder
+- **List shared calendar events, message rules, mail folders** — Retrieve calendar events from another user shared calendar
+- **Get user presence, mail tips, contact** — Get the presence status of a specific user
## Common workflows
diff --git a/src/content/docs/agentkit/connectors/pendomcp.mdx b/src/content/docs/agentkit/connectors/pendomcp.mdx
new file mode 100644
index 000000000..e2fc10201
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/pendomcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Pendo MCP connector'
+tableOfContents: true
+description: 'Connect to Pendo MCP to access product analytics, user guidance, and engagement data directly from your AI workflows.'
+sidebar:
+ label: 'Pendo MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/pendo.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Analytics, Monitoring]
+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/pendomcp'
+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:
+
+- **Visitorquery records** — Retrieve visitor data and metadata, or count matching visitors
+- **Visitormetadataschema records** — Return the set of metadata fields available for visitors
+- **Segmentlist records** — List all segments in the subscription with their IDs, names, and optional feature flag names
+- **Searchentities records** — Search for product entities such as pages, features, track types, guides, accounts, and segments
+- **Productengagementscore records** — Calculate the Product Engagement Score for an application over a date range, returning adoption, stickiness, and growth metrics
+- **Productareamemberactivity records** — Return all pages, features, or track types in a product area including those with zero activity
+
+## 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/prismamcp.mdx b/src/content/docs/agentkit/connectors/prismamcp.mdx
new file mode 100644
index 000000000..42ca80a66
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/prismamcp.mdx
@@ -0,0 +1,72 @@
+---
+title: 'Prisma MCP connector'
+tableOfContents: true
+description: 'Connect to Prisma MCP. Manage Prisma Postgres databases, run SQL queries, handle backups, and manage connection strings from your AI workflows.'
+sidebar:
+ label: 'Prisma MCP'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/prisma.svg
+connectorAuthType: OAuth 2.1/DCR
+connectorCategories: [Databases, 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/prismamcp'
+import { Steps, Tabs, TabItem } from '@astrojs/starlight/components'
+import { AgentKitCredentials } from '@components/templates'
+import { QuickstartGenericOauthSection } from '@components/templates'
+
+
+
+1. ### Install the SDK
+
+
+
+ ```bash frame="terminal"
+ npm install @scalekit-sdk/node
+ ```
+
+
+ ```bash frame="terminal"
+ pip install scalekit
+ ```
+
+
+
+ Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/)
+
+2. ### Set your credentials
+
+
+
+3. ### Authorize and make your first call
+
+
+
+
+
+## What you can do
+
+Connect this agent connector to let your agent:
+
+- **List prisma postgres databases, prisma postgres connection strings, prisma postgres backups** — List all Prisma Postgres databases in the workspace
+- **Schema introspect database** — Introspect and return the schema of a Prisma Postgres database as JSON
+- **Fetch workspace details** — Retrieve details of the current Prisma Postgres workspace, including plan limits and usage
+- **Execute sql query, prisma postgres schema update** — Execute a SQL query on a Prisma Postgres database and return the results as JSON
+- **Delete prisma postgres database, prisma postgres connection string** — Permanently delete a Prisma Postgres database by its ID
+- **Create prisma postgres recovery, prisma postgres database, prisma postgres connection string** — Restore a Prisma Postgres database from a backup into a new database
+
+## 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/twilio.mdx b/src/content/docs/agentkit/connectors/twilio.mdx
new file mode 100644
index 000000000..ca435553e
--- /dev/null
+++ b/src/content/docs/agentkit/connectors/twilio.mdx
@@ -0,0 +1,79 @@
+---
+title: 'Twilio connector'
+tableOfContents: true
+description: 'Connect to Twilio to send SMS/MMS messages, make voice calls, verify phone numbers with OTP, manage phone numbers, and access usage records.'
+sidebar:
+ label: 'Twilio'
+overviewTitle: 'Quickstart'
+connectorIcon: https://cdn.scalekit.com/sk-connect/assets/provider-icons/twilio.svg
+connectorAuthType: Basic Auth
+connectorCategories: [Communication, 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/twilio'
+import { Steps, Tabs, TabItem } from '@astrojs/starlight/components'
+import { AgentKitCredentials } from '@components/templates'
+import { SetupTwilioSection } from '@components/templates'
+
+
+
+1. ### Install the SDK
+
+
+
+ ```bash frame="terminal"
+ npm install @scalekit-sdk/node
+ ```
+
+
+ ```bash frame="terminal"
+ pip install scalekit
+ ```
+
+
+
+ Full SDK reference: [Node.js](/agentkit/sdks/node/) | [Python](/agentkit/sdks/python/)
+
+2. ### Set your credentials
+
+
+
+3. ### Set up the connector
+
+ Register your Twilio credentials with Scalekit so it can authenticate requests on your behalf. You do this once per environment.
+
+
+ Dashboard setup steps
+
+
+
+
+
+
+
+## What you can do
+
+Connect this agent connector to let your agent:
+
+- **List verify services, usage records, recordings** — List all Twilio Verify services on the account
+- **Get verify service, verification, recording** — Retrieve details of a specific Twilio Verify service by its SID
+- **Delete verify service, recording, message** — Delete a Twilio Verify service by its SID
+- **Create verify service** — Create a new Twilio Verify service for sending verification codes via SMS, call, email, or WhatsApp
+- **Today usage records** — Retrieve today's usage records for a Twilio account, optionally filtered by category
+- **Free available numbers toll** — Search for available toll-free phone numbers that can be purchased in a given country
+
+## Tool list
+
+Use the exact tool names from the **Tool list** below when you call `execute_tool`. If you're not sure which name to use, list the tools available for the current user first.
+
+
diff --git a/src/data/agent-connectors/catalog.ts b/src/data/agent-connectors/catalog.ts
index 3c53c5815..1ac287958 100644
--- a/src/data/agent-connectors/catalog.ts
+++ b/src/data/agent-connectors/catalog.ts
@@ -7,6 +7,96 @@ export interface ProviderMeta {
}
export const catalog: Record = {
+ erasermcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/eraser.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Design', 'Developer Tools'],
+ },
+ devrevmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/devrev.svg',
+ authType: 'Bearer Token',
+ categories: ['Developer Tools', 'Customer Support'],
+ },
+ prismamcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/prisma.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Databases', 'Developer Tools'],
+ },
+ pendomcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/pendo.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Analytics', 'Monitoring'],
+ },
+ convertapimcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/convertapi.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Files & Documents', 'Automation'],
+ },
+ deepgrammcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/deepgram.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Transcription', 'AI'],
+ },
+ databoxmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/databox.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Analytics', 'Monitoring'],
+ },
+ memberstackmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/memberstack.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Customer Support', 'Automation'],
+ },
+ docsautomatormcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/docsautomator.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Automation', 'Files & Documents'],
+ },
+ echtpostmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/echtpost.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Communication', 'Automation'],
+ },
+ fiberymcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fibery.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Project Management', 'Productivity'],
+ },
+ fullenrichmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/fullenrich.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['CRM & Sales', 'Marketing'],
+ },
+ huggingfacemcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/huggingface.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['AI', 'Developer Tools'],
+ },
+ kitmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/kit.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Marketing', 'Automation'],
+ },
+ motionmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/motion.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Project Management', 'Productivity'],
+ },
+ mem0mcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/mem0.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['AI', 'Databases'],
+ },
+ lemlistmcp: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/lemlist.svg',
+ authType: 'OAuth 2.1/DCR',
+ categories: ['Marketing', 'CRM & Sales'],
+ },
+ twilio: {
+ iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/twilio.svg',
+ authType: 'Basic Auth',
+ categories: ['Communication', 'Automation'],
+ },
dropboxmcp: {
iconUrl: 'https://cdn.scalekit.com/sk-connect/assets/provider-icons/drop_box.svg',
authType: 'OAuth 2.1',
diff --git a/src/data/agent-connectors/convertapimcp.ts b/src/data/agent-connectors/convertapimcp.ts
new file mode 100644
index 000000000..71ba27e27
--- /dev/null
+++ b/src/data/agent-connectors/convertapimcp.ts
@@ -0,0 +1,65 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'convertapimcp_convert',
+ description: `Convert a file from one format to another using ConvertAPI. Call 'get_conversion_parameters' first to discover supported parameters, then submit a conversion request with the source format, target format, and any additional parameters.`,
+ params: [
+ { name: 'clientRequest', type: 'object', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'convertapimcp_get_conversion_parameters',
+ description: `Retrieve all available parameters, types, and constraints for a specific format conversion. Call this before 'convert' to understand which parameters are supported for your source and target formats.`,
+ params: [
+ {
+ name: 'fromFormat',
+ type: 'string',
+ required: true,
+ description: `Source file format to convert from.`,
+ },
+ {
+ name: 'toFormat',
+ type: 'string',
+ required: true,
+ description: `Target file format to convert to.`,
+ },
+ ],
+ },
+ {
+ name: 'convertapimcp_get_converters_by_tags',
+ description: `Retrieve a list of available ConvertAPI converters that match all specified tags. Returns only converters associated with every tag provided.`,
+ params: [
+ {
+ name: 'tags',
+ type: 'array',
+ required: true,
+ description: `List of tags to filter converters by. Only converters matching all specified tags are returned.`,
+ },
+ ],
+ },
+ {
+ name: 'convertapimcp_request_upload_url',
+ description: `Generate a curl command to upload a local file to ConvertAPI and obtain a FileId. Use this when the file is not publicly accessible via URL; for public URLs pass the URL directly to the 'convert' tool instead.`,
+ params: [
+ {
+ name: 'filePath',
+ type: 'string',
+ required: true,
+ description: `Absolute or relative path to the file to upload.`,
+ },
+ ],
+ },
+ {
+ name: 'convertapimcp_search_converters',
+ description: `Search for available ConvertAPI converters that match the specified search terms. Each term is matched against converter metadata, and results include converters relevant to all provided terms.`,
+ params: [
+ {
+ name: 'terms',
+ type: 'array',
+ required: true,
+ description: `List of search terms to filter converters by. Each term is matched against converter metadata.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/databoxmcp.ts b/src/data/agent-connectors/databoxmcp.ts
new file mode 100644
index 000000000..7bcb4fbb0
--- /dev/null
+++ b/src/data/agent-connectors/databoxmcp.ts
@@ -0,0 +1,125 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'databoxmcp_ask_genie',
+ description: `Ask Genie, the Databox AI data analyst, to explore and analyze a dataset using natural language. Genie can answer business questions, run SQL queries, surface trends, and provide summaries.`,
+ params: [
+ { name: 'dataset_id', type: 'string', required: true, description: `No description.` },
+ { name: 'question', type: 'string', required: true, description: `No description.` },
+ { name: 'thread_id', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_create_data_source',
+ description: `Create a new data source container in Databox for organizing datasets. Optionally scopes the data source to a specific account; defaults to the account of the authenticated API key.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `No description.` },
+ { name: 'account_id', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_create_dataset',
+ description: `Create a structured dataset within a Databox data source, optionally defining a column schema and primary keys for tabular data storage.`,
+ params: [
+ { name: 'data_source_id', type: 'string', required: true, description: `No description.` },
+ { name: 'name', type: 'string', required: true, description: `No description.` },
+ { name: 'columns', type: 'string', required: false, description: `No description.` },
+ { name: 'primary_keys', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_delete_data_source',
+ description: `Permanently delete a data source and all its associated datasets from Databox. This operation cannot be undone.`,
+ params: [
+ { name: 'data_source_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_delete_dataset',
+ description: `Permanently delete a dataset and all its data from Databox. This operation cannot be undone.`,
+ params: [
+ { name: 'dataset_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_get_current_datetime',
+ description: `Get the current date and time in ISO 8601 format for a given timezone. Useful for resolving relative date expressions such as "last month" or "yesterday" before passing absolute dates to other tools.`,
+ params: [{ name: 'timezone', type: 'string', required: false, description: `No description.` }],
+ },
+ {
+ name: 'databoxmcp_get_dataset_ingestions',
+ description: `Retrieve the full ingestion history for a dataset, including job IDs, statuses, record counts, timestamps, and any error messages.`,
+ params: [
+ { name: 'dataset_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_get_ingestion',
+ description: `Get detailed information for a specific ingestion event, including status, timestamps, dataset metrics, and per-record ingestion outcomes.`,
+ params: [
+ { name: 'dataset_id', type: 'string', required: true, description: `No description.` },
+ { name: 'ingestion_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_ingest_data',
+ description: `Push data records into an existing Databox dataset. Each record must match the dataset schema; data is validated against column types and constraints before ingestion.`,
+ params: [
+ { name: 'data', type: 'string', required: true, description: `No description.` },
+ { name: 'dataset_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_list_accounts',
+ description: `List all Databox accounts accessible to the authenticated user. Use this to discover account IDs needed for other operations.`,
+ params: [],
+ },
+ {
+ name: 'databoxmcp_list_data_source_datasets',
+ description: `List all datasets belonging to a specific Databox data source, including schema details, row counts, and metadata.`,
+ params: [
+ { name: 'data_source_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_list_data_sources',
+ description: `List all API-ingestible data sources for a specific Databox account, returning IDs, names, types, and creation timestamps.`,
+ params: [
+ { name: 'account_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_list_merged_datasets',
+ description: `List all merged datasets for a specific Databox account. Merged datasets combine data from multiple sources into a single unified dataset.`,
+ params: [
+ { name: 'account_id', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_list_metrics',
+ description: `List all metrics available for a Databox data source, including metric keys, names, descriptions, and available dimensions. Pass the full metric_key value unchanged to load_metric_data.`,
+ params: [
+ { name: 'data_source_id', type: 'integer', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'databoxmcp_load_metric_data',
+ description: `Retrieve data points for a Databox metric over a date range with optional time-series granulation and dimension breakdown. The metric_key must be the exact value returned by list_metrics.`,
+ params: [
+ { name: 'data_source_id', type: 'integer', required: true, description: `No description.` },
+ { name: 'end_date', type: 'string', required: true, description: `No description.` },
+ { name: 'metric_key', type: 'string', required: true, description: `No description.` },
+ { name: 'start_date', type: 'string', required: true, description: `No description.` },
+ { name: 'dimension', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'granulation_time_unit',
+ type: 'string',
+ required: false,
+ description: `No description.`,
+ },
+ { name: 'is_whole_range', type: 'boolean', required: false, description: `No description.` },
+ { name: 'record_limit', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/deepgrammcp.ts b/src/data/agent-connectors/deepgrammcp.ts
new file mode 100644
index 000000000..105995181
--- /dev/null
+++ b/src/data/agent-connectors/deepgrammcp.ts
@@ -0,0 +1,16 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'deepgrammcp_search_deepgram_knowledge_sources',
+ description: `Search Deepgram documentation and knowledge sources for the most relevant results for a given query.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `A single, well-formed natural-language query to search Deepgram knowledge sources. Must be a complete sentence.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/devrevmcp.ts b/src/data/agent-connectors/devrevmcp.ts
new file mode 100644
index 000000000..bb067c8ca
--- /dev/null
+++ b/src/data/agent-connectors/devrevmcp.ts
@@ -0,0 +1,272 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'devrevmcp_add_comment',
+ description: `Add a comment to any DevRev object, with support for markdown formatting and user mentions.`,
+ params: [
+ {
+ name: 'object',
+ type: 'string',
+ required: true,
+ description: `DON ID of the DevRev object to comment on.`,
+ },
+ {
+ name: 'body',
+ type: 'string',
+ required: false,
+ description: `The markdown-formatted body of the comment.`,
+ },
+ {
+ name: 'snap_kit_body',
+ type: 'string',
+ required: false,
+ description: `Optional snap-kit UI component to render with the comment. Accepts a static snap-kit component as a valid JSON object.`,
+ },
+ {
+ name: 'visibility',
+ type: 'string',
+ required: false,
+ description: `Visibility of the comment: external (default), internal (dev org only), or private (specified users only).`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_create_object',
+ description: `Create a new DevRev object (issue, ticket, etc.) by specifying an action name and field values.`,
+ params: [
+ {
+ name: 'action_name',
+ type: 'string',
+ required: true,
+ description: `The create action identifier (e.g., create_issue, create_ticket). Must be one of the create actions returned by discover_schema.`,
+ },
+ {
+ name: 'values',
+ type: 'object',
+ required: true,
+ description: `Key-value pairs of field names and values for the new object. Call discover_schema first to get required and optional fields.`,
+ },
+ {
+ name: 'subtype',
+ type: 'string',
+ required: false,
+ description: `The subtype of the object to create (e.g., issue, ticket). Omit to create the stock type.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_discover_schema',
+ description: `Retrieve the input schema for a DevRev action, or list all available actions.`,
+ params: [
+ {
+ name: 'action_name',
+ type: 'string',
+ required: false,
+ description: `The action name to retrieve the schema for (e.g., create_issue). Omit to list all available actions.`,
+ },
+ {
+ name: 'subtype',
+ type: 'string',
+ required: false,
+ description: `The subtype to get the schema for. Omit to retrieve the schema for the stock type.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_fetch_object_context',
+ description: `Fetch contextual information about any DevRev object by its DON ID or display ID.`,
+ params: [
+ {
+ name: 'object_id',
+ type: 'string',
+ required: true,
+ description: `The DON ID or display ID of the DevRev object to fetch context for.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_get_self',
+ description: `Retrieve the profile details of the currently authenticated DevRev user.`,
+ params: [],
+ },
+ {
+ name: 'devrevmcp_get_sprint',
+ description: `Retrieve the details of a specific DevRev sprint by its DON ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'string',
+ required: true,
+ description: `The DON ID of the sprint to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_get_sprint_board',
+ description: `Retrieve the details of a specific DevRev sprint board (vista) by its DON ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'string',
+ required: true,
+ description: `The DON ID of the sprint board (vista) to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_get_tool_metadata',
+ description: `Retrieve comprehensive metadata about available DevRev MCP tools. Call this first before any other operation.`,
+ params: [],
+ },
+ {
+ name: 'devrevmcp_get_valid_stage_transitions',
+ description: `Return valid stage transitions for a given DevRev object type and its current stage.`,
+ params: [
+ {
+ name: 'object_type',
+ type: 'string',
+ required: true,
+ description: `The stock leaf type of the object.`,
+ },
+ {
+ name: 'stage_id',
+ type: 'string',
+ required: true,
+ description: `The DON ID of the current stage of the object.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_hybrid_search',
+ description: `Search across DevRev's knowledge graph using natural language to find issues, tickets, articles, and other objects.`,
+ params: [
+ {
+ name: 'namespace',
+ type: 'string',
+ required: true,
+ description: `Primary namespace to search in.`,
+ },
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `A natural language question to search across DevRev's knowledge graph.`,
+ },
+ {
+ name: 'reranking_instruction',
+ type: 'string',
+ required: true,
+ description: `A single sentence (≤15 words) guiding document ranking based on the query.`,
+ },
+ {
+ name: 'allowed_namespaces',
+ type: 'array',
+ required: false,
+ description: `Namespaces to restrict the search to. Leave empty to search all namespaces.`,
+ },
+ {
+ name: 'ids',
+ type: 'array',
+ required: false,
+ description: `DON IDs to filter search results by.`,
+ },
+ {
+ name: 'include_comments',
+ type: 'boolean',
+ required: false,
+ description: `Whether to include object comments in results. When true, results are limited to 10 objects.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of results to return.`,
+ },
+ {
+ name: 'projection_type',
+ type: 'string',
+ required: false,
+ description: `Shape of each returned object: id, id_with_label, or summary.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_link_objects',
+ description: `Create a link between two DevRev objects using a specified link action.`,
+ params: [
+ {
+ name: 'action_name',
+ type: 'string',
+ required: true,
+ description: `The link action identifier (e.g., link_ticket_with_issue). Must be one of the link actions returned by discover_schema.`,
+ },
+ {
+ name: 'source',
+ type: 'string',
+ required: true,
+ description: `The display ID of the source object to link from (e.g., ISS-123, TKT-123).`,
+ },
+ {
+ name: 'target',
+ type: 'string',
+ required: true,
+ description: `The display ID of the target object to link to (e.g., TKT-456, ISS-456).`,
+ },
+ {
+ name: 'link_type',
+ type: 'string',
+ required: false,
+ description: `Type of link defining the relationship between the two objects.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_list_objects',
+ description: `List DevRev objects (issues, tickets, etc.) with optional filters using a specified list action.`,
+ params: [
+ {
+ name: 'action_name',
+ type: 'string',
+ required: true,
+ description: `The list action identifier (e.g., list_issues, list_tickets). Must be one of the list actions returned by discover_schema.`,
+ },
+ {
+ name: 'fields',
+ type: 'array',
+ required: false,
+ description: `Field names to include in each returned object. Omit to return all fields.`,
+ },
+ {
+ name: 'values',
+ type: 'object',
+ required: false,
+ description: `Filter parameters to narrow results. Call discover_schema first to get available filter fields.`,
+ },
+ ],
+ },
+ {
+ name: 'devrevmcp_update_object',
+ description: `Update fields on an existing DevRev object using a specified update action.`,
+ params: [
+ {
+ name: 'action_name',
+ type: 'string',
+ required: true,
+ description: `The update action identifier (e.g., update_issue, update_ticket). Must be one of the update actions returned by discover_schema.`,
+ },
+ {
+ name: 'values',
+ type: 'object',
+ required: true,
+ description: `Fields to update including the object ID. Use discover_schema for allowed fields.`,
+ },
+ {
+ name: 'subtype',
+ type: 'string',
+ required: false,
+ description: `The subtype of the object to update. Omit to update the stock type.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/docsautomatormcp.ts b/src/data/agent-connectors/docsautomatormcp.ts
new file mode 100644
index 000000000..77d855d10
--- /dev/null
+++ b/src/data/agent-connectors/docsautomatormcp.ts
@@ -0,0 +1,358 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'docsautomatormcp_cancel_esign_session',
+ description: `Cancel an in-progress signing session. Cannot cancel already completed sessions. Optionally provide a cancellation reason.`,
+ params: [
+ {
+ name: 'sessionId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the signing session to act on.`,
+ },
+ {
+ name: 'reason',
+ type: 'string',
+ required: false,
+ description: `Optional reason for cancelling the signing session.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_create_automation',
+ description: `Create a new automation with the specified data source. Returns the new automation ID and configuration.`,
+ params: [
+ {
+ name: 'dataSourceName',
+ type: 'string',
+ required: true,
+ description: `The data source type to connect to this automation.`,
+ },
+ {
+ name: 'title',
+ type: 'string',
+ required: true,
+ description: `Display name for the new automation.`,
+ },
+ {
+ name: 'docTemplateLink',
+ type: 'string',
+ required: false,
+ description: `URL of the Google Doc template to use as the document template.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_create_document',
+ description: `Generate a document from a DocsAutomator automation. Supports various data sources including Airtable, Google Sheets, SmartSuite, ClickUp, and direct API data. Returns PDF URL and optionally Google Doc URL.
+
+**E-SIGNATURES**: If the automation has e-signing enabled in its output settings, creating a document will AUTOMATICALLY start the signing workflow. The response will include:
+- signingSessionId: The e-sign session ID
+- signingLinks: Array of signing URLs for each signer (if delivery method is "link")
+- signingStatus: "created" or "queued"
+
+You do NOT need to create e-sign sessions separately - they are triggered automatically when generating documents from automations configured with e-signing. To check if an automation has e-signing enabled, use get_automation first.
+
+For nested line items (up to 2 levels), use the "children" key to nest items:
+{
+ "line_items_1": [
+ {
+ "product": "Service A",
+ "price": "$100",
+ "children": [
+ {
+ "task": "Task 1",
+ "children": [
+ {"detail": "Detail 1"}
+ ]
+ }
+ ]
+ }
+ ]
+}`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ {
+ name: 'async',
+ type: 'boolean',
+ required: false,
+ description: `When true, returns a jobId immediately instead of waiting for document generation to complete.`,
+ },
+ {
+ name: 'data',
+ type: 'object',
+ required: false,
+ description: `Placeholder key-value pairs for API data sources. Use arrays for line items and the 'children' key for nested line items (up to 2 levels).`,
+ },
+ {
+ name: 'documentName',
+ type: 'string',
+ required: false,
+ description: `Optional custom name for the generated document.`,
+ },
+ {
+ name: 'recId',
+ type: 'string',
+ required: false,
+ description: `Record ID for Airtable data sources.`,
+ },
+ {
+ name: 'rowNumber',
+ type: 'number',
+ required: false,
+ description: `Row number for Google Sheets data sources.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_delete_automation',
+ description: `Permanently delete an automation. This action cannot be undone.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_duplicate_automation',
+ description: `Create a copy of an existing automation with ' COPY' appended to the title. Returns the new automation ID.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_duplicate_template',
+ description: `Create a copy of the Google Doc template associated with an automation. Returns the new template ID and URL.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ {
+ name: 'newTemplateName',
+ type: 'string',
+ required: false,
+ description: `Optional name for the new template copy. Defaults to the original name with ' COPY' appended.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_get_automation',
+ description: `Get detailed information about a specific automation including data source config, output settings, field mappings, and e-signature configuration. Check the 'esignature' field to see if e-signing is enabled - if so, creating a document will automatically start a signing workflow.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_get_esign_audit',
+ description: `Get the complete audit trail for a signing session including all events like invites, views, signatures, and completions.`,
+ params: [
+ {
+ name: 'sessionId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the signing session to act on.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_get_esign_session',
+ description: `Get detailed information about a signing session including signers, fields, document URLs, and current status.`,
+ params: [
+ {
+ name: 'sessionId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the signing session to act on.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_get_job_status',
+ description: `Get the current status of a queued document generation job. Returns status (waiting, active, completed, failed), progress percentage, and result when complete.`,
+ params: [
+ {
+ name: 'jobId',
+ type: 'string',
+ required: true,
+ description: `The job ID returned from async document creation.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_get_queue_stats',
+ description: `Get statistics about the document generation queue including counts of waiting, active, completed, failed, and delayed jobs.`,
+ params: [],
+ },
+ {
+ name: 'docsautomatormcp_get_signing_links',
+ description: `Get signing links for all signers in a session. Useful for manual delivery mode or resending links.`,
+ params: [
+ {
+ name: 'sessionId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the signing session to act on.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_list_automations',
+ description: `List all automations in the workspace with their basic configuration including title, data source, and active status.`,
+ params: [],
+ },
+ {
+ name: 'docsautomatormcp_list_esign_sessions',
+ description: `List e-signature sessions with optional filtering by status or signer email. Returns paginated results with session summaries.`,
+ params: [
+ {
+ name: 'email',
+ type: 'string',
+ required: false,
+ description: `Filter e-signature sessions by signer email address (partial match).`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Number of results per page.`,
+ },
+ { name: 'page', type: 'number', required: false, description: `Page number for pagination.` },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter sessions by their current status.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_list_placeholders',
+ description: `Extract all placeholders from a Google Doc template. Returns main placeholders and line item placeholders separately. Useful for understanding what data fields are available.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_poll_job_until_complete',
+ description: `Poll a job until it completes or times out. Uses exponential backoff for efficient polling. Returns the final result including PDF URL when successful.`,
+ params: [
+ {
+ name: 'jobId',
+ type: 'string',
+ required: true,
+ description: `The job ID returned from async document creation.`,
+ },
+ {
+ name: 'pollIntervalMs',
+ type: 'number',
+ required: false,
+ description: `Initial interval between polling requests in milliseconds. The tool uses exponential backoff.`,
+ },
+ {
+ name: 'timeoutMs',
+ type: 'number',
+ required: false,
+ description: `Maximum time to wait in milliseconds before giving up.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_resend_esign_invite',
+ description: `Resend the signing invitation email to a specific signer. Useful when original email was missed or expired.`,
+ params: [
+ {
+ name: 'sessionId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the signing session to act on.`,
+ },
+ {
+ name: 'signerIndex',
+ type: 'number',
+ required: true,
+ description: `1-based index identifying which signer to resend the invitation to.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_send_test_email',
+ description: `Send a test email with a sample PDF to verify email configuration. Rate limited to 5 emails per hour per workspace.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ {
+ name: 'recipient',
+ type: 'string',
+ required: true,
+ description: `Email address to receive the test email.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_update_automation',
+ description: `Update an existing automation's basic settings (title, template link, active flag, locale, save destination, document-name field). For e-signature configuration, use update_automation_esignature instead.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ {
+ name: 'updates',
+ type: 'object',
+ required: true,
+ description: `Fields to update on the automation. Only the fields you include are changed.`,
+ },
+ ],
+ },
+ {
+ name: 'docsautomatormcp_update_automation_esignature',
+ description: `Update the e-signature configuration of an automation: enable/disable signing, set signers, customize email templates and language, configure save-to-Drive. Call get_automation first to see the current esignature state before editing. Arrays (signers, notificationRecipients) and Maps (fieldConfigs, esignFieldMappings) are FULL REPLACE — send the complete value, not a diff. In-flight signing sessions snapshot their email config at creation time, so editing the automation does NOT retroactively change sessions already sent out.`,
+ params: [
+ {
+ name: 'automationId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the automation to use.`,
+ },
+ {
+ name: 'esignature',
+ type: 'object',
+ required: true,
+ description: `Partial e-signature configuration to apply. Only included fields are written; omitted fields stay unchanged.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/echtpostmcp.ts b/src/data/agent-connectors/echtpostmcp.ts
new file mode 100644
index 000000000..391c1dc6e
--- /dev/null
+++ b/src/data/agent-connectors/echtpostmcp.ts
@@ -0,0 +1,614 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'echtpostmcp_cancel_card',
+ description: `Cancel a scheduled postcard. Only cards where "cancelable" is true can be cancelled. Cancellation is asynchronous and may take a few minutes.`,
+ params: [
+ { name: 'id', type: 'string', required: true, description: `UUID of the card to cancel.` },
+ ],
+ },
+ {
+ name: 'echtpostmcp_create_card',
+ description: `Create a postcard with custom message and font. Validates that text fits on the card. Use preview_fit first to check if your message fits. Specify recipients via existing contact IDs, group IDs, or inline recipient objects (combinable). For simpler creation from a saved template, use create_card_from_template instead.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `Main message text to print on the postcard.`,
+ },
+ {
+ name: 'deliver_at',
+ type: 'string',
+ required: true,
+ description: `Delivery date. Accepted values: today, tomorrow, YYYY-MM-DD, or N-days-from-now.`,
+ },
+ {
+ name: 'motive_id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the motive (front image design) to use on the card.`,
+ },
+ {
+ name: 'content_ps',
+ type: 'string',
+ required: false,
+ description: `Optional postscript line printed after the main message (P.S.).`,
+ },
+ {
+ name: 'content_vertical',
+ type: 'string',
+ required: false,
+ description: `Optional text printed in the vertical side panel of the card.`,
+ },
+ {
+ name: 'font_color',
+ type: 'string',
+ required: false,
+ description: `Font color for the card text. Accepted values: black, blue.`,
+ },
+ {
+ name: 'font_family',
+ type: 'string',
+ required: false,
+ description: `Font family for the card text. Accepted values: architects_daughter, reenie_beanie, special_elite.`,
+ },
+ {
+ name: 'font_size',
+ type: 'integer',
+ required: false,
+ description: `Font size in pt. Allowed ranges: architects_daughter 12–14, reenie_beanie 15–17, special_elite 11–13.`,
+ },
+ {
+ name: 'group_ids',
+ type: 'array',
+ required: false,
+ description: `Array of contact group IDs. All members of each group receive the card.`,
+ },
+ {
+ name: 'notification_email',
+ type: 'string',
+ required: false,
+ description: `Email address to receive delivery notifications.`,
+ },
+ {
+ name: 'notification_send_on',
+ type: 'string',
+ required: false,
+ description: `Date to send the notification (ISO 8601, YYYY-MM-DD). Defaults to the delivery date.`,
+ },
+ {
+ name: 'notification_type',
+ type: 'string',
+ required: false,
+ description: `When to send a delivery notification. Accepted values: before_send, after_sent.`,
+ },
+ {
+ name: 'qr_code_url',
+ type: 'string',
+ required: false,
+ description: `URL to encode as a QR code printed on the card.`,
+ },
+ {
+ name: 'recipient_ids',
+ type: 'array',
+ required: false,
+ description: `Array of existing contact IDs to send the card to.`,
+ },
+ {
+ name: 'recipients',
+ type: 'array',
+ required: false,
+ description: `Array of inline recipient objects. Each requires last_name, street, zip, city, and country_code.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_create_card_from_template',
+ description: `Create a postcard from an existing template. The template provides the message, font, and motive. Specify recipients via existing contact IDs, group IDs, or inline recipient objects (combinable). Use list_templates to find templates.`,
+ params: [
+ {
+ name: 'deliver_at',
+ type: 'string',
+ required: true,
+ description: `Delivery date. Accepted values: today, tomorrow, YYYY-MM-DD, or N-days-from-now.`,
+ },
+ {
+ name: 'template_id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the template to use for this card.`,
+ },
+ {
+ name: 'group_ids',
+ type: 'array',
+ required: false,
+ description: `Array of contact group IDs. All members of each group receive the card.`,
+ },
+ {
+ name: 'recipient_ids',
+ type: 'array',
+ required: false,
+ description: `Array of existing contact IDs to send the card to.`,
+ },
+ {
+ name: 'recipients',
+ type: 'array',
+ required: false,
+ description: `Array of inline recipient objects. Each requires last_name, street, zip, city, and country_code.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_create_contact',
+ description: `Create a new contact for the account. At minimum, provide last_name and a postal address (street, zip, city, country_code). Optionally assign to groups via group_ids or group_names (group_names auto-creates groups if they do not exist).`,
+ params: [
+ {
+ name: 'city',
+ type: 'string',
+ required: true,
+ description: `City for the recipient's postal address.`,
+ },
+ {
+ name: 'country_code',
+ type: 'string',
+ required: true,
+ description: `ISO 3166-1 alpha-2 country code (e.g. DE for Germany).`,
+ },
+ { name: 'last_name', type: 'string', required: true, description: `Recipient's last name.` },
+ {
+ name: 'street',
+ type: 'string',
+ required: true,
+ description: `Street name and house number.`,
+ },
+ {
+ name: 'zip',
+ type: 'string',
+ required: true,
+ description: `Postal code for the recipient's address.`,
+ },
+ {
+ name: 'birthdate',
+ type: 'string',
+ required: false,
+ description: `Contact's birthdate in ISO 8601 format (YYYY-MM-DD).`,
+ },
+ {
+ name: 'company_name',
+ type: 'string',
+ required: false,
+ description: `Company name for the recipient.`,
+ },
+ {
+ name: 'custom_salutation',
+ type: 'string',
+ required: false,
+ description: `Custom greeting line. Use when greeting_style is set to custom.`,
+ },
+ {
+ name: 'department',
+ type: 'string',
+ required: false,
+ description: `Department within the company.`,
+ },
+ {
+ name: 'external_id',
+ type: 'string',
+ required: false,
+ description: `Your own reference ID for this record.`,
+ },
+ {
+ name: 'first_name',
+ type: 'string',
+ required: false,
+ description: `Recipient's first name.`,
+ },
+ {
+ name: 'gender',
+ type: 'string',
+ required: false,
+ description: `Gender identifier. Accepted values: male_user, female_user, diverse_user.`,
+ },
+ {
+ name: 'greeting_style',
+ type: 'string',
+ required: false,
+ description: `Greeting style for the card. Accepted values: formal, informal, custom.`,
+ },
+ {
+ name: 'group_ids',
+ type: 'array',
+ required: false,
+ description: `Array of contact group IDs. All members of each group receive the card.`,
+ },
+ {
+ name: 'group_names',
+ type: 'array',
+ required: false,
+ description: `Array of group names. Groups are created automatically if they do not exist.`,
+ },
+ {
+ name: 'state_code',
+ type: 'string',
+ required: false,
+ description: `State or province code (e.g. BY for Bavaria).`,
+ },
+ {
+ name: 'title',
+ type: 'string',
+ required: false,
+ description: `Academic or professional title (e.g. Dr., Prof.).`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_create_group',
+ description: `Create a new contact group. Provide a name; optionally an external_id for your own reference.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `Group name.` },
+ {
+ name: 'external_id',
+ type: 'string',
+ required: false,
+ description: `Your own reference ID for this record.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_delete_contact',
+ description: `Delete a contact by ID. This is permanent and cannot be undone.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the contact to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_delete_group',
+ description: `Delete a contact group. Fails if the group has attached workflows.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the group to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_get_card',
+ description: `Get details of a specific postcard by its ID. Returns status, content, font, delivery date, and whether the card is cancelable.`,
+ params: [
+ { name: 'id', type: 'string', required: true, description: `UUID of the card to retrieve.` },
+ ],
+ },
+ {
+ name: 'echtpostmcp_get_contact',
+ description: `Get details of a specific contact by their ID. Returns all fields including first_name, last_name, greeting, address, and group_ids.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the contact to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_get_group',
+ description: `Get details of a specific contact group by ID. Returns name, external_id, and recipient count.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the group to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_get_me',
+ description: `Get account info, user email, API key metadata, and current credit balance. Use this to verify the connection and check available credits.`,
+ params: [],
+ },
+ {
+ name: 'echtpostmcp_get_motive',
+ description: `Get details of a specific motive (postcard design) by its ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the motive (postcard design) to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_get_template',
+ description: `Get details of a specific template by ID. Returns content, font, motive, and QR code URL.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the template to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_list_cards',
+ description: `List postcards for the account. Returns id, status (pending/scheduled/sent/canceled), content, font, delivery date, and whether the card is cancelable. Supports status filter.`,
+ params: [
+ {
+ name: 'page',
+ type: 'integer',
+ required: false,
+ description: `Page number for paginated results. Defaults to 1.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Number of results per page. Defaults to 50, maximum 100.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter cards by status. Accepted values: pending, scheduled, sent, canceled.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_list_contacts',
+ description: `List contacts for the account. Returns id, first_name, last_name, address, greeting, and other fields. Supports search and pagination (50 per page).`,
+ params: [
+ {
+ name: 'page',
+ type: 'integer',
+ required: false,
+ description: `Page number for paginated results. Defaults to 1.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Number of results per page. Defaults to 50, maximum 100.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Search term to filter results by name or company.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_list_credits',
+ description: `Show the current credit balance, how many local/foreign postcards can be sent, and the price per card in EUR.`,
+ params: [],
+ },
+ {
+ name: 'echtpostmcp_list_groups',
+ description: `List contact groups for the account. Groups can be used as recipients when creating cards.`,
+ params: [
+ {
+ name: 'page',
+ type: 'integer',
+ required: false,
+ description: `Page number for paginated results. Defaults to 1.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Number of results per page. Defaults to 50, maximum 100.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_list_motives',
+ description: `List available postcard motives (designs). Returns id, name, orientation, and feature flags. Supports search by name/description. Use the motive id when creating cards.`,
+ params: [
+ {
+ name: 'page',
+ type: 'integer',
+ required: false,
+ description: `Page number for paginated results. Defaults to 1.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Number of results per page. Defaults to 50, maximum 100.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Search term to filter results by name or company.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_list_templates',
+ description: `List available card templates for the account. Templates contain pre-configured message, font, and motive — use create_card_from_template to send one.`,
+ params: [
+ {
+ name: 'page',
+ type: 'integer',
+ required: false,
+ description: `Page number for paginated results. Defaults to 1.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Number of results per page. Defaults to 50, maximum 100.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_preview_fit',
+ description: `Check if a message fits on a postcard with the given font settings. Returns fits (true/false), lines used, max lines, and a suggested smaller font size if it overflows. Use this before create_card to iterate on message length.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `Message text to check for fit on the postcard.`,
+ },
+ {
+ name: 'font_family',
+ type: 'string',
+ required: false,
+ description: `Font family for the card text. Accepted values: architects_daughter, reenie_beanie, special_elite.`,
+ },
+ {
+ name: 'font_size',
+ type: 'integer',
+ required: false,
+ description: `Font size in pt. Allowed ranges: architects_daughter 12–14, reenie_beanie 15–17, special_elite 11–13.`,
+ },
+ {
+ name: 'sample_greeting',
+ type: 'string',
+ required: false,
+ description: `Sample greeting string used to expand the {anrede} placeholder when checking fit.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_update_contact',
+ description: `Update one or more fields on an existing contact. Optional fields not provided are left unchanged. To clear an optional field, pass an empty string. group_ids replaces all memberships; group_names additively assigns groups (auto-creating).`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the contact to update.`,
+ },
+ {
+ name: 'birthdate',
+ type: 'string',
+ required: false,
+ description: `Contact's birthdate in ISO 8601 format (YYYY-MM-DD).`,
+ },
+ {
+ name: 'city',
+ type: 'string',
+ required: false,
+ description: `City for the recipient's postal address.`,
+ },
+ {
+ name: 'company_name',
+ type: 'string',
+ required: false,
+ description: `Company name for the recipient.`,
+ },
+ {
+ name: 'country_code',
+ type: 'string',
+ required: false,
+ description: `ISO 3166-1 alpha-2 country code (e.g. DE for Germany).`,
+ },
+ {
+ name: 'custom_salutation',
+ type: 'string',
+ required: false,
+ description: `Custom greeting line. Use when greeting_style is set to custom.`,
+ },
+ {
+ name: 'department',
+ type: 'string',
+ required: false,
+ description: `Department within the company.`,
+ },
+ {
+ name: 'external_id',
+ type: 'string',
+ required: false,
+ description: `Your own reference ID for this record.`,
+ },
+ {
+ name: 'first_name',
+ type: 'string',
+ required: false,
+ description: `Recipient's first name.`,
+ },
+ {
+ name: 'gender',
+ type: 'string',
+ required: false,
+ description: `Gender identifier. Accepted values: male_user, female_user, diverse_user.`,
+ },
+ {
+ name: 'greeting_style',
+ type: 'string',
+ required: false,
+ description: `Greeting style for the card. Accepted values: formal, informal, custom.`,
+ },
+ {
+ name: 'group_ids',
+ type: 'array',
+ required: false,
+ description: `Array of contact group IDs. All members of each group receive the card.`,
+ },
+ {
+ name: 'group_names',
+ type: 'array',
+ required: false,
+ description: `Array of group names. Groups are created automatically if they do not exist.`,
+ },
+ { name: 'last_name', type: 'string', required: false, description: `Recipient's last name.` },
+ {
+ name: 'state_code',
+ type: 'string',
+ required: false,
+ description: `State or province code (e.g. BY for Bavaria).`,
+ },
+ {
+ name: 'street',
+ type: 'string',
+ required: false,
+ description: `Street name and house number.`,
+ },
+ {
+ name: 'title',
+ type: 'string',
+ required: false,
+ description: `Academic or professional title (e.g. Dr., Prof.).`,
+ },
+ {
+ name: 'zip',
+ type: 'string',
+ required: false,
+ description: `Postal code for the recipient's address.`,
+ },
+ ],
+ },
+ {
+ name: 'echtpostmcp_update_group',
+ description: `Update a contact group. Only provided fields are changed.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `Numeric ID of the group to update.`,
+ },
+ {
+ name: 'external_id',
+ type: 'string',
+ required: false,
+ description: `Your own reference ID for this record.`,
+ },
+ { name: 'name', type: 'string', required: false, description: `Group name.` },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/erasermcp.ts b/src/data/agent-connectors/erasermcp.ts
new file mode 100644
index 000000000..a6a408568
--- /dev/null
+++ b/src/data/agent-connectors/erasermcp.ts
@@ -0,0 +1,522 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'erasermcp_add_or_remove_template_or_reference',
+ description: `Attach or detach an EXISTING file as a template (style anchor) or reference (terminology/concept anchor) of a preset.
+
+Use this tool when:
+ - the user has an existing workspace they want to promote into a preset (e.g. 'use this file as a template for the System Design preset'),
+ - you need to detach a file from a preset,
+ - or you just created a template via \`create_template_or_reference\` WITHOUT a \`presetId\` and need to attach it now.
+
+To create a NEW template/reference file and attach it in a single call, use \`create_template_or_reference\` with \`presetId\` set — that avoids leaving a detached file in the team. When removing a file leaves it orphaned from all presets, the file is archived automatically.
+
+Templates and references are inherently team-scoped (no private/personal templates exist); the preset choice is the only scoping decision.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'kind', type: 'string', required: true, description: `No description.` },
+ { name: 'operation', type: 'string', required: true, description: `No description.` },
+ { name: 'presetId', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_create_diagram',
+ description: `PREFERRED for creating a diagram from a natural-language prompt — Eraser's AI picks the diagram type, generates the DSL, and renders it.
+
+DO NOT pre-classify the user's request into a diagram type yourself. Pass \`text\` only (plus destination params) and LEAVE \`diagramType\` UNSET unless the user EXPLICITLY named a type (e.g. 'make this a sequence diagram', 'use a cloud architecture diagram'). Eraser's render service has type-specific heuristics and will pick a better type from the prompt than your guess will, especially on ambiguous asks like 'show how X works' or 'diagram the architecture'.
+
+BEFORE calling this tool, if the user has not already specified the destination, ASK them these questions (skip any the user has already answered):
+ 1. 'Should I create a new file for this diagram, or add it to an existing file?' — if existing, ask which fileId (or use one they just referenced).
+ 2. If NEW file: 'Should the file be private (just for you) or shared with your team in a folder?'
+ 3. If shared in a folder: 'Which folder?' (or offer to place it at the team root).
+Do NOT call list_folders or get_folder to invent a destination yourself — ask the user. Pick destination params based on the answers:
+ - Existing file → pass targetFileId
+ - New private file → omit targetFileId, omit folderId, do NOT set isTeamFile
+ - New shared file at team root → omit targetFileId, omit folderId, set isTeamFile: true
+ - New shared file in a folder → omit targetFileId, pass folderId (this implies shared)
+
+Returns the new diagram's id in the \`diagrams[].id\` field so a follow-up update_diagram/manually_update_diagram call does NOT need a list_diagrams round-trip. Prefer over manually_create_diagram unless you already have hand-written DSL/JSON.`,
+ params: [
+ { name: 'text', type: 'string', required: true, description: `No description.` },
+ { name: 'attachments', type: 'array', required: false, description: `No description.` },
+ { name: 'background', type: 'boolean', required: false, description: `No description.` },
+ { name: 'colorMode', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'diagramType',
+ type: 'string',
+ required: false,
+ description: `OPTIONAL — LEAVE THIS EMPTY by default. Only set it when the user EXPLICITLY names a diagram type (e.g. 'make this a sequence diagram', 'use a cloud architecture diagram', 'turn it into an ERD'). When omitted, Eraser's render service picks the diagram type from the prompt text using diagram-type-specific heuristics and (if applicable) the preset/template in scope — that selection is usually better than guessing from the prompt yourself. Do NOT pre-classify the user's request into a diagram type just because the value is available in your schema; spurious type-locking produces worse diagrams than letting Eraser choose, especially on ambiguous prompts ('show how X works', 'diagram the architecture'). On update_diagram, leave this empty as well — the existing diagram's type is preserved by default.`,
+ },
+ { name: 'direction', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'folderId',
+ type: 'string',
+ required: false,
+ description: `OPTIONAL — leave this empty by default. Only set it when the user EXPLICITLY names a folder to place the new file in (e.g. "put it in the Engineering folder"). Do NOT call list_folders or get_folder to "pick a sensible folder" — when omitted, the file is created at the team root and the user can move it themselves. Spurious folder discovery wastes tokens and produces unexpected file placement.`,
+ },
+ { name: 'format', type: 'string', required: false, description: `No description.` },
+ { name: 'gitContexts', type: 'array', required: false, description: `No description.` },
+ { name: 'imageQuality', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'includeImage',
+ type: 'boolean',
+ required: false,
+ description: `Set true only when you need a PNG URL to embed elsewhere. Not needed for in-app viewing — prefer the returned fileUrl/diagramUrl. Omitted from the response by default.`,
+ },
+ {
+ name: 'isTeamFile',
+ type: 'boolean',
+ required: false,
+ description: `Only honored by create_diagram when a NEW file is being created (i.e. targetFileId is omitted). When true, the new file is shared with the team (non-private); when false, the new file is private to the caller. Required on plans that don't support private files. Ignored by update_diagram, and ignored on create_diagram when targetFileId is set (because no new file is created).`,
+ },
+ { name: 'presetId', type: 'string', required: false, description: `No description.` },
+ { name: 'priorRequestId', type: 'string', required: false, description: `No description.` },
+ { name: 'styleMode', type: 'string', required: false, description: `No description.` },
+ { name: 'targetFileId', type: 'string', required: false, description: `No description.` },
+ { name: 'templateId', type: 'string', required: false, description: `No description.` },
+ { name: 'theme', type: 'string', required: false, description: `No description.` },
+ { name: 'title', type: 'string', required: false, description: `No description.` },
+ { name: 'typeface', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_create_document',
+ description: `PREFERRED for populating a document from a natural-language prompt — Eraser's AI generates the markdown. Only callable on a file with an empty document body; if the file already has content, this returns an error and you should call update_document (for natural-language edits) or manually_update_document (to replace verbatim) instead. Prefer over manually_create_document unless you have pre-written markdown to insert verbatim.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'text', type: 'string', required: true, description: `No description.` },
+ { name: 'presetId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_create_file',
+ description: `Create an empty file, or duplicate an existing file when sourceFileId is provided. Never populates content from a prompt — use create_document/create_diagram for AI generation.
+
+BEFORE calling this tool, if the user has not specified destination, ASK:
+ 1. 'Should the file be private (just for you) or shared with your team in a folder?'
+ 2. If shared in a folder: 'Which folder?' (or offer to place it at the team root).
+Do NOT call list_folders to invent a destination — ask the user. Pick params:
+ - Private file → omit folderId, do NOT set isTeamFile
+ - Shared at team root → omit folderId, set isTeamFile: true
+ - Shared in a folder → pass folderId (this implies shared)`,
+ params: [
+ {
+ name: 'folderId',
+ type: 'string',
+ required: false,
+ description: `OPTIONAL — omit unless the user EXPLICITLY names a folder. When omitted, the file is created at the team root. Do NOT call list_folders to "pick a folder".`,
+ },
+ {
+ name: 'isTeamFile',
+ type: 'boolean',
+ required: false,
+ description: `When true, the file is shared with the team (non-private). Required on plans that do not support private files.`,
+ },
+ { name: 'linkAccess', type: 'string', required: false, description: `No description.` },
+ { name: 'name', type: 'string', required: false, description: `No description.` },
+ { name: 'sourceFileId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_create_folder',
+ description: `Create a new folder.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `No description.` },
+ { name: 'order', type: 'number', required: false, description: `No description.` },
+ { name: 'parentFolderId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_create_preset',
+ description: `Create a new preset (the team-level container for AI styling: templates, references, and rules). After creating, the typical next steps to make the preset useful are:
+ 1. Add example files as templates/references via \`add_or_remove_template_or_reference\` (or \`create_template_or_reference\` to spin up a fresh template file from a prompt). Templates anchor the visual style; references anchor terminology and concepts.
+ 2. Set the preset's rules via \`update_rules\` (e.g. 'always use dark backgrounds', 'prefer sequence diagrams for auth flows').
+ 3. Optionally mark the preset as the team default by calling \`update_preset\` with \`isDefault: true\`.
+This tool only creates the empty preset shell; an agent that stops here will produce a preset with no styling power. Chain the steps above unless the user explicitly only wanted the shell.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `No description.` },
+ { name: 'description', type: 'string', required: false, description: `No description.` },
+ { name: 'isDefault', type: 'boolean', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_create_template_or_reference',
+ description: `Create a new template (style anchor) or reference (terminology/concept anchor) file and, when \`presetId\` is provided, attach it to that preset in a single call. Auto-publishes the file's first version.
+
+Templates and references are ALWAYS team-scoped resources under AI Presets — there is no concept of a private/personal template or reference. DO NOT ask the user 'team template or private template?' — that is not a real choice. The only sharing question is which preset to attach it to.
+
+Typical use:
+ - User says 'make this a template under ' → pass \`presetId\` so the file is attached immediately.
+ - User says 'make a template from this file' without naming a preset → ASK them which preset before calling (or list_presets to show options). DO NOT silently omit \`presetId\`; an unattached template is invisible to AI generation and almost never what the user wanted.
+ - User says 'duplicate this file as a template' → pass \`sourceFileId\` (and \`presetId\`).
+
+When \`presetId\` is omitted the response includes a warning that the file is detached; treat that as a signal to follow up with \`add_or_remove_template_or_reference\` rather than leaving it dangling.`,
+ params: [
+ { name: 'kind', type: 'string', required: true, description: `No description.` },
+ { name: 'name', type: 'string', required: false, description: `No description.` },
+ { name: 'presetId', type: 'string', required: false, description: `No description.` },
+ { name: 'sourceFileId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_delete_diagram',
+ description: `Delete a diagram from a file.`,
+ params: [
+ { name: 'diagramId', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_delete_document',
+ description: `Clear a file's document body to an empty markdown document.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_delete_file',
+ description: `Archive a file.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_delete_folder',
+ description: `Delete a folder. Rejects when the folder is not empty.`,
+ params: [{ name: 'folderId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_delete_preset',
+ description: `Delete a preset. Rejects when the preset has any rules, templates, or references.`,
+ params: [{ name: 'presetId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_export_diagram',
+ description: `Render a canvas diagram to PNG or JPEG and return a temporary image URL. Tell the user to download it from the returned imageUrl.`,
+ params: [
+ { name: 'diagramId', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'background', type: 'boolean', required: false, description: `No description.` },
+ { name: 'format', type: 'string', required: false, description: `No description.` },
+ { name: 'imageQuality', type: 'string', required: false, description: `No description.` },
+ { name: 'theme', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_export_document',
+ description: `Export a file's markdown document body as a downloadable artifact.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'returnAs', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_export_file',
+ description: `Returns the Eraser file URL for PDF export. NOTE: programmatic PDF export is not yet available via MCP — this returns a link for the user to export from the Eraser app's export menu, not a downloadable PDF. For a diagram image, use export_diagram; for the document body as markdown, use export_document.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'area', type: 'string', required: false, description: `No description.` },
+ { name: 'pageOrientation', type: 'string', required: false, description: `No description.` },
+ { name: 'pageSize', type: 'string', required: false, description: `No description.` },
+ { name: 'returnAs', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_get_diagram',
+ description: `Fetch a diagram's metadata and DSL/JSON code. For freeform diagrams, set includeFreeformDefinition: true to get the full scene structure (elements, connections, titles). Need a PNG image of the diagram? Use export_diagram instead.`,
+ params: [
+ { name: 'diagramId', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ {
+ name: 'includeFreeformDefinition',
+ type: 'boolean',
+ required: false,
+ description: `No description.`,
+ },
+ ],
+ },
+ {
+ name: 'erasermcp_get_document',
+ description: `Fetch the full markdown body of a file's document.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_get_file',
+ description: `Fetch a file's metadata, document outline (headers), and the list of diagrams in it.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_get_folder',
+ description: `Fetch a folder by id.`,
+ params: [{ name: 'folderId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_get_me',
+ description: `Fetch the current user, active team, and team memberships.`,
+ params: [],
+ },
+ {
+ name: 'erasermcp_get_preset',
+ description: `Fetch a preset including its rules, templates, and references.`,
+ params: [{ name: 'presetId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_get_template_or_reference',
+ description: `Fetch a template/reference's metadata, document outline, and diagram list.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_list_diagrams',
+ description: `List the diagrams contained in a file.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_list_files',
+ description: `List files in the team workspace, optionally scoped to a folder.`,
+ params: [
+ { name: 'author', type: 'string', required: false, description: `No description.` },
+ { name: 'cursor', type: 'string', required: false, description: `No description.` },
+ { name: 'folderId', type: 'string', required: false, description: `No description.` },
+ { name: 'limit', type: 'number', required: false, description: `No description.` },
+ { name: 'sort', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_list_folders',
+ description: `List folders. Pass \`parentFolderId\` to scope to direct children of a folder (or \`null\` for top-level only). Pass \`nameContains\` to resolve a folder the user names by string (e.g. 'the Engineering folder') without paging through the entire tree. Combining the two narrows further (e.g. top-level folders containing 'eng').`,
+ params: [
+ { name: 'nameContains', type: 'string', required: false, description: `No description.` },
+ { name: 'parentFolderId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_list_presets',
+ description: `List the team's presets. Pass \`nameContains\` to resolve a preset the user names by string (e.g. 'the Marketing preset') without scanning the full list — much cheaper in context tokens.`,
+ params: [
+ { name: 'nameContains', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_list_teams',
+ description: `List the teams the current user belongs to (OAuth only).`,
+ params: [],
+ },
+ {
+ name: 'erasermcp_manually_create_diagram',
+ description: `ADVANCED — most callers should use create_diagram instead. This tool writes a caller-supplied diagram definition VERBATIM into a new diagram; no AI runs.
+
+For DSL diagrams (flowchart-dsl, sequence-dsl, etc.) pass the DSL source as \`code\`. For freeform diagrams pass a freeform definition as \`code\` — either JSON ({"title"?: string, "elements": [ ... ]}) or the equivalent JSX; it is parsed and laid out through the freeform render pass (text measurement, connection routing, etc.).
+
+Use ONLY WHEN: the user gave you a literal diagram definition to paste, you are converting from a non-Eraser source (other tool's export, programmatic generation), or you need byte-exact output for a reason the AI path cannot satisfy. For any natural-language description of what the diagram should contain (e.g. 'a sequence diagram showing checkout'), use create_diagram — it picks the diagram type, generates the definition, and renders it for a fraction of the output tokens of composing it yourself.`,
+ params: [
+ { name: 'code', type: 'string', required: true, description: `No description.` },
+ { name: 'diagramType', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_manually_create_document',
+ description: `ADVANCED — most callers should use create_document instead. This tool populates an empty file's document body with caller-supplied markdown VERBATIM; no AI runs and the bytes you pass are exactly what gets stored.
+
+Only callable on a file with an empty document body; if the file already has content, call manually_update_document (verbatim overwrite) or update_document (targeted AI edit) instead.
+
+USE ONLY WHEN: the user gave you literal markdown to paste, you are converting from another format (HTML, Confluence export, programmatic generation), or you need byte-exact output. For any natural-language description of what the document should say, use create_document.`,
+ params: [
+ { name: 'document', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_manually_update_diagram',
+ description: `ADVANCED — most callers should use update_diagram instead. This tool writes a diagram's complete DSL/JSON (or freeform edits) VERBATIM; no AI runs and the bytes you pass are exactly what gets stored.
+
+USE ONLY WHEN:
+ - the user gave you literal DSL/JSON they want pasted as-is,
+ - you are converting from a non-Eraser source (other tool's export, programmatic generation),
+ - or you need byte-exact output for a reason an AI refinement cannot satisfy.
+
+DO NOT use this tool just because the current diagram code happens to be in your context (e.g. you just called create_diagram and want to apply a small refinement). For ANY user request phrased as a natural-language edit ('remove the X group', 'add a step', 'change the color', 'rename Y to Z') — even when you already have the full DSL in front of you — call update_diagram instead. Re-emitting the entire DSL here to apply a conceptual edit costs the user large amounts of output tokens, risks accidental edits to unrelated parts, and gives a worse UX than letting Eraser apply the targeted change.`,
+ params: [
+ { name: 'diagramId', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'code', type: 'string', required: false, description: `No description.` },
+ { name: 'freeformEdits', type: 'array', required: false, description: `No description.` },
+ { name: 'targetFileId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_manually_update_document',
+ description: `ADVANCED — most callers should use update_document instead. This tool replaces a file's document body with caller-supplied markdown VERBATIM; no AI runs and the WHOLE body is overwritten (no targeted block edits, no preservation of unrelated sections beyond what you re-emit).
+
+USE ONLY WHEN:
+ - the user gave you literal markdown they want pasted as-is,
+ - you are converting from a non-Eraser source (HTML, Confluence export, programmatic generation),
+ - or you need byte-exact output for a reason an AI refinement cannot satisfy.
+
+DO NOT use this tool just because the current document markdown happens to be in your context. For ANY user request phrased as a natural-language edit ('add a section', 'fix the wording', 'remove that paragraph') — even when you already have the full body in front of you — call update_document instead. Re-emitting the entire body here to apply a conceptual edit costs the user large amounts of output tokens, risks accidental edits to unrelated sections, and gives a worse UX than letting Eraser apply targeted block edits.`,
+ params: [
+ { name: 'document', type: 'string', required: true, description: `No description.` },
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_manually_update_file',
+ description: `Replace a file's document markdown and/or diagram code in one call. No AI — caller supplies exact markdown/DSL/JSON.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'diagrams', type: 'array', required: false, description: `No description.` },
+ { name: 'document', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_publish_template_or_reference',
+ description: `Publish a new version of a template/reference file.`,
+ params: [{ name: 'fileId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_search',
+ description: `Full-text and semantic search across files or diagrams. Omit 'kind' for content search (finds matching blocks). Use kind: 'file' only to look up a file by name (no block content returned). Use kind: 'diagram' to search within diagram code/titles.`,
+ params: [
+ {
+ name: 'kind',
+ type: 'string',
+ required: false,
+ description: `Controls what is searched and how results are grouped. Omit (default) for full-content search — finds any text across all files and returns individual matching blocks with their file context. Use kind: 'file' ONLY to find a file by name — results are grouped by file with no per-block content. DO NOT use kind: 'file' if you want to find content within files; it will not return the content you need. Use kind: 'diagram' to search within diagram code/titles only.`,
+ },
+ { name: 'limit', type: 'number', required: false, description: `No description.` },
+ { name: 'offset', type: 'number', required: false, description: `No description.` },
+ {
+ name: 'queries',
+ type: 'array',
+ required: false,
+ description: `Submit up to 5 related query variants in one call. Results are merged and de-duplicated server-side, returning a single ranked list. Prefer this over making multiple separate search tool calls for related terms. When provided, the top-level \`query\` field is ignored.`,
+ },
+ { name: 'query', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_select_team',
+ description: `Set the active team for the session when the user belongs to multiple teams (OAuth only).`,
+ params: [{ name: 'teamId', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'erasermcp_update_diagram',
+ description: `USE THIS for any user request that describes the change in natural language — verbs like 'add', 'remove', 'change', 'rename', 'recolor', 'make it more X', etc. Eraser's AI applies the change to the existing diagram in place; you only send the short instruction (e.g. \`text: "remove the External Integrations group"\`), NOT the full new DSL.
+
+IMPORTANT: pick this tool even when the full diagram code is already in your context (e.g. from the previous create_diagram or get_diagram response). Re-emitting the entire DSL via manually_update_diagram to apply a one-line conceptual edit is the WRONG default — it wastes a large number of output tokens, increases the chance of accidental edits/typos, and gives a worse UX than letting Eraser apply a targeted change.
+
+Only fall back to manually_update_diagram when the user gave you literal code to paste, you are converting from a non-Eraser format, or you need byte-exact output that the AI rewrite path cannot guarantee.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'text', type: 'string', required: true, description: `No description.` },
+ { name: 'attachments', type: 'array', required: false, description: `No description.` },
+ { name: 'background', type: 'boolean', required: false, description: `No description.` },
+ { name: 'colorMode', type: 'string', required: false, description: `No description.` },
+ { name: 'diagramId', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'diagramType',
+ type: 'string',
+ required: false,
+ description: `OPTIONAL — LEAVE THIS EMPTY by default. Only set it when the user EXPLICITLY names a diagram type (e.g. 'make this a sequence diagram', 'use a cloud architecture diagram', 'turn it into an ERD'). When omitted, Eraser's render service picks the diagram type from the prompt text using diagram-type-specific heuristics and (if applicable) the preset/template in scope — that selection is usually better than guessing from the prompt yourself. Do NOT pre-classify the user's request into a diagram type just because the value is available in your schema; spurious type-locking produces worse diagrams than letting Eraser choose, especially on ambiguous prompts ('show how X works', 'diagram the architecture'). On update_diagram, leave this empty as well — the existing diagram's type is preserved by default.`,
+ },
+ { name: 'direction', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'folderId',
+ type: 'string',
+ required: false,
+ description: `OPTIONAL — leave this empty by default. Only set it when the user EXPLICITLY names a folder to place the new file in (e.g. "put it in the Engineering folder"). Do NOT call list_folders or get_folder to "pick a sensible folder" — when omitted, the file is created at the team root and the user can move it themselves. Spurious folder discovery wastes tokens and produces unexpected file placement.`,
+ },
+ { name: 'format', type: 'string', required: false, description: `No description.` },
+ { name: 'gitContexts', type: 'array', required: false, description: `No description.` },
+ { name: 'imageQuality', type: 'string', required: false, description: `No description.` },
+ {
+ name: 'includeImage',
+ type: 'boolean',
+ required: false,
+ description: `Set true only when you need a PNG URL to embed elsewhere. Not needed for in-app viewing — prefer the returned fileUrl/diagramUrl. Omitted from the response by default.`,
+ },
+ {
+ name: 'isTeamFile',
+ type: 'boolean',
+ required: false,
+ description: `Only honored by create_diagram when a NEW file is being created (i.e. targetFileId is omitted). When true, the new file is shared with the team (non-private); when false, the new file is private to the caller. Required on plans that don't support private files. Ignored by update_diagram, and ignored on create_diagram when targetFileId is set (because no new file is created).`,
+ },
+ { name: 'presetId', type: 'string', required: false, description: `No description.` },
+ { name: 'priorRequestId', type: 'string', required: false, description: `No description.` },
+ { name: 'styleMode', type: 'string', required: false, description: `No description.` },
+ { name: 'templateId', type: 'string', required: false, description: `No description.` },
+ { name: 'theme', type: 'string', required: false, description: `No description.` },
+ { name: 'title', type: 'string', required: false, description: `No description.` },
+ { name: 'typeface', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_update_document',
+ description: `USE THIS for any user request that describes the change in natural language — verbs like 'add a section', 'rewrite the intro', 'fix the typo', 'remove the deprecated paragraph', etc. Eraser's AI applies targeted block-level edits to the existing markdown; you only send the short instruction, NOT the full rewritten document.
+
+IMPORTANT: pick this tool even when the full document markdown is already in your context (e.g. from a previous create_document or get_file response). Re-emitting the entire body via manually_update_document to apply a conceptual edit is the WRONG default — it wastes large amounts of output tokens, risks accidental edits/typos in unrelated sections, and gives a worse UX than letting Eraser apply a targeted change.
+
+Only fall back to manually_update_document when the user gave you literal markdown to paste, you are converting from another format, or you need byte-exact output the AI rewrite path cannot guarantee.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'text', type: 'string', required: true, description: `No description.` },
+ { name: 'presetId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_update_file',
+ description: `Update file metadata (title, folder, sharing). When applyTemplate is provided, AI fills the file's document and diagrams from a preset template.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'applyTemplate', type: 'object', required: false, description: `No description.` },
+ { name: 'folderId', type: 'string', required: false, description: `No description.` },
+ { name: 'isTeamFile', type: 'boolean', required: false, description: `No description.` },
+ { name: 'linkAccess', type: 'string', required: false, description: `No description.` },
+ { name: 'title', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_update_folder',
+ description: `Rename or move a folder, or bulk-apply a link-sharing setting to every file inside it (recursively). Note: folders do not store linkAccess themselves — to change sharing you MUST pass both \`linkAccess\` and \`applySharingToDescendantFiles: true\` together.`,
+ params: [
+ { name: 'folderId', type: 'string', required: true, description: `No description.` },
+ {
+ name: 'applySharingToDescendantFiles',
+ type: 'boolean',
+ required: false,
+ description: `Required (set to true) when supplying \`linkAccess\`. Rewrites the linkAccess setting on every file in this folder and all subfolders recursively.`,
+ },
+ {
+ name: 'linkAccess',
+ type: 'string',
+ required: false,
+ description: `Link-sharing setting to apply to every file under this folder. Folders themselves do not store linkAccess, so this MUST be paired with \`applySharingToDescendantFiles: true\`; passing linkAccess alone is rejected with an invalid-params error.`,
+ },
+ { name: 'name', type: 'string', required: false, description: `No description.` },
+ { name: 'parentFolderId', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_update_preset',
+ description: `Rename a preset or update its metadata (\`name\`, \`description\`, \`isDefault\`). Does NOT modify rules or templates/references — use \`update_rules\` and \`add_or_remove_template_or_reference\` for those.`,
+ params: [
+ { name: 'presetId', type: 'string', required: true, description: `No description.` },
+ { name: 'description', type: 'string', required: false, description: `No description.` },
+ { name: 'isDefault', type: 'boolean', required: false, description: `No description.` },
+ { name: 'name', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_update_rules',
+ description: `Add, update, or remove rules on a preset in a single batched call. Rules are natural-language instructions the AI will follow when generating diagrams/documents under this preset (e.g. 'use dark theme', 'all auth flows should be sequence diagrams'). Typically called as step 3 of the create-preset chain (after \`create_preset\` and \`add_or_remove_template_or_reference\`), but can be called any time to tune an existing preset.`,
+ params: [
+ { name: 'operations', type: 'array', required: true, description: `No description.` },
+ { name: 'presetId', type: 'string', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'erasermcp_update_template_or_reference',
+ description: `Rename a template or reference file.`,
+ params: [
+ { name: 'fileId', type: 'string', required: true, description: `No description.` },
+ { name: 'name', type: 'string', required: false, description: `No description.` },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/fiberymcp.ts b/src/data/agent-connectors/fiberymcp.ts
new file mode 100644
index 000000000..b745666f3
--- /dev/null
+++ b/src/data/agent-connectors/fiberymcp.ts
@@ -0,0 +1,928 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'fiberymcp_add_collection_items',
+ description: `Adds related entities to a Collection field on a Fibery entity.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entityId', type: 'string', required: true, description: `fibery/id of an entity` },
+ {
+ name: 'field',
+ type: 'string',
+ required: true,
+ description: `The name of the collection field`,
+ },
+ {
+ name: 'items',
+ type: 'array',
+ required: true,
+ description: `An array of related entity ids to add to the collection. Each entry must be fibery/id of the entity to add`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_add_comment',
+ description: `Adds a top-level comment or reply to an existing comment on a Fibery entity.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `Comment content in Markdown format`,
+ },
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task'). Must be a database that supports comments (has the comments/comments collection).`,
+ },
+ {
+ name: 'entityId',
+ type: 'string',
+ required: true,
+ description: `fibery/id of the entity to comment on`,
+ },
+ {
+ name: 'parentCommentId',
+ type: 'string',
+ required: false,
+ description: `fibery/id of the parent comment when replying. Omit for a top-level comment. The parent comment must belong to the same entity (entityId) — otherwise the request is rejected.`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_add_file_from_url',
+ description: `Attaches a file to a Fibery entity by downloading it from a publicly accessible URL.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entityId', type: 'string', required: true, description: `fibery/id of an entity` },
+ {
+ name: 'field',
+ type: 'string',
+ required: true,
+ description: `Exact name of a file field on this database (e.g., 'Files/Files' or 'Space/Files'). Confirm via \`schema_detailed\` tool call. Document fields cannot be used.`,
+ },
+ {
+ name: 'fileName',
+ type: 'string',
+ required: true,
+ description: `Name of the file to be added (e.g., 'Report.pdf')`,
+ },
+ {
+ name: 'url',
+ type: 'string',
+ required: true,
+ description: `HTTP(s) URL to download the file from`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_append_document_content',
+ description: `Appends Markdown content to the end of a document field on a Fibery entity.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `Document's content in MD format. Any content you write here will be APPENDED to already existing content in the document`,
+ },
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entityId', type: 'string', required: true, description: `fibery/id of an entity` },
+ {
+ name: 'field',
+ type: 'string',
+ required: true,
+ description: `The name of the document field`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_avatars_fields',
+ description: `Enables avatar/profile-picture attachments on entities in one or more databases.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names (e.g., ["SoftDev/Task"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_comments_fields',
+ description: `Enables comments on entities in one or more databases.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names (e.g., ["SoftDev/Task"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_databases',
+ description: `Creates one or more new databases within an existing space.`,
+ params: [{ name: 'databases', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_create_entities',
+ description: `Creates one or more entities in a Fibery database.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entities', type: 'array', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_files_fields',
+ description: `Creates file attachment fields in one or more databases.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_create_formula_field',
+ description: `Creates a formula field in a database; the formula expression is generated from a plain-language description.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: true,
+ description: `Description of what the formula should calculate. The formula expression will be generated from this`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Name of the formula field in {Space}/{Field} format (e.g., 'SoftDev/Days Since Created'). Space prefix must match the database space`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_icon_fields',
+ description: `Enables emoji icon fields on entities in one or more databases.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names (e.g., ["SoftDev/Task"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_multi_select_fields',
+ description: `Creates multi-select fields with predefined options in one or more databases.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_create_primitive_fields',
+ description: `Creates primitive fields (text, number, date, boolean, etc.) in one or more databases.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_create_relation_fields',
+ description: `Creates relation fields between databases, establishing links in both the source and target database.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_create_single_select_fields',
+ description: `Creates single-select fields with predefined options in one or more databases.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_create_space',
+ description: `Creates a new space in the Fibery workspace.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `Space name (e.g., "SoftDev")` },
+ {
+ name: 'color',
+ type: 'string',
+ required: false,
+ description: `Color for the space (hex color code, e.g., '#FF5722')`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `Description for the space`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_view',
+ description: `Creates a saved view (grid, board, timeline, calendar, etc.) or standalone document in the Fibery workspace.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `Name of the view` },
+ {
+ name: 'viewType',
+ type: 'string',
+ required: true,
+ description: `grid: spreadsheet table (supports hierarchical groupBy). list: simple list (prefer grid). board: kanban grouped by relation/enum on x and optionally y. timeline: time bars with optional milestones and dependencies. calendar: date events. map: geographic plot of a location field. feed: rich-text feed of a document field. gallery: card gallery with cover images. gantt: hierarchical timeline with dependencies. form: data input form. document: standalone markdown (use the \`content\` param). report: not yet supported here.`,
+ },
+ {
+ name: 'config',
+ type: 'object',
+ required: false,
+ description: `View configuration object. Shape depends on viewType — for anything beyond a basic grid/list with no filters or ordering, call get_tool_reference({toolName: 'create_view'}) first.`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `Markdown content (for document views)`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `Short description of the view in MD format`,
+ },
+ {
+ name: 'space',
+ type: 'string',
+ required: false,
+ description: `Space name to create the view in. Pass "Private" to save in Private space. By default, inferred from databases.`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_create_workflow_field',
+ description: `Creates a workflow (state) field for tracking entity status through defined stages.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ {
+ name: 'defaultOption',
+ type: 'string',
+ required: true,
+ description: `Default state name for new entities`,
+ },
+ {
+ name: 'options',
+ type: 'array',
+ required: true,
+ description: `Array of workflow state options`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_avatars_fields',
+ description: `Removes avatar fields from one or more databases; restorable via the Activity Log.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names (e.g., ["SoftDev/Task"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_comments_fields',
+ description: `Removes comment fields from one or more databases; restorable via the Activity Log.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names (e.g., ["SoftDev/Task"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_databases',
+ description: `Deletes one or more databases from a space; restorable via the Activity Log.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names to delete (e.g., ["SoftDev/Tasks"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_entities',
+ description: `Permanently deletes entities from a database by their IDs.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ {
+ name: 'ids',
+ type: 'array',
+ required: true,
+ description: `Array of entity IDs (fibery/id) to delete`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_fields',
+ description: `Deletes one or more fields from their databases; restorable via the Activity Log.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_delete_icon_fields',
+ description: `Removes icon fields from one or more databases; restorable via the Activity Log.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `Array of full database names (e.g., ["SoftDev/Task"])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_space',
+ description: `Deletes a space and all its databases from the workspace; restorable via the Activity Log.`,
+ params: [
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Space name to delete (e.g., "SoftDev")`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_views',
+ description: `Deletes one or more Fibery views by ID; the underlying data is not removed.`,
+ params: [
+ {
+ name: 'ids',
+ type: 'array',
+ required: true,
+ description: `An array of fibery/id strings (of views) to be deleted`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_delete_workflow_field',
+ description: `Deletes the workflow (state) field from a database; restorable via the Activity Log.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_download_file',
+ description: `Fetches a Fibery file attachment by secret and returns a signed download URL valid for ~60 minutes.`,
+ params: [
+ {
+ name: 'secret',
+ type: 'string',
+ required: true,
+ description: `File secret obtained from get_files_meta — opaque identifier returned in each file entry.`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_fetch_by_url',
+ description: `Fetches entity or view data from a Fibery URL and returns it as Markdown.`,
+ params: [
+ { name: 'url', type: 'string', required: true, description: `Fibery URL to fetch data from` },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of items to return for views (default: 20)`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_fetch_view_data',
+ description: `Fetches entity data from a Fibery view by executing its saved query.`,
+ params: [
+ {
+ name: 'publicId',
+ type: 'string',
+ required: true,
+ description: `Public ID of the view to fetch data from`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Max entities to return (default: 100)`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Number of entities to skip (default: 0)`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_get_connectors_list',
+ description: `Returns a list of available built-in connectors (integrations) in Fibery.`,
+ params: [],
+ },
+ {
+ name: 'fiberymcp_get_documents_content',
+ description: `Returns the Markdown content of one or more Fibery document fields identified by their secrets.`,
+ params: [
+ { name: 'secrets', type: 'array', required: true, description: `Secrets of documents` },
+ {
+ name: 'reducePrompt',
+ type: 'string',
+ required: false,
+ description: `Controls how large documents are summarized when too long. By default: 'Summarize this document in 2-3 paragraphs max.'`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_get_entity_links',
+ description: `Generates Fibery web links for entities by their public IDs.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ {
+ name: 'entityPublicIds',
+ type: 'array',
+ required: true,
+ description: `Array of entity public IDs (e.g., ['42', '43'])`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_get_files_meta',
+ description: `Lists file attachments on one or more Fibery entities and returns their metadata.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name in 'Space/Type' format, e.g. 'SoftDev/Task'. Use \`schema\` to discover available databases.`,
+ },
+ {
+ name: 'entityIds',
+ type: 'array',
+ required: true,
+ description: `One or more fibery/id UUIDs of the entities whose file attachments to list.`,
+ },
+ {
+ name: 'field',
+ type: 'string',
+ required: false,
+ description: `Name of a specific file field to query. Omit to scan all file fields on the database. Use \`schema_detailed\` to discover available file fields.`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_get_manual_import_link',
+ description: `Generates a link to the manual import page for a Fibery connector.`,
+ params: [
+ {
+ name: 'connectorId',
+ type: 'string',
+ required: true,
+ description: `ID of the connector to be used (obtained from get_connectors_list)`,
+ },
+ {
+ name: 'isSync',
+ type: 'boolean',
+ required: true,
+ description: `Whether the data from the source will be synced continuously (true) or imported once (false)`,
+ },
+ {
+ name: 'spaceName',
+ type: 'string',
+ required: true,
+ description: `The name of the space to import into`,
+ },
+ {
+ name: 'dbName',
+ type: 'string',
+ required: false,
+ description: `The name of the existing database to import into. Leave empty to import into a new database in the space.`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_get_me',
+ description: `Returns information about the currently authenticated Fibery user.`,
+ params: [],
+ },
+ {
+ name: 'fiberymcp_get_tool_reference',
+ description: `Returns extended reference documentation for a specific Fibery MCP tool.`,
+ params: [
+ {
+ name: 'toolName',
+ type: 'string',
+ required: true,
+ description: `The snake_case MCP tool name to look up (e.g. 'query', 'create_entities')`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_query',
+ description: `Runs a structured Fibery query to select, filter, order, paginate, and aggregate data.`,
+ params: [
+ { name: 'query', type: 'object', required: true, description: `No description.` },
+ {
+ name: 'params',
+ type: 'object',
+ required: false,
+ description: `Not used anymore, left for backwards compatibility`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_query_views',
+ description: `Queries saved views in the Fibery workspace, optionally filtering by ID, public ID, name, or type.`,
+ params: [
+ {
+ name: 'id',
+ type: 'string',
+ required: false,
+ description: `Filter by fibery/id of the view`,
+ },
+ {
+ name: 'publicId',
+ type: 'string',
+ required: false,
+ description: `Filter by public ID of the view`,
+ },
+ {
+ name: 'text',
+ type: 'string',
+ required: false,
+ description: `Text search in view name or description`,
+ },
+ { name: 'viewType', type: 'string', required: false, description: `Filter by view type` },
+ {
+ name: 'withConfig',
+ type: 'boolean',
+ required: false,
+ description: `Specify whether to include view config (like, what database are present on this view, what fields are shown). true by default. Set to false if not filtering by id filters since there can be many views returned`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_remove_collection_items',
+ description: `Removes related entities from a Collection field on a Fibery entity.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entityId', type: 'string', required: true, description: `fibery/id of an entity` },
+ {
+ name: 'field',
+ type: 'string',
+ required: true,
+ description: `The name of the collection field`,
+ },
+ {
+ name: 'items',
+ type: 'array',
+ required: true,
+ description: `An array of related entity ids to remove from the collection. Each entry must be fibery/id of the entity to add`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_rename_databases',
+ description: `Renames one or more databases, optionally moving them to a different space.`,
+ params: [{ name: 'databases', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_rename_fields',
+ description: `Renames one or more fields within their databases.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_schema',
+ description: `Returns the high-level workspace structure showing all spaces and databases.`,
+ params: [],
+ },
+ {
+ name: 'fiberymcp_schema_detailed',
+ description: `Returns detailed schema for specified databases, including fields and related databases.`,
+ params: [
+ {
+ name: 'databases',
+ type: 'array',
+ required: true,
+ description: `An array of database names (in "Space/Database" format).`,
+ },
+ {
+ name: 'includeRelatedDatabases',
+ type: 'boolean',
+ required: false,
+ description: `Whether to include related databases with their descriptions & fields. Defaults to false. Set to true if the schema is small and you want to navigate faster.`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_search',
+ description: `Searches workspace content using BM-25 keyword matching.`,
+ params: [
+ { name: 'query', type: 'string', required: true, description: `Search query string` },
+ {
+ name: 'database',
+ type: 'string',
+ required: false,
+ description: `Filter results to a specific database (e.g., 'Projects/Task')`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of items to return (default: 20, max: 100)`,
+ },
+ {
+ name: 'viewType',
+ type: 'string',
+ required: false,
+ description: `Filter results to a specific view type`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_search_guide',
+ description: `Fetches relevant information from the Fibery User Guide based on a query.`,
+ params: [
+ { name: 'query', type: 'string', required: true, description: `The query for searching` },
+ ],
+ },
+ {
+ name: 'fiberymcp_search_history',
+ description: `Searches the workspace activity history and returns matching history events.`,
+ params: [
+ { name: 'actions', type: 'array', required: false, description: `Filter by action types` },
+ {
+ name: 'authorUserId',
+ type: 'string',
+ required: false,
+ description: `Filter by author's fibery/id`,
+ },
+ {
+ name: 'database',
+ type: 'string',
+ required: false,
+ description: `Filter by database name (e.g., 'Projects/Task')`,
+ },
+ {
+ name: 'entityId',
+ type: 'string',
+ required: false,
+ description: `Filter by entity fibery/id`,
+ },
+ {
+ name: 'entityName',
+ type: 'string',
+ required: false,
+ description: `Filter by entity name (substring match)`,
+ },
+ {
+ name: 'entityPublicId',
+ type: 'string',
+ required: false,
+ description: `Filter by entity public ID (requires database to be set)`,
+ },
+ {
+ name: 'entityState',
+ type: 'array',
+ required: false,
+ description: `Filter by entity states`,
+ },
+ {
+ name: 'excludeAutomaticChanges',
+ type: 'string',
+ required: false,
+ description: `Exclude automatic changes (all excluded by default)`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of items to return (default: 50, max: 100)`,
+ },
+ {
+ name: 'schemaChange',
+ type: 'array',
+ required: false,
+ description: `Filter by schema change types`,
+ },
+ {
+ name: 'since',
+ type: 'string',
+ required: false,
+ description: `Start of time range (ISO 8601). Defaults to 24 hours ago`,
+ },
+ {
+ name: 'sinceItem',
+ type: 'string',
+ required: false,
+ description: `Cursor for pagination — last item ID from previous result`,
+ },
+ {
+ name: 'until',
+ type: 'string',
+ required: false,
+ description: `End of time range (ISO 8601). Defaults to now. Difference between dates in until and since cannot be more than 12 months`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_set_document_content',
+ description: `Sets (replaces) the content of a document field on a Fibery entity.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `Document's content in MD format. It has to be full document content`,
+ },
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entityId', type: 'string', required: true, description: `fibery/id of an entity` },
+ {
+ name: 'field',
+ type: 'string',
+ required: true,
+ description: `The name of the document field`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_set_state',
+ description: `Sets the workflow state of a Fibery entity.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entityId', type: 'string', required: true, description: `fibery/id of an entity` },
+ { name: 'state', type: 'string', required: true, description: `State title (enum/name)` },
+ ],
+ },
+ {
+ name: 'fiberymcp_update_entities',
+ description: `Updates fields on one or more existing Fibery entities.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ { name: 'entities', type: 'array', required: true, description: `No description.` },
+ ],
+ },
+ {
+ name: 'fiberymcp_update_formula_field',
+ description: `Updates an existing formula field by regenerating its expression from a new description.`,
+ params: [
+ {
+ name: 'database',
+ type: 'string',
+ required: true,
+ description: `Full database name (e.g., 'SoftDev/Task')`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: true,
+ description: `New description of what the formula should calculate. A new formula expression will be generated from this`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Name of the existing formula field in {Space}/{Field} format (e.g., 'SoftDev/Days Since Created')`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_update_multi_select_fields',
+ description: `Updates the options of one or more existing multi-select fields.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_update_single_select_fields',
+ description: `Updates the options of one or more existing single-select fields.`,
+ params: [{ name: 'fields', type: 'array', required: true, description: `No description.` }],
+ },
+ {
+ name: 'fiberymcp_update_view',
+ description: `Updates an existing Fibery view's name, description, space, content, or configuration.`,
+ params: [
+ {
+ name: 'id',
+ type: 'string',
+ required: true,
+ description: `fibery/id of the view to update`,
+ },
+ {
+ name: 'viewType',
+ type: 'string',
+ required: true,
+ description: `grid: spreadsheet table (supports hierarchical groupBy). list: simple list (prefer grid). board: kanban grouped by relation/enum on x and optionally y. timeline: time bars with optional milestones and dependencies. calendar: date events. map: geographic plot of a location field. feed: rich-text feed of a document field. gallery: card gallery with cover images. gantt: hierarchical timeline with dependencies. form: data input form. document: standalone markdown (use the \`content\` param). report: not yet supported here.`,
+ },
+ {
+ name: 'append',
+ type: 'boolean',
+ required: false,
+ description: `If true, append content instead of replacing (document views only)`,
+ },
+ {
+ name: 'config',
+ type: 'object',
+ required: false,
+ description: `View configuration object. Shape depends on viewType — for anything beyond a basic grid/list with no filters or ordering, call get_tool_reference({toolName: 'create_view'}) first.`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `Markdown content (for document views)`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `New description for the view`,
+ },
+ { name: 'name', type: 'string', required: false, description: `New name for the view` },
+ {
+ name: 'space',
+ type: 'string',
+ required: false,
+ description: `Move the view to a different space`,
+ },
+ ],
+ },
+ {
+ name: 'fiberymcp_update_workflow_field',
+ description: `Updates the options of an existing workflow (state) field.`,
+ params: [
+ { name: 'database', type: 'string', required: true, description: `Full database name` },
+ {
+ name: 'update',
+ type: 'string',
+ required: true,
+ description: `Full replacement or incremental update`,
+ },
+ {
+ name: 'defaultOption',
+ type: 'string',
+ required: false,
+ description: `New default state name. If not provided, the default is left unchanged`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/figma.ts b/src/data/agent-connectors/figma.ts
index ceb942584..dded90a23 100644
--- a/src/data/agent-connectors/figma.ts
+++ b/src/data/agent-connectors/figma.ts
@@ -5,283 +5,852 @@ export const tools: Tool[] = [
name: 'figma_activity_logs_list',
description: `Returns activity log events for an organization (Enterprise only). Includes events for file edits, permissions changes, and user actions.`,
params: [
- { name: 'cursor', type: 'string', required: false, description: `Cursor from previous response for pagination.` },
- { name: 'end_time', type: 'integer', required: false, description: `Unix timestamp (seconds) to stop fetching events at.` },
- { name: 'event_type', type: 'string', required: false, description: `Filter by a specific event type, e.g. 'file.update'.` },
- { name: 'limit', type: 'integer', required: false, description: `Maximum number of events to return (1-1000, default 100).` },
- { name: 'order', type: 'string', required: false, description: `Sort order: asc or desc by timestamp. Default is desc.` },
- { name: 'start_time', type: 'integer', required: false, description: `Unix timestamp (seconds) to start fetching events from.` },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from the previous response to fetch the next batch of events.`,
+ },
+ {
+ name: 'end_time',
+ type: 'integer',
+ required: false,
+ description: `Unix timestamp (seconds) to stop fetching events at.`,
+ },
+ {
+ name: 'events',
+ type: 'string',
+ required: false,
+ description: `Comma-separated event types to filter. All returned by default.`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Maximum number of events to return (1-1000, default 100).`,
+ },
+ {
+ name: 'order',
+ type: 'string',
+ required: false,
+ description: `Sort order: asc or desc by timestamp. Default is desc.`,
+ },
+ {
+ name: 'start_time',
+ type: 'integer',
+ required: false,
+ description: `Unix timestamp (seconds) to start fetching events from.`,
+ },
],
},
{
name: 'figma_comment_reaction_create',
description: `Adds an emoji reaction to a comment in a Figma file.`,
params: [
- { name: 'comment_id', type: 'string', required: true, description: `The ID of the comment to react to.` },
- { name: 'emoji', type: 'string', required: true, description: `The emoji to react with (e.g. ':thumbsup:').` },
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'comment_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the comment to react to.`,
+ },
+ {
+ name: 'emoji',
+ type: 'string',
+ required: true,
+ description: `The emoji to react with (e.g. ':thumbsup:').`,
+ },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_comment_reaction_delete',
description: `Removes the authenticated user's emoji reaction from a comment in a Figma file.`,
params: [
- { name: 'comment_id', type: 'string', required: true, description: `The ID of the comment to remove reaction from.` },
- { name: 'emoji', type: 'string', required: true, description: `The emoji reaction to remove (e.g. ':thumbsup:').` },
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'comment_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the comment to remove reaction from.`,
+ },
+ {
+ name: 'emoji',
+ type: 'string',
+ required: true,
+ description: `The emoji reaction to remove (e.g. ':thumbsup:').`,
+ },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_comment_reactions_list',
description: `Returns a list of emoji reactions on a specific comment in a Figma file.`,
params: [
- { name: 'comment_id', type: 'string', required: true, description: `The ID of the comment to get reactions for.` },
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor for next page of results.` },
+ {
+ name: 'comment_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the comment to get reactions for.`,
+ },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor for next page of results.`,
+ },
],
},
{
name: 'figma_component_get',
description: `Returns metadata for a published component by its key, including name, description, thumbnail, and containing file information.`,
params: [
- { name: 'key', type: 'string', required: true, description: `The unique key of the component.` },
+ {
+ name: 'key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the component.`,
+ },
],
},
{
name: 'figma_component_set_get',
description: `Returns metadata for a published component set (a group of related component variants) by its key.`,
params: [
- { name: 'key', type: 'string', required: true, description: `The unique key of the component set.` },
+ {
+ name: 'key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the component set.`,
+ },
],
},
{
name: 'figma_dev_resource_create',
description: `Creates a dev resource (external link) attached to a node in a Figma file, such as a link to Storybook, Jira, or documentation.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the Figma file containing the target node.` },
- { name: 'name', type: 'string', required: true, description: `Display name for the dev resource link.` },
- { name: 'node_id', type: 'string', required: true, description: `The ID of the node to attach the dev resource to.` },
- { name: 'url', type: 'string', required: true, description: `The URL of the external resource.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the Figma file containing the target node.`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Display name for the dev resource link.`,
+ },
+ {
+ name: 'node_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the node to attach the dev resource to.`,
+ },
+ {
+ name: 'url',
+ type: 'string',
+ required: true,
+ description: `The URL of the external resource.`,
+ },
],
},
{
name: 'figma_dev_resource_delete',
description: `Permanently deletes a dev resource from a node in a Figma file.`,
params: [
- { name: 'dev_resource_id', type: 'string', required: true, description: `The ID of the dev resource to delete.` },
- { name: 'file_key', type: 'string', required: true, description: `The key of the Figma file containing the dev resource.` },
+ {
+ name: 'dev_resource_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the dev resource to delete.`,
+ },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the Figma file containing the dev resource.`,
+ },
],
},
{
name: 'figma_dev_resource_update',
description: `Updates an existing dev resource attached to a node in a Figma file.`,
params: [
- { name: 'dev_resource_id', type: 'string', required: true, description: `The ID of the dev resource to update.` },
- { name: 'name', type: 'string', required: false, description: `New display name for the dev resource.` },
- { name: 'url', type: 'string', required: false, description: `New URL for the dev resource.` },
+ {
+ name: 'dev_resource_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the dev resource to update.`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: false,
+ description: `New display name for the dev resource.`,
+ },
+ {
+ name: 'url',
+ type: 'string',
+ required: false,
+ description: `New URL for the dev resource.`,
+ },
],
},
{
name: 'figma_dev_resources_list',
description: `Returns dev resources (links to external tools like Storybook, Jira, etc.) attached to nodes in a Figma file.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the Figma file to get dev resources for.` },
- { name: 'node_ids', type: 'string', required: false, description: `Comma-separated node IDs to filter by. Omit to return all dev resources in the file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the Figma file to get dev resources for.`,
+ },
+ {
+ name: 'node_ids',
+ type: 'string',
+ required: false,
+ description: `Comma-separated node IDs to filter by. Omit to return all dev resources in the file.`,
+ },
],
},
{
name: 'figma_file_comment_create',
description: `Posts a new comment on a Figma file. Can be placed at a specific canvas position or anchored to a specific node.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'message', type: 'string', required: true, description: `The text content of the comment.` },
- { name: 'client_meta', type: 'string', required: false, description: `JSON string specifying position or node anchor for the comment, e.g. {"node_id":"1:2","node_offset":{"x":0,"y":0}}.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
+ {
+ name: 'message',
+ type: 'string',
+ required: true,
+ description: `The text content of the comment.`,
+ },
+ {
+ name: 'client_meta',
+ type: 'string',
+ required: false,
+ description: `JSON string specifying position or node anchor for the comment, e.g. {"node_id":"1:2","node_offset":{"x":0,"y":0}}.`,
+ },
+ {
+ name: 'comment_id',
+ type: 'string',
+ required: false,
+ description: `The ID of the comment to reply to. If provided, this creates a reply to that comment.`,
+ },
],
},
{
name: 'figma_file_comment_delete',
description: `Deletes a specific comment from a Figma file. Only the comment author or file owner can delete a comment.`,
params: [
- { name: 'comment_id', type: 'string', required: true, description: `The ID of the comment to delete.` },
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'comment_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the comment to delete.`,
+ },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_comments_list',
description: `Returns all comments left on a Figma file, including their text, author, position, and resolved status.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'as_md', type: 'boolean', required: false, description: `If true, returns comment text as Markdown.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
+ {
+ name: 'as_md',
+ type: 'boolean',
+ required: false,
+ description: `If true, returns comment text as Markdown.`,
+ },
],
},
{
name: 'figma_file_component_sets_list',
description: `Returns all published component sets in a Figma file.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_components_list',
description: `Returns a list of all published components in a Figma file, including their keys, names, descriptions, and thumbnails.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_get',
description: `Returns a Figma file's full document tree including all nodes, components, styles, and metadata.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file (found in the file URL).` },
- { name: 'depth', type: 'integer', required: false, description: `Depth of the document tree to return (1-4). Lower depth returns faster.` },
- { name: 'version', type: 'string', required: false, description: `A specific version ID to get. Omit to get the current version.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file (found in the file URL).`,
+ },
+ {
+ name: 'branch_data',
+ type: 'boolean',
+ required: false,
+ description: `Include data on branches of the file.`,
+ },
+ {
+ name: 'depth',
+ type: 'integer',
+ required: false,
+ description: `Depth of the document tree to return (1-4). Lower depth returns faster.`,
+ },
+ {
+ name: 'geometry',
+ type: 'string',
+ required: false,
+ description: `Set to "paths" to export vector path data.`,
+ },
+ {
+ name: 'ids',
+ type: 'string',
+ required: false,
+ description: `Comma-separated node IDs to fetch.`,
+ },
+ {
+ name: 'plugin_data',
+ type: 'string',
+ required: false,
+ description: `Plugin IDs to return plugin data for.`,
+ },
+ {
+ name: 'version',
+ type: 'string',
+ required: false,
+ description: `A specific version ID to get. Omit to get the current version.`,
+ },
],
},
{
name: 'figma_file_image_fills_get',
description: `Returns download URLs for all image fills used in a Figma file. Image fills are images that have been applied as fills to nodes.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_images_render',
description: `Renders nodes from a Figma file as images (PNG, JPG, SVG, or PDF) and returns URLs to download them.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'ids', type: 'string', required: true, description: `Comma-separated list of node IDs to render.` },
- { name: 'format', type: 'string', required: false, description: `Image format: jpg, png, svg, or pdf. Default is png.` },
- { name: 'scale', type: 'number', required: false, description: `Image scale factor (0.01 to 4). Default is 1.` },
- { name: 'version', type: 'string', required: false, description: `A specific version ID to render from.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
+ {
+ name: 'ids',
+ type: 'string',
+ required: true,
+ description: `Comma-separated list of node IDs to render.`,
+ },
+ {
+ name: 'contents_only',
+ type: 'boolean',
+ required: false,
+ description: `Render only node contents without background.`,
+ },
+ {
+ name: 'format',
+ type: 'string',
+ required: false,
+ description: `Image format: jpg, png, svg, or pdf. Default is png.`,
+ },
+ {
+ name: 'scale',
+ type: 'number',
+ required: false,
+ description: `Image scale factor (0.01 to 4). Default is 1.`,
+ },
+ {
+ name: 'svg_include_id',
+ type: 'boolean',
+ required: false,
+ description: `Include id attributes on SVG elements.`,
+ },
+ {
+ name: 'svg_include_node_id',
+ type: 'boolean',
+ required: false,
+ description: `Include node_id attributes on SVG elements.`,
+ },
+ {
+ name: 'svg_outline_text',
+ type: 'boolean',
+ required: false,
+ description: `Outline all text in SVG output.`,
+ },
+ {
+ name: 'svg_simplify_stroke',
+ type: 'boolean',
+ required: false,
+ description: `Simplify stroke operations in SVG output.`,
+ },
+ {
+ name: 'use_absolute_bounds',
+ type: 'boolean',
+ required: false,
+ description: `Use absolute bounding box for rendering.`,
+ },
+ {
+ name: 'version',
+ type: 'string',
+ required: false,
+ description: `A specific version ID to render from.`,
+ },
],
},
{
name: 'figma_file_nodes_get',
description: `Returns specific nodes from a Figma file by their node IDs, along with their children and associated styles and components.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'ids', type: 'string', required: true, description: `Comma-separated list of node IDs to retrieve.` },
- { name: 'depth', type: 'integer', required: false, description: `Depth of the document tree to return for each node.` },
- { name: 'version', type: 'string', required: false, description: `A specific version ID to fetch nodes from.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
+ {
+ name: 'ids',
+ type: 'string',
+ required: true,
+ description: `Comma-separated list of node IDs to retrieve.`,
+ },
+ {
+ name: 'depth',
+ type: 'integer',
+ required: false,
+ description: `Depth of the document tree to return for each node.`,
+ },
+ {
+ name: 'geometry',
+ type: 'string',
+ required: false,
+ description: `Set to "paths" to export vector path data.`,
+ },
+ {
+ name: 'plugin_data',
+ type: 'string',
+ required: false,
+ description: `Plugin IDs to return plugin data for.`,
+ },
+ {
+ name: 'version',
+ type: 'string',
+ required: false,
+ description: `A specific version ID to fetch nodes from.`,
+ },
],
},
{
name: 'figma_file_styles_list',
description: `Returns all published styles in a Figma file, including color, text, effect, and grid styles.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_variables_local_get',
description: `Returns all local variables and variable collections defined in a Figma file. Requires the variables:read scope.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_variables_published_get',
description: `Returns all published variables and variable collections from a Figma file's library. Requires the variables:read scope.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
],
},
{
name: 'figma_file_variables_update',
- description: `Creates, updates, or deletes variables and variable collections in a Figma file. Accepts a JSON payload describing the changes. Requires the variables:write scope.`,
+ description: `Create, update, or delete variables, variable collections, and modes in a Figma file. Enterprise plan only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'payload', type: 'string', required: true, description: `JSON string with variableCollections, variables, and variableModeValues arrays describing changes to apply.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The file or branch key to update variables in.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ {
+ name: 'variableCollections',
+ type: 'array',
+ required: false,
+ description: `Variable collections to create, update, or delete.`,
+ },
+ {
+ name: 'variableModes',
+ type: 'array',
+ required: false,
+ description: `Variable modes to create, update, or delete.`,
+ },
+ {
+ name: 'variableModeValues',
+ type: 'array',
+ required: false,
+ description: `Variable mode values to set.`,
+ },
+ {
+ name: 'variables',
+ type: 'array',
+ required: false,
+ description: `Variables to create, update, or delete.`,
+ },
],
},
{
name: 'figma_file_versions_list',
description: `Returns the version history of a Figma file, including version IDs, labels, descriptions, and creation timestamps.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The unique key of the Figma file.` },
- { name: 'after', type: 'string', required: false, description: `Return versions created after this version ID (for pagination).` },
- { name: 'before', type: 'string', required: false, description: `Return versions created before this version ID (for pagination).` },
- { name: 'page_size', type: 'integer', required: false, description: `Number of versions to return per page.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The unique key of the Figma file.`,
+ },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Return versions created after this version ID (for pagination).`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Return versions created before this version ID (for pagination).`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of versions to return per page.`,
+ },
],
},
{
name: 'figma_library_analytics_component_actions_get',
description: `Returns analytics data on component insertion, detachment, and usage actions from a library file. Enterprise only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the library Figma file.` },
- { name: 'group_by', type: 'string', required: true, description: `Dimension to group results by: component or team.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from previous response.` },
- { name: 'end_date', type: 'string', required: false, description: `End date for analytics in YYYY-MM-DD format.` },
- { name: 'start_date', type: 'string', required: false, description: `Start date for analytics in YYYY-MM-DD format.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the library Figma file.`,
+ },
+ {
+ name: 'group_by',
+ type: 'string',
+ required: true,
+ description: `Dimension to group results by: component or team.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response.`,
+ },
+ {
+ name: 'end_date',
+ type: 'string',
+ required: false,
+ description: `End date for analytics in YYYY-MM-DD format.`,
+ },
+ {
+ name: 'start_date',
+ type: 'string',
+ required: false,
+ description: `Start date for analytics in YYYY-MM-DD format.`,
+ },
],
},
{
name: 'figma_library_analytics_component_usages_get',
description: `Returns a snapshot of how many times each component from a library is used across the organization. Enterprise only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the library Figma file.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from previous response.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the library Figma file.`,
+ },
+ {
+ name: 'group_by',
+ type: 'string',
+ required: true,
+ description: `Group analytics results by COMPONENT, TEAM, or FILE.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response.`,
+ },
],
},
{
name: 'figma_library_analytics_style_actions_get',
description: `Returns analytics data on style insertion and detachment actions from a library file. Enterprise only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the library Figma file.` },
- { name: 'group_by', type: 'string', required: true, description: `Dimension to group results by: style or team.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from previous response.` },
- { name: 'end_date', type: 'string', required: false, description: `End date for analytics in YYYY-MM-DD format.` },
- { name: 'start_date', type: 'string', required: false, description: `Start date for analytics in YYYY-MM-DD format.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the library Figma file.`,
+ },
+ {
+ name: 'group_by',
+ type: 'string',
+ required: true,
+ description: `Dimension to group results by: style or team.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response.`,
+ },
+ {
+ name: 'end_date',
+ type: 'string',
+ required: false,
+ description: `End date for analytics in YYYY-MM-DD format.`,
+ },
+ {
+ name: 'start_date',
+ type: 'string',
+ required: false,
+ description: `Start date for analytics in YYYY-MM-DD format.`,
+ },
],
},
{
name: 'figma_library_analytics_style_usages_get',
description: `Returns a snapshot of how many times each style from a library is used across the organization. Enterprise only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the library Figma file.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from previous response.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the library Figma file.`,
+ },
+ {
+ name: 'group_by',
+ type: 'string',
+ required: true,
+ description: `Group analytics results by COMPONENT, TEAM, or FILE.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response.`,
+ },
],
},
{
name: 'figma_library_analytics_variable_actions_get',
description: `Returns analytics data on variable actions from a library file. Enterprise only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the library Figma file.` },
- { name: 'group_by', type: 'string', required: true, description: `Dimension to group results by: variable or team.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from previous response.` },
- { name: 'end_date', type: 'string', required: false, description: `End date for analytics in YYYY-MM-DD format.` },
- { name: 'start_date', type: 'string', required: false, description: `Start date for analytics in YYYY-MM-DD format.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the library Figma file.`,
+ },
+ {
+ name: 'group_by',
+ type: 'string',
+ required: true,
+ description: `Dimension to group results by: variable or team.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response.`,
+ },
+ {
+ name: 'end_date',
+ type: 'string',
+ required: false,
+ description: `End date for analytics in YYYY-MM-DD format.`,
+ },
+ {
+ name: 'start_date',
+ type: 'string',
+ required: false,
+ description: `Start date for analytics in YYYY-MM-DD format.`,
+ },
],
},
{
name: 'figma_library_analytics_variable_usages_get',
description: `Returns a snapshot of how many times each variable from a library is used across the organization. Enterprise only.`,
params: [
- { name: 'file_key', type: 'string', required: true, description: `The key of the library Figma file.` },
- { name: 'cursor', type: 'string', required: false, description: `Pagination cursor from previous response.` },
+ {
+ name: 'file_key',
+ type: 'string',
+ required: true,
+ description: `The key of the library Figma file.`,
+ },
+ {
+ name: 'group_by',
+ type: 'string',
+ required: true,
+ description: `Group analytics results by COMPONENT, TEAM, or FILE.`,
+ },
+ {
+ name: 'cursor',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response.`,
+ },
],
},
{
name: 'figma_me_get',
description: `Returns the authenticated user's information including name, email, and profile image URL.`,
- params: [
- ],
+ params: [],
},
{
name: 'figma_payments_get',
description: `Returns payment and plan information for a Figma user or resource, including subscription status and plan type.`,
params: [
- { name: 'resource_id', type: 'string', required: false, description: `The ID of the plugin or widget resource.` },
- { name: 'resource_type', type: 'string', required: false, description: `The type of resource: plugin or widget.` },
- { name: 'user_id', type: 'string', required: false, description: `The ID of the user to get payment info for.` },
+ {
+ name: 'resource_id',
+ type: 'string',
+ required: false,
+ description: `The ID of the plugin or widget resource.`,
+ },
+ {
+ name: 'resource_type',
+ type: 'string',
+ required: false,
+ description: `The type of resource: plugin or widget.`,
+ },
+ {
+ name: 'user_id',
+ type: 'string',
+ required: false,
+ description: `The ID of the user to get payment info for.`,
+ },
],
},
{
name: 'figma_project_files_list',
description: `Returns all files in a Figma project, including file keys, names, thumbnails, and last modified timestamps.`,
params: [
- { name: 'project_id', type: 'string', required: true, description: `The ID of the Figma project.` },
- { name: 'branch_data', type: 'boolean', required: false, description: `If true, includes branch metadata for each file.` },
+ {
+ name: 'project_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the Figma project.`,
+ },
+ {
+ name: 'branch_data',
+ type: 'boolean',
+ required: false,
+ description: `If true, includes branch metadata for each file.`,
+ },
+ ],
+ },
+ {
+ name: 'figma_project_meta_get',
+ description: `Retrieve metadata for a Figma project by its project ID.`,
+ params: [
+ { name: 'project_id', type: 'string', required: true, description: `The ID of the project.` },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
],
},
{
@@ -296,9 +865,24 @@ export const tools: Tool[] = [
description: `Returns all published component sets in a Figma team library, with pagination support.`,
params: [
{ name: 'team_id', type: 'string', required: true, description: `The ID of the Figma team.` },
- { name: 'after', type: 'integer', required: false, description: `Cursor for the next page of results.` },
- { name: 'before', type: 'integer', required: false, description: `Cursor for the previous page of results.` },
- { name: 'page_size', type: 'integer', required: false, description: `Number of component sets to return per page.` },
+ {
+ name: 'after',
+ type: 'integer',
+ required: false,
+ description: `Cursor for the next page of results.`,
+ },
+ {
+ name: 'before',
+ type: 'integer',
+ required: false,
+ description: `Cursor for the previous page of results.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of component sets to return per page.`,
+ },
],
},
{
@@ -306,14 +890,29 @@ export const tools: Tool[] = [
description: `Returns all published components in a Figma team library, with pagination support.`,
params: [
{ name: 'team_id', type: 'string', required: true, description: `The ID of the Figma team.` },
- { name: 'after', type: 'integer', required: false, description: `Cursor for the next page of results.` },
- { name: 'before', type: 'integer', required: false, description: `Cursor for the previous page of results.` },
- { name: 'page_size', type: 'integer', required: false, description: `Number of components to return per page.` },
+ {
+ name: 'after',
+ type: 'integer',
+ required: false,
+ description: `Cursor for the next page of results.`,
+ },
+ {
+ name: 'before',
+ type: 'integer',
+ required: false,
+ description: `Cursor for the previous page of results.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of components to return per page.`,
+ },
],
},
{
name: 'figma_team_get',
- description: `Returns metadata about a Figma team, including its name and member count.`,
+ description: `List all projects visible to the authenticated user within the specified Figma team.`,
params: [
{ name: 'team_id', type: 'string', required: true, description: `The ID of the Figma team.` },
],
@@ -330,9 +929,24 @@ export const tools: Tool[] = [
description: `Returns all published styles in a Figma team library, with pagination support.`,
params: [
{ name: 'team_id', type: 'string', required: true, description: `The ID of the Figma team.` },
- { name: 'after', type: 'integer', required: false, description: `Cursor for the next page of results.` },
- { name: 'before', type: 'integer', required: false, description: `Cursor for the previous page of results.` },
- { name: 'page_size', type: 'integer', required: false, description: `Number of styles to return per page.` },
+ {
+ name: 'after',
+ type: 'integer',
+ required: false,
+ description: `Cursor for the next page of results.`,
+ },
+ {
+ name: 'before',
+ type: 'integer',
+ required: false,
+ description: `Cursor for the previous page of results.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of styles to return per page.`,
+ },
],
},
{
@@ -346,19 +960,54 @@ export const tools: Tool[] = [
name: 'figma_webhook_create',
description: `Creates a new webhook that sends events to the specified endpoint URL when Figma events occur in a team.`,
params: [
- { name: 'endpoint', type: 'string', required: true, description: `The HTTPS URL to send webhook payloads to.` },
- { name: 'event_type', type: 'string', required: true, description: `The event type to subscribe to: FILE_UPDATE, FILE_DELETE, FILE_VERSION_UPDATE, FILE_COMMENT, LIBRARY_PUBLISH.` },
- { name: 'passcode', type: 'string', required: true, description: `A passcode included in the webhook payload for verification.` },
- { name: 'team_id', type: 'string', required: true, description: `The ID of the team to subscribe to events for.` },
- { name: 'description', type: 'string', required: false, description: `Optional description for the webhook.` },
- { name: 'status', type: 'string', required: false, description: `Webhook status: ACTIVE or PAUSED.` },
+ {
+ name: 'endpoint',
+ type: 'string',
+ required: true,
+ description: `The HTTPS URL to send webhook payloads to.`,
+ },
+ {
+ name: 'event_type',
+ type: 'string',
+ required: true,
+ description: `The event type to subscribe to: FILE_UPDATE, FILE_DELETE, FILE_VERSION_UPDATE, FILE_COMMENT, LIBRARY_PUBLISH.`,
+ },
+ {
+ name: 'passcode',
+ type: 'string',
+ required: true,
+ description: `A passcode included in the webhook payload for verification.`,
+ },
+ {
+ name: 'team_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the team to subscribe to events for.`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `Optional description for the webhook.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Webhook status: ACTIVE or PAUSED.`,
+ },
],
},
{
name: 'figma_webhook_delete',
description: `Permanently deletes a Figma webhook. This stops all future event deliveries for this webhook.`,
params: [
- { name: 'webhook_id', type: 'string', required: true, description: `The ID of the webhook to delete.` },
+ {
+ name: 'webhook_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the webhook to delete.`,
+ },
],
},
{
@@ -379,11 +1028,36 @@ export const tools: Tool[] = [
name: 'figma_webhook_update',
description: `Updates an existing Figma webhook's endpoint, passcode, status, or description.`,
params: [
- { name: 'webhook_id', type: 'string', required: true, description: `The ID of the webhook to update.` },
- { name: 'description', type: 'string', required: false, description: `Updated description for the webhook.` },
- { name: 'endpoint', type: 'string', required: false, description: `New HTTPS URL to send webhook payloads to.` },
- { name: 'passcode', type: 'string', required: false, description: `New passcode for webhook verification.` },
- { name: 'status', type: 'string', required: false, description: `Webhook status: ACTIVE or PAUSED.` },
+ {
+ name: 'webhook_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the webhook to update.`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `Updated description for the webhook.`,
+ },
+ {
+ name: 'endpoint',
+ type: 'string',
+ required: false,
+ description: `New HTTPS URL to send webhook payloads to.`,
+ },
+ {
+ name: 'passcode',
+ type: 'string',
+ required: false,
+ description: `New passcode for webhook verification.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Webhook status: ACTIVE or PAUSED.`,
+ },
],
},
]
diff --git a/src/data/agent-connectors/fullenrichmcp.ts b/src/data/agent-connectors/fullenrichmcp.ts
new file mode 100644
index 000000000..84bffec25
--- /dev/null
+++ b/src/data/agent-connectors/fullenrichmcp.ts
@@ -0,0 +1,703 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'fullenrichmcp_enrich_bulk',
+ description: `Launch an asynchronous bulk enrichment job for a list of contacts, retrieving professional email addresses or phone numbers. Returns an enrichment ID and URL to track results.`,
+ params: [
+ {
+ name: 'contacts',
+ type: 'string',
+ required: true,
+ description: `List of contacts to enrich`,
+ },
+ {
+ name: 'fields',
+ type: 'string',
+ required: true,
+ description: `Enrichment fields to request`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Short human-readable label for this enrichment (e.g. Google Engineers Emails)`,
+ },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_enrich_personal_email_bulk',
+ description: `Launch an asynchronous bulk enrichment job to find personal email addresses for a list of contacts. Requires personal email enrichment to be enabled on your workspace.`,
+ params: [
+ {
+ name: 'contacts',
+ type: 'string',
+ required: true,
+ description: `List of contacts to enrich`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Short human-readable label for this enrichment (e.g. Google Engineers Personal Emails)`,
+ },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_enrich_search_contact',
+ description: `Launch an asynchronous enrichment job for contacts matching search filters, enriching them with professional emails or phone numbers. Returns an enrichment ID to track progress.`,
+ params: [
+ {
+ name: 'fields',
+ type: 'string',
+ required: true,
+ description: `Enrichment fields to request`,
+ },
+ {
+ name: 'current_company_days_since_last_job_change',
+ type: 'string',
+ required: false,
+ description: `Filter by days since last job change`,
+ },
+ {
+ name: 'current_company_domains',
+ type: 'string',
+ required: false,
+ description: `Filter by current company domain`,
+ },
+ {
+ name: 'current_company_founded_years',
+ type: 'string',
+ required: false,
+ description: `Filter by current company founded year range`,
+ },
+ {
+ name: 'current_company_headcounts',
+ type: 'string',
+ required: false,
+ description: `Filter by current company employee count range`,
+ },
+ {
+ name: 'current_company_headquarters',
+ type: 'string',
+ required: false,
+ description: `Filter by current company HQ location`,
+ },
+ {
+ name: 'current_company_ids',
+ type: 'string',
+ required: false,
+ description: `Filter by current company ID`,
+ },
+ {
+ name: 'current_company_industries',
+ type: 'string',
+ required: false,
+ description: `Filter by current company industry`,
+ },
+ {
+ name: 'current_company_linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by current company LinkedIn URL`,
+ },
+ {
+ name: 'current_company_names',
+ type: 'string',
+ required: false,
+ description: `Filter by current company name`,
+ },
+ {
+ name: 'current_company_specialties',
+ type: 'string',
+ required: false,
+ description: `Filter by current company specialties`,
+ },
+ {
+ name: 'current_company_types',
+ type: 'string',
+ required: false,
+ description: `Filter by current company type`,
+ },
+ {
+ name: 'current_company_years_at',
+ type: 'string',
+ required: false,
+ description: `Filter by years at current company`,
+ },
+ {
+ name: 'current_position_seniority_level',
+ type: 'string',
+ required: false,
+ description: `Filter by seniority level (Director, VP, or C-level)`,
+ },
+ {
+ name: 'current_position_titles',
+ type: 'string',
+ required: false,
+ description: `Filter by current job title`,
+ },
+ {
+ name: 'current_position_years_in',
+ type: 'string',
+ required: false,
+ description: `Filter by years in current position`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Number of contacts to enrich (default: 10000, max: 10000)`,
+ },
+ {
+ name: 'offset',
+ type: 'integer',
+ required: false,
+ description: `Number of results to skip`,
+ },
+ {
+ name: 'past_company_domains',
+ type: 'string',
+ required: false,
+ description: `Filter by past company domains`,
+ },
+ {
+ name: 'past_company_names',
+ type: 'string',
+ required: false,
+ description: `Filter by past company names`,
+ },
+ {
+ name: 'past_position_titles',
+ type: 'string',
+ required: false,
+ description: `Filter by past job titles`,
+ },
+ { name: 'person_ids', type: 'string', required: false, description: `Filter by person ID` },
+ {
+ name: 'person_linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by LinkedIn profile URL`,
+ },
+ {
+ name: 'person_locations',
+ type: 'string',
+ required: false,
+ description: `Filter by location (city, region, or country)`,
+ },
+ {
+ name: 'person_names',
+ type: 'string',
+ required: false,
+ description: `Filter by name (first, last, or full)`,
+ },
+ { name: 'person_skills', type: 'string', required: false, description: `Filter by skills` },
+ {
+ name: 'person_universities',
+ type: 'string',
+ required: false,
+ description: `Filter by university attended`,
+ },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_export_companies',
+ description: `Export company search results to a CSV or JSON file. Use this when you need more than 10 results. Returns a download URL valid for 24 hours.`,
+ params: [
+ { name: 'format', type: 'string', required: true, description: `required` },
+ { name: 'company_ids', type: 'string', required: false, description: `Filter by company ID` },
+ {
+ name: 'domains',
+ type: 'string',
+ required: false,
+ description: `Filter by company domain (e.g. google.com)`,
+ },
+ {
+ name: 'founded_years',
+ type: 'string',
+ required: false,
+ description: `Filter by year founded range`,
+ },
+ {
+ name: 'headcounts',
+ type: 'string',
+ required: false,
+ description: `Filter by employee count range`,
+ },
+ {
+ name: 'headquarters',
+ type: 'string',
+ required: false,
+ description: `Filter by HQ location (city or country)`,
+ },
+ { name: 'industries', type: 'string', required: false, description: `Filter by industry` },
+ {
+ name: 'keywords',
+ type: 'string',
+ required: false,
+ description: `Filter by keywords in company description`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Maximum number of results to export (default: 10000, max: 10000)`,
+ },
+ {
+ name: 'linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by company LinkedIn URL`,
+ },
+ { name: 'names', type: 'string', required: false, description: `Filter by company name` },
+ {
+ name: 'offset',
+ type: 'integer',
+ required: false,
+ description: `Number of results to skip before exporting`,
+ },
+ {
+ name: 'output_dir',
+ type: 'string',
+ required: false,
+ description: `Directory path to save the exported file.`,
+ },
+ {
+ name: 'specialties',
+ type: 'string',
+ required: false,
+ description: `Filter by company specialties`,
+ },
+ { name: 'types', type: 'string', required: false, description: `Filter by company type` },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_export_contacts',
+ description: `Export contact search results to a CSV or JSON file. Use this when you need more than 10 results. Returns a download URL valid for 24 hours.`,
+ params: [
+ { name: 'format', type: 'string', required: true, description: `required` },
+ {
+ name: 'current_company_days_since_last_job_change',
+ type: 'string',
+ required: false,
+ description: `Filter by days since last job change`,
+ },
+ {
+ name: 'current_company_domains',
+ type: 'string',
+ required: false,
+ description: `Filter by current company domain`,
+ },
+ {
+ name: 'current_company_founded_years',
+ type: 'string',
+ required: false,
+ description: `Filter by current company founded year range`,
+ },
+ {
+ name: 'current_company_headcounts',
+ type: 'string',
+ required: false,
+ description: `Filter by current company employee count range`,
+ },
+ {
+ name: 'current_company_headquarters',
+ type: 'string',
+ required: false,
+ description: `Filter by current company HQ location`,
+ },
+ {
+ name: 'current_company_ids',
+ type: 'string',
+ required: false,
+ description: `Filter by current company ID`,
+ },
+ {
+ name: 'current_company_industries',
+ type: 'string',
+ required: false,
+ description: `Filter by current company industry`,
+ },
+ {
+ name: 'current_company_linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by current company LinkedIn URL`,
+ },
+ {
+ name: 'current_company_names',
+ type: 'string',
+ required: false,
+ description: `Filter by current company name`,
+ },
+ {
+ name: 'current_company_specialties',
+ type: 'string',
+ required: false,
+ description: `Filter by current company specialties`,
+ },
+ {
+ name: 'current_company_types',
+ type: 'string',
+ required: false,
+ description: `Filter by current company type`,
+ },
+ {
+ name: 'current_company_years_at',
+ type: 'string',
+ required: false,
+ description: `Filter by years at current company`,
+ },
+ {
+ name: 'current_position_seniority_level',
+ type: 'string',
+ required: false,
+ description: `Filter by seniority level (Director, VP, or C-level)`,
+ },
+ {
+ name: 'current_position_titles',
+ type: 'string',
+ required: false,
+ description: `Filter by current job title`,
+ },
+ {
+ name: 'current_position_years_in',
+ type: 'string',
+ required: false,
+ description: `Filter by years in current position`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Maximum number of results to export (default: 10000, max: 10000)`,
+ },
+ {
+ name: 'offset',
+ type: 'integer',
+ required: false,
+ description: `Number of results to skip before exporting`,
+ },
+ {
+ name: 'past_company_domains',
+ type: 'string',
+ required: false,
+ description: `Filter by past company domains`,
+ },
+ {
+ name: 'past_company_names',
+ type: 'string',
+ required: false,
+ description: `Filter by past company names`,
+ },
+ {
+ name: 'past_position_titles',
+ type: 'string',
+ required: false,
+ description: `Filter by past job titles`,
+ },
+ { name: 'person_ids', type: 'string', required: false, description: `Filter by person ID` },
+ {
+ name: 'person_linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by LinkedIn profile URL`,
+ },
+ {
+ name: 'person_locations',
+ type: 'string',
+ required: false,
+ description: `Filter by location (city, region, or country)`,
+ },
+ {
+ name: 'person_names',
+ type: 'string',
+ required: false,
+ description: `Filter by name (first, last, or full)`,
+ },
+ { name: 'person_skills', type: 'string', required: false, description: `Filter by skills` },
+ {
+ name: 'person_universities',
+ type: 'string',
+ required: false,
+ description: `Filter by university attended`,
+ },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_export_enrichment_results',
+ description: `Export all results from a completed enrichment job to a CSV or JSON file. Returns a download URL. Use get_enrichment_results first to check status.`,
+ params: [
+ {
+ name: 'enrichment_id',
+ type: 'string',
+ required: true,
+ description: `The enrichment ID to export`,
+ },
+ { name: 'format', type: 'string', required: true, description: `required` },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_get_credits',
+ description: `Check the current credit balance for your workspace. No input required.`,
+ params: [],
+ },
+ {
+ name: 'fullenrichmcp_get_enrichment_results',
+ description: `Get the current status and up to 10 result rows from an enrichment job by enrichment ID. Use export_enrichment_results to retrieve the full dataset.`,
+ params: [
+ {
+ name: 'enrichment_id',
+ type: 'string',
+ required: true,
+ description: `The enrichment ID returned by enrich_bulk or enrich_search_contact`,
+ },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_list_industries',
+ description: `List all valid industry values that can be used as filter inputs in search_people, search_companies, export_contacts, and export_companies.`,
+ params: [],
+ },
+ {
+ name: 'fullenrichmcp_search_companies',
+ description: `Search for companies in the FullEnrich database using filters such as name, domain, industry, headcount, and headquarters. Returns up to 10 preview results.`,
+ params: [
+ { name: 'company_ids', type: 'string', required: false, description: `Filter by company ID` },
+ {
+ name: 'domains',
+ type: 'string',
+ required: false,
+ description: `Filter by company domain (e.g. google.com)`,
+ },
+ {
+ name: 'founded_years',
+ type: 'string',
+ required: false,
+ description: `Filter by year founded range`,
+ },
+ {
+ name: 'headcounts',
+ type: 'string',
+ required: false,
+ description: `Filter by employee count range`,
+ },
+ {
+ name: 'headquarters',
+ type: 'string',
+ required: false,
+ description: `Filter by HQ location (city or country)`,
+ },
+ {
+ name: 'include_descriptions',
+ type: 'boolean',
+ required: false,
+ description: `If true, include company description fields in the response. Default false to save tokens.`,
+ },
+ { name: 'industries', type: 'string', required: false, description: `Filter by industry` },
+ {
+ name: 'keywords',
+ type: 'string',
+ required: false,
+ description: `Filter by keywords in company description`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Number of results to return (max 10)`,
+ },
+ {
+ name: 'linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by company LinkedIn URL`,
+ },
+ { name: 'names', type: 'string', required: false, description: `Filter by company name` },
+ {
+ name: 'specialties',
+ type: 'string',
+ required: false,
+ description: `Filter by company specialties`,
+ },
+ { name: 'types', type: 'string', required: false, description: `Filter by company type` },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_search_contact_by_email',
+ description: `Look up contact profiles from a list of email addresses using reverse email enrichment. Launches an asynchronous job and returns an enrichment ID.`,
+ params: [
+ {
+ name: 'emails',
+ type: 'string',
+ required: true,
+ description: `List of email addresses to look up (max 100)`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: false,
+ description: `Short human-readable label for this reverse email job (e.g. Sales Team Emails)`,
+ },
+ ],
+ },
+ {
+ name: 'fullenrichmcp_search_people',
+ description: `Search for contacts in the FullEnrich database using filters such as name, company, job title, location, and skills. Returns up to 10 preview results.`,
+ params: [
+ {
+ name: 'current_company_days_since_last_job_change',
+ type: 'string',
+ required: false,
+ description: `Filter by days since last job change`,
+ },
+ {
+ name: 'current_company_domains',
+ type: 'string',
+ required: false,
+ description: `Filter by current company domain`,
+ },
+ {
+ name: 'current_company_founded_years',
+ type: 'string',
+ required: false,
+ description: `Filter by current company founded year range`,
+ },
+ {
+ name: 'current_company_headcounts',
+ type: 'string',
+ required: false,
+ description: `Filter by current company employee count range`,
+ },
+ {
+ name: 'current_company_headquarters',
+ type: 'string',
+ required: false,
+ description: `Filter by current company HQ location`,
+ },
+ {
+ name: 'current_company_ids',
+ type: 'string',
+ required: false,
+ description: `Filter by current company ID`,
+ },
+ {
+ name: 'current_company_industries',
+ type: 'string',
+ required: false,
+ description: `Filter by current company industry`,
+ },
+ {
+ name: 'current_company_keywords',
+ type: 'string',
+ required: false,
+ description: `Filter by current company keywords`,
+ },
+ {
+ name: 'current_company_linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by current company LinkedIn URL`,
+ },
+ {
+ name: 'current_company_names',
+ type: 'string',
+ required: false,
+ description: `Filter by current company name`,
+ },
+ {
+ name: 'current_company_specialties',
+ type: 'string',
+ required: false,
+ description: `Filter by current company specialties`,
+ },
+ {
+ name: 'current_company_types',
+ type: 'string',
+ required: false,
+ description: `Filter by current company type`,
+ },
+ {
+ name: 'current_company_years_at',
+ type: 'string',
+ required: false,
+ description: `Filter by years at current company`,
+ },
+ {
+ name: 'current_position_seniority_level',
+ type: 'string',
+ required: false,
+ description: `Filter by seniority level (Director, VP, or C-level)`,
+ },
+ {
+ name: 'current_position_titles',
+ type: 'string',
+ required: false,
+ description: `Filter by current job title`,
+ },
+ {
+ name: 'current_position_years_in',
+ type: 'string',
+ required: false,
+ description: `Filter by years in current position`,
+ },
+ {
+ name: 'include_descriptions',
+ type: 'boolean',
+ required: false,
+ description: `If true, include description fields (company descriptions, position descriptions) in the response. Default false to save tokens.`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Number of results to return (max 10)`,
+ },
+ {
+ name: 'past_company_domains',
+ type: 'string',
+ required: false,
+ description: `Filter by past company domains`,
+ },
+ {
+ name: 'past_company_names',
+ type: 'string',
+ required: false,
+ description: `Filter by past company names`,
+ },
+ {
+ name: 'past_position_titles',
+ type: 'string',
+ required: false,
+ description: `Filter by past job titles`,
+ },
+ { name: 'person_ids', type: 'string', required: false, description: `Filter by person ID` },
+ {
+ name: 'person_linkedin_urls',
+ type: 'string',
+ required: false,
+ description: `Filter by LinkedIn profile URL`,
+ },
+ {
+ name: 'person_locations',
+ type: 'string',
+ required: false,
+ description: `Filter by location (city, region, or country)`,
+ },
+ {
+ name: 'person_names',
+ type: 'string',
+ required: false,
+ description: `Filter by name (first, last, or full)`,
+ },
+ { name: 'person_skills', type: 'string', required: false, description: `Filter by skills` },
+ {
+ name: 'person_universities',
+ type: 'string',
+ required: false,
+ description: `Filter by university attended`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/hubspot.ts b/src/data/agent-connectors/hubspot.ts
index f9720d022..890c07390 100644
--- a/src/data/agent-connectors/hubspot.ts
+++ b/src/data/agent-connectors/hubspot.ts
@@ -494,6 +494,180 @@ export const tools: Tool[] = [
},
],
},
+ {
+ name: 'hubspot_campaign_asset_create',
+ description: `Associate a marketing asset with a HubSpot campaign. Supported asset types include BLOG_POST, LANDING_PAGE, MARKETING_EMAIL, CTA, FORM, VIDEO, SOCIAL_POST, WORKFLOW, and more.`,
+ params: [
+ {
+ name: 'assetId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the asset to associate.`,
+ },
+ {
+ name: 'assetType',
+ type: 'string',
+ required: true,
+ description: `Type of asset. Accepted values: MARKETING_EMAIL, LANDING_PAGE, BLOG_POST, CTA, SOCIAL.`,
+ },
+ {
+ name: 'campaignGuid',
+ type: 'string',
+ required: true,
+ description: `The unique GUID of the campaign.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_campaign_asset_delete',
+ description: `Remove the association between a marketing asset and a campaign.`,
+ params: [
+ {
+ name: 'assetId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the asset to disassociate.`,
+ },
+ {
+ name: 'assetType',
+ type: 'string',
+ required: true,
+ description: `Type of asset to disassociate.`,
+ },
+ {
+ name: 'campaignGuid',
+ type: 'string',
+ required: true,
+ description: `The unique GUID of the campaign.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_campaign_assets_get',
+ description: `List all assets of a specific type associated with a HubSpot campaign. Optionally include asset metrics by providing startDate and endDate.`,
+ params: [
+ {
+ name: 'assetType',
+ type: 'string',
+ required: true,
+ description: `Type of assets to retrieve. Accepted values: MARKETING_EMAIL, LANDING_PAGE, BLOG_POST, CTA, SOCIAL.`,
+ },
+ {
+ name: 'campaignGuid',
+ type: 'string',
+ required: true,
+ description: `The unique GUID of the campaign.`,
+ },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor from previous response paging.next.after.`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: false,
+ description: `End date for asset metrics (YYYY-MM-DD).`,
+ },
+ {
+ name: 'limit',
+ type: 'string',
+ required: false,
+ description: `Maximum number of results per page.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: false,
+ description: `Start date for asset metrics (YYYY-MM-DD).`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_campaign_create',
+ description: `Create a new HubSpot marketing campaign.`,
+ params: [
+ {
+ name: 'properties',
+ type: 'object',
+ required: true,
+ description: `Campaign property key-value pairs.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_campaign_delete',
+ description: `Permanently delete a HubSpot marketing campaign by its GUID.`,
+ params: [
+ {
+ name: 'campaignGuid',
+ type: 'string',
+ required: true,
+ description: `The unique GUID of the campaign to delete.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
{
name: 'hubspot_campaign_get',
description: `Retrieve details of a specific HubSpot marketing campaign by campaign ID.`,
@@ -506,6 +680,78 @@ export const tools: Tool[] = [
},
],
},
+ {
+ name: 'hubspot_campaign_revenue_get',
+ description: `Retrieve revenue attribution report for a specific HubSpot marketing campaign.`,
+ params: [
+ {
+ name: 'campaignGuid',
+ type: 'string',
+ required: true,
+ description: `The unique GUID of the campaign.`,
+ },
+ {
+ name: 'attributionModel',
+ type: 'string',
+ required: false,
+ description: `Revenue attribution model for calculating deal revenue credit.`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: false,
+ description: `End date for attribution data (YYYY-MM-DD).`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: false,
+ description: `Start date for attribution data (YYYY-MM-DD).`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_campaign_update',
+ description: `Update an existing HubSpot marketing campaign by its GUID.`,
+ params: [
+ {
+ name: 'campaignGuid',
+ type: 'string',
+ required: true,
+ description: `The unique GUID of the campaign to update.`,
+ },
+ {
+ name: 'properties',
+ type: 'object',
+ required: true,
+ description: `Campaign property key-value pairs to update.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
{
name: 'hubspot_campaigns_list',
description: `List all HubSpot marketing campaigns with pagination support.`,
@@ -1982,83 +2228,235 @@ export const tools: Tool[] = [
],
},
{
- name: 'hubspot_form_submissions_get',
- description: `Retrieve all submissions for a specific HubSpot form. Returns submitted field values and submission timestamps.`,
+ name: 'hubspot_form_create',
+ description: `Create a new HubSpot form with fields, configuration, and submission settings.`,
params: [
{
- name: 'form_id',
+ name: 'archived',
+ type: 'boolean',
+ required: true,
+ description: `Whether the form is archived.`,
+ },
+ {
+ name: 'configuration',
+ type: 'object',
+ required: true,
+ description: `Form configuration including post-submit action, language, lifecycle stages, and notification settings.`,
+ },
+ {
+ name: 'createdAt',
type: 'string',
required: true,
- description: `ID of the form to retrieve submissions for`,
+ description: `Creation timestamp in ISO 8601 format.`,
},
{
- name: 'after',
+ name: 'displayOptions',
+ type: 'object',
+ required: true,
+ description: `Visual display options for the form including submit button text, CSS styling, and render mode.`,
+ },
+ {
+ name: 'fieldGroups',
+ type: 'array',
+ required: true,
+ description: `Array of field groups defining the form layout and fields.`,
+ },
+ {
+ name: 'formType',
+ type: 'string',
+ required: true,
+ description: `Type of form. Accepted values: hubspot, captured, flow, blog_comment, hubspot_internal.`,
+ },
+ {
+ name: 'legalConsentOptions',
+ type: 'object',
+ required: true,
+ description: `GDPR legal consent configuration. Accepted types: none, implicit_consent_to_process, legitimate_interest, explicit_consent_to_process.`,
+ },
+ { name: 'name', type: 'string', required: true, description: `Display name for the form.` },
+ {
+ name: 'schema_version',
type: 'string',
required: false,
- description: `Pagination offset token for the next page`,
+ description: `Optional schema version`,
},
{
- name: 'limit',
- type: 'number',
+ name: 'tool_version',
+ type: 'string',
required: false,
- description: `Number of submissions to return per page`,
+ description: `Optional tool version`,
},
],
},
{
- name: 'hubspot_forms_list',
- description: `List all HubSpot marketing forms. Returns form IDs, names, and field definitions.`,
+ name: 'hubspot_form_delete',
+ description: `Archive a HubSpot form definition. New submissions will not be accepted and the form will be permanently deleted after 3 months.`,
params: [
{
- name: 'after',
+ name: 'formId',
type: 'string',
- required: false,
- description: `Pagination cursor for the next page of results`,
+ required: true,
+ description: `The unique ID of the form to delete.`,
},
{
- name: 'formTypes',
+ name: 'schema_version',
type: 'string',
required: false,
- description: `Comma-separated list of form types to filter by (e.g., hubspot,captured,flow)`,
+ description: `Optional schema version`,
},
{
- name: 'limit',
- type: 'number',
+ name: 'tool_version',
+ type: 'string',
required: false,
- description: `Number of forms to return per page (max 50)`,
+ description: `Optional tool version`,
},
],
},
{
- name: 'hubspot_goal_get',
- description: `Retrieve a single HubSpot goal by its ID.`,
+ name: 'hubspot_form_submissions_get',
+ description: `Retrieve all submissions for a specific HubSpot form. Returns submitted field values and submission timestamps.`,
params: [
{
- name: 'goal_id',
+ name: 'form_id',
type: 'string',
required: true,
- description: `The unique ID of the goal.`,
+ description: `ID of the form to retrieve submissions for`,
},
{
- name: 'associations',
+ name: 'after',
type: 'string',
required: false,
- description: `Comma-separated associated object types to include.`,
+ description: `Pagination offset token for the next page`,
},
{
- name: 'properties',
- type: 'string',
+ name: 'limit',
+ type: 'number',
required: false,
- description: `Comma-separated list of properties to return.`,
+ description: `Number of submissions to return per page`,
},
],
},
{
- name: 'hubspot_goal_target_delete',
- description: `Permanently delete a goal target record.`,
+ name: 'hubspot_form_update',
+ description: `Update all fields of a HubSpot form definition. This is a full update — all required fields must be provided.`,
params: [
- { name: 'goal_target_id', type: 'string', required: true, description: `Goal target ID.` },
- { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ {
+ name: 'archived',
+ type: 'boolean',
+ required: true,
+ description: `Whether the form is archived.`,
+ },
+ {
+ name: 'configuration',
+ type: 'object',
+ required: true,
+ description: `Form configuration including post-submit action, language, lifecycle stages, and notification settings.`,
+ },
+ {
+ name: 'createdAt',
+ type: 'string',
+ required: true,
+ description: `Creation timestamp in ISO 8601 format.`,
+ },
+ {
+ name: 'displayOptions',
+ type: 'object',
+ required: true,
+ description: `Visual display options for the form.`,
+ },
+ {
+ name: 'fieldGroups',
+ type: 'array',
+ required: true,
+ description: `Array of field groups defining the form layout and fields.`,
+ },
+ {
+ name: 'formId',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the form to update.`,
+ },
+ { name: 'formType', type: 'string', required: true, description: `The type of form.` },
+ {
+ name: 'legalConsentOptions',
+ type: 'object',
+ required: true,
+ description: `GDPR legal consent configuration. Accepted types: none, implicit_consent_to_process, legitimate_interest, explicit_consent_to_process.`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `The display name of the form.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_forms_list',
+ description: `List all HubSpot marketing forms. Returns form IDs, names, and field definitions.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor for the next page of results`,
+ },
+ {
+ name: 'formTypes',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of form types to filter by (e.g., hubspot,captured,flow)`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Number of forms to return per page (max 50)`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_goal_get',
+ description: `Retrieve a single HubSpot goal by its ID.`,
+ params: [
+ {
+ name: 'goal_id',
+ type: 'string',
+ required: true,
+ description: `The unique ID of the goal.`,
+ },
+ {
+ name: 'associations',
+ type: 'string',
+ required: false,
+ description: `Comma-separated associated object types to include.`,
+ },
+ {
+ name: 'properties',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of properties to return.`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_goal_target_delete',
+ description: `Permanently delete a goal target record.`,
+ params: [
+ { name: 'goal_target_id', type: 'string', required: true, description: `Goal target ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
{ name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
@@ -2792,6 +3190,170 @@ export const tools: Tool[] = [
{ name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
+ {
+ name: 'hubspot_marketing_email_create',
+ description: `Create a new HubSpot marketing email.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `Internal name for the email.` },
+ {
+ name: 'activeDomain',
+ type: 'string',
+ required: false,
+ description: `The active domain of the email.`,
+ },
+ {
+ name: 'archived',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to archive the email.`,
+ },
+ {
+ name: 'businessUnitId',
+ type: 'integer',
+ required: false,
+ description: `ID of the business unit to associate with the email.`,
+ },
+ {
+ name: 'campaign',
+ type: 'string',
+ required: false,
+ description: `Campaign GUID to associate this email with.`,
+ },
+ {
+ name: 'content',
+ type: 'object',
+ required: false,
+ description: `Email body content including flexAreas, widgets, and styleSettings.`,
+ },
+ {
+ name: 'feedbackSurveyId',
+ type: 'string',
+ required: false,
+ description: `The ID of the feedback survey linked to the email.`,
+ },
+ {
+ name: 'folderIdV2',
+ type: 'integer',
+ required: false,
+ description: `ID of the folder where the email will be stored.`,
+ },
+ {
+ name: 'from',
+ type: 'object',
+ required: false,
+ description: `Sender details: fromName, replyTo, customReplyTo.`,
+ },
+ {
+ name: 'jitterSendTime',
+ type: 'boolean',
+ required: false,
+ description: `Randomize send time slightly to avoid all sends at exactly the same moment.`,
+ },
+ {
+ name: 'language',
+ type: 'string',
+ required: false,
+ description: `Language code, e.g. en, fr, de, es.`,
+ },
+ {
+ name: 'publishDate',
+ type: 'string',
+ required: false,
+ description: `Scheduled send date in ISO 8601 format.`,
+ },
+ {
+ name: 'rssData',
+ type: 'object',
+ required: false,
+ description: `RSS email configuration: hubspotBlogId, url, maxEntries, timing.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'sendOnPublish',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to send immediately on publish.`,
+ },
+ {
+ name: 'state',
+ type: 'string',
+ required: false,
+ description: `Email state. Common values: DRAFT, SCHEDULED, PUBLISHED.`,
+ },
+ {
+ name: 'subcategory',
+ type: 'string',
+ required: false,
+ description: `Email subcategory. Common values: batch, automated, blog_email, rss_to_email, localtime.`,
+ },
+ { name: 'subject', type: 'string', required: false, description: `Email subject line.` },
+ {
+ name: 'subscriptionDetails',
+ type: 'object',
+ required: false,
+ description: `Subscription configuration: subscriptionId, officeLocationId, preferencesGroupId.`,
+ },
+ {
+ name: 'testing',
+ type: 'object',
+ required: false,
+ description: `AB testing configuration.`,
+ },
+ {
+ name: 'to',
+ type: 'object',
+ required: false,
+ description: `Recipient configuration: contactLists, contactIlsLists, contactIds, suppressGraymail.`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ {
+ name: 'webversion',
+ type: 'object',
+ required: false,
+ description: `Web version settings: enabled, slug, title, metaDescription, redirectToUrl.`,
+ },
+ ],
+ },
+ {
+ name: 'hubspot_marketing_email_delete',
+ description: `Permanently delete a HubSpot marketing email by its ID.`,
+ params: [
+ {
+ name: 'emailId',
+ type: 'string',
+ required: true,
+ description: `The ID of the marketing email to delete.`,
+ },
+ {
+ name: 'archived',
+ type: 'boolean',
+ required: false,
+ description: `Filter for archived emails.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ ],
+ },
{
name: 'hubspot_marketing_email_get',
description: `Retrieve a single marketing email by its ID, including subject, body, send configuration, and metadata.`,
@@ -2840,6 +3402,156 @@ export const tools: Tool[] = [
},
],
},
+ {
+ name: 'hubspot_marketing_email_update',
+ description: `Update an existing HubSpot marketing email by its ID.`,
+ params: [
+ {
+ name: 'emailId',
+ type: 'string',
+ required: true,
+ description: `The ID of the marketing email to update.`,
+ },
+ {
+ name: 'activeDomain',
+ type: 'string',
+ required: false,
+ description: `The active domain of the email.`,
+ },
+ {
+ name: 'archived',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to archive the email.`,
+ },
+ {
+ name: 'businessUnitId',
+ type: 'integer',
+ required: false,
+ description: `ID of the business unit to associate with the email.`,
+ },
+ {
+ name: 'campaign',
+ type: 'string',
+ required: false,
+ description: `Campaign GUID to associate this email with.`,
+ },
+ {
+ name: 'content',
+ type: 'object',
+ required: false,
+ description: `Email body content including flexAreas, widgets, and styleSettings.`,
+ },
+ {
+ name: 'feedbackSurveyId',
+ type: 'string',
+ required: false,
+ description: `The ID of the feedback survey linked to the email.`,
+ },
+ {
+ name: 'folderIdV2',
+ type: 'integer',
+ required: false,
+ description: `ID of the folder where the email will be stored.`,
+ },
+ {
+ name: 'from',
+ type: 'object',
+ required: false,
+ description: `Sender details: fromName, replyTo, customReplyTo.`,
+ },
+ {
+ name: 'jitterSendTime',
+ type: 'boolean',
+ required: false,
+ description: `Randomize send time slightly to avoid all sends at exactly the same moment.`,
+ },
+ {
+ name: 'language',
+ type: 'string',
+ required: false,
+ description: `Language code, e.g. en, fr, de, es.`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: false,
+ description: `Internal name for the email.`,
+ },
+ {
+ name: 'publishDate',
+ type: 'string',
+ required: false,
+ description: `Scheduled send date in ISO 8601 format.`,
+ },
+ {
+ name: 'rssData',
+ type: 'object',
+ required: false,
+ description: `RSS email configuration: hubspotBlogId, url, maxEntries, timing.`,
+ },
+ {
+ name: 'schema_version',
+ type: 'string',
+ required: false,
+ description: `Optional schema version`,
+ },
+ {
+ name: 'sendOnPublish',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to send immediately on publish.`,
+ },
+ {
+ name: 'state',
+ type: 'string',
+ required: false,
+ description: `Email state. Common values: DRAFT, SCHEDULED, PUBLISHED.`,
+ },
+ {
+ name: 'subcategory',
+ type: 'string',
+ required: false,
+ description: `Email subcategory. Common values: batch, automated, blog_email, rss_to_email, localtime.`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: false,
+ description: `Email subject line shown to recipients.`,
+ },
+ {
+ name: 'subscriptionDetails',
+ type: 'object',
+ required: false,
+ description: `Subscription configuration: subscriptionId, officeLocationId, preferencesGroupId.`,
+ },
+ {
+ name: 'testing',
+ type: 'object',
+ required: false,
+ description: `AB testing configuration.`,
+ },
+ {
+ name: 'to',
+ type: 'object',
+ required: false,
+ description: `Recipient configuration: contactLists, contactIlsLists, contactIds, suppressGraymail.`,
+ },
+ {
+ name: 'tool_version',
+ type: 'string',
+ required: false,
+ description: `Optional tool version`,
+ },
+ {
+ name: 'webversion',
+ type: 'object',
+ required: false,
+ description: `Web version settings: enabled, slug, title, metaDescription, redirectToUrl.`,
+ },
+ ],
+ },
{
name: 'hubspot_marketing_event_attendance_record',
description: `Record attendance for contacts at a marketing event.`,
diff --git a/src/data/agent-connectors/huggingfacemcp.ts b/src/data/agent-connectors/huggingfacemcp.ts
new file mode 100644
index 000000000..3f1746e73
--- /dev/null
+++ b/src/data/agent-connectors/huggingfacemcp.ts
@@ -0,0 +1,261 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'huggingfacemcp_dynamic_space',
+ description: `Call a Hugging Face MCP-enabled Space dynamically. Use 'discover' to list available MCP spaces, 'view_parameters' to inspect a space's tools, or 'invoke' to call a specific tool.`,
+ params: [
+ {
+ name: 'operation',
+ type: 'string',
+ required: false,
+ description: `Action to perform: discover lists available tasks, view_parameters inspects a space, invoke runs it.`,
+ },
+ {
+ name: 'parameters',
+ type: 'string',
+ required: false,
+ description: `JSON string of input parameters. Used only with the "invoke" operation.`,
+ },
+ {
+ name: 'space_name',
+ type: 'string',
+ required: false,
+ description: `Space ID in "username/space-name" format. Required for "view_parameters" and "invoke" operations.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_gr1_z_image_turbo_generate',
+ description: `Generate an image from a text prompt using the Image Turbo model hosted on Hugging Face Spaces.`,
+ params: [
+ {
+ name: 'prompt',
+ type: 'string',
+ required: false,
+ description: `Text prompt describing the desired image content`,
+ },
+ {
+ name: 'random_seed',
+ type: 'boolean',
+ required: false,
+ description: `Generate a new random seed for each run. Set to false to use the value in the seed field.`,
+ },
+ {
+ name: 'resolution',
+ type: 'string',
+ required: false,
+ description: `Output resolution in "WIDTHxHEIGHT ( RATIO )" format.`,
+ },
+ {
+ name: 'seed',
+ type: 'integer',
+ required: false,
+ description: `Seed value for reproducible image generation. Ignored when random_seed is true.`,
+ },
+ {
+ name: 'shift',
+ type: 'number',
+ required: false,
+ description: `Time shift parameter for the flow matching scheduler. Controls generation quality.`,
+ },
+ {
+ name: 'steps',
+ type: 'number',
+ required: false,
+ description: `Number of inference steps for the diffusion process. Higher values improve quality but take longer.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_hf_doc_fetch',
+ description: `Fetch the content of a Hugging Face documentation page by URL, with optional character offset for pagination.`,
+ params: [
+ {
+ name: 'doc_url',
+ type: 'string',
+ required: true,
+ description: `Full URL of the Hugging Face or Gradio documentation page to fetch.`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Token offset for paginating large documents. Use the offset value from the truncation message to fetch the next chunk.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_hf_doc_search',
+ description: `Search Hugging Face documentation across all products or a specific product by query.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Semantic search query. Use an empty string to explore structure and navigation tips, or provide a specific query to find targeted documentation.`,
+ },
+ {
+ name: 'product',
+ type: 'string',
+ required: false,
+ description: `Hugging Face product or library to filter results by. Provide when known to narrow the search.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_hf_hub_query',
+ description: `Ask a natural language question about the Hugging Face Hub and get an AI-generated answer.`,
+ params: [
+ {
+ name: 'message',
+ type: 'string',
+ required: true,
+ description: `Natural language query to run against the Hugging Face Hub.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_hf_whoami',
+ description: `Return the currently authenticated Hugging Face user's profile information.`,
+ params: [],
+ },
+ {
+ name: 'huggingfacemcp_hub_repo_details',
+ description: `Retrieve details for one or more Hugging Face Hub repositories by their IDs.`,
+ params: [
+ {
+ name: 'repo_ids',
+ type: 'array',
+ required: true,
+ description: `One or more repository IDs in "author/name" format. Supports models, datasets, and spaces.`,
+ },
+ {
+ name: 'config',
+ type: 'string',
+ required: false,
+ description: `Dataset Viewer config name. Required for dataset_preview when the dataset has multiple configs. Discover available configs via dataset_structure.`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Number of rows to return for dataset_preview. Defaults to 5; clamped between 1 and 100.`,
+ },
+ {
+ name: 'offset',
+ type: 'integer',
+ required: false,
+ description: `Row offset for dataset_preview pagination. Defaults to 0.`,
+ },
+ {
+ name: 'operations',
+ type: 'array',
+ required: false,
+ description: `Details to return. Defaults to ["overview"]. For datasets, use ["overview", "dataset_structure"] first, then ["dataset_preview"] with config and split.`,
+ },
+ {
+ name: 'repo_type',
+ type: 'string',
+ required: false,
+ description: `Repository type to look up. Auto-detected when omitted.`,
+ },
+ {
+ name: 'split',
+ type: 'string',
+ required: false,
+ description: `Dataset split name. Required for dataset_preview when the dataset has multiple splits. Discover available splits via dataset_structure.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_hub_repo_search',
+ description: `Search the Hugging Face Hub for models, datasets, or spaces with optional filters for author, task, and sort order.`,
+ params: [
+ {
+ name: 'author',
+ type: 'string',
+ required: false,
+ description: `Organization or user namespace to filter results by.`,
+ },
+ {
+ name: 'filters',
+ type: 'array',
+ required: false,
+ description: `Hub filter tags to apply to each selected repo type. Supports task tags, language codes, and framework tags.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of results to return per selected repository type. Clamped between 1 and 100.`,
+ },
+ {
+ name: 'query',
+ type: 'string',
+ required: false,
+ description: `Search term for repositories. Leave blank with sort + limit set to browse trending or recent repos.`,
+ },
+ {
+ name: 'repo_types',
+ type: 'array',
+ required: false,
+ description: `Repository types to include in the search. Defaults to model and dataset. space uses keyword search.`,
+ },
+ {
+ name: 'sort',
+ type: 'string',
+ required: false,
+ description: `Sort order for results, applied in descending order.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_paper_search',
+ description: `Search Hugging Face Papers by query and return matching papers with abstracts and author information.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Semantic search query for finding ML research papers.`,
+ },
+ {
+ name: 'concise_only',
+ type: 'boolean',
+ required: false,
+ description: `Return a 2-sentence abstract summary instead of the full text. Recommended for broad queries that return many results.`,
+ },
+ {
+ name: 'results_limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of paper results to return.`,
+ },
+ ],
+ },
+ {
+ name: 'huggingfacemcp_space_search',
+ description: `Search Hugging Face Spaces by query and return matching spaces with relevance scores.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Semantic search query for finding Hugging Face Spaces.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of Space results to return.`,
+ },
+ {
+ name: 'mcp',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to return only MCP Server-enabled Spaces. Required when using results with dynamic_space.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/kitmcp.ts b/src/data/agent-connectors/kitmcp.ts
new file mode 100644
index 000000000..537a3192c
--- /dev/null
+++ b/src/data/agent-connectors/kitmcp.ts
@@ -0,0 +1,2386 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'kitmcp_add_subscriber_to_form',
+ description: `Subscribe a single email address to a Kit form. Creates the subscriber if they do not exist; returns the subscriber record.`,
+ params: [
+ {
+ name: 'email_address',
+ type: 'string',
+ required: true,
+ description: `Subscriber's email address (required)`,
+ },
+ {
+ name: 'form_id',
+ type: 'integer',
+ required: true,
+ description: `The form ID (required). Use list_forms to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_add_subscriber_to_sequence',
+ description: `Enroll a single subscriber (by email) into a Kit email sequence. Use list_sequences to find the sequence ID.`,
+ params: [
+ {
+ name: 'email_address',
+ type: 'string',
+ required: true,
+ description: `Subscriber's email address (required)`,
+ },
+ {
+ name: 'sequence_id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_add_subscribers_to_form',
+ description: `Subscribe multiple existing subscribers to one or more forms in a single request. Batches over 100 are processed asynchronously.`,
+ params: [
+ {
+ name: 'additions',
+ type: 'array',
+ required: true,
+ description: `Form subscriptions to create (required). Each item must include \`form_id\` and \`subscriber_id\`.`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_create_custom_fields',
+ description: `Create multiple custom subscriber fields in one request. Use list_custom_fields to view existing fields.`,
+ params: [
+ {
+ name: 'custom_fields',
+ type: 'array',
+ required: true,
+ description: `Custom field definitions to create (required). Each item must include \`label\`.`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_create_subscribers',
+ description: `Create or update multiple subscribers in one request. Batches over 100 are processed asynchronously.`,
+ params: [
+ {
+ name: 'subscribers',
+ type: 'array',
+ required: true,
+ description: `Subscribers to upsert (required). Each item must include \`email_address\`; \`first_name\` and \`state\` are optional.`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_create_tags',
+ description: `Create multiple tags in one request. Returns created tag records.`,
+ params: [
+ {
+ name: 'tags',
+ type: 'array',
+ required: true,
+ description: `Tags to create (required). Each item must include \`name\`.`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_tag_subscribers',
+ description: `Apply a tag to multiple subscribers in one request. Batches over 100 are processed asynchronously.`,
+ params: [
+ {
+ name: 'taggings',
+ type: 'array',
+ required: true,
+ description: `Tag-subscriber pairs to apply (required). Each item must include \`tag_id\` (integer) and \`subscriber_id\` (integer).`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_untag_subscribers',
+ description: `Remove a tag from multiple subscribers in one request. Batches over 100 are processed asynchronously.`,
+ params: [
+ {
+ name: 'taggings',
+ type: 'array',
+ required: true,
+ description: `Tag-subscriber pairs to remove (required). Each item must include \`tag_id\` (integer) and \`subscriber_id\` (integer).`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_bulk_update_subscriber_custom_field_values',
+ description: `Update custom field values for multiple subscribers in one request.`,
+ params: [
+ {
+ name: 'custom_field_values',
+ type: 'array',
+ required: true,
+ description: `Custom field updates to apply (required). Each item must include \`subscriber_id\`, \`subscriber_custom_field_id\`, and \`value\`.`,
+ },
+ {
+ name: 'callback_url',
+ type: 'string',
+ required: false,
+ description: `URL to POST results to when the batch is processed asynchronously (batches > 100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_broadcast',
+ description: `Create a draft email broadcast in Kit. The broadcast is saved as a draft; scheduling and sending happen from the Kit UI.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `Email body content in HTML (required)`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: true,
+ description: `Email subject line (required)`,
+ },
+ {
+ name: 'allow_starting_point',
+ type: 'boolean',
+ required: false,
+ description: `Set to true when posting adapted content from a Starting-point template (in combination with \`email_template_id\` set to that template's id and \`content\` set to the adapted body). Required only for the Starting-point + content combination; omit otherwise.`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `Internal description for organizing broadcasts`,
+ },
+ {
+ name: 'email_template_id',
+ type: 'integer',
+ required: false,
+ description: `Email template ID. Use list_email_templates to find IDs.`,
+ },
+ {
+ name: 'preview_text',
+ type: 'string',
+ required: false,
+ description: `Preview text shown in email clients`,
+ },
+ {
+ name: 'public',
+ type: 'boolean',
+ required: false,
+ description: `Whether to publish on the creator's profile page`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'subscriber_filter',
+ type: 'array',
+ required: false,
+ description: `Target audience filter. A single-element array wrapping one filter group (all/any/none). Example: [{ "all": [{ "type": "tag", "ids": [1, 2] }] }]. Only one filter group (all, any, or none) may be populated per request. Filter types allowed: 'tag' or 'segment'. Omit to target all subscribers.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_custom_field',
+ description: `Create a new custom subscriber field. Returns the created field record with its key.`,
+ params: [
+ {
+ name: 'label',
+ type: 'string',
+ required: true,
+ description: `Field label (required), e.g. 'Company' or 'Website'`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_sequence',
+ description: `Create a new email sequence. Returns the sequence record including its ID.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `Sequence name (required)` },
+ {
+ name: 'email_address',
+ type: 'string',
+ required: false,
+ description: `From email address to use for this sequence`,
+ },
+ {
+ name: 'email_template_id',
+ type: 'integer',
+ required: false,
+ description: `Email template ID. Use list_email_templates to find IDs.`,
+ },
+ {
+ name: 'repeat',
+ type: 'boolean',
+ required: false,
+ description: `Whether the sequence repeats for subscribers`,
+ },
+ {
+ name: 'send_days',
+ type: 'array',
+ required: false,
+ description: `Days to send on (e.g. ['monday', 'wednesday', 'friday'])`,
+ },
+ {
+ name: 'send_hour',
+ type: 'integer',
+ required: false,
+ description: `Hour of day to send (0-23)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'time_zone',
+ type: 'string',
+ required: false,
+ description: `Timezone for send scheduling (e.g. 'America/New_York')`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_sequence_email',
+ description: `Add a new email to an existing sequence at a specified position and delay.`,
+ params: [
+ {
+ name: 'delay_unit',
+ type: 'string',
+ required: true,
+ description: `'days' or 'hours' (required)`,
+ },
+ {
+ name: 'delay_value',
+ type: 'integer',
+ required: true,
+ description: `Number of days or hours to wait before sending this email (required). Unit is controlled by delay_unit.`,
+ },
+ {
+ name: 'sequence_id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: true,
+ description: `Email subject line (required)`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `Email body content in HTML`,
+ },
+ {
+ name: 'email_template_id',
+ type: 'integer',
+ required: false,
+ description: `Layout template ID. Use list_email_templates to find IDs.`,
+ },
+ {
+ name: 'position',
+ type: 'integer',
+ required: false,
+ description: `0-based position in the sequence. Defaults to the end.`,
+ },
+ {
+ name: 'preview_text',
+ type: 'string',
+ required: false,
+ description: `Preview text shown in email clients`,
+ },
+ {
+ name: 'published',
+ type: 'boolean',
+ required: false,
+ description: `Publish the email immediately (default: false)`,
+ },
+ {
+ name: 'send_days',
+ type: 'array',
+ required: false,
+ description: `Days of the week this email may send. Omit or pass null to allow all days (inherits the sequence schedule).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_snippet',
+ description: `Create a reusable content snippet (inline or block) for use in broadcasts and sequences.`,
+ params: [
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Snippet name (required). Used to auto-generate the key.`,
+ },
+ {
+ name: 'snippet_type',
+ type: 'string',
+ required: true,
+ description: `'inline' or 'block' (required). Cannot be changed after creation.`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `Text/Liquid content for inline snippets (required when snippet_type is 'inline')`,
+ },
+ {
+ name: 'document_attributes',
+ type: 'object',
+ required: false,
+ description: `Rich HTML content for block snippets (required when snippet_type is 'block')`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_subscriber',
+ description: `Create or update a single subscriber by email address (upsert). Returns the subscriber record.`,
+ params: [
+ {
+ name: 'email_address',
+ type: 'string',
+ required: true,
+ description: `Subscriber's email address (required)`,
+ },
+ {
+ name: 'fields',
+ type: 'object',
+ required: false,
+ description: `Custom field values as key-value pairs`,
+ },
+ {
+ name: 'first_name',
+ type: 'string',
+ required: false,
+ description: `Subscriber's first name`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'state',
+ type: 'string',
+ required: false,
+ description: `Subscriber state (default: active)`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_tag',
+ description: `Create a new tag. Returns the tag record with its ID.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `Tag name (required)` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_create_webhook',
+ description: `Register a webhook endpoint to receive Kit events. Returns the created webhook record.`,
+ params: [
+ {
+ name: 'event',
+ type: 'object',
+ required: true,
+ description: `Event configuration (required). Must include 'name' and optional filter IDs.`,
+ },
+ {
+ name: 'target_url',
+ type: 'string',
+ required: true,
+ description: `URL to receive webhook POST requests (required)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_delete_broadcast',
+ description: `Delete a draft broadcast by ID. Only draft broadcasts can be deleted.`,
+ params: [
+ {
+ name: 'broadcast_id',
+ type: 'integer',
+ required: true,
+ description: `The broadcast ID to delete (required). Use list_broadcasts to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_delete_custom_field',
+ description: `Delete a custom subscriber field by ID.`,
+ params: [
+ {
+ name: 'custom_field_id',
+ type: 'integer',
+ required: true,
+ description: `The custom field ID to delete (required). Use list_custom_fields to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_delete_sequence',
+ description: `Delete a sequence and all its emails by ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID to delete (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_delete_sequence_email',
+ description: `Delete a single email from a sequence by email ID and sequence ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The email ID to delete (required). Use list_sequence_emails to find IDs.`,
+ },
+ {
+ name: 'sequence_id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_delete_webhook',
+ description: `Delete a registered webhook by ID.`,
+ params: [
+ {
+ name: 'webhook_id',
+ type: 'integer',
+ required: true,
+ description: `The webhook ID to delete (required). Use list_webhooks to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_filter_subscribers',
+ description: `Search and filter subscribers by engagement events (opens, clicks, sends, deliveries) or sign-up date. Returns paginated results.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor for the next page. Use \`pagination.end_cursor\` from a previous response. Distinct from per-filter date ranges in \`all[].after\`.`,
+ },
+ {
+ name: 'all',
+ type: 'array',
+ required: false,
+ description: `Array of filter conditions, AND-ed together. Each item filters by one event type (opens, clicks, sent, delivered) or by sign-up date (subscribed). Omit to match all subscribers.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Pagination cursor for the previous page. Use \`pagination.start_cursor\` from a previous response. Distinct from per-filter date ranges in \`all[].before\`.`,
+ },
+ {
+ name: 'include_total_count',
+ type: 'boolean',
+ required: false,
+ description: `If true, include \`pagination.total_count\` in the response (slower).`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100).`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'sort_field',
+ type: 'string',
+ required: false,
+ description: `Field to sort by. Defaults to \`id\` (recommended for stable cursor pagination).`,
+ },
+ {
+ name: 'sort_order',
+ type: 'string',
+ required: false,
+ description: `Sort direction (default: desc).`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_account',
+ description: `Retrieve the Kit account details for the authenticated user.`,
+ params: [
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_account_colors',
+ description: `Retrieve the custom brand color palette for the Kit account.`,
+ params: [
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_broadcast',
+ description: `Retrieve a single broadcast record by ID.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The broadcast ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_broadcast_clicks',
+ description: `Retrieve click data for a specific broadcast, paginated by cursor.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The broadcast ID` },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_broadcast_stats',
+ description: `Retrieve performance statistics (opens, clicks, etc.) for a specific broadcast.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The broadcast ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_broadcasts_stats',
+ description: `Retrieve aggregated performance statistics for multiple broadcasts, with optional date and status filters.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'sent_after',
+ type: 'string',
+ required: false,
+ description: `ISO 8601 date or datetime (e.g. \`2026-01-15\` or \`2026-01-15T10:00:00Z\`). Only include broadcasts with \`send_at >= sent_after\`.`,
+ },
+ {
+ name: 'sent_before',
+ type: 'string',
+ required: false,
+ description: `ISO 8601 date or datetime (e.g. \`2026-01-15\` or \`2026-01-15T10:00:00Z\`). Only include broadcasts with \`send_at < sent_before\`.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter to broadcasts in this state. Omit to return all states.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_creator_profile',
+ description: `Retrieve the creator profile linked to the authenticated Kit account.`,
+ params: [
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_email_stats',
+ description: `Retrieve overall email performance statistics for the Kit account.`,
+ params: [
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_email_template',
+ description: `Retrieve a single email template by ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The email template ID (required). Use list_email_templates to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_growth_stats',
+ description: `Retrieve subscriber growth statistics for a specified date range.`,
+ params: [
+ {
+ name: 'ending',
+ type: 'string',
+ required: false,
+ description: `End date (YYYY-MM-DD). Defaults to today.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'starting',
+ type: 'string',
+ required: false,
+ description: `Start date (YYYY-MM-DD). Defaults to 90 days ago.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_post',
+ description: `Retrieve a single Kit post (newsletter issue) by ID.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The post ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_purchase',
+ description: `Retrieve a single purchase record by ID.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The purchase ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_sequence',
+ description: `Retrieve a single sequence record by ID.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The sequence ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_sequence_email',
+ description: `Retrieve a single email within a sequence by email ID and sequence ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The email ID (required). Use list_sequence_emails to find IDs.`,
+ },
+ {
+ name: 'sequence_id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_snippet',
+ description: `Retrieve a single content snippet by ID.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The snippet ID (required). Use list_snippets to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_subscriber',
+ description: `Retrieve a single subscriber record by ID, including their custom fields.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The subscriber ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_subscriber_stats',
+ description: `Retrieve engagement statistics for a single subscriber.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The subscriber ID` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_get_subscriber_tags',
+ description: `Retrieve all tags applied to a specific subscriber, paginated.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The subscriber ID` },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_broadcasts',
+ description: `List all broadcasts with optional status filter and cursor pagination.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include',
+ type: 'array',
+ required: false,
+ description: `Extra fields to include per broadcast. \`content\` adds the full HTML body (can be large — only request when needed).`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter to broadcasts in this state. Omit to return all states.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_custom_fields',
+ description: `List all custom subscriber fields in the account.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_email_templates',
+ description: `List all email templates in the account.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_form_subscribers',
+ description: `List all subscribers on a specific form, paginated.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The form ID. Use list_forms to find IDs.`,
+ },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include',
+ type: 'array',
+ required: false,
+ description: `Extra data to include per subscriber. \`fields\` adds custom field values (omit for slim responses).`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_forms',
+ description: `List all forms in the account with optional status filter.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Form status (default: active)`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_posts',
+ description: `List all Kit newsletter posts with optional cursor pagination.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include_content',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to include the full HTML body of each post. Omit (or set false) for a slim response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_prompt_suggestions',
+ description: `Retrieve suggested prompts to help the user get started with Kit via AI.`,
+ params: [
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_purchases',
+ description: `List all purchase records in the account, paginated.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_segments',
+ description: `List all subscriber segments in the account.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_sequence_emails',
+ description: `List all emails in a specific sequence.`,
+ params: [
+ {
+ name: 'sequence_id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include_content',
+ type: 'boolean',
+ required: false,
+ description: `Include HTML content in each email (default: false)`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_sequence_subscribers',
+ description: `List all subscribers enrolled in a specific sequence.`,
+ params: [
+ { name: 'id', type: 'integer', required: true, description: `The sequence ID` },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include',
+ type: 'array',
+ required: false,
+ description: `Extra data to include per subscriber. \`fields\` adds custom field values (omit for slim responses).`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_sequences',
+ description: `List all email sequences in the account.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_snippets',
+ description: `List all content snippets in the account with optional type and archive filters.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'archived',
+ type: 'boolean',
+ required: false,
+ description: `true to list archived snippets, false (default) for active ones`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include_content',
+ type: 'boolean',
+ required: false,
+ description: `Include content and document fields in each snippet (default: false)`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'snippet_type',
+ type: 'string',
+ required: false,
+ description: `Filter by type: 'inline' or 'block'`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_subscribers',
+ description: `List all subscribers with optional status, sort, and cursor pagination.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include',
+ type: 'array',
+ required: false,
+ description: `Extra data to include per subscriber. \`fields\` adds custom field values (omit for slim responses). \`canceled_at\` requires \`status\` set to \`cancelled\` (otherwise the API returns 422).`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'sort_field',
+ type: 'string',
+ required: false,
+ description: `Sort by \`id\` (default, recommended for stable cursor pagination), \`created_at\`, or \`updated_at\`.`,
+ },
+ {
+ name: 'sort_order',
+ type: 'string',
+ required: false,
+ description: `Sort direction: asc or desc`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter by subscriber state. Defaults to active when omitted. Use \`all\` to include every state.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_tag_subscribers',
+ description: `List all subscribers who have a specific tag applied.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The tag ID. Use list_tags to find IDs.`,
+ },
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'include',
+ type: 'array',
+ required: false,
+ description: `Extra data to include per subscriber. \`fields\` adds custom field values (omit for slim responses).`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_tags',
+ description: `List all tags in the account.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_list_webhooks',
+ description: `List all registered webhooks in the account.`,
+ params: [
+ {
+ name: 'after',
+ type: 'string',
+ required: false,
+ description: `Cursor for next page. Use \`pagination.end_cursor\` from a previous response.`,
+ },
+ {
+ name: 'before',
+ type: 'string',
+ required: false,
+ description: `Cursor for previous page. Use \`pagination.start_cursor\` from a previous response.`,
+ },
+ {
+ name: 'per_page',
+ type: 'integer',
+ required: false,
+ description: `Results per page (1-100)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_tag_subscriber',
+ description: `Apply a tag to a subscriber identified by email address.`,
+ params: [
+ {
+ name: 'email_address',
+ type: 'string',
+ required: true,
+ description: `Subscriber's email address (required)`,
+ },
+ {
+ name: 'tag_id',
+ type: 'integer',
+ required: true,
+ description: `The tag ID (required). Use list_tags to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_unsubscribe',
+ description: `Cancel a subscriber's subscription by subscriber ID.`,
+ params: [
+ {
+ name: 'subscriber_id',
+ type: 'integer',
+ required: true,
+ description: `The subscriber ID (required). Use list_subscribers or get_subscriber to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_untag_subscriber',
+ description: `Remove a tag from a subscriber by subscriber ID and tag ID.`,
+ params: [
+ {
+ name: 'subscriber_id',
+ type: 'integer',
+ required: true,
+ description: `The subscriber ID (required)`,
+ },
+ {
+ name: 'tag_id',
+ type: 'integer',
+ required: true,
+ description: `The tag ID (required). Use list_tags to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_account_colors',
+ description: `Update the custom brand color palette for the Kit account.`,
+ params: [
+ {
+ name: 'colors',
+ type: 'array',
+ required: true,
+ description: `Array of up to 10 hex color codes (e.g. ["#FF6900", "#FCB900"]). Replaces the existing palette entirely.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_broadcast',
+ description: `Update a draft broadcast's subject, content, or audience filter.`,
+ params: [
+ {
+ name: 'broadcast_id',
+ type: 'integer',
+ required: true,
+ description: `The broadcast ID (required). Use list_broadcasts to find IDs.`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `Email body content in HTML`,
+ },
+ { name: 'description', type: 'string', required: false, description: `Internal description` },
+ {
+ name: 'email_template_id',
+ type: 'integer',
+ required: false,
+ description: `Email template ID`,
+ },
+ {
+ name: 'preview_text',
+ type: 'string',
+ required: false,
+ description: `Preview text shown in email clients`,
+ },
+ {
+ name: 'public',
+ type: 'boolean',
+ required: false,
+ description: `Whether to publish on the creator's profile page`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ { name: 'subject', type: 'string', required: false, description: `Email subject line` },
+ {
+ name: 'subscriber_filter',
+ type: 'array',
+ required: false,
+ description: `Target audience filter. A single-element array wrapping one filter group (all/any/none). Example: [{ "all": [{ "type": "tag", "ids": [1, 2] }] }]. Only one filter group (all, any, or none) may be populated per request. Filter types allowed: 'tag' or 'segment'. Omit to leave current filter unchanged.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_custom_field',
+ description: `Rename a custom subscriber field by ID.`,
+ params: [
+ {
+ name: 'custom_field_id',
+ type: 'integer',
+ required: true,
+ description: `The custom field ID (required). Use list_custom_fields to find IDs.`,
+ },
+ { name: 'label', type: 'string', required: true, description: `New field label (required)` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_sequence',
+ description: `Update sequence settings such as name, send days, or active state.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'active',
+ type: 'boolean',
+ required: false,
+ description: `Whether the sequence is active`,
+ },
+ { name: 'email_address', type: 'string', required: false, description: `From email address` },
+ {
+ name: 'email_template_id',
+ type: 'integer',
+ required: false,
+ description: `Email template ID`,
+ },
+ {
+ name: 'hold',
+ type: 'boolean',
+ required: false,
+ description: `Whether the sequence is on hold`,
+ },
+ { name: 'name', type: 'string', required: false, description: `New sequence name` },
+ {
+ name: 'repeat',
+ type: 'boolean',
+ required: false,
+ description: `Whether the sequence repeats`,
+ },
+ { name: 'send_days', type: 'array', required: false, description: `Days to send on` },
+ {
+ name: 'send_hour',
+ type: 'integer',
+ required: false,
+ description: `Hour of day to send (0-23)`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'time_zone',
+ type: 'string',
+ required: false,
+ description: `Timezone for send scheduling`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_sequence_email',
+ description: `Update an existing sequence email's subject, content, delay, or position.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The email ID (required). Use list_sequence_emails to find IDs.`,
+ },
+ {
+ name: 'sequence_id',
+ type: 'integer',
+ required: true,
+ description: `The sequence ID (required). Use list_sequences to find IDs.`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `Email body content in HTML`,
+ },
+ { name: 'delay_unit', type: 'string', required: false, description: `'days' or 'hours'` },
+ {
+ name: 'delay_value',
+ type: 'integer',
+ required: false,
+ description: `Number of days or hours to wait before sending this email. Unit is controlled by delay_unit.`,
+ },
+ {
+ name: 'email_template_id',
+ type: 'integer',
+ required: false,
+ description: `Layout template ID. Use list_email_templates to find IDs.`,
+ },
+ {
+ name: 'position',
+ type: 'integer',
+ required: false,
+ description: `0-based position in the sequence`,
+ },
+ {
+ name: 'preview_text',
+ type: 'string',
+ required: false,
+ description: `Preview text shown in email clients`,
+ },
+ {
+ name: 'published',
+ type: 'boolean',
+ required: false,
+ description: `Publish or unpublish the email`,
+ },
+ {
+ name: 'send_days',
+ type: 'array',
+ required: false,
+ description: `Days of the week this email may send. To reset to the full weekly schedule, pass all 7 values explicitly.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ { name: 'subject', type: 'string', required: false, description: `Email subject line` },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_snippet',
+ description: `Update a content snippet's name, content, or archived state.`,
+ params: [
+ {
+ name: 'id',
+ type: 'integer',
+ required: true,
+ description: `The snippet ID (required). Use list_snippets to find IDs.`,
+ },
+ {
+ name: 'archived',
+ type: 'boolean',
+ required: false,
+ description: `true to archive, false to restore`,
+ },
+ {
+ name: 'content',
+ type: 'string',
+ required: false,
+ description: `New text/Liquid content (inline snippets only)`,
+ },
+ {
+ name: 'document_attributes',
+ type: 'object',
+ required: false,
+ description: `New HTML content (block snippets only)`,
+ },
+ { name: 'name', type: 'string', required: false, description: `New snippet name` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_subscriber',
+ description: `Update a subscriber's email, name, or custom field values by subscriber ID.`,
+ params: [
+ {
+ name: 'subscriber_id',
+ type: 'integer',
+ required: true,
+ description: `The subscriber ID (required). Use list_subscribers or filter_subscribers to find IDs.`,
+ },
+ { name: 'email_address', type: 'string', required: false, description: `New email address` },
+ {
+ name: 'fields',
+ type: 'object',
+ required: false,
+ description: `Custom field values to update as key-value pairs`,
+ },
+ { name: 'first_name', type: 'string', required: false, description: `New first name` },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+ {
+ name: 'kitmcp_update_tag',
+ description: `Rename a tag by ID.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `New tag name (required)` },
+ {
+ name: 'tag_id',
+ type: 'integer',
+ required: true,
+ description: `The tag ID (required). Use list_tags to find IDs.`,
+ },
+ {
+ name: 'session_id',
+ type: 'string',
+ required: false,
+ description: `UUID v4 identifier for grouping tool calls in the same conversation. Generate once at the start of the session and reuse it on every call.`,
+ },
+ {
+ name: 'user_goal',
+ type: 'string',
+ required: false,
+ description: `What the creator is trying to accomplish with this tool call. Pick the closest match; use 'unknown' only when no category fits.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/lemlistmcp.ts b/src/data/agent-connectors/lemlistmcp.ts
new file mode 100644
index 000000000..95867ae30
--- /dev/null
+++ b/src/data/agent-connectors/lemlistmcp.ts
@@ -0,0 +1,1786 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'lemlistmcp_add_contacts_to_list',
+ description: `Add existing CRM contacts to a contact list by list ID.`,
+ params: [
+ {
+ name: 'contactIds',
+ type: 'array',
+ required: true,
+ description: `Contact IDs to add to the list (max 1,000)`,
+ },
+ {
+ name: 'listId',
+ type: 'string',
+ required: true,
+ description: `Target contact list ID in clt_xxx format. Get valid IDs from get_contact_lists.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_add_leads_to_campaign',
+ description: `Add one or more leads (max 100) to a campaign. Each lead requires at least one identifying field such as email, first name, last name, or company name.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `The campaign ID (starts with cam_)`,
+ },
+ {
+ name: 'leads',
+ type: 'array',
+ required: true,
+ description: `Leads to add (1..100). Each lead must have at least one identifying field.`,
+ },
+ {
+ name: 'deduplicate',
+ type: 'boolean',
+ required: false,
+ description: `Avoid duplicates across campaigns (default: false). When true, existing leads in OTHER campaigns are reported as outcome="skippedDuplicateCrossCampaign".`,
+ },
+ {
+ name: 'findEmail',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS per lead: Find email address from other lead data (LinkedIn, name, company)`,
+ },
+ {
+ name: 'findPhone',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS per lead: Find phone number from other lead data`,
+ },
+ {
+ name: 'linkedinEnrichment',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS per lead: Enrich each lead with LinkedIn profile data (job title, company info, etc.)`,
+ },
+ {
+ name: 'verifyEmail',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS per lead: Verify if the email address is valid and deliverable`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_add_sequence_step',
+ description: `Add a step to an existing campaign sequence. Use only for modifying already-created campaigns — not for initial campaign creation.`,
+ params: [
+ { name: 'campaignId', type: 'string', required: true, description: `Campaign ID (cam_xxx)` },
+ {
+ name: 'delay',
+ type: 'number',
+ required: true,
+ description: `Days to wait after previous step. Must be 0 for "sendToAnotherCampaign" (the lemlist API does not accept a delay for this type, transfer is immediate).`,
+ },
+ { name: 'sequenceId', type: 'string', required: true, description: `Sequence ID (seq_xxx)` },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: true,
+ description: `Must be true after user confirms`,
+ },
+ {
+ name: 'altMessage',
+ type: 'string',
+ required: false,
+ description: `Alternative message variation for "linkedinSend" steps (used as second-attempt content when applicable).`,
+ },
+ {
+ name: 'conditionKey',
+ type: 'string',
+ required: false,
+ description: `Condition to check (REQUIRED when type is "conditional"). E.g. emailsOpened, linkedinInviteAccepted.`,
+ },
+ {
+ name: 'delayType',
+ type: 'string',
+ required: false,
+ description: `REQUIRED for all conditional steps. "within" = must happen within delay days, "waitUntil" = wait indefinitely. For field-check conditions (hasEmailAddress, hasLinkedinUrl, etc.), use "within" with delay 0.`,
+ },
+ {
+ name: 'emailStatusFilter',
+ type: 'array',
+ required: false,
+ description: `Only for hasEmailAddress condition. Filter by email verification status. E.g. ["deliverable"] to only match leads with deliverable email. Omit to check if any email exists.`,
+ },
+ {
+ name: 'index',
+ type: 'number',
+ required: false,
+ description: `Zero-based position where to insert the step (0 = first). Omit to append at the end. Use to insert warm-up steps before an existing step (e.g. Like + Comment before an Invite).`,
+ },
+ {
+ name: 'message',
+ type: 'string',
+ required: false,
+ description: `Message content (REQUIRED when type is "email", "linkedinSend", "whatsappMessage" or "sms"; OPTIONAL but recommended for "linkedinInvite"). For emails: the HTML body. For LinkedIn/WhatsApp/SMS/tasks: the message text.`,
+ },
+ {
+ name: 'method',
+ type: 'string',
+ required: false,
+ description: `REQUIRED when type="api". HTTP method (GET or POST) used by the webhook call. Limited to GET/POST to stay iso with the lemlist UI editor.`,
+ },
+ {
+ name: 'recordMode',
+ type: 'string',
+ required: false,
+ description: `linkedinVoiceNote only: "ai" generates audio from text via ElevenLabs (user adds the text after); "manual" (default) requires user-recorded audio after step creation.`,
+ },
+ {
+ name: 'scoreComparator',
+ type: 'string',
+ required: false,
+ description: `Only for hasScore condition. "$gte" = score is above or equal to threshold, "$lt" = score is below threshold. Defaults to "$gte".`,
+ },
+ {
+ name: 'scoreThreshold',
+ type: 'number',
+ required: false,
+ description: `Only for hasScore condition. Score threshold value (0-100). Defaults to 80.`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: false,
+ description: `Email subject line. Required for the first email; omit for follow-ups to send as reply thread. Supports Liquid syntax: {{ firstName }}, {% if condition %}...{% endif %}`,
+ },
+ {
+ name: 'targetCampaignId',
+ type: 'string',
+ required: false,
+ description: `REQUIRED when type is "sendToAnotherCampaign". Target campaign ID (cam_xxx) the lead is moved to. Must belong to the same team as the parent campaign and not be archived. Avoid cycles (A -> B -> A).`,
+ },
+ {
+ name: 'title',
+ type: 'string',
+ required: false,
+ description: `Task title (for manual/phone steps). Short label displayed in the review UI.`,
+ },
+ {
+ name: 'type',
+ type: 'string',
+ required: false,
+ description: `Type of step. Use "conditional" for branching based on lead behavior, "sendToAnotherCampaign" to move a lead to another campaign, "api" to fire an outbound HTTP webhook (provide method and url).`,
+ },
+ {
+ name: 'url',
+ type: 'string',
+ required: false,
+ description: `REQUIRED when type="api". Webhook URL fired during sequence execution. Supports Liquid templating against lead variables (e.g. https://example.com/leads/{{ _id }}). For POST, the request body is automatically the lead data; custom bodies and custom headers are not supported.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_add_unsubscribe',
+ description: `Add email to unsubscribe blocklist. Blocks all future campaign sends. Use delete_unsubscribe to reverse.`,
+ params: [
+ {
+ name: 'email',
+ type: 'string',
+ required: true,
+ description: `The email address to add to the unsubscribe list`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_bulk_enrich_data',
+ description: `Enrich up to 500 contacts with additional data in a single call. Returns a dataRef for polling results asynchronously.`,
+ params: [
+ {
+ name: 'items',
+ type: 'array',
+ required: true,
+ description: `Array of enrichment items (max 500)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_bulk_get_enrichment_results',
+ description: `Poll the results of one or more enrichment jobs. Provide a dataRef from bulk_enrich_data or a nextPollRef from a previous poll.`,
+ params: [
+ {
+ name: 'dataRef',
+ type: 'string',
+ required: false,
+ description: `dataRef from bulk_enrich_data (first poll) OR nextPollRef from a previous poll result (subsequent polls). Mutually exclusive with enrichmentIds.`,
+ },
+ {
+ name: 'enrichmentIds',
+ type: 'array',
+ required: false,
+ description: `Array of enrichment IDs to poll (1-500, enr_xxx format). Mutually exclusive with dataRef.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_call_api',
+ description: `Make a direct call to the Lemlist API using a specified endpoint and method. Requires load_skill('api-reference') to be called first in the session.`,
+ params: [
+ {
+ name: 'endpoint',
+ type: 'string',
+ required: true,
+ description: `API endpoint path starting with /api/`,
+ },
+ { name: 'method', type: 'string', required: true, description: `HTTP method` },
+ {
+ name: 'body',
+ type: 'object',
+ required: false,
+ description: `Request body for POST/PUT/PATCH (optional)`,
+ },
+ {
+ name: 'confirmed',
+ type: 'boolean',
+ required: false,
+ description: `Set to true after user confirms a write/delete action`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_check_domain_health',
+ description: `Check DNS health for email sending domains (MX, SPF, DMARC, blacklists). Returns score (0-100), per-check status, and DNS fix records.`,
+ params: [
+ {
+ name: 'domain',
+ type: 'string',
+ required: false,
+ description: `Domain to check (e.g. example.com). If omitted, checks domains from team members.`,
+ },
+ {
+ name: 'mailboxId',
+ type: 'string',
+ required: false,
+ description: `Mailbox ID to check DNS for.`,
+ },
+ {
+ name: 'scope',
+ type: 'string',
+ required: false,
+ description: `Check scope: user (current user) or team (all members). Default: team.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_connect_email_account',
+ description: `Connect a custom SMTP/IMAP email account for sending and receiving emails in Lemlist campaigns.`,
+ params: [
+ {
+ name: 'imap_host',
+ type: 'string',
+ required: true,
+ description: `IMAP server hostname (e.g., "imap.company.com")`,
+ },
+ {
+ name: 'imap_login',
+ type: 'string',
+ required: true,
+ description: `IMAP authentication login (usually the email address)`,
+ },
+ {
+ name: 'imap_password',
+ type: 'string',
+ required: true,
+ description: `IMAP authentication password or app password`,
+ },
+ {
+ name: 'imap_port',
+ type: 'number',
+ required: true,
+ description: `IMAP server port (typically 993 for TLS)`,
+ },
+ {
+ name: 'sender_email',
+ type: 'string',
+ required: true,
+ description: `Email address to send from (e.g., "john@company.com")`,
+ },
+ {
+ name: 'sender_name',
+ type: 'string',
+ required: true,
+ description: `Display name for the sender (e.g., "John Doe")`,
+ },
+ {
+ name: 'smtp_host',
+ type: 'string',
+ required: true,
+ description: `SMTP server hostname (e.g., "smtp.company.com")`,
+ },
+ {
+ name: 'smtp_login',
+ type: 'string',
+ required: true,
+ description: `SMTP authentication login (usually the email address)`,
+ },
+ {
+ name: 'smtp_password',
+ type: 'string',
+ required: true,
+ description: `SMTP authentication password or app password`,
+ },
+ {
+ name: 'smtp_port',
+ type: 'number',
+ required: true,
+ description: `SMTP server port (typically 587 for TLS or 465 for SSL)`,
+ },
+ {
+ name: 'imap_secure',
+ type: 'boolean',
+ required: false,
+ description: `Optional: Use TLS for IMAP connection (default: true)`,
+ },
+ {
+ name: 'smtp_secure',
+ type: 'boolean',
+ required: false,
+ description: `Optional: Use TLS for SMTP connection (default: true)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_create_campaign_from_proposal',
+ description: `Create a campaign from a previously validated sequence proposal. Requires a proposal ID generated by propose_sequence.`,
+ params: [
+ {
+ name: 'sequenceItemId',
+ type: 'string',
+ required: true,
+ description: `Workspace item id of the validated sequence (from propose_sequence)`,
+ },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: true,
+ description: `Must be true after the user explicitly approves campaign creation`,
+ },
+ {
+ name: 'emoji',
+ type: 'string',
+ required: false,
+ description: `Optional emoji for the campaign`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: false,
+ description: `Campaign name (defaults to the sequence proposal name)`,
+ },
+ {
+ name: 'timezone',
+ type: 'string',
+ required: false,
+ description: `Timezone for the campaign (e.g. Europe/Paris)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_create_campaign_with_sequence',
+ description: `Create campaign. If subject AND body are provided, creates the first email step. If omitted, creates an empty sequence (use add_sequence_step to add a condition or any step type as the first step). Call add_sequence_step for each additional step. Supports Liquid syntax.`,
+ params: [
+ { name: 'name', type: 'string', required: true, description: `The name of the campaign` },
+ {
+ name: 'body',
+ type: 'string',
+ required: false,
+ description: `Email body content for the first email (supports Liquid syntax). Omit both subject and body to create campaign without a first step.`,
+ },
+ {
+ name: 'emoji',
+ type: 'string',
+ required: false,
+ description: `Optional emoji for the campaign (e.g., 🚀, 💎, 🔥)`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: false,
+ description: `Subject line for the first email (supports Liquid syntax). Omit both subject and body to create campaign without a first step (e.g. when first step is a condition).`,
+ },
+ {
+ name: 'timezone',
+ type: 'string',
+ required: false,
+ description: `Timezone for the campaign (e.g., Europe/Paris, America/New_York)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_create_contact_list',
+ description: `Create a new static contact list in the CRM to organize and group contacts.`,
+ params: [
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Name of the contact list to create (max 200 characters)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_create_or_update_company',
+ description: `Create a new company in the user's Lemlist company database, or update an existing one (upsert). Requires both a name AND a domain. If a company with the same domain, LinkedIn URL, or Sales Navigator URL already exists, it will be updated instead of creating a duplicate. Returns the company data and whether it was created or updated.`,
+ params: [
+ { name: 'domain', type: 'string', required: true, description: `Company domain (required)` },
+ { name: 'name', type: 'string', required: true, description: `Company name (required)` },
+ {
+ name: 'companyOwner',
+ type: 'string',
+ required: false,
+ description: `Company owner email or user ID (usr_xxx format)`,
+ },
+ { name: 'industry', type: 'string', required: false, description: `Company industry` },
+ {
+ name: 'linkedinUrl',
+ type: 'string',
+ required: false,
+ description: `Company LinkedIn profile URL`,
+ },
+ {
+ name: 'linkedinUrlSalesNav',
+ type: 'string',
+ required: false,
+ description: `Company LinkedIn Sales Navigator URL (used as an additional matching key for upsert)`,
+ },
+ {
+ name: 'location',
+ type: 'string',
+ required: false,
+ description: `Company location or address`,
+ },
+ { name: 'picture', type: 'string', required: false, description: `Company logo URL` },
+ ],
+ },
+ {
+ name: 'lemlistmcp_create_or_update_contact',
+ description: `Create a new contact in the user's Lemlist contact database, or update an existing one (upsert). Requires at least an email OR linkedinUrl as identifier. If a contact with the same email or LinkedIn URL already exists, it will be updated instead of creating a duplicate. Returns the contact data and whether it was created or updated. Use search_contacts first to check if the contact already exists.`,
+ params: [
+ {
+ name: 'companyDomain',
+ type: 'string',
+ required: false,
+ description: `Company domain to link the contact to a company (alternative to companyId)`,
+ },
+ {
+ name: 'companyId',
+ type: 'string',
+ required: false,
+ description: `Company ID to associate the contact with`,
+ },
+ {
+ name: 'companyLinkedinUrl',
+ type: 'string',
+ required: false,
+ description: `Company LinkedIn URL to link the contact to a company (alternative to companyId)`,
+ },
+ {
+ name: 'contactOwner',
+ type: 'string',
+ required: false,
+ description: `Contact owner email or user ID (usr_xxx format)`,
+ },
+ {
+ name: 'email',
+ type: 'string',
+ required: false,
+ description: `Contact email address (required if linkedinUrl is not provided)`,
+ },
+ { name: 'firstName', type: 'string', required: false, description: `Contact first name` },
+ {
+ name: 'jobDescription',
+ type: 'string',
+ required: false,
+ description: `Contact job description`,
+ },
+ { name: 'jobTitle', type: 'string', required: false, description: `Contact job title` },
+ { name: 'lastName', type: 'string', required: false, description: `Contact last name` },
+ {
+ name: 'linkedinUrl',
+ type: 'string',
+ required: false,
+ description: `Contact LinkedIn profile URL (required if email is not provided)`,
+ },
+ { name: 'phone', type: 'string', required: false, description: `Contact phone number` },
+ {
+ name: 'picture',
+ type: 'string',
+ required: false,
+ description: `Contact profile picture URL`,
+ },
+ {
+ name: 'salesnavUrl',
+ type: 'string',
+ required: false,
+ description: `Contact LinkedIn Sales Navigator URL (used as an additional matching key for upsert)`,
+ },
+ { name: 'timezone', type: 'string', required: false, description: `Contact timezone` },
+ ],
+ },
+ {
+ name: 'lemlistmcp_create_webhook',
+ description: `Create a webhook for real-time campaign activity notifications. Max 200 per account, no duplicate URLs. Filter by activity type (emailsSent, emailsOpened, emailsReplied, etc.) and/or campaignId.`,
+ params: [
+ {
+ name: 'targetUrl',
+ type: 'string',
+ required: true,
+ description: `The webhook URL to call (must start with http:// or https://)`,
+ },
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: false,
+ description: `Optional: Filter to call webhook only for specific campaign (e.g., "cam_xxx")`,
+ },
+ {
+ name: 'isFirst',
+ type: 'boolean',
+ required: false,
+ description: `Optional: Call webhook only for first activity of this type`,
+ },
+ {
+ name: 'type',
+ type: 'string',
+ required: false,
+ description: `Optional: Filter to call webhook only for specific activity types (e.g., "emailsReplied", "emailsSent")`,
+ },
+ {
+ name: 'zapId',
+ type: 'string',
+ required: false,
+ description: `Optional: Zapier integration ID`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_delete_company',
+ description: `Permanently delete a company record from Lemlist. Only removes the Lemlist record — does not affect any connected CRM.`,
+ params: [
+ {
+ name: 'companyId',
+ type: 'string',
+ required: true,
+ description: `Lemlist company ID to delete (cpn_xxx).`,
+ },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: true,
+ description: `REQUIRED: Must be true. Confirms user explicitly approved this deletion. Only set to true after user says yes.`,
+ },
+ {
+ name: 'force',
+ type: 'boolean',
+ required: false,
+ description: `When true, detaches any attached contacts (unsets their companyId) before deleting the company.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_delete_memory',
+ description: `Delete a stored memory entry by topic so it is no longer recalled in future conversations.`,
+ params: [
+ {
+ name: 'topic',
+ type: 'string',
+ required: true,
+ description: `The topic key to delete (e.g. "preferred_tone")`,
+ },
+ {
+ name: 'scope',
+ type: 'string',
+ required: false,
+ description: `Scope: "user" (default) or "team"`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_delete_sequence_step',
+ description: `Delete a step from a campaign sequence. Use only when removing a step added by mistake — requires user confirmation.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `The campaign ID (required for status verification)`,
+ },
+ {
+ name: 'sequenceId',
+ type: 'string',
+ required: true,
+ description: `The sequence ID (starts with seq_)`,
+ },
+ {
+ name: 'stepId',
+ type: 'string',
+ required: true,
+ description: `The step ID to delete (starts with stp_)`,
+ },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: true,
+ description: `REQUIRED: Must be true. Confirms user explicitly approved this deletion. Only set to true after user says yes.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_delete_unsubscribe',
+ description: `Remove an email address from the unsubscribe list, allowing it to be contacted again in future campaigns.`,
+ params: [
+ {
+ name: 'email',
+ type: 'string',
+ required: true,
+ description: `The email address to remove from the unsubscribe list`,
+ },
+ {
+ name: 'confirmed',
+ type: 'boolean',
+ required: false,
+ description: `NEVER set this to true on first call. Only set to true after the user has explicitly confirmed the action (e.g. via ask_question).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_delete_watch_list',
+ description: `Delete a watch list and immediately stop processing signals for it.`,
+ params: [
+ {
+ name: 'watchListId',
+ type: 'string',
+ required: true,
+ description: `The watch list ID to delete (wat_xxx format)`,
+ },
+ {
+ name: 'confirmed',
+ type: 'boolean',
+ required: false,
+ description: `Set to true only after the user has explicitly confirmed the deletion (e.g. via ask_question).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_delete_webhook',
+ description: `Delete a webhook from your Lemlist account, stopping all notifications to that endpoint immediately.`,
+ params: [
+ {
+ name: 'webhookId',
+ type: 'string',
+ required: true,
+ description: `The webhook ID to delete (starts with hoo_)`,
+ },
+ {
+ name: 'confirmed',
+ type: 'boolean',
+ required: false,
+ description: `Set to true only after the user has explicitly confirmed the deletion (e.g. via ask_question).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_disconnect_email_account',
+ description: `Disconnect email account. Stops sending immediately. Cannot be undone. Use get_user_channels to find account ID.`,
+ params: [
+ {
+ name: 'emailAccountId',
+ type: 'string',
+ required: true,
+ description: `The email account ID to disconnect (starts with usm_)`,
+ },
+ {
+ name: 'confirmed',
+ type: 'boolean',
+ required: false,
+ description: `Set to true only after the user has explicitly confirmed the disconnection (e.g. via ask_question).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_enrich_lead',
+ description: `Enrich existing campaign lead. ASYNC — poll with bulk_get_enrichment_results (pass enrichmentIds: [id]). For non-campaign contacts use bulk_enrich_data. ALL options COST CREDITS.`,
+ params: [
+ {
+ name: 'leadId',
+ type: 'string',
+ required: true,
+ description: `The lead ID to enrich (starts with lea_)`,
+ },
+ {
+ name: 'findEmail',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS: Find email from lead data`,
+ },
+ {
+ name: 'findPhone',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS: Find phone number`,
+ },
+ {
+ name: 'linkedinEnrichment',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS: Enrich with LinkedIn data`,
+ },
+ {
+ name: 'verifyEmail',
+ type: 'boolean',
+ required: false,
+ description: `⚠️ COSTS CREDITS: Verify lead email`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_campaign_details',
+ description: `Get configuration and settings for ONE campaign (timezone, emoji, labels, senders, sequences). For metrics use get_campaigns_stats, for email content use get_campaign_sequences.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `The campaign ID (cam_xxx format)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_campaign_sequences',
+ description: `Get the email sequences and their content (subject, body) for a specific campaign. Useful for reviewing copywriting and email flow.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `The campaign ID (cam_xxx format)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_campaigns',
+ description: `List campaigns with optional search, filtering by labels, and sorting.`,
+ params: [
+ {
+ name: 'createdBy',
+ type: 'string',
+ required: false,
+ description: `Filter by creator user ID (usr_xxx format). Use your own user ID from Context to find campaigns you created.`,
+ },
+ {
+ name: 'labels',
+ type: 'array',
+ required: false,
+ description: `Filter by labels/tags. OR semantics: returns campaigns matching at least one. Accepts label names ("q2") or IDs ("lab_xxx") — both can be mixed.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of campaigns to return (default: 20)`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Number of campaigns to skip for pagination (default: 0). Use with limit to paginate through all campaigns.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Search campaigns by name (case-insensitive)`,
+ },
+ {
+ name: 'sortOrder',
+ type: 'string',
+ required: false,
+ description: `Sort by creation date (default: newest first)`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter by status. OMIT this parameter to get ALL campaigns regardless of status.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_campaigns_reports',
+ description: `Get lifetime stats for MULTIPLE campaigns in one call. Returns metadata, sender info, and 65+ metrics per campaign. No date filtering - for time-based analysis use get_campaigns_stats.`,
+ params: [
+ {
+ name: 'campaignIds',
+ type: 'array',
+ required: true,
+ description: `Array of campaign IDs to get reports for (e.g., ["cam_xxx", "cam_yyy"])`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_campaigns_stats',
+ description: `Get detailed stats for one or more campaigns including lead funnel metrics, message counts, and per-step breakdowns.`,
+ params: [
+ {
+ name: 'campaignIds',
+ type: 'array',
+ required: true,
+ description: `Array of campaign IDs (cam_xxx format)`,
+ },
+ {
+ name: 'ABSelected',
+ type: 'string',
+ required: false,
+ description: `Optional: Filter by A/B test variant`,
+ },
+ {
+ name: 'channels',
+ type: 'array',
+ required: false,
+ description: `Optional: Filter stats by channels (mirrors the UI dropdown filter). When provided, both top-level totals and messageMetrics.perChannel are restricted to the requested channels. Omit to get the full breakdown across all 5 channels.`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: false,
+ description: `End date. Either a calendar day "YYYY-MM-DD" (interpreted as end-of-day in the resolved timezone) or a full ISO 8601 datetime with offset (used as-is). Omit for all-time stats.`,
+ },
+ {
+ name: 'sendUser',
+ type: 'string',
+ required: false,
+ description: `Optional: Filter by send user (format: usr_xxx|email@example.com)`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: false,
+ description: `Start date. Either a calendar day "YYYY-MM-DD" (interpreted as start-of-day in the resolved timezone) or a full ISO 8601 datetime with offset like "2026-04-01T00:00:00+05:30" / "2026-04-01T00:00:00Z" (used as-is, the timezone arg is ignored for that bound). Omit for all-time stats.`,
+ },
+ {
+ name: 'timezone',
+ type: 'string',
+ required: false,
+ description: `IANA timezone (e.g. "Asia/Kolkata", "America/New_York") used to interpret startDate/endDate ONLY when they are calendar days (YYYY-MM-DD). Ignored for full ISO 8601 datetimes. If omitted, falls back to the calling user's profile.timezone (if set), then to Europe/Paris. To exactly mirror what the Lemlist UI displays, prefer passing the same ISO 8601 strings the UI uses (capture from the campaignReportsTimePeriod session).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_contact_lists',
+ description: `Retrieve available CRM contact lists with optional search filtering.`,
+ params: [
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Filter lists by name (case-insensitive)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_inbox_conversation',
+ description: `Get the full conversation thread for a specific contact across all channels (email, LinkedIn, WhatsApp, SMS).`,
+ params: [
+ {
+ name: 'contactId',
+ type: 'string',
+ required: true,
+ description: `The contact ID (ctc_xxx format) to get the conversation thread for. Do not use leadId or any other ID type.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Number of activities per page (default: 20, max: 50)`,
+ },
+ {
+ name: 'markAsRead',
+ type: 'boolean',
+ required: false,
+ description: `Whether to mark the conversation as read (default: false). Note: this mutates state.`,
+ },
+ {
+ name: 'page',
+ type: 'number',
+ required: false,
+ description: `Page number for pagination (default: 1)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_inbox_conversations',
+ description: `List inbox conversations with contact info and last message preview, with optional filtering by list type.`,
+ params: [
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Number of conversations per page (default: 20, max: 50)`,
+ },
+ {
+ name: 'listId',
+ type: 'string',
+ required: false,
+ description: `Which inbox list to fetch: myConversations (default), unRead, favorites, snoozed, archived, sentOnly, teamConversations`,
+ },
+ {
+ name: 'page',
+ type: 'number',
+ required: false,
+ description: `Page number for pagination (default: 1)`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Search query to filter conversations by contact name or email`,
+ },
+ {
+ name: 'userId',
+ type: 'string',
+ required: false,
+ description: `The user ID (usr_xxx format). Optional — defaults to the current authenticated user if omitted.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_lemleads_filters',
+ description: `Get available filters for People Database searches. Call this FIRST before lemleads_search or display_leads/display_companies. Returns filter IDs with valid values.`,
+ params: [],
+ },
+ {
+ name: 'lemlistmcp_get_settings',
+ description: `Retrieve settings for a campaign or warmup mailbox entity.`,
+ params: [
+ {
+ name: 'type',
+ type: 'string',
+ required: true,
+ description: `The type of settings to retrieve.`,
+ },
+ {
+ name: 'id',
+ type: 'string',
+ required: false,
+ description: `Entity ID. Required for "campaign" (cam_xxx) and "lemwarm" (usm_xxx). Ignored for "sending" and "team".`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_statistics',
+ description: `Retrieve statistics for one or more entities of the same type (lemwarm, campaign, lead, etc.).`,
+ params: [
+ {
+ name: 'ids',
+ type: 'array',
+ required: true,
+ description: `For "lemwarm": mailbox IDs (usm_xxx) — same ids used with get_settings type="lemwarm". 1-20 items.`,
+ },
+ {
+ name: 'type',
+ type: 'string',
+ required: true,
+ description: `The type of statistics to retrieve. Only "lemwarm" is supported for now.`,
+ },
+ {
+ name: 'days',
+ type: 'number',
+ required: false,
+ description: `Lookback window in days (1-60). Defaults to 30. Applied to every id.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_team_info',
+ description: `Get basic team info (ID, name, plan, credits remaining) and minimal identity of the caller (current user id + email). For full user details call get_users with userIds: ["me"] for the caller, userIds: ["all"] for the full member list, or userIds: ["usr_xxx", ...] for one or more team members.`,
+ params: [],
+ },
+ {
+ name: 'lemlistmcp_get_team_overview',
+ description: `Account summary: campaign count by status. Use get_campaigns for the full list with names and details.`,
+ params: [],
+ },
+ {
+ name: 'lemlistmcp_get_unsubscribes',
+ description: `List unsubscribed emails with pagination. Use delete_unsubscribe to re-enable.`,
+ params: [
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of unsubscribes to return`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Number of unsubscribes to skip (for pagination)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_user_channels',
+ description: `Check connected sending channels (email, LinkedIn, WhatsApp). Returns connection status, plan availability, and accounts. WhatsApp requires separate addon purchase. Use show_connect_channel to guide setup (one channel at a time).`,
+ params: [],
+ },
+ {
+ name: 'lemlistmcp_get_users',
+ description: `Retrieve team member details by user IDs, or pass 'all' to fetch all team members.`,
+ params: [
+ {
+ name: 'userIds',
+ type: 'array',
+ required: true,
+ description: `List of userIds to fetch. Each item is "all" (every team member, lightweight), "me" (caller, full profile), or a usr_xxx id (full profile). 1-20 items.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_get_webhooks',
+ description: `List all configured webhooks. Returns array with _id, targetUrl, createdAt, type, campaignId, isFirst.`,
+ params: [],
+ },
+ {
+ name: 'lemlistmcp_lemleads_search',
+ description: `Search the People Database (450M+ B2B contacts) by people or company. Returns results with total count and pagination.`,
+ params: [
+ {
+ name: 'filters',
+ type: 'array',
+ required: true,
+ description: `Array of filter objects from get_lemleads_filters. Each filter MUST have filterId, in (array), and out (array).`,
+ },
+ {
+ name: 'mode',
+ type: 'string',
+ required: true,
+ description: `MUST be "people" for contacts or "companies" for organizations. Do NOT use "leads".`,
+ },
+ {
+ name: 'description',
+ type: 'string',
+ required: false,
+ description: `Prose describing the target company as if you were writing ITS "About us" section (companies mode only, max 1000 chars per string). MUST be 2-4 full sentences each, NOT a keyword list. The embedding index was built on real company descriptions, so keyword-stacked strings ("SaaS treasury cash management tool") score poorly. Write complete sentences: who they are, who they serve, what they do, how. GOOD: "We build treasury management software for mid-market finance teams. Our platform helps CFOs and treasurers automate cash forecasting, consolidate bank accounts, and optimize liquidity across entities." BAD: "SaaS software solution for treasury management cash management". Accepts (a) a single string for the simple case, or (b) an array of up to 3 strings covering different angles (e.g. anchor + product + customer/problem). Multi-angle triggers parallel vector searches with RRF fusion — recommended for niche verticals where one phrasing risks missing matches. Combine with keywords (grouped) and country/headcount filters for narrowing.`,
+ },
+ {
+ name: 'excludes',
+ type: 'array',
+ required: false,
+ description: `Fields to exclude from results`,
+ },
+ {
+ name: 'keywords',
+ type: 'string',
+ required: false,
+ description: `Optional hybrid BM25 + vector terms (companies mode only). Pass as GROUPS whenever possible — each group is a category of signal, and the document must match at least one term per group (AND-of-ORs). Grouping is how you force "editor, not consultancy": one group for the domain, one for the product-type marker. Example for "French SaaS treasury editors": [["treasury management", "cash forecasting", "gestion de trésorerie", "prévisions de trésorerie"], ["software", "SaaS", "logiciel", "platform", "plateforme"]]. A flat string[] is still accepted as a single implicit group (all terms OR-matched, any one hit passes). Keep groups small (2-5 terms each), max 5 groups.`,
+ },
+ {
+ name: 'page',
+ type: 'number',
+ required: false,
+ description: `1-based page index (default: 1)`,
+ },
+ {
+ name: 'seed',
+ type: 'string',
+ required: false,
+ description: `Random seed for consistent ordering. Must be a STRING like "abc123", not a number.`,
+ },
+ {
+ name: 'size',
+ type: 'number',
+ required: false,
+ description: `Results per page (default: 10, max: 100)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_list_watch_lists',
+ description: `List watch lists for the current team with optional type, status, and pagination filters.`,
+ params: [
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Max watch lists per page (default 50, max 100)`,
+ },
+ {
+ name: 'page',
+ type: 'integer',
+ required: false,
+ description: `Page number (1-based, default 1)`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of statuses to filter. Accepted values: active, inactive, draft, insufficient_credits, empty_crm_lists, error. Excludes soft-deleted by default.`,
+ },
+ {
+ name: 'type',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of watch list types (e.g. "companyIsHiring,jobChange")`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_load_skill',
+ description: `Load specialized guidance for a specific domain (e.g. campaign-builder, api-reference) to assist with complex tasks.`,
+ params: [
+ {
+ name: 'skillName',
+ type: 'string',
+ required: true,
+ description: `Name of the skill to load`,
+ },
+ {
+ name: 'section',
+ type: 'string',
+ required: false,
+ description: `Optional: specific reference section to load`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_preview_sequence_update',
+ description: `SAFE READ-ONLY: Preview what would change in an email sequence step before applying modifications. Shows current vs proposed content and campaign status. Must call this before update_sequence_step.`,
+ params: [
+ { name: 'campaignId', type: 'string', required: true, description: `Campaign ID (cam_xxx)` },
+ { name: 'sequenceId', type: 'string', required: true, description: `Sequence ID (seq_xxx)` },
+ { name: 'stepId', type: 'string', required: true, description: `Step ID (stp_xxx)` },
+ {
+ name: 'newMessage',
+ type: 'string',
+ required: false,
+ description: `Proposed new message body`,
+ },
+ {
+ name: 'newSubject',
+ type: 'string',
+ required: false,
+ description: `Proposed new subject line`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_push_leads_to_contacts',
+ description: `Push leads from the People Database into your CRM contacts, optionally adding them to a contact list.`,
+ params: [
+ {
+ name: 'profileIds',
+ type: 'array',
+ required: true,
+ description: `People Database lead IDs to push to contacts (max 1,000)`,
+ },
+ {
+ name: 'enrichFeatures',
+ type: 'array',
+ required: false,
+ description: `⚠️ COSTS CREDITS: Enrichment features to apply when pushing leads`,
+ },
+ {
+ name: 'listId',
+ type: 'string',
+ required: false,
+ description: `Target contact list ID in clt_xxx format. Omit to push to "all contacts". Get valid IDs from get_contact_lists — never invent or pass aliases like "all".`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_recall_memory',
+ description: `Retrieve stored memories from previous conversations to restore context about user preferences or past decisions.`,
+ params: [
+ {
+ name: 'topic',
+ type: 'string',
+ required: false,
+ description: `Exact topic key to retrieve (e.g. "preferred_tone"). Omit to retrieve all memories.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_report_unsupported_case',
+ description: `Report a feature request or unsupported use case to the product team. Use this ONLY when the user's request is something lemlist should support but the copilot cannot do yet, AND the user has agreed to have their feedback reported. Do NOT use for off-topic requests unrelated to lemlist. Always provide inputs in English, translate if needed.`,
+ params: [
+ {
+ name: 'description',
+ type: 'string',
+ required: true,
+ description: `What the user asked for that is not supported yet (MUST be in English)`,
+ },
+ {
+ name: 'conversationContext',
+ type: 'string',
+ required: false,
+ description: `Brief summary of the conversation context leading to this request (MUST be in English)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_save_business_context',
+ description: `Save the user business context for future conversations. Use this after collecting company information from the user to remember it across conversations.`,
+ params: [
+ { name: 'companyName', type: 'string', required: true, description: `Company name` },
+ {
+ name: 'mainActivity',
+ type: 'string',
+ required: false,
+ description: `What the company does`,
+ },
+ {
+ name: 'painPointsSolved',
+ type: 'array',
+ required: false,
+ description: `Pain points the company solves for customers`,
+ },
+ {
+ name: 'shortDescription',
+ type: 'string',
+ required: false,
+ description: `Company and offering summary`,
+ },
+ {
+ name: 'targetCompanySizes',
+ type: 'array',
+ required: false,
+ description: `Target sizes (1-10, 11-50, etc.)`,
+ },
+ {
+ name: 'targetIndustries',
+ type: 'array',
+ required: false,
+ description: `Target industries`,
+ },
+ { name: 'targetJobTitles', type: 'array', required: false, description: `Target job titles` },
+ {
+ name: 'valueProposition',
+ type: 'string',
+ required: false,
+ description: `Main value proposition of the company`,
+ },
+ { name: 'websiteUrl', type: 'string', required: false, description: `Website URL` },
+ ],
+ },
+ {
+ name: 'lemlistmcp_save_memory',
+ description: `Save a piece of information to persistent memory so it can be recalled in future conversations.`,
+ params: [
+ {
+ name: 'content',
+ type: 'string',
+ required: true,
+ description: `The information to remember (max 5000 chars, in the user language)`,
+ },
+ {
+ name: 'topic',
+ type: 'string',
+ required: true,
+ description: `Unique topic key in snake_case english (e.g. "preferred_tone", "icp_details", "campaign_naming")`,
+ },
+ {
+ name: 'scope',
+ type: 'string',
+ required: false,
+ description: `Scope: "user" (default, personal) or "team" (shared with all team members)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_search_campaign_leads',
+ description: `Find leads in your campaigns by email, lead ID, or by listing all leads in a campaign.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: false,
+ description: `Campaign ID. Required when listing all leads (no email/id). Optional filter when searching by email/id.`,
+ },
+ {
+ name: 'email',
+ type: 'string',
+ required: false,
+ description: `Lead email address to search for`,
+ },
+ {
+ name: 'id',
+ type: 'string',
+ required: false,
+ description: `Lead ID to search for (alternative to email)`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Max leads to return (default: 50, max: 100).`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Pagination offset (default: 0). Use nextOffset from a previous result to load more.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_search_companies',
+ description: `Search your team's Lemlist companies. Returns a paginated list with each company's id, domain, name, owner, and a curated \`crmSync\` block describing how the record is synced to your active CRM (Hubspot, Salesforce, or Pipedrive). Use the \`crmSyncStatus\` filter to find companies in a specific sync state — most notably \`unique_index_error_company\` to list lemlist companies blocked from syncing because another lemlist company already occupies their CRM record. For each result in that state, look at \`crmSync.errors[].metadata.alreadyExistingCompanyId\` — that is the canonical lemlist company you should remap contacts to before deleting the duplicate (see \`search_contacts\` with companyId, then \`delete_company\`).`,
+ params: [
+ {
+ name: 'crmSyncStatus',
+ type: 'string',
+ required: false,
+ description: `Filter by CRM sync status. Requires a CRM (Hubspot, Salesforce, Pipedrive) to be connected on the team — otherwise the call returns NO_CRM_CONNECTED.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Max companies per page (1-100, default 100).`,
+ },
+ {
+ name: 'page',
+ type: 'number',
+ required: false,
+ description: `Page number (1-based, default 1).`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Free-text search on the company name (case insensitive, accent insensitive).`,
+ },
+ {
+ name: 'sortBy',
+ type: 'string',
+ required: false,
+ description: `Sort field (default \`createdAt\`).`,
+ },
+ {
+ name: 'sortOrder',
+ type: 'string',
+ required: false,
+ description: `Sort direction (default \`desc\`).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_search_contacts',
+ description: `Search or list your team's Lemlist contacts by name, email, contact list, or attached company. Returns matching contacts with their details (ID, name, email, phone, job title, company, campaign count). All filters are optional — calling the tool without any filter returns the paginated list of all contacts of the team (useful for discovery, e.g. obtaining a Record ID before associating it with another resource). Use this to find if a contact already exists in Lemlist before creating a new one. You can filter by a specific contact list using listId (get valid IDs from get_contact_lists first). Use notInAnyCampaign=true to find contacts that are not part of any campaign (orphan contacts). To list contacts attached to a given company, use companyId (cpn_xxx) or one of companyDomain / companyLinkedinUrl / companySalesnavUrl — only one company* filter at a time. URL/domain filters return an empty list if no company matches. For searching leads WITHIN campaigns, use search_campaign_leads instead. For prospecting NEW leads from the People Database, use lemleads_search instead.`,
+ params: [
+ {
+ name: 'companyDomain',
+ type: 'string',
+ required: false,
+ description: `Filter contacts by their company's website domain (resolved to a companyId). Empty list if no company matches.`,
+ },
+ {
+ name: 'companyId',
+ type: 'string',
+ required: false,
+ description: `Filter contacts by attached lemlist company ID (cpn_xxx). Mutually exclusive with companyDomain/companyLinkedinUrl/companySalesnavUrl.`,
+ },
+ {
+ name: 'companyLinkedinUrl',
+ type: 'string',
+ required: false,
+ description: `Filter contacts by their company's LinkedIn URL (resolved to a companyId). Empty list if no company matches.`,
+ },
+ {
+ name: 'companySalesnavUrl',
+ type: 'string',
+ required: false,
+ description: `Filter contacts by their company's LinkedIn Sales Navigator URL (resolved to a companyId). Empty list if no company matches.`,
+ },
+ {
+ name: 'email',
+ type: 'string',
+ required: false,
+ description: `Exact email address to search for (takes priority over search parameter)`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of contacts to return (1-100, default: 20)`,
+ },
+ {
+ name: 'listId',
+ type: 'string',
+ required: false,
+ description: `Filter by contact list ID (clt_xxx format). Can be combined with search/email, or used alone to list all contacts in a list. Get valid IDs from get_contact_lists.`,
+ },
+ {
+ name: 'notInAnyCampaign',
+ type: 'boolean',
+ required: false,
+ description: `When true, only returns contacts that are not part of any campaign. Can be used alone or combined with other filters.`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Number of contacts to skip for pagination (default: 0)`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Free-text search: matches against contact full name or email address (min 2 chars, case-insensitive)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_search_help_center',
+ description: `Search the lemlist help center for official documentation and guides. Use this when you need to provide guidance on how to do something in lemlist that you cannot do directly via tools. Returns relevant help center articles with content excerpts and links. Do NOT use this for questions you can answer from context or tools.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Search query in English using 1-3 keywords (e.g., "inbox rotation", "email provider", "signals")`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_send_message',
+ description: `Send a message to a contact or lead via email, LinkedIn, WhatsApp, or SMS from the Lemlist inbox.`,
+ params: [
+ { name: 'channel', type: 'string', required: true, description: `Channel to send through.` },
+ {
+ name: 'message',
+ type: 'string',
+ required: true,
+ description: `Message content (channel-specific format).`,
+ },
+ {
+ name: 'sendUserId',
+ type: 'string',
+ required: true,
+ description: `User ID sending the message (usr_xxx format).`,
+ },
+ {
+ name: 'cc',
+ type: 'array',
+ required: false,
+ description: `channel="email": optional list of CC email addresses.`,
+ },
+ {
+ name: 'contactId',
+ type: 'string',
+ required: false,
+ description: `Contact ID to send to. Required if leadId is not provided.`,
+ },
+ {
+ name: 'from',
+ type: 'string',
+ required: false,
+ description: `channel="sms": sender phone number.`,
+ },
+ {
+ name: 'leadId',
+ type: 'string',
+ required: false,
+ description: `Lead ID to send to. Alternative to contactId.`,
+ },
+ {
+ name: 'sendUserEmail',
+ type: 'string',
+ required: false,
+ description: `channel="email": email address to send from.`,
+ },
+ {
+ name: 'sendUserMailboxId',
+ type: 'string',
+ required: false,
+ description: `channel="email": mailbox ID (usm_xxx) to use for sending.`,
+ },
+ {
+ name: 'sendUserWhatsappAccountId',
+ type: 'string',
+ required: false,
+ description: `channel="whatsapp": WhatsApp account ID (uwa_xxx) to use for sending.`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: false,
+ description: `channel="email": email subject line.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_set_campaign_senders',
+ description: `Assign team members as senders for a campaign's outreach messages.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `Campaign ID (cam_xxx format)`,
+ },
+ {
+ name: 'senderIds',
+ type: 'array',
+ required: true,
+ description: `Array of user IDs (usr_xxx format) to assign as senders. Get IDs from get_users (userIds: ["all"]).`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_set_campaign_state',
+ description: `Start, pause, archive, or unarchive a campaign to change its running state.`,
+ params: [
+ {
+ name: 'action',
+ type: 'string',
+ required: true,
+ description: `"start" to launch the campaign, "pause" to pause a running campaign, "archive" to archive a campaign, "unarchive" to restore an archived campaign`,
+ },
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `The campaign ID (cam_xxx format)`,
+ },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: false,
+ description: `REQUIRED for action="start" and action="archive": Must be true. Confirms user explicitly approved the action. Not required for pause or unarchive.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_test_email_account',
+ description: `Test SMTP/IMAP connectivity of an email account. No actual email sent. Use get_user_channels to find account ID.`,
+ params: [
+ {
+ name: 'emailAccountId',
+ type: 'string',
+ required: true,
+ description: `The email account ID to test (starts with usm_)`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_update_lead',
+ description: `Update standard fields on an existing lead (firstName, lastName, jobTitle, companyName, email, phone, linkedinUrl, picture, timezone, jobDescription, companyDomain). Requires leadId + at least one field to update. For custom variables, use update_lead_variables instead.`,
+ params: [
+ {
+ name: 'leadId',
+ type: 'string',
+ required: true,
+ description: `The lead ID (starts with lea_)`,
+ },
+ {
+ name: 'companyDomain',
+ type: 'string',
+ required: false,
+ description: `Lead company domain`,
+ },
+ { name: 'companyName', type: 'string', required: false, description: `Lead company name` },
+ { name: 'email', type: 'string', required: false, description: `Lead email address` },
+ { name: 'firstName', type: 'string', required: false, description: `Lead first name` },
+ {
+ name: 'jobDescription',
+ type: 'string',
+ required: false,
+ description: `Lead job description`,
+ },
+ { name: 'jobTitle', type: 'string', required: false, description: `Lead job title` },
+ { name: 'lastName', type: 'string', required: false, description: `Lead last name` },
+ {
+ name: 'linkedinUrl',
+ type: 'string',
+ required: false,
+ description: `Lead LinkedIn profile URL`,
+ },
+ { name: 'phone', type: 'string', required: false, description: `Lead phone number` },
+ { name: 'picture', type: 'string', required: false, description: `Lead profile picture URL` },
+ { name: 'timezone', type: 'string', required: false, description: `Lead timezone` },
+ ],
+ },
+ {
+ name: 'lemlistmcp_update_lead_variables',
+ description: `Set custom variables on an existing lead (upsert). Requires leadId + variables (key-value pairs of non-empty strings). Automatically handles both updating existing variables and adding new ones. IMPORTANT: Do NOT pass standard lead fields as variables — the following keys are FORBIDDEN and will be rejected: email, firstName, lastName, picture, phone, linkedinUrl, timezone, jobTitle, jobDescription, companyName, companyDomain. To update these fields, use the update_lead tool instead. Empty string values are rejected — omit the variable instead.`,
+ params: [
+ {
+ name: 'leadId',
+ type: 'string',
+ required: true,
+ description: `The lead ID (starts with lea_)`,
+ },
+ {
+ name: 'variables',
+ type: 'object',
+ required: true,
+ description: `Custom variables as key-value pairs to set (e.g., {"comicFrame": "panel_3", "tone": "friendly"}). Values must be non-empty strings — omit the variable rather than passing an empty string.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_update_sequence_step',
+ description: `Update a step in an existing campaign sequence. Requires user confirmation for email or content step changes.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: true,
+ description: `The campaign ID (required for status verification)`,
+ },
+ {
+ name: 'sequenceId',
+ type: 'string',
+ required: true,
+ description: `The sequence ID (starts with seq_)`,
+ },
+ {
+ name: 'stepId',
+ type: 'string',
+ required: true,
+ description: `The step ID to update (starts with stp_)`,
+ },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: true,
+ description: `REQUIRED: Must be true. Confirms user explicitly approved this change after seeing the preview. Only set to true after user says yes.`,
+ },
+ {
+ name: 'conditionKey',
+ type: 'string',
+ required: false,
+ description: `New condition key (for conditional steps only)`,
+ },
+ { name: 'delay', type: 'number', required: false, description: `New delay value in days` },
+ {
+ name: 'delayType',
+ type: 'string',
+ required: false,
+ description: `New delay type for conditional steps. "within" = must happen within delay days, "waitUntil" = wait indefinitely. For field-check conditions, use "within" with delay 0.`,
+ },
+ {
+ name: 'emailStatusFilter',
+ type: 'array',
+ required: false,
+ description: `Only for hasEmailAddress condition. Filter by email status: ["deliverable","risky","undeliverable","unverified"].`,
+ },
+ {
+ name: 'message',
+ type: 'string',
+ required: false,
+ description: `New email body content (for email steps, supports Liquid syntax)`,
+ },
+ {
+ name: 'method',
+ type: 'string',
+ required: false,
+ description: `New HTTP method for "api" (webhook) steps. Limited to GET/POST to stay iso with the lemlist UI editor. Ignored on non-api steps.`,
+ },
+ {
+ name: 'scoreComparator',
+ type: 'string',
+ required: false,
+ description: `Only for hasScore condition. "$gte" = score above or equal, "$lt" = score below.`,
+ },
+ {
+ name: 'scoreThreshold',
+ type: 'number',
+ required: false,
+ description: `Only for hasScore condition. Score threshold (0-100).`,
+ },
+ {
+ name: 'subject',
+ type: 'string',
+ required: false,
+ description: `New subject line (supports Liquid syntax: {{ firstName }}, {% if condition %}...{% endif %})`,
+ },
+ {
+ name: 'title',
+ type: 'string',
+ required: false,
+ description: `New task title (for manual/phone steps). Short label displayed in the review UI.`,
+ },
+ {
+ name: 'url',
+ type: 'string',
+ required: false,
+ description: `New webhook URL for "api" steps. Supports Liquid templating against lead variables (e.g. https://example.com/leads/{{ _id }}). Ignored on non-api steps.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_update_settings',
+ description: `Update settings for a campaign or warmup mailbox entity.`,
+ params: [
+ {
+ name: 'id',
+ type: 'string',
+ required: true,
+ description: `Entity ID. For "lemwarm": the mailbox ID (usm_xxx) — the same id used with get_settings type="lemwarm".`,
+ },
+ {
+ name: 'type',
+ type: 'string',
+ required: true,
+ description: `The type of settings to update. Only "lemwarm" is supported for now.`,
+ },
+ {
+ name: 'action',
+ type: 'string',
+ required: false,
+ description: `Optional state change. "start" activates warmup, "pause" stops it. Omit when only updating settings.`,
+ },
+ {
+ name: 'internalCommunicationPercent',
+ type: 'number',
+ required: false,
+ description: `Percentage of warmup emails sent to internal participants (0-100). Only applied when the team has the lemwarmInternalCommunication beta.`,
+ },
+ {
+ name: 'userConfirmed',
+ type: 'boolean',
+ required: false,
+ description: `REQUIRED when action="start": must be true after user confirms activating warmup.`,
+ },
+ {
+ name: 'warmEmailMax',
+ type: 'number',
+ required: false,
+ description: `Daily warmup email target (0-40). Server enforces 1-40 unless the team has the lemwarm0limit beta.`,
+ },
+ {
+ name: 'warmEmailRampup',
+ type: 'number',
+ required: false,
+ description: `Ramp-up increment per day (0-40). Server enforces 1-40 unless the team has the lemwarm0limit beta.`,
+ },
+ ],
+ },
+ {
+ name: 'lemlistmcp_validate_campaign_readiness',
+ description: `Validate that a campaign is ready to launch by checking step content, sender configuration, DNS health, and daily limits.`,
+ params: [
+ {
+ name: 'campaignId',
+ type: 'string',
+ required: false,
+ description: `Campaign ID (cam_xxx format). Provide this or campaignName.`,
+ },
+ {
+ name: 'campaignName',
+ type: 'string',
+ required: false,
+ description: `Campaign name to search for. Provide this or campaignId.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/mem0mcp.ts b/src/data/agent-connectors/mem0mcp.ts
new file mode 100644
index 000000000..26667acfa
--- /dev/null
+++ b/src/data/agent-connectors/mem0mcp.ts
@@ -0,0 +1,258 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'mem0mcp_add_memory',
+ description: `Store a new preference, fact, or conversation snippet. Requires at least one: user_id, agent_id, or run_id. Returns an event_id for async polling via get_event_status.`,
+ params: [
+ {
+ name: 'text',
+ type: 'string',
+ required: true,
+ description: `Plain sentence summarizing what to store.`,
+ },
+ {
+ name: 'agent_id',
+ type: 'string',
+ required: false,
+ description: `Optional agent identifier.`,
+ },
+ { name: 'app_id', type: 'string', required: false, description: `Optional app identifier.` },
+ {
+ name: 'messages',
+ type: 'string',
+ required: false,
+ description: `Structured conversation history with \`role\`/\`content\`. Use when you have multiple turns.`,
+ },
+ {
+ name: 'metadata',
+ type: 'string',
+ required: false,
+ description: `Attach arbitrary metadata JSON to the memory.`,
+ },
+ { name: 'run_id', type: 'string', required: false, description: `Optional run identifier.` },
+ {
+ name: 'source',
+ type: 'string',
+ required: false,
+ description: `Event source tag (defaults to MCP if omitted).`,
+ },
+ {
+ name: 'user_id',
+ type: 'string',
+ required: false,
+ description: `Override the default user scope for this write.`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_delete_all_memories',
+ description: `Delete every memory in the given user/agent/app/run but keep the entity.`,
+ params: [
+ {
+ name: 'agent_id',
+ type: 'string',
+ required: false,
+ description: `Optional agent scope to delete.`,
+ },
+ {
+ name: 'app_id',
+ type: 'string',
+ required: false,
+ description: `Optional app scope to delete.`,
+ },
+ {
+ name: 'run_id',
+ type: 'string',
+ required: false,
+ description: `Optional run scope to delete.`,
+ },
+ {
+ name: 'source',
+ type: 'string',
+ required: false,
+ description: `Event source tag (defaults to MCP if omitted).`,
+ },
+ {
+ name: 'user_id',
+ type: 'string',
+ required: false,
+ description: `User scope to delete; defaults to server user.`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_delete_entities',
+ description: `Remove an entity and cascade-delete its memories.`,
+ params: [
+ {
+ name: 'agent_id',
+ type: 'string',
+ required: false,
+ description: `Delete this agent and its memories.`,
+ },
+ {
+ name: 'app_id',
+ type: 'string',
+ required: false,
+ description: `Delete this app and its memories.`,
+ },
+ {
+ name: 'run_id',
+ type: 'string',
+ required: false,
+ description: `Delete this run and its memories.`,
+ },
+ {
+ name: 'user_id',
+ type: 'string',
+ required: false,
+ description: `Delete this user and its memories.`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_delete_memory',
+ description: `Delete one memory after the user confirms its memory_id.`,
+ params: [
+ {
+ name: 'memory_id',
+ type: 'string',
+ required: true,
+ description: `Exact memory_id to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_get_event_status',
+ description: `Check the status of a specific memory operation event by its ID.`,
+ params: [
+ {
+ name: 'event_id',
+ type: 'string',
+ required: true,
+ description: `UUID of the event to check.`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_get_memories',
+ description: `Page through memories using filters instead of search. Use filters to list specific memories. Common filter patterns: single user: {"AND": [{"user_id": "john"}]}, agent memories: {"AND": [{"agent_id": "agent_name"}]}. user_id is automatically added to filters if not provided.`,
+ params: [
+ {
+ name: 'filters',
+ type: 'string',
+ required: false,
+ description: `Structured filters; user_id injected automatically.`,
+ },
+ {
+ name: 'page',
+ type: 'string',
+ required: false,
+ description: `1-indexed page number when paginating.`,
+ },
+ {
+ name: 'page_size',
+ type: 'string',
+ required: false,
+ description: `Number of memories per page (default 10).`,
+ },
+ {
+ name: 'source',
+ type: 'string',
+ required: false,
+ description: `Event source tag (defaults to MCP if omitted).`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_get_memory',
+ description: `Fetch a single memory by ID.`,
+ params: [
+ {
+ name: 'memory_id',
+ type: 'string',
+ required: true,
+ description: `Exact memory_id to fetch.`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_list_entities',
+ description: `List which users/agents/apps/runs currently hold memories.`,
+ params: [],
+ },
+ {
+ name: 'mem0mcp_list_events',
+ description: `List memory operation events with optional filters and pagination.`,
+ params: [
+ {
+ name: 'event_type',
+ type: 'string',
+ required: false,
+ description: `Filter by type: ADD, SEARCH, UPDATE, DELETE, GET_ALL, DELETE_ALL.`,
+ },
+ { name: 'page', type: 'string', required: false, description: `1-indexed page number.` },
+ {
+ name: 'page_size',
+ type: 'string',
+ required: false,
+ description: `Events per page (default 50, max 100).`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_search_memories',
+ description: `Run a semantic search over existing memories. Use filters to narrow results. Common filter patterns: single user: {"AND": [{"user_id": "john"}]}, agent memories: {"AND": [{"agent_id": "agent_name"}]}. user_id is automatically added to filters if not provided.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Natural language description of what to find.`,
+ },
+ {
+ name: 'filters',
+ type: 'string',
+ required: false,
+ description: `Additional filter clauses (user_id injected automatically).`,
+ },
+ {
+ name: 'source',
+ type: 'string',
+ required: false,
+ description: `Event source tag (defaults to MCP if omitted).`,
+ },
+ {
+ name: 'top_k',
+ type: 'string',
+ required: false,
+ description: `Number of results to return (1-1000, default 10).`,
+ },
+ ],
+ },
+ {
+ name: 'mem0mcp_update_memory',
+ description: `Overwrite an existing memory's text.`,
+ params: [
+ {
+ name: 'memory_id',
+ type: 'string',
+ required: true,
+ description: `Exact memory_id to overwrite.`,
+ },
+ {
+ name: 'text',
+ type: 'string',
+ required: true,
+ description: `Replacement text for the memory.`,
+ },
+ {
+ name: 'source',
+ type: 'string',
+ required: false,
+ description: `Event source tag (defaults to MCP if omitted).`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/memberstackmcp.ts b/src/data/agent-connectors/memberstackmcp.ts
new file mode 100644
index 000000000..2f66aa201
--- /dev/null
+++ b/src/data/agent-connectors/memberstackmcp.ts
@@ -0,0 +1,108 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'memberstackmcp_createapp',
+ description: `Create a new Memberstack app (project) with isolated members, plans, data tables, and gated content. Only use when the user explicitly requests a new app. After creation the session context automatically switches to the new app.`,
+ params: [
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `Name for the new app. Maximum 24 characters.`,
+ },
+ {
+ name: 'stack',
+ type: 'string',
+ required: true,
+ description: `Platform/stack for the app. Accepted values: WEBFLOW, VANILLA, WORDPRESS.`,
+ },
+ {
+ name: 'templateId',
+ type: 'string',
+ required: false,
+ description: `Webflow template ID to scaffold the app from. Only applicable for WEBFLOW stack.`,
+ },
+ {
+ name: 'wordpressPageBuilder',
+ type: 'string',
+ required: false,
+ description: `WordPress page builder plugin. Accepted values: GUTENBERG, ELEMENTOR, DIVI, BEAVER_BUILDER, BRICKS, CORNERSTONE, OTHER.`,
+ },
+ ],
+ },
+ {
+ name: 'memberstackmcp_currentapp',
+ description: `Get the currently active Memberstack app, including its environment mode (SANDBOX or LIVE), user role, and domain configuration.`,
+ params: [],
+ },
+ {
+ name: 'memberstackmcp_currentuser',
+ description: `Get the authenticated dashboard user's profile and the list of Memberstack apps they can manage.`,
+ params: [],
+ },
+ {
+ name: 'memberstackmcp_explore_tools',
+ description: `Browse available Memberstack tools by category or search term. Returns tool names with brief descriptions. Use get_tool_schema to load the full schema for a specific tool before calling it.`,
+ params: [
+ {
+ name: 'category',
+ type: 'string',
+ required: false,
+ description: `Filter tools by category. Accepted values: core, members, plans, dataTables, gatedContent, teams, customFields, stripe. Omit to see all.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Search term to filter tools by name or description.`,
+ },
+ ],
+ },
+ {
+ name: 'memberstackmcp_get_tool_schema',
+ description: `Load the full input schema and usage instructions for a specific Memberstack tool by name.`,
+ params: [
+ {
+ name: 'toolName',
+ type: 'string',
+ required: true,
+ description: `Exact tool name returned by explore_tools, e.g. getMember.`,
+ },
+ ],
+ },
+ {
+ name: 'memberstackmcp_getmemberstackenvironment',
+ description: `Get the current environment (LIVE or SANDBOX) used for member-related operations.`,
+ params: [],
+ },
+ {
+ name: 'memberstackmcp_listapps',
+ description: `List all Memberstack apps accessible to the dashboard user, including roles and creation dates.`,
+ params: [],
+ },
+ {
+ name: 'memberstackmcp_switchapp',
+ description: `Set the active app context so all subsequent operations target the specified app.`,
+ params: [
+ {
+ name: 'appId',
+ type: 'string',
+ required: true,
+ description: `Unique identifier of the app to switch to. Retrieve app IDs using listApps.`,
+ },
+ ],
+ },
+ {
+ name: 'memberstackmcp_switchmemberstackenvironment',
+ description: `Switch the environment (LIVE or SANDBOX) used for member operations. Only affects member-related tools.`,
+ params: [
+ {
+ name: 'environment',
+ type: 'string',
+ required: true,
+ description: `Environment for member operations. Accepted values: LIVE (production), SANDBOX (test data).`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/motionmcp.ts b/src/data/agent-connectors/motionmcp.ts
new file mode 100644
index 000000000..50d92b47d
--- /dev/null
+++ b/src/data/agent-connectors/motionmcp.ts
@@ -0,0 +1,415 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'motionmcp_get_auth_context',
+ description: `Retrieve the authenticated user's organizations and workspaces. Returns the workspaceId required by all other Motion tools.`,
+ params: [],
+ },
+ {
+ name: 'motionmcp_get_brand_by_domain',
+ description: `Resolve a brandId from a website domain or URL. Returns null if no brand is found for the given domain.`,
+ params: [
+ {
+ name: 'brandUrl',
+ type: 'string',
+ required: true,
+ description: `Brand URL or domain, for example \`https://example.com\``,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID for authorization`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_creative_insights',
+ description: `Retrieve creative performance insights for your own ads in a workspace. Either datePreset or both startDate and endDate must be provided.`,
+ params: [
+ {
+ name: 'insightType',
+ type: 'string',
+ required: true,
+ description: `Primary metric to sort/rank creatives by`,
+ },
+ {
+ name: 'organizationId',
+ type: 'string',
+ required: true,
+ description: `The organization ID from get_auth_context`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID from get_auth_context`,
+ },
+ {
+ name: 'chartKPIs',
+ type: 'array',
+ required: false,
+ description: `Optional KPI fields to include in chart KPI metrics.`,
+ },
+ {
+ name: 'creativeAssetIds',
+ type: 'array',
+ required: false,
+ description: `Optional creative asset IDs to narrow results.`,
+ },
+ {
+ name: 'datePreset',
+ type: 'string',
+ required: false,
+ description: `Predefined date range. Omit if using startDate/endDate.`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: false,
+ description: `Custom end date (YYYY-MM-DD). Requires datePreset=CUSTOM.`,
+ },
+ {
+ name: 'filters',
+ type: 'array',
+ required: false,
+ description: `Nested filter groups to narrow which creatives are returned. Outer array = AND (all groups must pass); inner array = OR (any filter in a group can match). For text fields (campaignName, adsetName, adName): use "value" (singular) for case-insensitive substring match, or "values" (array) for exact match. For metric fields: set "metric": true and use "value" for thresholds or "values" for ranges. Example: [[{"field":"spend","type":"GREATER_THAN","value":"100","metric":true}],[{"field":"campaignName","type":"includes","value":"Prospecting"}]] returns creatives where spend > 100 AND campaign name contains "Prospecting".`,
+ },
+ {
+ name: 'groupBy',
+ type: 'string',
+ required: false,
+ description: `How to group ranked rows. Options: 'creative' (default — one row per creative asset), 'adId' (one row per ad — for ad-level optimization, comparing same creative across ad sets, deciding which ad to pause/scale), 'name' (by ad name), 'copy' (by ad body text — 'which copy performs best?'), 'headline' (by headline text), 'landingPage' (by destination URL — 'which landing page converts best?').`,
+ },
+ {
+ name: 'includeEntityCategoryValues',
+ type: 'boolean',
+ required: false,
+ description: `Include the full taxonomy catalog (all possible values) per glossary category. Default false — only the values applied to each creative are returned. Set true when you need to see all available tags for coverage gap analysis.`,
+ },
+ {
+ name: 'includeGlossary',
+ type: 'boolean',
+ required: false,
+ description: `Include creative taxonomy/glossary tags per creative. Default false to minimize payload. Set true for creative pattern analysis.`,
+ },
+ {
+ name: 'insightGroups',
+ type: 'array',
+ required: false,
+ description: `Metric groups per creative. Defaults: spendState, performance, motion, click.`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Max number of creatives to return`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: false,
+ description: `Custom start date (YYYY-MM-DD). Requires datePreset=CUSTOM.`,
+ },
+ {
+ name: 'tableKPIs',
+ type: 'array',
+ required: false,
+ description: `Optional KPI fields to include in table KPI metrics.`,
+ },
+ {
+ name: 'withAggregatedInsights',
+ type: 'boolean',
+ required: false,
+ description: `Include account-level aggregated metrics`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_creative_summary',
+ description: `Fetch a compact AI-generated summary for a specific creative asset in a workspace.`,
+ params: [
+ {
+ name: 'creativeEntityId',
+ type: 'string',
+ required: true,
+ description: `Mongo ObjectId of the creative entity`,
+ },
+ {
+ name: 'creativeFormat',
+ type: 'string',
+ required: true,
+ description: `Creative format from the source tool. Pass through the source value; \`unknown\` may fail if no compatible summary prompt exists.`,
+ },
+ {
+ name: 'creativeOrigin',
+ type: 'string',
+ required: true,
+ description: `Source/origin of the creative`,
+ },
+ {
+ name: 'organizationId',
+ type: 'string',
+ required: true,
+ description: `The organization ID from get_auth_context`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID from get_auth_context`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_creative_transcript',
+ description: `Fetch the spoken transcript for a video creative by its entity ID and workspace.`,
+ params: [
+ {
+ name: 'creativeEntityId',
+ type: 'string',
+ required: true,
+ description: `Mongo ObjectId of the creative entity`,
+ },
+ {
+ name: 'creativeOrigin',
+ type: 'string',
+ required: true,
+ description: `Source/origin of the creative`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID from get_auth_context`,
+ },
+ {
+ name: 'creativeFormat',
+ type: 'string',
+ required: false,
+ description: `Creative format (video or image). Transcript data is only available for video creatives; image creatives will return empty transcript data.`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_demographic_breakdown',
+ description: `Return ad performance broken down by age and gender demographics for a workspace.`,
+ params: [
+ {
+ name: 'organizationId',
+ type: 'string',
+ required: true,
+ description: `The organization ID from get_auth_context`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID from get_auth_context`,
+ },
+ { name: 'datePreset', type: 'string', required: false, description: `Predefined date range` },
+ ],
+ },
+ {
+ name: 'motionmcp_get_glossary_values',
+ description: `Return the workspace's glossary taxonomy — categories and their allowed tag values.`,
+ params: [
+ { name: 'workspaceId', type: 'string', required: true, description: `The workspace ID` },
+ {
+ name: 'categoryNames',
+ type: 'array',
+ required: false,
+ description: `Optional list of glossary category internal names`,
+ },
+ {
+ name: 'customOnly',
+ type: 'boolean',
+ required: false,
+ description: `Return only custom glossary categories`,
+ },
+ {
+ name: 'includeCreativeIds',
+ type: 'boolean',
+ required: false,
+ description: `Include creative IDs in value buckets`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_inspo_brand_context',
+ description: `Retrieve strategic brand context for an Inspo brand, including positioning, voice, tone, messaging angles, and customer voice analysis.`,
+ params: [
+ {
+ name: 'brandId',
+ type: 'string',
+ required: true,
+ description: `The brand ID to get Inspo context for`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID for authorization`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_inspo_creatives',
+ description: `Retrieve Inspo creatives for one or more brands by brand ID, with optional filters for date range, format, and platform.`,
+ params: [
+ {
+ name: 'brandIds',
+ type: 'array',
+ required: true,
+ description: `One or more brand IDs to fetch Inspo creatives for`,
+ },
+ {
+ name: 'launchDate',
+ type: 'string',
+ required: false,
+ description: `Optional launch date window. When omitted, returns creatives regardless of launch date. Available: LAST_7_DAYS, LAST_14_DAYS, LAST_30_DAYS, LAST_90_DAYS.`,
+ },
+ {
+ name: 'limit',
+ type: 'integer',
+ required: false,
+ description: `Max creatives to return. Defaults to 50. For larger pulls, increase up to 1000.`,
+ },
+ { name: 'sort', type: 'string', required: false, description: `Sort order by launch date` },
+ { name: 'status', type: 'string', required: false, description: `Optional ad status filter` },
+ {
+ name: 'withGlossary',
+ type: 'boolean',
+ required: false,
+ description: `Include Motion glossary tags for returned creatives`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_reports',
+ description: `Return saved reports for a workspace. Omit reportId to list all reports; provide reportId to fetch a specific report with full data.`,
+ params: [
+ {
+ name: 'organizationId',
+ type: 'string',
+ required: true,
+ description: `The organization ID from get_auth_context`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID from get_auth_context`,
+ },
+ {
+ name: 'reportId',
+ type: 'string',
+ required: false,
+ description: `Specific report ID. Omit to list all reports.`,
+ },
+ {
+ name: 'reportTypes',
+ type: 'array',
+ required: false,
+ description: `Filter by report type when listing. Omit to include all types.`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_workspace_brand',
+ description: `Return the workspace's own brand reference ID for use with brand context and competitor tools.`,
+ params: [
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID for authorization`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_get_workspace_competitors',
+ description: `List competitor brands the workspace is tracking, with optional filtering by specific brand IDs.`,
+ params: [
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID for authorization`,
+ },
+ {
+ name: 'brandIds',
+ type: 'array',
+ required: false,
+ description: `Optional competitor brand IDs to fetch. Resolve IDs first when narrowing to a specific competitor set.`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_search_brands',
+ description: `Search for brands by name or domain query. Returns matching brands with optional verbose catalog fields.`,
+ params: [
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Search query (brand name or domain)`,
+ },
+ {
+ name: 'workspaceId',
+ type: 'string',
+ required: true,
+ description: `The workspace ID for authorization`,
+ },
+ {
+ name: 'verbose',
+ type: 'boolean',
+ required: false,
+ description: `When true, include the full per-brand catalog (visual formats, top landing pages). Defaults to false for lean discovery responses.`,
+ },
+ ],
+ },
+ {
+ name: 'motionmcp_submit_feedback',
+ description: `Submit feedback about this Motion MCP server to the Motion product team.`,
+ params: [
+ {
+ name: 'category',
+ type: 'string',
+ required: true,
+ description: `Type of feedback: 'bug' for tool errors or incorrect behavior, 'feature_request' for missing capabilities, 'workflow_friction' for flows that are overly complex.`,
+ },
+ {
+ name: 'comment',
+ type: 'string',
+ required: true,
+ description: `Concise, actionable description. For bugs: what you did, what happened, what you expected. For feature requests: what is missing and why. For workflow friction: what the user tried and how it could be simpler.`,
+ },
+ {
+ name: 'intent',
+ type: 'string',
+ required: true,
+ description: `Briefly describe the wider context task, and why this tool was chosen. Omit argument values, PII/secrets. Use English.`,
+ },
+ {
+ name: 'query',
+ type: 'string',
+ required: false,
+ description: `The user's original question or request that led to this feedback. Include enough context for the Motion team to reproduce the issue — e.g. 'Show me top performing creatives for Q1' or 'Compare my hook rates to competitors'. Omit PII.`,
+ },
+ {
+ name: 'tags',
+ type: 'array',
+ required: false,
+ description: `Optional tags to categorize feedback (e.g. 'ux', 'performance', 'accuracy', 'missing-data').`,
+ },
+ {
+ name: 'toolName',
+ type: 'string',
+ required: false,
+ description: `The name of the specific Motion MCP tool this feedback is about.`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/outlook.ts b/src/data/agent-connectors/outlook.ts
index fb0b5dcfd..38b6e57a8 100644
--- a/src/data/agent-connectors/outlook.ts
+++ b/src/data/agent-connectors/outlook.ts
@@ -1,6 +1,17 @@
import type { Tool } from '../../types/agent-connectors'
export const tools: Tool[] = [
+ {
+ name: 'outlook_accept_event',
+ description: `Accept a calendar event invitation.`,
+ params: [
+ { name: 'event_id', type: 'string', required: true, description: `Event ID.` },
+ { name: 'comment', type: 'string', required: false, description: `Response comment.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'send_response', type: 'boolean', required: false, description: `Send response.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
{
name: 'outlook_create_calendar_event',
description: `Create a new calendar event in the user's Outlook calendar. Supports attendees, recurrence, reminders, online meetings, multiple locations, and event properties.`,
@@ -10,28 +21,118 @@ export const tools: Tool[] = [
{ name: 'start_datetime', type: 'string', required: true, description: `No description.` },
{ name: 'start_timezone', type: 'string', required: true, description: `No description.` },
{ name: 'subject', type: 'string', required: true, description: `No description.` },
- { name: 'attendees_optional', type: 'string', required: false, description: `Array of email addresses for optional attendees` },
- { name: 'attendees_required', type: 'string', required: false, description: `Array of email addresses for required attendees` },
- { name: 'attendees_resource', type: 'string', required: false, description: `Array of email addresses for resources (meeting rooms, equipment)` },
+ {
+ name: 'attendees_optional',
+ type: 'string',
+ required: false,
+ description: `Array of email addresses for optional attendees`,
+ },
+ {
+ name: 'attendees_required',
+ type: 'string',
+ required: false,
+ description: `Array of email addresses for required attendees`,
+ },
+ {
+ name: 'attendees_resource',
+ type: 'string',
+ required: false,
+ description: `Array of email addresses for resources (meeting rooms, equipment)`,
+ },
{ name: 'body_content', type: 'string', required: false, description: `No description.` },
{ name: 'body_contentType', type: 'string', required: false, description: `No description.` },
- { name: 'hideAttendees', type: 'boolean', required: false, description: `When true, each attendee only sees themselves` },
- { name: 'importance', type: 'string', required: false, description: `Event importance level` },
+ {
+ name: 'hideAttendees',
+ type: 'boolean',
+ required: false,
+ description: `When true, each attendee only sees themselves`,
+ },
+ {
+ name: 'importance',
+ type: 'string',
+ required: false,
+ description: `Event importance level`,
+ },
{ name: 'isAllDay', type: 'boolean', required: false, description: `Mark as all-day event` },
- { name: 'isOnlineMeeting', type: 'boolean', required: false, description: `Create an online meeting (Teams/Skype)` },
- { name: 'isReminderOn', type: 'boolean', required: false, description: `Enable or disable reminder` },
+ {
+ name: 'isOnlineMeeting',
+ type: 'boolean',
+ required: false,
+ description: `Create an online meeting (Teams/Skype)`,
+ },
+ {
+ name: 'isReminderOn',
+ type: 'boolean',
+ required: false,
+ description: `Enable or disable reminder`,
+ },
{ name: 'location', type: 'string', required: false, description: `No description.` },
- { name: 'locations', type: 'string', required: false, description: `JSON array of location objects with displayName, address, coordinates` },
- { name: 'onlineMeetingProvider', type: 'string', required: false, description: `Online meeting provider` },
- { name: 'recurrence_days_of_week', type: 'string', required: false, description: `Days of week for weekly recurrence (comma-separated)` },
- { name: 'recurrence_end_date', type: 'string', required: false, description: `End date for recurrence (YYYY-MM-DD), required if range_type is endDate` },
- { name: 'recurrence_interval', type: 'integer', required: false, description: `How often the event recurs (e.g., every 2 weeks = 2)` },
- { name: 'recurrence_occurrences', type: 'integer', required: false, description: `Number of occurrences, required if range_type is numbered` },
- { name: 'recurrence_range_type', type: 'string', required: false, description: `How the recurrence ends` },
- { name: 'recurrence_start_date', type: 'string', required: false, description: `Start date for recurrence (YYYY-MM-DD)` },
- { name: 'recurrence_type', type: 'string', required: false, description: `Recurrence pattern type` },
- { name: 'reminderMinutesBeforeStart', type: 'integer', required: false, description: `Minutes before event start to show reminder` },
- { name: 'sensitivity', type: 'string', required: false, description: `Event sensitivity/privacy level` },
+ {
+ name: 'locations',
+ type: 'string',
+ required: false,
+ description: `JSON array of location objects with displayName, address, coordinates`,
+ },
+ {
+ name: 'onlineMeetingProvider',
+ type: 'string',
+ required: false,
+ description: `Online meeting provider`,
+ },
+ {
+ name: 'recurrence_days_of_week',
+ type: 'string',
+ required: false,
+ description: `Days of week for weekly recurrence (comma-separated)`,
+ },
+ {
+ name: 'recurrence_end_date',
+ type: 'string',
+ required: false,
+ description: `End date for recurrence (YYYY-MM-DD), required if range_type is endDate`,
+ },
+ {
+ name: 'recurrence_interval',
+ type: 'integer',
+ required: false,
+ description: `How often the event recurs (e.g., every 2 weeks = 2)`,
+ },
+ {
+ name: 'recurrence_occurrences',
+ type: 'integer',
+ required: false,
+ description: `Number of occurrences, required if range_type is numbered`,
+ },
+ {
+ name: 'recurrence_range_type',
+ type: 'string',
+ required: false,
+ description: `How the recurrence ends`,
+ },
+ {
+ name: 'recurrence_start_date',
+ type: 'string',
+ required: false,
+ description: `Start date for recurrence (YYYY-MM-DD)`,
+ },
+ {
+ name: 'recurrence_type',
+ type: 'string',
+ required: false,
+ description: `Recurrence pattern type`,
+ },
+ {
+ name: 'reminderMinutesBeforeStart',
+ type: 'integer',
+ required: false,
+ description: `Minutes before event start to show reminder`,
+ },
+ {
+ name: 'sensitivity',
+ type: 'string',
+ required: false,
+ description: `Event sensitivity/privacy level`,
+ },
{ name: 'showAs', type: 'string', required: false, description: `Free/busy status` },
],
},
@@ -39,101 +140,476 @@ export const tools: Tool[] = [
name: 'outlook_create_contact',
description: `Create a new contact in the user's mailbox with name, email addresses, and phone numbers.`,
params: [
- { name: 'givenName', type: 'string', required: true, description: `First name of the contact` },
+ {
+ name: 'givenName',
+ type: 'string',
+ required: true,
+ description: `First name of the contact`,
+ },
{ name: 'surname', type: 'string', required: true, description: `Last name of the contact` },
- { name: 'businessPhones', type: 'array', required: false, description: `Array of business phone numbers` },
+ {
+ name: 'businessPhones',
+ type: 'array',
+ required: false,
+ description: `Array of business phone numbers`,
+ },
{ name: 'companyName', type: 'string', required: false, description: `Company name` },
- { name: 'emailAddresses', type: 'array', required: false, description: `Array of email address objects with 'address' and optional 'name' fields` },
+ {
+ name: 'emailAddresses',
+ type: 'array',
+ required: false,
+ description: `Array of email address objects with 'address' and optional 'name' fields`,
+ },
{ name: 'jobTitle', type: 'string', required: false, description: `Job title` },
{ name: 'mobilePhone', type: 'string', required: false, description: `Mobile phone number` },
],
},
+ {
+ name: 'outlook_create_draft_message',
+ description: `Create a new email draft in the mailbox.`,
+ params: [
+ { name: 'bcc_recipients', type: 'string', required: false, description: `BCC recipients.` },
+ { name: 'body', type: 'string', required: false, description: `Email body content.` },
+ { name: 'body_type', type: 'string', required: false, description: `Body content type.` },
+ { name: 'cc_recipients', type: 'string', required: false, description: `CC recipients.` },
+ { name: 'importance', type: 'string', required: false, description: `Importance.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'subject', type: 'string', required: false, description: `Email subject.` },
+ { name: 'to_recipients', type: 'string', required: false, description: `To recipients.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_create_forward_draft',
+ description: `Create a forward draft for a specific message.`,
+ params: [
+ { name: 'message_id', type: 'string', required: true, description: `Message ID.` },
+ { name: 'comment', type: 'string', required: false, description: `Forward comment.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'to_recipients', type: 'string', required: false, description: `To recipients.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_create_mail_folder',
+ description: `Create a new mail folder in the mailbox.`,
+ params: [
+ { name: 'display_name', type: 'string', required: true, description: `Folder name.` },
+ { name: 'is_hidden', type: 'boolean', required: false, description: `Hidden folder.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_create_message_rule',
+ description: `Create a new inbox message rule.`,
+ params: [
+ { name: 'display_name', type: 'string', required: true, description: `Rule name.` },
+ { name: 'actions', type: 'object', required: false, description: `Rule actions.` },
+ { name: 'conditions', type: 'object', required: false, description: `Rule conditions.` },
+ {
+ name: 'exceptions',
+ type: 'object',
+ required: false,
+ description: `Exception conditions for the rule.`,
+ },
+ { name: 'is_enabled', type: 'boolean', required: false, description: `Enable rule.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'sequence', type: 'integer', required: false, description: `Rule sequence.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_create_reply_all_draft',
+ description: `Create a reply-all draft for a specific message.`,
+ params: [
+ { name: 'message_id', type: 'string', required: true, description: `Message ID.` },
+ { name: 'comment', type: 'string', required: false, description: `Reply comment.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_create_reply_draft',
+ description: `Create a reply draft for a specific message.`,
+ params: [
+ { name: 'message_id', type: 'string', required: true, description: `Message ID.` },
+ { name: 'comment', type: 'string', required: false, description: `Reply comment.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_decline_event',
+ description: `Decline a calendar event invitation.`,
+ params: [
+ { name: 'event_id', type: 'string', required: true, description: `Event ID.` },
+ { name: 'comment', type: 'string', required: false, description: `Response comment.` },
+ {
+ name: 'proposed_new_time',
+ type: 'object',
+ required: false,
+ description: `Proposed new meeting time.`,
+ },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'send_response', type: 'boolean', required: false, description: `Send response.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
{
name: 'outlook_delete_calendar_event',
description: `Delete a calendar event by ID.`,
+ params: [{ name: 'event_id', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'outlook_delete_contact',
+ description: `Permanently delete a contact.`,
params: [
- { name: 'event_id', type: 'string', required: true, description: `No description.` },
+ { name: 'contact_id', type: 'string', required: true, description: `Contact ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_delete_mail_folder',
+ description: `Permanently delete a mail folder and its contents.`,
+ params: [
+ { name: 'folder_id', type: 'string', required: true, description: `Folder ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_delete_message',
+ description: `Permanently delete an email message.`,
+ params: [
+ { name: 'message_id', type: 'string', required: true, description: `Message ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_delete_message_rule',
+ description: `Delete an inbox message rule.`,
+ params: [
+ { name: 'rule_id', type: 'string', required: true, description: `Rule ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_forward_event',
+ description: `Forward a calendar event to other people.`,
+ params: [
+ { name: 'comment', type: 'string', required: true, description: `Forward comment.` },
+ { name: 'event_id', type: 'string', required: true, description: `Event ID.` },
+ { name: 'to_recipients', type: 'string', required: true, description: `To recipients.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
{
name: 'outlook_get_attachment',
description: `Download a specific attachment from an Outlook email message by attachment ID. Returns the full attachment including base64-encoded file content in the contentBytes field. Use List Attachments to get the attachment ID first.`,
params: [
- { name: 'attachment_id', type: 'string', required: true, description: `The ID of the attachment to download.` },
- { name: 'message_id', type: 'string', required: true, description: `The ID of the message containing the attachment.` },
+ {
+ name: 'attachment_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the attachment to download.`,
+ },
+ {
+ name: 'message_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the message containing the attachment.`,
+ },
],
},
{
name: 'outlook_get_calendar_event',
description: `Retrieve an existing calendar event by ID from the user's Outlook calendar.`,
+ params: [{ name: 'event_id', type: 'string', required: true, description: `No description.` }],
+ },
+ {
+ name: 'outlook_get_contact',
+ description: `Retrieve a specific contact by ID.`,
+ params: [
+ { name: 'contact_id', type: 'string', required: true, description: `Contact ID.` },
+ { name: 'expand', type: 'string', required: false, description: `Expand relationships.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'select', type: 'string', required: false, description: `Select properties.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_get_mail_tips',
+ description: `Get mail tips for a list of recipients before sending an email.`,
params: [
- { name: 'event_id', type: 'string', required: true, description: `No description.` },
+ {
+ name: 'email_addresses',
+ type: 'array',
+ required: true,
+ description: `Recipient email addresses.`,
+ },
+ { name: 'mail_tips_options', type: 'string', required: true, description: `Mail tip types.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
{
name: 'outlook_get_message',
description: `Retrieve a specific email message by ID from the user's Outlook mailbox, including full body content, sender, recipients, attachments info, and metadata.`,
params: [
- { name: 'message_id', type: 'string', required: true, description: `The ID of the message to retrieve.` },
+ {
+ name: 'message_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the message to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'outlook_get_user_presence',
+ description: `Get the presence status of a specific user.`,
+ params: [
+ { name: 'user_id', type: 'string', required: true, description: `User ID or email.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
{
name: 'outlook_list_attachments',
description: `List all attachments on a specific Outlook email message. Returns attachment metadata including ID, name, size, and content type. Use the attachment ID with Get Attachment to download the file content.`,
params: [
- { name: 'message_id', type: 'string', required: true, description: `The ID of the message to list attachments for.` },
+ {
+ name: 'message_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the message to list attachments for.`,
+ },
],
},
{
name: 'outlook_list_calendar_events',
description: `List calendar events from the user's Outlook calendar with filtering, sorting, pagination, and field selection.`,
params: [
- { name: 'filter', type: 'string', required: false, description: `OData filter expression to filter events (e.g., startsWith(subject,'All'))` },
- { name: 'orderby', type: 'string', required: false, description: `OData orderby expression to sort events (e.g., start/dateTime desc)` },
- { name: 'select', type: 'string', required: false, description: `Comma-separated list of properties to include in the response` },
- { name: 'skip', type: 'number', required: false, description: `Number of events to skip for pagination` },
- { name: 'top', type: 'number', required: false, description: `Maximum number of events to return` },
+ {
+ name: 'filter',
+ type: 'string',
+ required: false,
+ description: `OData filter expression to filter events (e.g., startsWith(subject,'All'))`,
+ },
+ {
+ name: 'orderby',
+ type: 'string',
+ required: false,
+ description: `OData orderby expression to sort events (e.g., start/dateTime desc)`,
+ },
+ {
+ name: 'select',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of properties to include in the response`,
+ },
+ {
+ name: 'skip',
+ type: 'number',
+ required: false,
+ description: `Number of events to skip for pagination`,
+ },
+ {
+ name: 'top',
+ type: 'number',
+ required: false,
+ description: `Maximum number of events to return`,
+ },
+ ],
+ },
+ {
+ name: 'outlook_list_calendars',
+ description: `Retrieve all calendars in the user mailbox.`,
+ params: [
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'skip', type: 'integer', required: false, description: `Skip count.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ { name: 'top', type: 'integer', required: false, description: `Page size.` },
],
},
{
name: 'outlook_list_contacts',
description: `List all contacts in the user's mailbox with support for filtering, pagination, and field selection.`,
params: [
- { name: '$filter', type: 'string', required: false, description: `Filter expression to narrow results (e.g., "emailAddresses/any(a:a/address eq 'user@example.com')")` },
- { name: '$orderby', type: 'string', required: false, description: `Property to sort by (e.g., "displayName")` },
- { name: '$select', type: 'string', required: false, description: `Comma-separated list of properties to return (e.g., "displayName,emailAddresses,phoneNumbers")` },
- { name: '$skip', type: 'integer', required: false, description: `Number of contacts to skip for pagination` },
- { name: '$top', type: 'integer', required: false, description: `Number of contacts to return (default: 10)` },
+ {
+ name: '$filter',
+ type: 'string',
+ required: false,
+ description: `Filter expression to narrow results (e.g., "emailAddresses/any(a:a/address eq 'user@example.com')")`,
+ },
+ {
+ name: '$orderby',
+ type: 'string',
+ required: false,
+ description: `Property to sort by (e.g., "displayName")`,
+ },
+ {
+ name: '$select',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of properties to return (e.g., "displayName,emailAddresses,phoneNumbers")`,
+ },
+ {
+ name: '$skip',
+ type: 'integer',
+ required: false,
+ description: `Number of contacts to skip for pagination`,
+ },
+ {
+ name: '$top',
+ type: 'integer',
+ required: false,
+ description: `Number of contacts to return (default: 10)`,
+ },
+ ],
+ },
+ {
+ name: 'outlook_list_mail_folders',
+ description: `List all mail folders in the user mailbox.`,
+ params: [
+ {
+ name: 'include_hidden',
+ type: 'boolean',
+ required: false,
+ description: `Include hidden folders.`,
+ },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'skip', type: 'integer', required: false, description: `Skip count.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ { name: 'top', type: 'integer', required: false, description: `Page size.` },
+ ],
+ },
+ {
+ name: 'outlook_list_message_rules',
+ description: `List all inbox message rules for the user.`,
+ params: [
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
{
name: 'outlook_list_messages',
description: `List all messages in the user's mailbox with support for filtering, pagination, and field selection. Returns 10 messages by default.`,
params: [
- { name: '$filter', type: 'string', required: false, description: `Filter expression to narrow results (e.g., "from/emailAddress/address eq 'user@example.com'")` },
- { name: '$orderby', type: 'string', required: false, description: `Property to sort by (e.g., "receivedDateTime desc")` },
- { name: '$select', type: 'string', required: false, description: `Comma-separated list of properties to return (e.g., "subject,from,receivedDateTime")` },
- { name: '$skip', type: 'integer', required: false, description: `Number of messages to skip for pagination` },
- { name: '$top', type: 'integer', required: false, description: `Number of messages to return (1-1000, default: 10)` },
+ {
+ name: '$filter',
+ type: 'string',
+ required: false,
+ description: `Filter expression to narrow results (e.g., "from/emailAddress/address eq 'user@example.com'")`,
+ },
+ {
+ name: '$orderby',
+ type: 'string',
+ required: false,
+ description: `Property to sort by (e.g., "receivedDateTime desc")`,
+ },
+ {
+ name: '$select',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of properties to return (e.g., "subject,from,receivedDateTime")`,
+ },
+ {
+ name: '$skip',
+ type: 'integer',
+ required: false,
+ description: `Number of messages to skip for pagination`,
+ },
+ {
+ name: '$top',
+ type: 'integer',
+ required: false,
+ description: `Number of messages to return (1-1000, default: 10)`,
+ },
],
},
{
- name: 'outlook_mailbox_settings_get',
- description: `Retrieve the mailbox settings for the signed-in user. Returns automatic replies (out-of-office) configuration, language, timezone, working hours, date/time format, and delegate meeting message delivery preferences.`,
+ name: 'outlook_list_shared_calendar_events',
+ description: `Retrieve calendar events from another user shared calendar.`,
params: [
+ { name: 'end_date_time', type: 'string', required: true, description: `End date/time.` },
+ { name: 'start_date_time', type: 'string', required: true, description: `Start date/time.` },
+ { name: 'user_id', type: 'string', required: true, description: `User ID or email.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ { name: 'top', type: 'integer', required: false, description: `Page size.` },
],
},
+ {
+ name: 'outlook_mailbox_settings_get',
+ description: `Retrieve the mailbox settings for the signed-in user. Returns automatic replies (out-of-office) configuration, language, timezone, working hours, date/time format, and delegate meeting message delivery preferences.`,
+ params: [],
+ },
{
name: 'outlook_mailbox_settings_update',
description: `Update mailbox settings for the signed-in user. Supports configuring automatic replies (out-of-office), language, timezone, working hours, date/time format, and delegate meeting message delivery preferences. Only fields provided will be updated.`,
params: [
- { name: 'automaticRepliesSetting', type: 'object', required: false, description: `Configuration for automatic replies (out-of-office). Set status, internal/external reply messages, and optional scheduled time window.` },
- { name: 'dateFormat', type: 'string', required: false, description: `Preferred date format string for the mailbox (e.g., 'MM/dd/yyyy', 'dd/MM/yyyy', 'yyyy-MM-dd').` },
- { name: 'delegateMeetingMessageDeliveryOptions', type: 'string', required: false, description: `Controls how meeting messages are delivered when a delegate is configured.` },
- { name: 'language', type: 'object', required: false, description: `Language and locale for the mailbox. Object with locale (e.g., 'en-US') and displayName.` },
- { name: 'timeFormat', type: 'string', required: false, description: `Preferred time format string for the mailbox (e.g., 'hh:mm tt' for 12-hour, 'HH:mm' for 24-hour).` },
- { name: 'timeZone', type: 'string', required: false, description: `Preferred time zone for the mailbox (e.g., 'UTC', 'Pacific Standard Time', 'Eastern Standard Time').` },
- { name: 'workingHours', type: 'object', required: false, description: `Working hours configuration including days of week, start/end times, and time zone.` },
+ {
+ name: 'automaticRepliesSetting',
+ type: 'object',
+ required: false,
+ description: `Configuration for automatic replies (out-of-office). Set status, internal/external reply messages, and optional scheduled time window.`,
+ },
+ {
+ name: 'dateFormat',
+ type: 'string',
+ required: false,
+ description: `Preferred date format string for the mailbox (e.g., 'MM/dd/yyyy', 'dd/MM/yyyy', 'yyyy-MM-dd').`,
+ },
+ {
+ name: 'delegateMeetingMessageDeliveryOptions',
+ type: 'string',
+ required: false,
+ description: `Controls how meeting messages are delivered when a delegate is configured.`,
+ },
+ {
+ name: 'language',
+ type: 'object',
+ required: false,
+ description: `Language and locale for the mailbox. Object with locale (e.g., 'en-US') and displayName.`,
+ },
+ {
+ name: 'timeFormat',
+ type: 'string',
+ required: false,
+ description: `Preferred time format string for the mailbox (e.g., 'hh:mm tt' for 12-hour, 'HH:mm' for 24-hour).`,
+ },
+ {
+ name: 'timeZone',
+ type: 'string',
+ required: false,
+ description: `Preferred time zone for the mailbox (e.g., 'UTC', 'Pacific Standard Time', 'Eastern Standard Time').`,
+ },
+ {
+ name: 'workingHours',
+ type: 'object',
+ required: false,
+ description: `Working hours configuration including days of week, start/end times, and time zone.`,
+ },
+ ],
+ },
+ {
+ name: 'outlook_move_message',
+ description: `Move a message to a different mail folder.`,
+ params: [
+ {
+ name: 'destination_id',
+ type: 'string',
+ required: true,
+ description: `Destination folder ID.`,
+ },
+ { name: 'message_id', type: 'string', required: true, description: `Message ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
{
@@ -141,17 +617,56 @@ export const tools: Tool[] = [
description: `Reply to an existing email message. The reply is automatically sent to the original sender and saved in the Sent Items folder.`,
params: [
{ name: 'comment', type: 'string', required: true, description: `Reply message content` },
- { name: 'messageId', type: 'string', required: true, description: `The unique identifier of the message to reply to` },
+ {
+ name: 'messageId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the message to reply to`,
+ },
],
},
{
name: 'outlook_search_messages',
description: `Search messages by keywords across subject, body, sender, and other fields. Returns matching messages with support for pagination.`,
params: [
- { name: 'query', type: 'string', required: true, description: `Search query string (searches across subject, body, from, to)` },
- { name: '$select', type: 'string', required: false, description: `Comma-separated list of properties to return (e.g., "subject,from,receivedDateTime")` },
- { name: '$skip', type: 'integer', required: false, description: `Number of messages to skip for pagination` },
- { name: '$top', type: 'integer', required: false, description: `Number of messages to return (1-1000, default: 10)` },
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `Search query string (searches across subject, body, from, to)`,
+ },
+ {
+ name: '$select',
+ type: 'string',
+ required: false,
+ description: `Comma-separated list of properties to return (e.g., "subject,from,receivedDateTime")`,
+ },
+ {
+ name: '$skip',
+ type: 'integer',
+ required: false,
+ description: `Number of messages to skip for pagination`,
+ },
+ {
+ name: '$top',
+ type: 'integer',
+ required: false,
+ description: `Number of messages to return (1-1000, default: 10)`,
+ },
+ ],
+ },
+ {
+ name: 'outlook_search_people',
+ description: `Search for people relevant to the signed-in user by name or email.`,
+ params: [
+ { name: 'filter', type: 'string', required: false, description: `OData filter.` },
+ { name: 'order_by', type: 'string', required: false, description: `Order by field.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'search', type: 'string', required: false, description: `Search query.` },
+ { name: 'select', type: 'string', required: false, description: `Select properties.` },
+ { name: 'skip', type: 'integer', required: false, description: `Skip count.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ { name: 'top', type: 'integer', required: false, description: `Page size.` },
],
},
{
@@ -160,28 +675,90 @@ export const tools: Tool[] = [
params: [
{ name: 'body', type: 'string', required: true, description: `Body content of the email` },
{ name: 'subject', type: 'string', required: true, description: `Subject line of the email` },
- { name: 'toRecipients', type: 'array', required: true, description: `Array of email addresses to send to` },
- { name: 'bccRecipients', type: 'array', required: false, description: `Array of email addresses to BCC` },
- { name: 'bodyType', type: 'string', required: false, description: `Content type of the body (Text or HTML)` },
- { name: 'ccRecipients', type: 'array', required: false, description: `Array of email addresses to CC` },
- { name: 'saveToSentItems', type: 'boolean', required: false, description: `Save the message in Sent Items folder (default: true)` },
+ {
+ name: 'toRecipients',
+ type: 'array',
+ required: true,
+ description: `Array of email addresses to send to`,
+ },
+ {
+ name: 'bccRecipients',
+ type: 'array',
+ required: false,
+ description: `Array of email addresses to BCC`,
+ },
+ {
+ name: 'bodyType',
+ type: 'string',
+ required: false,
+ description: `Content type of the body (Text or HTML)`,
+ },
+ {
+ name: 'ccRecipients',
+ type: 'array',
+ required: false,
+ description: `Array of email addresses to CC`,
+ },
+ {
+ name: 'saveToSentItems',
+ type: 'boolean',
+ required: false,
+ description: `Save the message in Sent Items folder (default: true)`,
+ },
+ ],
+ },
+ {
+ name: 'outlook_tentatively_accept_event',
+ description: `Tentatively accept a calendar event invitation.`,
+ params: [
+ { name: 'event_id', type: 'string', required: true, description: `Event ID.` },
+ { name: 'comment', type: 'string', required: false, description: `Response comment.` },
+ {
+ name: 'proposed_new_time',
+ type: 'object',
+ required: false,
+ description: `Proposed new meeting time.`,
+ },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'send_response', type: 'boolean', required: false, description: `Send response.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
],
},
{
name: 'outlook_todo_checklist_items_create',
description: `Add a checklist item (subtask) to a specific task in a Microsoft To Do task list.`,
params: [
- { name: 'display_name', type: 'string', required: true, description: `The display name of the checklist item.` },
+ {
+ name: 'display_name',
+ type: 'string',
+ required: true,
+ description: `The display name of the checklist item.`,
+ },
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
- { name: 'task_id', type: 'string', required: true, description: `The ID of the task to add the checklist item to.` },
- { name: 'is_checked', type: 'boolean', required: false, description: `Whether the checklist item is already checked/completed.` },
+ {
+ name: 'task_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the task to add the checklist item to.`,
+ },
+ {
+ name: 'is_checked',
+ type: 'boolean',
+ required: false,
+ description: `Whether the checklist item is already checked/completed.`,
+ },
],
},
{
name: 'outlook_todo_checklist_items_delete',
description: `Permanently delete a checklist item (subtask) from a task in a Microsoft To Do task list.`,
params: [
- { name: 'checklist_item_id', type: 'string', required: true, description: `The ID of the checklist item to delete.` },
+ {
+ name: 'checklist_item_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the checklist item to delete.`,
+ },
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
{ name: 'task_id', type: 'string', required: true, description: `The ID of the task.` },
],
@@ -190,7 +767,12 @@ export const tools: Tool[] = [
name: 'outlook_todo_checklist_items_get',
description: `Get a specific checklist item (subtask) from a task in a Microsoft To Do task list.`,
params: [
- { name: 'checklist_item_id', type: 'string', required: true, description: `The ID of the checklist item.` },
+ {
+ name: 'checklist_item_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the checklist item.`,
+ },
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
{ name: 'task_id', type: 'string', required: true, description: `The ID of the task.` },
],
@@ -207,25 +789,50 @@ export const tools: Tool[] = [
name: 'outlook_todo_checklist_items_update',
description: `Update a checklist item (subtask) in a Microsoft To Do task. Only provided fields are changed.`,
params: [
- { name: 'checklist_item_id', type: 'string', required: true, description: `The ID of the checklist item to update.` },
+ {
+ name: 'checklist_item_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the checklist item to update.`,
+ },
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
{ name: 'task_id', type: 'string', required: true, description: `The ID of the task.` },
- { name: 'display_name', type: 'string', required: false, description: `New display name for the checklist item.` },
- { name: 'is_checked', type: 'boolean', required: false, description: `Whether the checklist item is checked/completed.` },
+ {
+ name: 'display_name',
+ type: 'string',
+ required: false,
+ description: `New display name for the checklist item.`,
+ },
+ {
+ name: 'is_checked',
+ type: 'boolean',
+ required: false,
+ description: `Whether the checklist item is checked/completed.`,
+ },
],
},
{
name: 'outlook_todo_lists_create',
description: `Create a new Microsoft To Do task list.`,
params: [
- { name: 'display_name', type: 'string', required: true, description: `The name of the task list.` },
+ {
+ name: 'display_name',
+ type: 'string',
+ required: true,
+ description: `The name of the task list.`,
+ },
],
},
{
name: 'outlook_todo_lists_delete',
description: `Permanently delete a Microsoft To Do task list and all its tasks.`,
params: [
- { name: 'list_id', type: 'string', required: true, description: `The ID of the task list to delete.` },
+ {
+ name: 'list_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the task list to delete.`,
+ },
],
},
{
@@ -238,31 +845,85 @@ export const tools: Tool[] = [
{
name: 'outlook_todo_lists_list',
description: `List all Microsoft To Do task lists for the current user.`,
- params: [
- ],
+ params: [],
},
{
name: 'outlook_todo_lists_update',
description: `Rename a Microsoft To Do task list.`,
params: [
- { name: 'display_name', type: 'string', required: true, description: `The new name for the task list.` },
- { name: 'list_id', type: 'string', required: true, description: `The ID of the task list to update.` },
+ {
+ name: 'display_name',
+ type: 'string',
+ required: true,
+ description: `The new name for the task list.`,
+ },
+ {
+ name: 'list_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the task list to update.`,
+ },
],
},
{
name: 'outlook_todo_tasks_create',
description: `Create a new task in a Microsoft To Do task list with optional body, due date, importance, and reminder.`,
params: [
- { name: 'list_id', type: 'string', required: true, description: `The ID of the task list to add the task to.` },
+ {
+ name: 'list_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the task list to add the task to.`,
+ },
{ name: 'title', type: 'string', required: true, description: `The title of the task.` },
- { name: 'body', type: 'string', required: false, description: `The body/notes of the task (plain text).` },
- { name: 'categories', type: 'array', required: false, description: `Array of category names to assign to the task.` },
- { name: 'due_date', type: 'string', required: false, description: `Due date in YYYY-MM-DD format (e.g. "2026-04-15").` },
- { name: 'due_time_zone', type: 'string', required: false, description: `Time zone for the due date (e.g. "UTC", "America/New_York"). Defaults to UTC.` },
- { name: 'importance', type: 'string', required: false, description: `The importance of the task: low, normal, or high.` },
- { name: 'reminder_date_time', type: 'string', required: false, description: `Reminder date and time in ISO 8601 format (e.g. "2026-04-15T09:00:00").` },
- { name: 'reminder_time_zone', type: 'string', required: false, description: `Time zone for the reminder (e.g. "UTC"). Defaults to UTC.` },
- { name: 'status', type: 'string', required: false, description: `The status of the task: notStarted, inProgress, completed, waitingOnOthers, or deferred.` },
+ {
+ name: 'body',
+ type: 'string',
+ required: false,
+ description: `The body/notes of the task (plain text).`,
+ },
+ {
+ name: 'categories',
+ type: 'array',
+ required: false,
+ description: `Array of category names to assign to the task.`,
+ },
+ {
+ name: 'due_date',
+ type: 'string',
+ required: false,
+ description: `Due date in YYYY-MM-DD format (e.g. "2026-04-15").`,
+ },
+ {
+ name: 'due_time_zone',
+ type: 'string',
+ required: false,
+ description: `Time zone for the due date (e.g. "UTC", "America/New_York"). Defaults to UTC.`,
+ },
+ {
+ name: 'importance',
+ type: 'string',
+ required: false,
+ description: `The importance of the task: low, normal, or high.`,
+ },
+ {
+ name: 'reminder_date_time',
+ type: 'string',
+ required: false,
+ description: `Reminder date and time in ISO 8601 format (e.g. "2026-04-15T09:00:00").`,
+ },
+ {
+ name: 'reminder_time_zone',
+ type: 'string',
+ required: false,
+ description: `Time zone for the reminder (e.g. "UTC"). Defaults to UTC.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `The status of the task: notStarted, inProgress, completed, waitingOnOthers, or deferred.`,
+ },
],
},
{
@@ -270,7 +931,12 @@ export const tools: Tool[] = [
description: `Permanently delete a task from a Microsoft To Do task list.`,
params: [
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
- { name: 'task_id', type: 'string', required: true, description: `The ID of the task to delete.` },
+ {
+ name: 'task_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the task to delete.`,
+ },
],
},
{
@@ -286,10 +952,30 @@ export const tools: Tool[] = [
description: `List all tasks in a Microsoft To Do task list with optional filtering and pagination.`,
params: [
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
- { name: '$filter', type: 'string', required: false, description: `OData filter expression (e.g. "status eq 'notStarted'").` },
- { name: '$orderby', type: 'string', required: false, description: `Property to sort by (e.g. "createdDateTime desc").` },
- { name: '$skip', type: 'integer', required: false, description: `Number of tasks to skip for pagination.` },
- { name: '$top', type: 'integer', required: false, description: `Number of tasks to return (default: 10).` },
+ {
+ name: '$filter',
+ type: 'string',
+ required: false,
+ description: `OData filter expression (e.g. "status eq 'notStarted'").`,
+ },
+ {
+ name: '$orderby',
+ type: 'string',
+ required: false,
+ description: `Property to sort by (e.g. "createdDateTime desc").`,
+ },
+ {
+ name: '$skip',
+ type: 'integer',
+ required: false,
+ description: `Number of tasks to skip for pagination.`,
+ },
+ {
+ name: '$top',
+ type: 'integer',
+ required: false,
+ description: `Number of tasks to return (default: 10).`,
+ },
],
},
{
@@ -297,13 +983,48 @@ export const tools: Tool[] = [
description: `Update a task in a Microsoft To Do task list. Only provided fields are changed.`,
params: [
{ name: 'list_id', type: 'string', required: true, description: `The ID of the task list.` },
- { name: 'task_id', type: 'string', required: true, description: `The ID of the task to update.` },
- { name: 'body', type: 'string', required: false, description: `New body/notes for the task (plain text).` },
- { name: 'categories', type: 'array', required: false, description: `Array of category names to assign to the task.` },
- { name: 'due_date', type: 'string', required: false, description: `Due date in YYYY-MM-DD format.` },
- { name: 'due_time_zone', type: 'string', required: false, description: `Time zone for the due date. Defaults to UTC.` },
- { name: 'importance', type: 'string', required: false, description: `The importance: low, normal, or high.` },
- { name: 'status', type: 'string', required: false, description: `The status: notStarted, inProgress, completed, waitingOnOthers, or deferred.` },
+ {
+ name: 'task_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the task to update.`,
+ },
+ {
+ name: 'body',
+ type: 'string',
+ required: false,
+ description: `New body/notes for the task (plain text).`,
+ },
+ {
+ name: 'categories',
+ type: 'array',
+ required: false,
+ description: `Array of category names to assign to the task.`,
+ },
+ {
+ name: 'due_date',
+ type: 'string',
+ required: false,
+ description: `Due date in YYYY-MM-DD format.`,
+ },
+ {
+ name: 'due_time_zone',
+ type: 'string',
+ required: false,
+ description: `Time zone for the due date. Defaults to UTC.`,
+ },
+ {
+ name: 'importance',
+ type: 'string',
+ required: false,
+ description: `The importance: low, normal, or high.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `The status: notStarted, inProgress, completed, waitingOnOthers, or deferred.`,
+ },
{ name: 'title', type: 'string', required: false, description: `New title for the task.` },
],
},
@@ -311,36 +1032,260 @@ export const tools: Tool[] = [
name: 'outlook_update_calendar_event',
description: `Update an existing Outlook calendar event. Only provided fields will be updated. Supports time, attendees, location, reminders, online meetings, recurrence, and event properties.`,
params: [
- { name: 'event_id', type: 'string', required: true, description: `The ID of the calendar event to update` },
- { name: 'attendees_optional', type: 'string', required: false, description: `Comma-separated optional attendee emails` },
- { name: 'attendees_required', type: 'string', required: false, description: `Comma-separated required attendee emails` },
- { name: 'attendees_resource', type: 'string', required: false, description: `Comma-separated resource emails (meeting rooms, equipment)` },
- { name: 'body_content', type: 'string', required: false, description: `Event description/body` },
- { name: 'body_contentType', type: 'string', required: false, description: `Content type of body` },
- { name: 'categories', type: 'string', required: false, description: `Comma-separated categories` },
- { name: 'end_datetime', type: 'string', required: false, description: `Event end time in RFC3339 format` },
- { name: 'end_timezone', type: 'string', required: false, description: `Timezone for end time` },
- { name: 'hideAttendees', type: 'boolean', required: false, description: `When true, each attendee only sees themselves` },
- { name: 'importance', type: 'string', required: false, description: `Event importance level` },
+ {
+ name: 'event_id',
+ type: 'string',
+ required: true,
+ description: `The ID of the calendar event to update`,
+ },
+ {
+ name: 'attendees_optional',
+ type: 'string',
+ required: false,
+ description: `Comma-separated optional attendee emails`,
+ },
+ {
+ name: 'attendees_required',
+ type: 'string',
+ required: false,
+ description: `Comma-separated required attendee emails`,
+ },
+ {
+ name: 'attendees_resource',
+ type: 'string',
+ required: false,
+ description: `Comma-separated resource emails (meeting rooms, equipment)`,
+ },
+ {
+ name: 'body_content',
+ type: 'string',
+ required: false,
+ description: `Event description/body`,
+ },
+ {
+ name: 'body_contentType',
+ type: 'string',
+ required: false,
+ description: `Content type of body`,
+ },
+ {
+ name: 'categories',
+ type: 'string',
+ required: false,
+ description: `Comma-separated categories`,
+ },
+ {
+ name: 'end_datetime',
+ type: 'string',
+ required: false,
+ description: `Event end time in RFC3339 format`,
+ },
+ {
+ name: 'end_timezone',
+ type: 'string',
+ required: false,
+ description: `Timezone for end time`,
+ },
+ {
+ name: 'hideAttendees',
+ type: 'boolean',
+ required: false,
+ description: `When true, each attendee only sees themselves`,
+ },
+ {
+ name: 'importance',
+ type: 'string',
+ required: false,
+ description: `Event importance level`,
+ },
{ name: 'isAllDay', type: 'boolean', required: false, description: `Mark as all-day event` },
- { name: 'isOnlineMeeting', type: 'boolean', required: false, description: `Create an online meeting (Teams/Skype)` },
- { name: 'isReminderOn', type: 'boolean', required: false, description: `Enable or disable reminder` },
- { name: 'location', type: 'string', required: false, description: `Physical or virtual location` },
- { name: 'locations', type: 'string', required: false, description: `JSON array of location objects with displayName, address, coordinates` },
- { name: 'onlineMeetingProvider', type: 'string', required: false, description: `Online meeting provider` },
- { name: 'recurrence_days_of_week', type: 'string', required: false, description: `Days of week for weekly recurrence (comma-separated)` },
- { name: 'recurrence_end_date', type: 'string', required: false, description: `End date for recurrence (YYYY-MM-DD)` },
- { name: 'recurrence_interval', type: 'integer', required: false, description: `How often the event recurs (e.g., every 2 weeks = 2)` },
- { name: 'recurrence_occurrences', type: 'integer', required: false, description: `Number of occurrences` },
- { name: 'recurrence_range_type', type: 'string', required: false, description: `How the recurrence ends` },
- { name: 'recurrence_start_date', type: 'string', required: false, description: `Start date for recurrence (YYYY-MM-DD)` },
- { name: 'recurrence_type', type: 'string', required: false, description: `Recurrence pattern type` },
- { name: 'reminderMinutesBeforeStart', type: 'integer', required: false, description: `Minutes before event start to show reminder` },
- { name: 'sensitivity', type: 'string', required: false, description: `Event sensitivity/privacy level` },
+ {
+ name: 'isOnlineMeeting',
+ type: 'boolean',
+ required: false,
+ description: `Create an online meeting (Teams/Skype)`,
+ },
+ {
+ name: 'isReminderOn',
+ type: 'boolean',
+ required: false,
+ description: `Enable or disable reminder`,
+ },
+ {
+ name: 'location',
+ type: 'string',
+ required: false,
+ description: `Physical or virtual location`,
+ },
+ {
+ name: 'locations',
+ type: 'string',
+ required: false,
+ description: `JSON array of location objects with displayName, address, coordinates`,
+ },
+ {
+ name: 'onlineMeetingProvider',
+ type: 'string',
+ required: false,
+ description: `Online meeting provider`,
+ },
+ {
+ name: 'recurrence_days_of_week',
+ type: 'string',
+ required: false,
+ description: `Days of week for weekly recurrence (comma-separated)`,
+ },
+ {
+ name: 'recurrence_end_date',
+ type: 'string',
+ required: false,
+ description: `End date for recurrence (YYYY-MM-DD)`,
+ },
+ {
+ name: 'recurrence_interval',
+ type: 'integer',
+ required: false,
+ description: `How often the event recurs (e.g., every 2 weeks = 2)`,
+ },
+ {
+ name: 'recurrence_occurrences',
+ type: 'integer',
+ required: false,
+ description: `Number of occurrences`,
+ },
+ {
+ name: 'recurrence_range_type',
+ type: 'string',
+ required: false,
+ description: `How the recurrence ends`,
+ },
+ {
+ name: 'recurrence_start_date',
+ type: 'string',
+ required: false,
+ description: `Start date for recurrence (YYYY-MM-DD)`,
+ },
+ {
+ name: 'recurrence_type',
+ type: 'string',
+ required: false,
+ description: `Recurrence pattern type`,
+ },
+ {
+ name: 'reminderMinutesBeforeStart',
+ type: 'integer',
+ required: false,
+ description: `Minutes before event start to show reminder`,
+ },
+ {
+ name: 'sensitivity',
+ type: 'string',
+ required: false,
+ description: `Event sensitivity/privacy level`,
+ },
{ name: 'showAs', type: 'string', required: false, description: `Free/busy status` },
- { name: 'start_datetime', type: 'string', required: false, description: `Event start time in RFC3339 format` },
- { name: 'start_timezone', type: 'string', required: false, description: `Timezone for start time` },
+ {
+ name: 'start_datetime',
+ type: 'string',
+ required: false,
+ description: `Event start time in RFC3339 format`,
+ },
+ {
+ name: 'start_timezone',
+ type: 'string',
+ required: false,
+ description: `Timezone for start time`,
+ },
{ name: 'subject', type: 'string', required: false, description: `Event title/summary` },
],
},
+ {
+ name: 'outlook_update_contact',
+ description: `Update properties of an existing contact.`,
+ params: [
+ { name: 'contact_id', type: 'string', required: true, description: `Contact ID.` },
+ { name: 'company_name', type: 'string', required: false, description: `Company name.` },
+ { name: 'email_addresses', type: 'string', required: false, description: `Email addresses.` },
+ { name: 'given_name', type: 'string', required: false, description: `First name.` },
+ { name: 'job_title', type: 'string', required: false, description: `Job title.` },
+ { name: 'mobile_phone', type: 'string', required: false, description: `Mobile phone.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'surname', type: 'string', required: false, description: `Last name.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_update_mail_folder',
+ description: `Rename or update a mail folder.`,
+ params: [
+ { name: 'display_name', type: 'string', required: true, description: `New folder name.` },
+ { name: 'folder_id', type: 'string', required: true, description: `Folder ID.` },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_update_message',
+ description: `Update properties of an email message (e.g. mark as read, set importance).`,
+ params: [
+ { name: 'message_id', type: 'string', required: true, description: `Message ID.` },
+ { name: 'body', type: 'string', required: false, description: `Message body content.` },
+ {
+ name: 'body_content_type',
+ type: 'string',
+ required: false,
+ description: `Body content type.`,
+ },
+ { name: 'categories', type: 'array', required: false, description: `Categories.` },
+ { name: 'importance', type: 'string', required: false, description: `Importance.` },
+ {
+ name: 'inference_classification',
+ type: 'string',
+ required: false,
+ description: `Inference classification.`,
+ },
+ {
+ name: 'is_delivery_receipt_requested',
+ type: 'boolean',
+ required: false,
+ description: `Delivery receipt requested.`,
+ },
+ { name: 'is_read', type: 'boolean', required: false, description: `Mark as read.` },
+ {
+ name: 'is_read_receipt_requested',
+ type: 'boolean',
+ required: false,
+ description: `Read receipt requested.`,
+ },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'subject', type: 'string', required: false, description: `Updated subject.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
+ {
+ name: 'outlook_update_message_rule',
+ description: `Update an existing inbox message rule.`,
+ params: [
+ { name: 'rule_id', type: 'string', required: true, description: `Rule ID.` },
+ { name: 'actions', type: 'object', required: false, description: `Rule actions.` },
+ { name: 'conditions', type: 'object', required: false, description: `Rule conditions.` },
+ { name: 'display_name', type: 'string', required: false, description: `Rule name.` },
+ {
+ name: 'exceptions',
+ type: 'object',
+ required: false,
+ description: `Exception conditions for the rule.`,
+ },
+ { name: 'is_enabled', type: 'boolean', required: false, description: `Enable rule.` },
+ {
+ name: 'is_read_only',
+ type: 'boolean',
+ required: false,
+ description: `Mark rule as read-only.`,
+ },
+ { name: 'schema_version', type: 'string', required: false, description: `Schema version` },
+ { name: 'sequence', type: 'integer', required: false, description: `Rule sequence.` },
+ { name: 'tool_version', type: 'string', required: false, description: `Tool version` },
+ ],
+ },
]
diff --git a/src/data/agent-connectors/pendomcp.ts b/src/data/agent-connectors/pendomcp.ts
new file mode 100644
index 000000000..8f5b75015
--- /dev/null
+++ b/src/data/agent-connectors/pendomcp.ts
@@ -0,0 +1,963 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'pendomcp_accountmetadataschema',
+ description: `Return the set of metadata fields available for accounts.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_accountquery',
+ description: `Retrieve account data and metadata, or count matching accounts.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'accountId',
+ type: 'string',
+ required: false,
+ description: `only return data about the specified accountId`,
+ },
+ {
+ name: 'count',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to return only the total count of matching records instead of rows.`,
+ },
+ {
+ name: 'metadataFilter',
+ type: 'string',
+ required: false,
+ description: `Filter using: metadata.metadataGroup.metadataField == metadataValue. Groups: agent, auto, custom, salesforce. Operators: == != < > <= >=. Combine with && or ||. String values need quotes. Dates: date("YYYY-MM-DD"). e.g. metadata.auto.country == "US" && metadata.custom.plan == "enterprise"`,
+ },
+ {
+ name: 'segmentId',
+ type: 'string',
+ required: false,
+ description: `filter the results by the specified segment id. If not provided, no segment filtering is applied.`,
+ },
+ {
+ name: 'select',
+ type: 'array',
+ required: false,
+ description: `list of fields to read in addition to the accountId. only exact field names may be used, and should come from the accountMetadataSchema tool`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_activityquery',
+ description: `Query aggregated activity metrics for pages, features, and track types over a date range.`,
+ params: [
+ {
+ name: 'appId',
+ type: 'string',
+ required: true,
+ description: `Application id of the app to query`,
+ },
+ {
+ name: 'dateRange',
+ type: 'object',
+ required: true,
+ description: `The time period to query. Use 'relative' with lastNDays or 'custom' with explicit dates.`,
+ },
+ {
+ name: 'entityType',
+ type: 'string',
+ required: true,
+ description: `The entity type to query`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'accountId',
+ type: 'string',
+ required: false,
+ description: `Filter results to a specific account. REQUIRED when the user mentions or references a specific account. Use the exact account ID string`,
+ },
+ {
+ name: 'count',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to return only the total count of matching records instead of rows.`,
+ },
+ {
+ name: 'featureFlag',
+ type: 'object',
+ required: false,
+ description: `Filter events to those where a feature flag was set. Object: {name, value}. e.g. {"name": "myFlag", "value": true}. Use value:false to filter to events where the flag is not true.`,
+ },
+ {
+ name: 'frustrationMetrics',
+ type: 'boolean',
+ required: false,
+ description: `Toggles return of frustration metrics: error click/rage click/u-turn/dead click count`,
+ },
+ {
+ name: 'group',
+ type: 'array',
+ required: false,
+ description: `Fields to group results by. e.g. ["featureId"] for per-feature rows, ["visitorId"] for per-visitor rows. Any field in select can be used.`,
+ },
+ {
+ name: 'historicalMetadataFilter',
+ type: 'object',
+ required: false,
+ description: `Filter by metadata values at event time (not current). Object: {kind, group, field, op, value}. kind: visitor|account|parentAccount. op: == != < > <= >=. e.g. {"kind":"visitor","group":"agent","field":"email","op":"==","value":"\\"user@example.com\\""}`,
+ },
+ { name: 'itemIds', type: 'array', required: false, description: `The item ids to query` },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of rows to return. Range: 1-1000. Default: 1000.`,
+ },
+ {
+ name: 'period',
+ type: 'string',
+ required: false,
+ description: `Aggregation period: dayRange (default), day, week, month. Controls how date ranges are bucketed in results.`,
+ },
+ {
+ name: 'productAreaId',
+ type: 'string',
+ required: false,
+ description: `Scope query to one product area. Mutually exclusive with itemIds. Use listProductAreas to find the ID.`,
+ },
+ {
+ name: 'segmentId',
+ type: 'string',
+ required: false,
+ description: `filter the results by the specified segment id. If not provided, no segment filtering is applied.`,
+ },
+ {
+ name: 'sort',
+ type: 'array',
+ required: false,
+ description: `The fields to sort by. Prepending the field with a + (ascending) or - (descending) determines the sort direction.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ {
+ name: 'visitorId',
+ type: 'string',
+ required: false,
+ description: `Filter results to a specific visitor. REQUIRED when the user mentions or references a specific visitor. Use the exact visitor ID string`,
+ },
+ {
+ name: 'visitorMetadataFilter',
+ type: 'string',
+ required: false,
+ description: `Filter activity by visitor metadata (current values). e.g. metadata.auto.country == "US" && metadata.custom.plan == "enterprise". Mutually exclusive with segmentId.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_agent_analytics_key_metrics',
+ description: `Return key aggregate metrics for an AI agent's conversations over a date range, with period-over-period comparison.`,
+ params: [
+ {
+ name: 'agentId',
+ type: 'string',
+ required: true,
+ description: `Required. The AI agent ID to get metrics for (from list_ai_agents).`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: true,
+ description: `Query end date in YYYY-MM-DD format (e.g., '2025-01-31'). Inclusive.`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: true,
+ description: `Query start date in YYYY-MM-DD format (e.g., '2025-01-01'). Inclusive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'appId',
+ type: 'string',
+ required: false,
+ description: `Application ID of the app to query (defaults to -323232 if not specified)`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_ai_agent_issue_analysis',
+ description: `Return diagnoses, flagged tool/model usage, and user prompt content for a specific detected issue in an AI agent.`,
+ params: [
+ {
+ name: 'agentId',
+ type: 'string',
+ required: true,
+ description: `The AI agent ID (from list_ai_agents). Used to scope the lookup to the correct agent.`,
+ },
+ {
+ name: 'appId',
+ type: 'string',
+ required: true,
+ description: `Application id of the app to query`,
+ },
+ {
+ name: 'conversationIds',
+ type: 'array',
+ required: true,
+ description: `List of conversation IDs for the issue cluster (from the list_ai_agent_issues response).`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: true,
+ description: `Query end date in YYYY-MM-DD format (e.g., '2025-01-31'). Inclusive.`,
+ },
+ {
+ name: 'eventIds',
+ type: 'array',
+ required: true,
+ description: `List of event IDs for the issue cluster (from the list_ai_agent_issues response). These are the agent response event IDs flagged as instances of this issue.`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: true,
+ description: `Query start date in YYYY-MM-DD format (e.g., '2025-01-01'). Inclusive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_get_agent_context',
+ description: `Fetch a grounding document describing a Pendo product resource so an LLM can answer questions about it.`,
+ params: [
+ {
+ name: 'resource_id',
+ type: 'string',
+ required: true,
+ description: `Opaque id for that resource type (e.g. when resource_type is 'space', the space id).`,
+ },
+ {
+ name: 'resource_type',
+ type: 'string',
+ required: true,
+ description: `Which product resource to load context for. Supported values depend on subscription features; currently includes 'space'.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'frame_id',
+ type: 'string',
+ required: false,
+ description: `When resource_type is "space", limits context to one frame (that canvas item id) and items whose parent is that frame. Omit for full-space context.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_guidemetrics',
+ description: `Get performance metrics for a single guide over a date range, including reach, views, and completion rates.`,
+ params: [
+ {
+ name: 'endDate',
+ type: 'string',
+ required: true,
+ description: `Query end date in YYYY-MM-DD format (e.g., '2025-01-31'). Inclusive.`,
+ },
+ {
+ name: 'guideId',
+ type: 'string',
+ required: true,
+ description: `The exact guide ID to analyze.`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: true,
+ description: `Query start date in YYYY-MM-DD format (e.g., '2025-01-01'). Inclusive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'blacklist',
+ type: 'string',
+ required: false,
+ description: `Blacklist behavior: 'apply' (use blacklist, normal behavior), 'ignore' (do not use blacklist), 'only' (invert blacklist, return only blacklisted activity)`,
+ },
+ {
+ name: 'period',
+ type: 'string',
+ required: false,
+ description: `Aggregation period: dayRange (default), day, week, month. Controls how date ranges are bucketed in results.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_list_ai_agent_issues',
+ description: `List detected issues in an AI agent's conversations with instance and conversation counts.`,
+ params: [
+ {
+ name: 'agentId',
+ type: 'string',
+ required: true,
+ description: `Required. The AI agent ID to filter by (from list_ai_agents). Issues are clustered per agent to match the emergent issues table.`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: true,
+ description: `Query end date in YYYY-MM-DD format (e.g., '2025-01-31'). Inclusive.`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: true,
+ description: `Query start date in YYYY-MM-DD format (e.g., '2025-01-01'). Inclusive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'appId',
+ type: 'string',
+ required: false,
+ description: `Application ID to filter by. If omitted, returns data across all applications the user can access.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of issue rows to return. Range: 1-500. Default: 100.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_list_ai_agents',
+ description: `List all AI agents accessible in this subscription with agent IDs, names, and deployment configuration.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_list_all_applications',
+ description: `List all applications and subscriptions the current user has access to.`,
+ params: [
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_list_spaces',
+ description: `List the Pendo Spaces accessible to the current user.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_list_use_cases',
+ description: `Return conversation clustering analysis for an AI agent, grouped by semantic topic.`,
+ params: [
+ {
+ name: 'agentId',
+ type: 'string',
+ required: true,
+ description: `The AI agent ID to analyze retrieved from the list_ai_agents tool`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: true,
+ description: `Query end date in YYYY-MM-DD format (e.g., '2025-01-31'). Inclusive.`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: true,
+ description: `Query start date in YYYY-MM-DD format (e.g., '2025-01-01'). Inclusive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_listguides',
+ description: `List, filter, and search in-app guides, or fetch a single guide's full content.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'activation',
+ type: 'string',
+ required: false,
+ description: `Filter by launch method: auto (automatic), api (programmatic), badge, dom (element click), embed, launcher (resource center), page (page view), feature (mobile element click), form, track (track event).`,
+ },
+ {
+ name: 'appId',
+ type: 'string',
+ required: false,
+ description: `Application ID to filter by. If omitted, returns data across all applications the user can access.`,
+ },
+ {
+ name: 'expand',
+ type: 'boolean',
+ required: false,
+ description: `Set to true for detailed guide metadata (steps, polls, scheduling, recurrence, conversion). Does not include guide content text — use guideId for that.`,
+ },
+ {
+ name: 'expiration',
+ type: 'string',
+ required: false,
+ description: `Filter guides by expiration status. Values:
+"active" — guide has no expiration date or has not yet expired,
+"expired" — guide's expiration date is in the past.`,
+ },
+ {
+ name: 'guideId',
+ type: 'string',
+ required: false,
+ description: `Fetch a single guide by ID and return its full content (step-by-step text extracted from building blocks). When provided, all filter/pagination params are ignored.`,
+ },
+ {
+ name: 'guideType',
+ type: 'string',
+ required: false,
+ description: `Filter by type: banner, tooltip, lightbox, walkthrough, whatsnew, building-block, group, training, launcher, mobile-lightbox.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of results to return.`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Number of matching results to skip before returning. Use with limit to paginate through large result sets.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Search query for guide names/descriptions. Use with searchType. Offset is ignored when search is active — use limit to control result count.`,
+ },
+ {
+ name: 'searchType',
+ type: 'string',
+ required: false,
+ description: `Search mode: semantic (natural-language ranked by meaning) or fuzzy (keyword matching on name and description).`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter guides by state. Values: "public" (live), "staged" (testing), "draft" (in progress), "_pendingReview_" (awaiting review), "disabled" (turned off).`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_listproductareas',
+ description: `List all product areas in the subscription with their IDs, names, and descriptions.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of results to return.`,
+ },
+ {
+ name: 'offset',
+ type: 'number',
+ required: false,
+ description: `Number of matching results to skip before returning. Use with limit to paginate through large result sets.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `Optional fuzzy search string to filter product areas by name or description. When omitted, all product areas are returned.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_productareamemberactivity',
+ description: `Return all pages, features, or track types in a product area including those with zero activity.`,
+ params: [
+ {
+ name: 'dateRange',
+ type: 'object',
+ required: true,
+ description: `The time period to query. Use 'relative' with lastNDays or 'custom' with explicit dates.`,
+ },
+ {
+ name: 'entityType',
+ type: 'string',
+ required: true,
+ description: `The entity type to query. Must be a direct product area type: page, feature, or trackType.`,
+ },
+ {
+ name: 'productAreaId',
+ type: 'string',
+ required: true,
+ description: `The ID of the product area whose members to return.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'appId',
+ type: 'string',
+ required: false,
+ description: `Application ID of the app to query (defaults to -323232 if not specified)`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Maximum number of rows to return. Range: 1-1000. Default: 1000.`,
+ },
+ {
+ name: 'period',
+ type: 'string',
+ required: false,
+ description: `Aggregation period: dayRange (default), day, week, month. Controls how date ranges are bucketed in results.`,
+ },
+ {
+ name: 'segmentId',
+ type: 'string',
+ required: false,
+ description: `filter the results by the specified segment id. If not provided, no segment filtering is applied.`,
+ },
+ {
+ name: 'sort',
+ type: 'array',
+ required: false,
+ description: `The fields to sort by. Prepending the field with a + (ascending) or - (descending) determines the sort direction.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_productengagementscore',
+ description: `Calculate the Product Engagement Score for an application over a date range, returning adoption, stickiness, and growth metrics.`,
+ params: [
+ {
+ name: 'appId',
+ type: 'string',
+ required: true,
+ description: `Application id of the app to query`,
+ },
+ {
+ name: 'endDate',
+ type: 'string',
+ required: true,
+ description: `Query end date in YYYY-MM-DD format (e.g., '2025-01-31'). Inclusive.`,
+ },
+ {
+ name: 'startDate',
+ type: 'string',
+ required: true,
+ description: `Query start date in YYYY-MM-DD format (e.g., '2025-01-01'). Inclusive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'accountId',
+ type: 'string',
+ required: false,
+ description: `Filter results to a specific account. REQUIRED when the user mentions or references a specific account. Use the exact account ID string`,
+ },
+ {
+ name: 'adoptionUserBase',
+ type: 'string',
+ required: false,
+ description: `The user base for the adoption score.`,
+ },
+ {
+ name: 'blacklist',
+ type: 'string',
+ required: false,
+ description: `Blacklist behavior: 'apply' (use blacklist, normal behavior), 'ignore' (do not use blacklist), 'only' (invert blacklist, return only blacklisted activity)`,
+ },
+ {
+ name: 'excludeWeekends',
+ type: 'boolean',
+ required: false,
+ description: `Whether to exclude weekends in the stickiness score calculation.`,
+ },
+ {
+ name: 'featureIds',
+ type: 'array',
+ required: false,
+ description: `Array of the featureIds to include in the adoption score calculation. If this, pageIds, and trackEventIds are empty, default core events are included.`,
+ },
+ {
+ name: 'growthUserBase',
+ type: 'string',
+ required: false,
+ description: `The user base for the growth score.`,
+ },
+ {
+ name: 'pageIds',
+ type: 'array',
+ required: false,
+ description: `Array of the pageIds to include in the adoption score calculation. If this, featureIds, and trackEventIds are empty, default core events are included.`,
+ },
+ {
+ name: 'scores',
+ type: 'array',
+ required: false,
+ description: `Array of the scores to return. If empty, only PES is returned`,
+ },
+ {
+ name: 'segmentId',
+ type: 'string',
+ required: false,
+ description: `filter the results by the specified segment id. If not provided, no segment filtering is applied.`,
+ },
+ {
+ name: 'stickinessDenominator',
+ type: 'string',
+ required: false,
+ description: `The denominator time range for the stickiness score. If denominator is provided, numerator must also be provided. Numerator cannot equal denominator.`,
+ },
+ {
+ name: 'stickinessNumerator',
+ type: 'string',
+ required: false,
+ description: `The numerator time range for the stickiness score. If numerator is provided, denominator must also be provided. Numerator cannot equal denominator.`,
+ },
+ {
+ name: 'stickinessUserBase',
+ type: 'string',
+ required: false,
+ description: `The user base for the stickiness score.`,
+ },
+ {
+ name: 'trackEventIds',
+ type: 'array',
+ required: false,
+ description: `Array of the trackEventIds to include in the adoption score calculation. If this, pageIds, and featureIds are empty, default core events are included.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_searchentities',
+ description: `Search for product entities such as pages, features, track types, guides, accounts, and segments.`,
+ params: [
+ {
+ name: 'appId',
+ type: 'string',
+ required: true,
+ description: `Application id of the app to query`,
+ },
+ {
+ name: 'itemType',
+ type: 'array',
+ required: true,
+ description: `The types of items to search for. Case-sensitive.`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'itemIds',
+ type: 'array',
+ required: false,
+ description: `Fetch specific entities by ID. Requires exactly one itemType. Cannot be combined with search or search_fallback.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Return at most this many items for each itemType.`,
+ },
+ {
+ name: 'search',
+ type: 'string',
+ required: false,
+ description: `The semantic search query (e.g., "Bridgeway Logistics", "onboarding features"). Use natural phrases, not meta-instructions.
+ Must always be specified together with search_fallback.
+ `,
+ },
+ {
+ name: 'search_fallback',
+ type: 'array',
+ required: false,
+ description: `Fuzzy fallback search terms. Must be provided together with search for search mode. Not allowed with itemIds.`,
+ },
+ {
+ name: 'starredItemTypes',
+ type: 'array',
+ required: false,
+ description: `Return only entities starred by the current user for these types. Combine multiple types in one call (e.g. ["Guide", "SessionRecording"]).`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_segmentlist',
+ description: `List all segments in the subscription with their IDs, names, and optional feature flag names.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'substring',
+ type: 'string',
+ required: false,
+ description: `Only return segments whose name contains this value; matching is case insensitive`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_visitormetadataschema',
+ description: `Return the set of metadata fields available for visitors.`,
+ params: [
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ ],
+ },
+ {
+ name: 'pendomcp_visitorquery',
+ description: `Retrieve visitor data and metadata, or count matching visitors.`,
+ params: [
+ {
+ name: 'appId',
+ type: 'string',
+ required: true,
+ description: `Application id of the app to query`,
+ },
+ {
+ name: 'subId',
+ type: 'string',
+ required: true,
+ description: `Subscription ID that owns the data. Required for all queries.`,
+ },
+ {
+ name: 'count',
+ type: 'boolean',
+ required: false,
+ description: `Set to true to return only the total count of matching records instead of rows.`,
+ },
+ {
+ name: 'limit',
+ type: 'number',
+ required: false,
+ description: `Number of visitors to return. Only set this if count is false. Defaults to 10000, max of 50000`,
+ },
+ {
+ name: 'metadataFilter',
+ type: 'string',
+ required: false,
+ description: `Filter using: metadata.metadataGroup.metadataField == metadataValue. Groups: agent, auto, custom, salesforce. Operators: == != < > <= >=. Combine with && or ||. String values need quotes. Dates: date("YYYY-MM-DD"). e.g. metadata.auto.country == "US" && metadata.custom.plan == "enterprise"`,
+ },
+ {
+ name: 'segmentId',
+ type: 'string',
+ required: false,
+ description: `filter the results by the specified segment id. If not provided, no segment filtering is applied.`,
+ },
+ {
+ name: 'select',
+ type: 'array',
+ required: false,
+ description: `list of fields to read in addition to the visitorId. only exact field names may be used, and should come from the visitorMetadataSchema tool`,
+ },
+ {
+ name: 'userQuery',
+ type: 'string',
+ required: false,
+ description: `The original user query or question that triggered this tool call.`,
+ },
+ {
+ name: 'visitorId',
+ type: 'string',
+ required: false,
+ description: `only return data about the specified visitorId (often formatted as email address)`,
+ },
+ ],
+ },
+]
diff --git a/src/data/agent-connectors/prismamcp.ts b/src/data/agent-connectors/prismamcp.ts
new file mode 100644
index 000000000..e3503b15a
--- /dev/null
+++ b/src/data/agent-connectors/prismamcp.ts
@@ -0,0 +1,206 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'prismamcp_create_prisma_postgres_backup',
+ description: `Create an automated backup for a Prisma Postgres database. Note: on-demand backup creation is not currently supported; backups are created automatically by the system.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ {
+ name: 'projectId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma project. Get it from List Databases.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_create_prisma_postgres_connection_string',
+ description: `Create a new connection string for a Prisma Postgres database. Returns both Prisma and direct connection strings when available.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `A unique display name for the resource.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_create_prisma_postgres_database',
+ description: `Create a new managed Prisma Postgres database in the specified region.`,
+ params: [
+ {
+ name: 'name',
+ type: 'string',
+ required: true,
+ description: `A unique display name for the resource.`,
+ },
+ {
+ name: 'region',
+ type: 'string',
+ required: true,
+ description: `The AWS region to deploy the database in. Accepted values: us-east-1, us-west-1, eu-west-3, eu-central-1, ap-northeast-1, ap-southeast-1.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_create_prisma_postgres_recovery',
+ description: `Restore a Prisma Postgres database from a backup into a new database.`,
+ params: [
+ {
+ name: 'backupId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the backup to restore. Get it from List Backups.`,
+ },
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ {
+ name: 'targetDatabaseName',
+ type: 'string',
+ required: true,
+ description: `A unique name for the recovered database.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_delete_prisma_postgres_connection_string',
+ description: `Permanently delete a connection string by its ID. This action cannot be undone.`,
+ params: [
+ {
+ name: 'id',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the connection string. Get it from List Connection Strings.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_delete_prisma_postgres_database',
+ description: `Permanently delete a Prisma Postgres database by its ID. This action cannot be undone.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_execute_prisma_postgres_schema_update',
+ description: `Execute a DDL schema update on a Prisma Postgres database. Use for schema changes only; use Execute SQL Query for data reads and writes.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ {
+ name: 'projectId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma project. Get it from List Databases.`,
+ },
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `The SQL query to execute against the database.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_execute_sql_query',
+ description: `Execute a SQL query on a Prisma Postgres database and return the results as JSON. Does not have permission to run schema updates.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ {
+ name: 'projectId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma project. Get it from List Databases.`,
+ },
+ {
+ name: 'query',
+ type: 'string',
+ required: true,
+ description: `The SQL query to execute against the database.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_fetch_workspace_details',
+ description: `Retrieve details of the current Prisma Postgres workspace, including plan limits and usage.`,
+ params: [],
+ },
+ {
+ name: 'prismamcp_introspect_database_schema',
+ description: `Introspect and return the schema of a Prisma Postgres database as JSON.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ {
+ name: 'projectId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma project. Get it from List Databases.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_list_prisma_postgres_backups',
+ description: `List all available automated backups for a Prisma Postgres database.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_list_prisma_postgres_connection_strings',
+ description: `List all connection strings for a Prisma Postgres database.`,
+ params: [
+ {
+ name: 'databaseId',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Prisma Postgres database. Get it from List Databases.`,
+ },
+ ],
+ },
+ {
+ name: 'prismamcp_list_prisma_postgres_databases',
+ description: `List all Prisma Postgres databases in the workspace. Use the returned id as databaseId in other tools.`,
+ params: [],
+ },
+]
diff --git a/src/data/agent-connectors/twilio.ts b/src/data/agent-connectors/twilio.ts
new file mode 100644
index 000000000..aa2d1ac88
--- /dev/null
+++ b/src/data/agent-connectors/twilio.ts
@@ -0,0 +1,569 @@
+import type { Tool } from '../../types/agent-connectors'
+
+export const tools: Tool[] = [
+ {
+ name: 'twilio_account_get',
+ description: `Retrieve details of a Twilio account by its SID.`,
+ params: [],
+ },
+ {
+ name: 'twilio_available_numbers_local',
+ description: `Search for available local phone numbers that can be purchased in a given country.`,
+ params: [
+ {
+ name: 'country_code',
+ type: 'string',
+ required: true,
+ description: `The ISO 3166-1 alpha-2 country code to search for numbers in.`,
+ },
+ { name: 'area_code', type: 'string', required: false, description: `Filter by area code.` },
+ {
+ name: 'contains',
+ type: 'string',
+ required: false,
+ description: `A pattern to match phone numbers against. Use * for wildcards.`,
+ },
+ {
+ name: 'sms_enabled',
+ type: 'string',
+ required: false,
+ description: `Filter for numbers that are SMS-capable.`,
+ },
+ {
+ name: 'voice_enabled',
+ type: 'string',
+ required: false,
+ description: `Filter for numbers that are voice-capable.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_available_numbers_toll_free',
+ description: `Search for available toll-free phone numbers that can be purchased in a given country.`,
+ params: [
+ {
+ name: 'country_code',
+ type: 'string',
+ required: true,
+ description: `The ISO 3166-1 alpha-2 country code to search for numbers in.`,
+ },
+ { name: 'area_code', type: 'string', required: false, description: `Filter by area code.` },
+ {
+ name: 'contains',
+ type: 'string',
+ required: false,
+ description: `A pattern to match phone numbers against. Use * for wildcards.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_call_delete',
+ description: `Delete a call record from the account. This permanently removes the call log entry.`,
+ params: [
+ {
+ name: 'call_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Call resource to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_call_get',
+ description: `Retrieve details of a specific phone call by its SID, including status, duration, and pricing information.`,
+ params: [
+ {
+ name: 'call_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Call resource to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_calls_list',
+ description: `Retrieve a list of phone calls made to and from the account, with optional filtering by number, status, and date.`,
+ params: [
+ {
+ name: 'end_time',
+ type: 'string',
+ required: false,
+ description: `Filter by calls started on or before this date (YYYY-MM-DD format).`,
+ },
+ {
+ name: 'from_number',
+ type: 'string',
+ required: false,
+ description: `Filter by the phone number that initiated the call.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `The number of results to return per page. Maximum is 1000.`,
+ },
+ {
+ name: 'start_time',
+ type: 'string',
+ required: false,
+ description: `Filter by calls started on or after this date (YYYY-MM-DD format).`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter by call status. Values: queued, ringing, in-progress, completed, busy, failed, no-answer, canceled.`,
+ },
+ {
+ name: 'to',
+ type: 'string',
+ required: false,
+ description: `Filter by the phone number that received the call.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conference_get',
+ description: `Retrieve details of a specific conference by its SID, including status, friendly name, and region.`,
+ params: [
+ {
+ name: 'conference_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Conference resource to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conferences_list',
+ description: `Retrieve a list of conferences for the account, with optional filtering by name, status, date, and pagination.`,
+ params: [
+ {
+ name: 'date_created',
+ type: 'string',
+ required: false,
+ description: `Filter conferences created on this date (YYYY-MM-DD format).`,
+ },
+ {
+ name: 'friendly_name',
+ type: 'string',
+ required: false,
+ description: `Filter conferences by their friendly name.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `The number of results to return per page. Maximum is 1000.`,
+ },
+ {
+ name: 'status',
+ type: 'string',
+ required: false,
+ description: `Filter by conference status. Values: init, in-progress, completed.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conversation_delete',
+ description: `Delete a Twilio Conversation by its SID. This permanently removes the conversation and all associated data.`,
+ params: [
+ {
+ name: 'conversation_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the conversation to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conversation_get',
+ description: `Retrieve the details of a specific Twilio Conversation by its SID.`,
+ params: [
+ {
+ name: 'conversation_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the conversation to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conversation_message_delete',
+ description: `Delete a specific message from a Twilio Conversation by its SID.`,
+ params: [
+ {
+ name: 'conversation_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the conversation containing the message.`,
+ },
+ {
+ name: 'message_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the message to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conversation_messages_list',
+ description: `List all messages in a Twilio Conversation. Optionally control the sort order and page size.`,
+ params: [
+ {
+ name: 'conversation_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the conversation to list messages for.`,
+ },
+ {
+ name: 'order',
+ type: 'string',
+ required: false,
+ description: `The sort order of messages. One of: asc, desc.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `The number of messages to return per page.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conversation_participants_list',
+ description: `List all participants in a Twilio Conversation.`,
+ params: [
+ {
+ name: 'conversation_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the conversation to list participants for.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `The number of participants to return per page.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_conversations_list',
+ description: `List all Twilio Conversations. Optionally filter by state and control page size.`,
+ params: [
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `The number of conversations to return per page.`,
+ },
+ {
+ name: 'state',
+ type: 'string',
+ required: false,
+ description: `Filter conversations by state. One of: active, inactive, closed.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_message_delete',
+ description: `Permanently delete a message resource from your Twilio account. This action cannot be undone.`,
+ params: [
+ {
+ name: 'message_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the message to delete`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_message_get',
+ description: `Retrieve the details of a specific message by its SID.`,
+ params: [
+ {
+ name: 'message_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the message to retrieve`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_message_media_list',
+ description: `Retrieve a list of media resources associated with a specific message.`,
+ params: [
+ {
+ name: 'message_sid',
+ type: 'string',
+ required: true,
+ description: `The SID of the message to list media for`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of media resources to return per page (1-1000, default 50)`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_messages_list',
+ description: `Retrieve a list of messages associated with your Twilio account, with optional filtering by recipient, sender, or date sent.`,
+ params: [
+ {
+ name: 'date_sent',
+ type: 'string',
+ required: false,
+ description: `Filter by date sent (YYYY-MM-DD format)`,
+ },
+ {
+ name: 'from_number',
+ type: 'string',
+ required: false,
+ description: `Filter by messages sent from this phone number in E.164 format`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of messages to return per page (1-1000, default 50)`,
+ },
+ {
+ name: 'to',
+ type: 'string',
+ required: false,
+ description: `Filter by messages sent to this phone number in E.164 format`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_messaging_services_list',
+ description: `Retrieve a list of all Messaging Services associated with your Twilio account.`,
+ params: [
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of Messaging Services to return per page (1-1000, default 50)`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_phone_number_get',
+ description: `Retrieve details of a specific incoming phone number by its SID.`,
+ params: [
+ {
+ name: 'phone_number_sid',
+ type: 'string',
+ required: true,
+ description: `The SID of the incoming phone number to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_phone_numbers_list',
+ description: `List all incoming phone numbers on the Twilio account.`,
+ params: [
+ {
+ name: 'friendly_name',
+ type: 'string',
+ required: false,
+ description: `Filter by friendly name of the phone number.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of results to return per page.`,
+ },
+ {
+ name: 'phone_number',
+ type: 'string',
+ required: false,
+ description: `Filter by phone number in E.164 format.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_recording_delete',
+ description: `Permanently delete a call recording from the account. This action cannot be undone.`,
+ params: [
+ {
+ name: 'recording_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Recording resource to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_recording_get',
+ description: `Retrieve details of a specific call recording by its SID, including duration, status, and source.`,
+ params: [
+ {
+ name: 'recording_sid',
+ type: 'string',
+ required: true,
+ description: `The unique identifier of the Recording resource to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_recordings_list',
+ description: `Retrieve a list of call recordings for the account, with optional filtering by call SID, date, and pagination.`,
+ params: [
+ {
+ name: 'call_sid',
+ type: 'string',
+ required: false,
+ description: `Filter recordings by the Call SID they are associated with.`,
+ },
+ {
+ name: 'date_created',
+ type: 'string',
+ required: false,
+ description: `Filter recordings created on this date (YYYY-MM-DD format).`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `The number of results to return per page. Maximum is 1000.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_usage_records_list',
+ description: `Retrieve usage records for a Twilio account, optionally filtered by category and date range.`,
+ params: [
+ {
+ name: 'category',
+ type: 'string',
+ required: false,
+ description: `The usage category to filter by (e.g., sms, calls, phonenumbers).`,
+ },
+ {
+ name: 'end_date',
+ type: 'string',
+ required: false,
+ description: `The end date for the usage records in YYYY-MM-DD format.`,
+ },
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of results to return per page.`,
+ },
+ {
+ name: 'start_date',
+ type: 'string',
+ required: false,
+ description: `The start date for the usage records in YYYY-MM-DD format.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_usage_records_today',
+ description: `Retrieve today's usage records for a Twilio account, optionally filtered by category.`,
+ params: [
+ {
+ name: 'category',
+ type: 'string',
+ required: false,
+ description: `The usage category to filter by (e.g., sms, calls, phonenumbers).`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_verification_get',
+ description: `Retrieve the status and details of a specific verification by its SID.`,
+ params: [
+ {
+ name: 'service_sid',
+ type: 'string',
+ required: true,
+ description: `The SID of the Verify service.`,
+ },
+ {
+ name: 'verification_sid',
+ type: 'string',
+ required: true,
+ description: `The SID of the verification to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_verify_service_create',
+ description: `Create a new Twilio Verify service for sending verification codes via SMS, call, email, or WhatsApp.`,
+ params: [
+ {
+ name: 'friendly_name',
+ type: 'string',
+ required: true,
+ description: `A descriptive name for the Verify service.`,
+ },
+ {
+ name: 'code_length',
+ type: 'integer',
+ required: false,
+ description: `The length of the verification code to generate. Must be between 4 and 10.`,
+ },
+ {
+ name: 'lookup_enabled',
+ type: 'string',
+ required: false,
+ description: `Whether to perform a lookup on the phone number before sending verification.`,
+ },
+ {
+ name: 'psd2_enabled',
+ type: 'string',
+ required: false,
+ description: `Whether to enable PSD2 compliance for the service.`,
+ },
+ {
+ name: 'skip_sms_to_landlines',
+ type: 'string',
+ required: false,
+ description: `Whether to skip sending SMS to landline phone numbers.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_verify_service_delete',
+ description: `Delete a Twilio Verify service by its SID. This action is irreversible.`,
+ params: [
+ {
+ name: 'service_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the Verify service to delete.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_verify_service_get',
+ description: `Retrieve details of a specific Twilio Verify service by its SID.`,
+ params: [
+ {
+ name: 'service_sid',
+ type: 'string',
+ required: true,
+ description: `The unique SID of the Verify service to retrieve.`,
+ },
+ ],
+ },
+ {
+ name: 'twilio_verify_services_list',
+ description: `List all Twilio Verify services on the account.`,
+ params: [
+ {
+ name: 'page_size',
+ type: 'integer',
+ required: false,
+ description: `Number of results to return per page. Maximum is 1000.`,
+ },
+ ],
+ },
+]