>
)}
diff --git a/apps/docs/components/ui/sim-logo.tsx b/apps/docs/components/ui/sim-logo.tsx
new file mode 100644
index 0000000000..06cc0d95d3
--- /dev/null
+++ b/apps/docs/components/ui/sim-logo.tsx
@@ -0,0 +1,108 @@
+'use client'
+
+import { cn } from '@/lib/utils'
+
+interface SimLogoProps {
+ className?: string
+}
+
+/**
+ * Sim logo with icon and text.
+ * The icon stays green (#33C482), text adapts to light/dark mode.
+ */
+export function SimLogo({ className }: SimLogoProps) {
+ return (
+
+ )
+}
+
+/**
+ * Full Sim logo with icon and "Sim" text.
+ * The icon stays green (#33C482), text adapts to light/dark mode.
+ */
+export function SimLogoFull({ className }: SimLogoProps) {
+ return (
+
+ )
+}
diff --git a/apps/docs/content/docs/de/mcp/deploy-workflows.mdx b/apps/docs/content/docs/de/mcp/deploy-workflows.mdx
index a782869af7..595c581132 100644
--- a/apps/docs/content/docs/de/mcp/deploy-workflows.mdx
+++ b/apps/docs/content/docs/de/mcp/deploy-workflows.mdx
@@ -17,7 +17,7 @@ MCP-Server gruppieren Ihre Workflow-Tools zusammen. Erstellen und verwalten Sie
-1. Navigieren Sie zu **Einstellungen → Bereitgestellte MCPs**
+1. Navigieren Sie zu **Einstellungen → MCP-Server**
2. Klicken Sie auf **Server erstellen**
3. Geben Sie einen Namen und eine optionale Beschreibung ein
4. Kopieren Sie die Server-URL zur Verwendung in Ihren MCP-Clients
@@ -79,7 +79,7 @@ Füge deinen API-Key-Header (`X-API-Key`) für authentifizierten Zugriff hinzu,
## Server-Verwaltung
-In der Server-Detailansicht unter **Einstellungen → Bereitgestellte MCPs** können Sie:
+In der Server-Detailansicht unter **Einstellungen → MCP-Server** können Sie:
- **Tools anzeigen**: Alle Workflows sehen, die einem Server hinzugefügt wurden
- **URL kopieren**: Die Server-URL für MCP-Clients abrufen
diff --git a/apps/docs/content/docs/de/mcp/index.mdx b/apps/docs/content/docs/de/mcp/index.mdx
index 77edb5b72c..12d5713bdd 100644
--- a/apps/docs/content/docs/de/mcp/index.mdx
+++ b/apps/docs/content/docs/de/mcp/index.mdx
@@ -27,7 +27,7 @@ MCP-Server stellen Sammlungen von Tools bereit, die Ihre Agenten nutzen können.
1. Navigieren Sie zu Ihren Workspace-Einstellungen
-2. Gehen Sie zum Abschnitt **Bereitgestellte MCPs**
+2. Gehen Sie zum Abschnitt **MCP-Server**
3. Klicken Sie auf **MCP-Server hinzufügen**
4. Geben Sie die Server-Konfigurationsdetails ein
5. Speichern Sie die Konfiguration
diff --git a/apps/docs/content/docs/en/blocks/agent.mdx b/apps/docs/content/docs/en/blocks/agent.mdx
index 205d9b1ddc..377cb8c1c7 100644
--- a/apps/docs/content/docs/en/blocks/agent.mdx
+++ b/apps/docs/content/docs/en/blocks/agent.mdx
@@ -56,6 +56,10 @@ Controls response randomness and creativity:
- **Medium (0.3-0.7)**: Balanced creativity and focus. Good for general use.
- **High (0.7-2.0)**: Creative and varied. Ideal for brainstorming and content generation.
+### Max Output Tokens
+
+Controls the maximum length of the model's response. For Anthropic models, Sim uses reliable defaults: streaming executions use the model's full capacity (e.g. 64,000 tokens for Claude 4.5), while non-streaming executions default to 8,192 to avoid timeout issues. For long-form content generation via API, explicitly set a higher value.
+
### API Key
Your API key for the selected LLM provider. This is securely stored and used for authentication.
diff --git a/apps/docs/content/docs/en/mcp/deploy-workflows.mdx b/apps/docs/content/docs/en/mcp/deploy-workflows.mdx
index 54a928c3ab..f7ece9e966 100644
--- a/apps/docs/content/docs/en/mcp/deploy-workflows.mdx
+++ b/apps/docs/content/docs/en/mcp/deploy-workflows.mdx
@@ -16,7 +16,7 @@ MCP servers group your workflow tools together. Create and manage them in worksp
-1. Navigate to **Settings → Deployed MCPs**
+1. Navigate to **Settings → MCP Servers**
2. Click **Create Server**
3. Enter a name and optional description
4. Copy the server URL for use in your MCP clients
@@ -78,7 +78,7 @@ Include your API key header (`X-API-Key`) for authenticated access when using mc
## Server Management
-From the server detail view in **Settings → Deployed MCPs**, you can:
+From the server detail view in **Settings → MCP Servers**, you can:
- **View tools**: See all workflows added to a server
- **Copy URL**: Get the server URL for MCP clients
diff --git a/apps/docs/content/docs/en/mcp/index.mdx b/apps/docs/content/docs/en/mcp/index.mdx
index c38f5d95d0..8975c4f39a 100644
--- a/apps/docs/content/docs/en/mcp/index.mdx
+++ b/apps/docs/content/docs/en/mcp/index.mdx
@@ -27,7 +27,7 @@ MCP servers provide collections of tools that your agents can use. Configure the
1. Navigate to your workspace settings
-2. Go to the **Deployed MCPs** section
+2. Go to the **MCP Servers** section
3. Click **Add MCP Server**
4. Enter the server configuration details
5. Save the configuration
diff --git a/apps/docs/content/docs/en/quick-reference/index.mdx b/apps/docs/content/docs/en/quick-reference/index.mdx
index e0996d0b18..85ca46867e 100644
--- a/apps/docs/content/docs/en/quick-reference/index.mdx
+++ b/apps/docs/content/docs/en/quick-reference/index.mdx
@@ -22,17 +22,17 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Create a workspace
Click workspace dropdown → **New Workspace**
-
+
Switch workspaces
Click workspace dropdown → Select workspace
-
+
Invite team members
Sidebar → **Invite**
-
+
Rename a workspace
@@ -69,7 +69,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Reorder / move workflows
Drag workflow up/down or onto a folder
-
+
Import a workflow
@@ -79,7 +79,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Multi-select workflows
`Mod+Click` or `Shift+Click` workflows in sidebar
-
+
Open in new tab
@@ -144,17 +144,17 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Add a block
Drag from Toolbar panel, or right-click canvas → **Add Block**
-
+
Multi-select blocks
`Mod+Click` additional blocks, or shift-drag to draw selection box
-
+
Copy blocks
`Mod+C` with blocks selected
-
+
Paste blocks
@@ -163,7 +163,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Duplicate blocks
Right-click → **Duplicate**
-
+
Delete blocks
@@ -173,7 +173,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Rename a block
Click block name in header, or edit in the Editor panel
-
+
Enable/Disable a block
@@ -183,12 +183,12 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Toggle handle orientation
Right-click → **Toggle Handles**
-
+
Configure a block
Select block → use Editor panel on right
-
+
@@ -203,17 +203,17 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Create a connection
Drag from output handle to input handle
-
+
Delete a connection
Click edge to select → `Delete` key
-
+
Use output in another block
Drag connection tag into input field
-
+
@@ -228,7 +228,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Search toolbar
`Mod+F`
-
+
Search everything
@@ -243,7 +243,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Collapse/expand sidebar
Click collapse button on sidebar
-
+
@@ -337,7 +337,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Copy API endpoint
-
Deploy tab → Copy API endpoint URL
+
Deploy tab → API → Copy API cURL
@@ -367,7 +367,7 @@ A quick lookup for everyday actions in the Sim workflow editor. For keyboard sho
Reference an environment variable
-
Use `{{ENV_VAR}}` syntax in block inputs
+
Use `{{ENV_VAR}}` syntax in block inputs
diff --git a/apps/docs/content/docs/en/tools/browser_use.mdx b/apps/docs/content/docs/en/tools/browser_use.mdx
index ebcb3ec5d8..d0cee89035 100644
--- a/apps/docs/content/docs/en/tools/browser_use.mdx
+++ b/apps/docs/content/docs/en/tools/browser_use.mdx
@@ -47,6 +47,7 @@ Runs a browser automation task using BrowserUse
| `save_browser_data` | boolean | No | Whether to save browser data |
| `model` | string | No | LLM model to use \(default: gpt-4o\) |
| `apiKey` | string | Yes | API key for BrowserUse API |
+| `profile_id` | string | No | Browser profile ID for persistent sessions \(cookies, login state\) |
#### Output
diff --git a/apps/docs/content/docs/en/tools/intercom.mdx b/apps/docs/content/docs/en/tools/intercom.mdx
index 2b21d1cba0..f797074723 100644
--- a/apps/docs/content/docs/en/tools/intercom.mdx
+++ b/apps/docs/content/docs/en/tools/intercom.mdx
@@ -647,6 +647,42 @@ Retrieve a single ticket by ID from Intercom. Returns API-aligned fields only.
| `ticketId` | string | ID of the retrieved ticket |
| `success` | boolean | Operation success status |
+### `intercom_update_ticket`
+
+Update a ticket in Intercom (change state, assignment, attributes)
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `ticketId` | string | Yes | The ID of the ticket to update |
+| `ticket_attributes` | string | No | JSON object with ticket attributes \(e.g., \{"_default_title_":"New Title","_default_description_":"Updated description"\}\) |
+| `open` | boolean | No | Set to false to close the ticket, true to keep it open |
+| `is_shared` | boolean | No | Whether the ticket is visible to users |
+| `snoozed_until` | number | No | Unix timestamp for when the ticket should reopen |
+| `admin_id` | string | No | The ID of the admin performing the update \(needed for workflows and attribution\) |
+| `assignee_id` | string | No | The ID of the admin or team to assign the ticket to. Set to "0" to unassign. |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `ticket` | object | The updated ticket object |
+| ↳ `id` | string | Unique identifier for the ticket |
+| ↳ `type` | string | Object type \(ticket\) |
+| ↳ `ticket_id` | string | Ticket ID shown in Intercom UI |
+| ↳ `ticket_state` | string | State of the ticket |
+| ↳ `ticket_attributes` | object | Attributes of the ticket |
+| ↳ `open` | boolean | Whether the ticket is open |
+| ↳ `is_shared` | boolean | Whether the ticket is visible to users |
+| ↳ `snoozed_until` | number | Unix timestamp when ticket will reopen |
+| ↳ `admin_assignee_id` | string | ID of assigned admin |
+| ↳ `team_assignee_id` | string | ID of assigned team |
+| ↳ `created_at` | number | Unix timestamp when ticket was created |
+| ↳ `updated_at` | number | Unix timestamp when ticket was last updated |
+| `ticketId` | string | ID of the updated ticket |
+| `ticket_state` | string | Current state of the ticket |
+
### `intercom_create_message`
Create and send a new admin-initiated message in Intercom. Returns API-aligned fields only.
@@ -680,4 +716,340 @@ Create and send a new admin-initiated message in Intercom. Returns API-aligned f
| `messageId` | string | ID of the created message |
| `success` | boolean | Operation success status |
+### `intercom_list_admins`
+
+Fetch a list of all admins for the workspace
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `admins` | array | Array of admin objects |
+| ↳ `id` | string | Unique identifier for the admin |
+| ↳ `type` | string | Object type \(admin\) |
+| ↳ `name` | string | Name of the admin |
+| ↳ `email` | string | Email of the admin |
+| ↳ `job_title` | string | Job title of the admin |
+| ↳ `away_mode_enabled` | boolean | Whether admin is in away mode |
+| ↳ `away_mode_reassign` | boolean | Whether to reassign conversations when away |
+| ↳ `has_inbox_seat` | boolean | Whether admin has a paid inbox seat |
+| ↳ `team_ids` | array | List of team IDs the admin belongs to |
+| ↳ `avatar` | object | Avatar information |
+| ↳ `email_verified` | boolean | Whether email is verified |
+| `type` | string | Object type \(admin.list\) |
+
+### `intercom_close_conversation`
+
+Close a conversation in Intercom
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `conversationId` | string | Yes | The ID of the conversation to close |
+| `admin_id` | string | Yes | The ID of the admin performing the action |
+| `body` | string | No | Optional closing message to add to the conversation |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `conversation` | object | The closed conversation object |
+| ↳ `id` | string | Unique identifier for the conversation |
+| ↳ `type` | string | Object type \(conversation\) |
+| ↳ `state` | string | State of the conversation \(closed\) |
+| ↳ `open` | boolean | Whether the conversation is open \(false\) |
+| ↳ `read` | boolean | Whether the conversation has been read |
+| ↳ `created_at` | number | Unix timestamp when conversation was created |
+| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
+| `conversationId` | string | ID of the closed conversation |
+| `state` | string | State of the conversation \(closed\) |
+
+### `intercom_open_conversation`
+
+Open a closed or snoozed conversation in Intercom
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `conversationId` | string | Yes | The ID of the conversation to open |
+| `admin_id` | string | Yes | The ID of the admin performing the action |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `conversation` | object | The opened conversation object |
+| ↳ `id` | string | Unique identifier for the conversation |
+| ↳ `type` | string | Object type \(conversation\) |
+| ↳ `state` | string | State of the conversation \(open\) |
+| ↳ `open` | boolean | Whether the conversation is open \(true\) |
+| ↳ `read` | boolean | Whether the conversation has been read |
+| ↳ `created_at` | number | Unix timestamp when conversation was created |
+| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
+| `conversationId` | string | ID of the opened conversation |
+| `state` | string | State of the conversation \(open\) |
+
+### `intercom_snooze_conversation`
+
+Snooze a conversation to reopen at a future time
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `conversationId` | string | Yes | The ID of the conversation to snooze |
+| `admin_id` | string | Yes | The ID of the admin performing the action |
+| `snoozed_until` | number | Yes | Unix timestamp for when the conversation should reopen |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `conversation` | object | The snoozed conversation object |
+| ↳ `id` | string | Unique identifier for the conversation |
+| ↳ `type` | string | Object type \(conversation\) |
+| ↳ `state` | string | State of the conversation \(snoozed\) |
+| ↳ `open` | boolean | Whether the conversation is open |
+| ↳ `snoozed_until` | number | Unix timestamp when conversation will reopen |
+| ↳ `created_at` | number | Unix timestamp when conversation was created |
+| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
+| `conversationId` | string | ID of the snoozed conversation |
+| `state` | string | State of the conversation \(snoozed\) |
+| `snoozed_until` | number | Unix timestamp when conversation will reopen |
+
+### `intercom_assign_conversation`
+
+Assign a conversation to an admin or team in Intercom
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `conversationId` | string | Yes | The ID of the conversation to assign |
+| `admin_id` | string | Yes | The ID of the admin performing the assignment |
+| `assignee_id` | string | Yes | The ID of the admin or team to assign the conversation to. Set to "0" to unassign. |
+| `body` | string | No | Optional message to add when assigning \(e.g., "Passing to the support team"\) |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `conversation` | object | The assigned conversation object |
+| ↳ `id` | string | Unique identifier for the conversation |
+| ↳ `type` | string | Object type \(conversation\) |
+| ↳ `state` | string | State of the conversation |
+| ↳ `open` | boolean | Whether the conversation is open |
+| ↳ `admin_assignee_id` | number | ID of the assigned admin |
+| ↳ `team_assignee_id` | string | ID of the assigned team |
+| ↳ `created_at` | number | Unix timestamp when conversation was created |
+| ↳ `updated_at` | number | Unix timestamp when conversation was last updated |
+| `conversationId` | string | ID of the assigned conversation |
+| `admin_assignee_id` | number | ID of the assigned admin |
+| `team_assignee_id` | string | ID of the assigned team |
+
+### `intercom_list_tags`
+
+Fetch a list of all tags in the workspace
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `tags` | array | Array of tag objects |
+| ↳ `id` | string | Unique identifier for the tag |
+| ↳ `type` | string | Object type \(tag\) |
+| ↳ `name` | string | Name of the tag |
+| `type` | string | Object type \(list\) |
+
+### `intercom_create_tag`
+
+Create a new tag or update an existing tag name
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `name` | string | Yes | The name of the tag. Will create a new tag if not found, or update the name if id is provided. |
+| `id` | string | No | The ID of an existing tag to update. Omit to create a new tag. |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `id` | string | Unique identifier for the tag |
+| `name` | string | Name of the tag |
+| `type` | string | Object type \(tag\) |
+
+### `intercom_tag_contact`
+
+Add a tag to a specific contact
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `contactId` | string | Yes | The ID of the contact to tag |
+| `tagId` | string | Yes | The ID of the tag to apply |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `id` | string | Unique identifier for the tag |
+| `name` | string | Name of the tag |
+| `type` | string | Object type \(tag\) |
+
+### `intercom_untag_contact`
+
+Remove a tag from a specific contact
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `contactId` | string | Yes | The ID of the contact to untag |
+| `tagId` | string | Yes | The ID of the tag to remove |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `id` | string | Unique identifier for the tag that was removed |
+| `name` | string | Name of the tag that was removed |
+| `type` | string | Object type \(tag\) |
+
+### `intercom_tag_conversation`
+
+Add a tag to a specific conversation
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `conversationId` | string | Yes | The ID of the conversation to tag |
+| `tagId` | string | Yes | The ID of the tag to apply |
+| `admin_id` | string | Yes | The ID of the admin applying the tag |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `id` | string | Unique identifier for the tag |
+| `name` | string | Name of the tag |
+| `type` | string | Object type \(tag\) |
+
+### `intercom_create_note`
+
+Add a note to a specific contact
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `contactId` | string | Yes | The ID of the contact to add the note to |
+| `body` | string | Yes | The text content of the note |
+| `admin_id` | string | No | The ID of the admin creating the note |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `id` | string | Unique identifier for the note |
+| `body` | string | The text content of the note |
+| `created_at` | number | Unix timestamp when the note was created |
+| `type` | string | Object type \(note\) |
+| `author` | object | The admin who created the note |
+| ↳ `type` | string | Author type \(admin\) |
+| ↳ `id` | string | Author ID |
+| ↳ `name` | string | Author name |
+| ↳ `email` | string | Author email |
+| `contact` | object | The contact the note was created for |
+| ↳ `type` | string | Contact type |
+| ↳ `id` | string | Contact ID |
+
+### `intercom_create_event`
+
+Track a custom event for a contact in Intercom
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `event_name` | string | Yes | The name of the event \(e.g., "order-completed"\). Use past-tense verb-noun format for readability. |
+| `created_at` | number | No | Unix timestamp for when the event occurred. Strongly recommended for uniqueness. |
+| `user_id` | string | No | Your identifier for the user \(external_id\) |
+| `email` | string | No | Email address of the user. Use only if your app uses email to uniquely identify users. |
+| `id` | string | No | The Intercom contact ID |
+| `metadata` | string | No | JSON object with up to 10 metadata key-value pairs about the event \(e.g., \{"order_value": 99.99\}\) |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `accepted` | boolean | Whether the event was accepted \(202 Accepted\) |
+
+### `intercom_attach_contact_to_company`
+
+Attach a contact to a company in Intercom
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `contactId` | string | Yes | The ID of the contact to attach to the company |
+| `companyId` | string | Yes | The ID of the company to attach the contact to |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `company` | object | The company object the contact was attached to |
+| ↳ `id` | string | Unique identifier for the company |
+| ↳ `type` | string | Object type \(company\) |
+| ↳ `company_id` | string | The company_id you defined |
+| ↳ `name` | string | Name of the company |
+| ↳ `created_at` | number | Unix timestamp when company was created |
+| ↳ `updated_at` | number | Unix timestamp when company was updated |
+| ↳ `user_count` | number | Number of users in the company |
+| ↳ `session_count` | number | Number of sessions |
+| ↳ `monthly_spend` | number | Monthly spend amount |
+| ↳ `plan` | object | Company plan details |
+| `companyId` | string | ID of the company |
+| `name` | string | Name of the company |
+
+### `intercom_detach_contact_from_company`
+
+Remove a contact from a company in Intercom
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `contactId` | string | Yes | The ID of the contact to detach from the company |
+| `companyId` | string | Yes | The ID of the company to detach the contact from |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `company` | object | The company object the contact was detached from |
+| ↳ `id` | string | Unique identifier for the company |
+| ↳ `type` | string | Object type \(company\) |
+| ↳ `company_id` | string | The company_id you defined |
+| ↳ `name` | string | Name of the company |
+| `companyId` | string | ID of the company |
+| `name` | string | Name of the company |
+
diff --git a/apps/docs/content/docs/en/tools/kalshi.mdx b/apps/docs/content/docs/en/tools/kalshi.mdx
index 0757348b18..bae619d792 100644
--- a/apps/docs/content/docs/en/tools/kalshi.mdx
+++ b/apps/docs/content/docs/en/tools/kalshi.mdx
@@ -6,7 +6,7 @@ description: Access prediction markets and trade on Kalshi
import { BlockInfoCard } from "@/components/ui/block-info-card"
@@ -36,7 +36,7 @@ Integrate Kalshi prediction markets into the workflow. Can get markets, market,
### `kalshi_get_markets`
-Retrieve a list of prediction markets from Kalshi with optional filtering
+Retrieve a list of prediction markets from Kalshi with all filtering options (V2 - full API response)
#### Input
@@ -52,12 +52,12 @@ Retrieve a list of prediction markets from Kalshi with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `markets` | array | Array of market objects |
-| `paging` | object | Pagination cursor for fetching more results |
+| `markets` | array | Array of market objects with all API fields |
+| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_market`
-Retrieve details of a specific prediction market by ticker
+Retrieve details of a specific prediction market by ticker (V2 - full API response)
#### Input
@@ -69,11 +69,62 @@ Retrieve details of a specific prediction market by ticker
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `market` | object | Market object with details |
+| `market` | object | Market object with all API fields |
+| ↳ `ticker` | string | Market ticker |
+| ↳ `event_ticker` | string | Event ticker |
+| ↳ `market_type` | string | Market type |
+| ↳ `title` | string | Market title |
+| ↳ `subtitle` | string | Market subtitle |
+| ↳ `yes_sub_title` | string | Yes outcome subtitle |
+| ↳ `no_sub_title` | string | No outcome subtitle |
+| ↳ `open_time` | string | Market open time |
+| ↳ `close_time` | string | Market close time |
+| ↳ `expected_expiration_time` | string | Expected expiration time |
+| ↳ `expiration_time` | string | Expiration time |
+| ↳ `latest_expiration_time` | string | Latest expiration time |
+| ↳ `settlement_timer_seconds` | number | Settlement timer in seconds |
+| ↳ `status` | string | Market status |
+| ↳ `response_price_units` | string | Response price units |
+| ↳ `notional_value` | number | Notional value |
+| ↳ `tick_size` | number | Tick size |
+| ↳ `yes_bid` | number | Current yes bid price |
+| ↳ `yes_ask` | number | Current yes ask price |
+| ↳ `no_bid` | number | Current no bid price |
+| ↳ `no_ask` | number | Current no ask price |
+| ↳ `last_price` | number | Last trade price |
+| ↳ `previous_yes_bid` | number | Previous yes bid |
+| ↳ `previous_yes_ask` | number | Previous yes ask |
+| ↳ `previous_price` | number | Previous price |
+| ↳ `volume` | number | Total volume |
+| ↳ `volume_24h` | number | 24-hour volume |
+| ↳ `liquidity` | number | Market liquidity |
+| ↳ `open_interest` | number | Open interest |
+| ↳ `result` | string | Market result |
+| ↳ `cap_strike` | number | Cap strike |
+| ↳ `floor_strike` | number | Floor strike |
+| ↳ `can_close_early` | boolean | Can close early |
+| ↳ `expiration_value` | string | Expiration value |
+| ↳ `category` | string | Market category |
+| ↳ `risk_limit_cents` | number | Risk limit in cents |
+| ↳ `strike_type` | string | Strike type |
+| ↳ `rules_primary` | string | Primary rules |
+| ↳ `rules_secondary` | string | Secondary rules |
+| ↳ `settlement_source_url` | string | Settlement source URL |
+| ↳ `custom_strike` | object | Custom strike object |
+| ↳ `underlying` | string | Underlying asset |
+| ↳ `settlement_value` | number | Settlement value |
+| ↳ `cfd_contract_size` | number | CFD contract size |
+| ↳ `yes_fee_fp` | number | Yes fee \(fixed-point\) |
+| ↳ `no_fee_fp` | number | No fee \(fixed-point\) |
+| ↳ `last_price_fp` | number | Last price \(fixed-point\) |
+| ↳ `yes_bid_fp` | number | Yes bid \(fixed-point\) |
+| ↳ `yes_ask_fp` | number | Yes ask \(fixed-point\) |
+| ↳ `no_bid_fp` | number | No bid \(fixed-point\) |
+| ↳ `no_ask_fp` | number | No ask \(fixed-point\) |
### `kalshi_get_events`
-Retrieve a list of events from Kalshi with optional filtering
+Retrieve a list of events from Kalshi with optional filtering (V2 - exact API response)
#### Input
@@ -90,11 +141,12 @@ Retrieve a list of events from Kalshi with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `events` | array | Array of event objects |
-| `paging` | object | Pagination cursor for fetching more results |
+| `milestones` | array | Array of milestone objects \(if requested\) |
+| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_event`
-Retrieve details of a specific event by ticker
+Retrieve details of a specific event by ticker (V2 - exact API response)
#### Input
@@ -107,11 +159,23 @@ Retrieve details of a specific event by ticker
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `event` | object | Event object with details |
+| `event` | object | Event object with full details matching Kalshi API response |
+| ↳ `event_ticker` | string | Event ticker |
+| ↳ `series_ticker` | string | Series ticker |
+| ↳ `title` | string | Event title |
+| ↳ `sub_title` | string | Event subtitle |
+| ↳ `mutually_exclusive` | boolean | Mutually exclusive markets |
+| ↳ `category` | string | Event category |
+| ↳ `collateral_return_type` | string | Collateral return type |
+| ↳ `strike_date` | string | Strike date |
+| ↳ `strike_period` | string | Strike period |
+| ↳ `available_on_brokers` | boolean | Available on brokers |
+| ↳ `product_metadata` | object | Product metadata |
+| ↳ `markets` | array | Nested markets \(if requested\) |
### `kalshi_get_balance`
-Retrieve your account balance and portfolio value from Kalshi
+Retrieve your account balance and portfolio value from Kalshi (V2 - exact API response)
#### Input
@@ -125,11 +189,12 @@ Retrieve your account balance and portfolio value from Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `balance` | number | Account balance in cents |
-| `portfolioValue` | number | Portfolio value in cents |
+| `portfolio_value` | number | Portfolio value in cents |
+| `updated_ts` | number | Unix timestamp of last update \(milliseconds\) |
### `kalshi_get_positions`
-Retrieve your open positions from Kalshi
+Retrieve your open positions from Kalshi (V2 - exact API response)
#### Input
@@ -147,12 +212,13 @@ Retrieve your open positions from Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `positions` | array | Array of position objects |
-| `paging` | object | Pagination cursor for fetching more results |
+| `market_positions` | array | Array of market position objects |
+| `event_positions` | array | Array of event position objects |
+| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_orders`
-Retrieve your orders from Kalshi with optional filtering
+Retrieve your orders from Kalshi with optional filtering (V2 with full API response)
#### Input
@@ -170,12 +236,12 @@ Retrieve your orders from Kalshi with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `orders` | array | Array of order objects |
-| `paging` | object | Pagination cursor for fetching more results |
+| `orders` | array | Array of order objects with full API response fields |
+| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_order`
-Retrieve details of a specific order by ID from Kalshi
+Retrieve details of a specific order by ID from Kalshi (V2 with full API response)
#### Input
@@ -189,11 +255,44 @@ Retrieve details of a specific order by ID from Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `order` | object | Order object with details |
+| `order` | object | Order object with full API response fields |
+| ↳ `order_id` | string | Order ID |
+| ↳ `user_id` | string | User ID |
+| ↳ `client_order_id` | string | Client order ID |
+| ↳ `ticker` | string | Market ticker |
+| ↳ `side` | string | Order side \(yes/no\) |
+| ↳ `action` | string | Action \(buy/sell\) |
+| ↳ `type` | string | Order type \(limit/market\) |
+| ↳ `status` | string | Order status \(resting/canceled/executed\) |
+| ↳ `yes_price` | number | Yes price in cents |
+| ↳ `no_price` | number | No price in cents |
+| ↳ `yes_price_dollars` | string | Yes price in dollars |
+| ↳ `no_price_dollars` | string | No price in dollars |
+| ↳ `fill_count` | number | Filled contract count |
+| ↳ `fill_count_fp` | string | Filled count \(fixed-point\) |
+| ↳ `remaining_count` | number | Remaining contracts |
+| ↳ `remaining_count_fp` | string | Remaining count \(fixed-point\) |
+| ↳ `initial_count` | number | Initial contract count |
+| ↳ `initial_count_fp` | string | Initial count \(fixed-point\) |
+| ↳ `taker_fees` | number | Taker fees in cents |
+| ↳ `maker_fees` | number | Maker fees in cents |
+| ↳ `taker_fees_dollars` | string | Taker fees in dollars |
+| ↳ `maker_fees_dollars` | string | Maker fees in dollars |
+| ↳ `taker_fill_cost` | number | Taker fill cost in cents |
+| ↳ `maker_fill_cost` | number | Maker fill cost in cents |
+| ↳ `taker_fill_cost_dollars` | string | Taker fill cost in dollars |
+| ↳ `maker_fill_cost_dollars` | string | Maker fill cost in dollars |
+| ↳ `queue_position` | number | Queue position \(deprecated\) |
+| ↳ `expiration_time` | string | Order expiration time |
+| ↳ `created_time` | string | Order creation time |
+| ↳ `last_update_time` | string | Last update time |
+| ↳ `self_trade_prevention_type` | string | Self-trade prevention type |
+| ↳ `order_group_id` | string | Order group ID |
+| ↳ `cancel_order_on_pause` | boolean | Cancel on market pause |
### `kalshi_get_orderbook`
-Retrieve the orderbook (yes and no bids) for a specific market
+Retrieve the orderbook (yes and no bids) for a specific market (V2 - includes depth and fp fields)
#### Input
@@ -205,11 +304,18 @@ Retrieve the orderbook (yes and no bids) for a specific market
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `orderbook` | object | Orderbook with yes/no bids and asks |
+| `orderbook` | object | Orderbook with yes/no bids \(legacy integer counts\) |
+| ↳ `yes` | array | Yes side bids as tuples \[price_cents, count\] |
+| ↳ `no` | array | No side bids as tuples \[price_cents, count\] |
+| ↳ `yes_dollars` | array | Yes side bids as tuples \[dollars_string, count\] |
+| ↳ `no_dollars` | array | No side bids as tuples \[dollars_string, count\] |
+| `orderbook_fp` | object | Orderbook with fixed-point counts \(preferred\) |
+| ↳ `yes_dollars` | array | Yes side bids as tuples \[dollars_string, fp_count_string\] |
+| ↳ `no_dollars` | array | No side bids as tuples \[dollars_string, fp_count_string\] |
### `kalshi_get_trades`
-Retrieve recent trades across all markets
+Retrieve recent trades with additional filtering options (V2 - includes trade_id and count_fp)
#### Input
@@ -222,12 +328,12 @@ Retrieve recent trades across all markets
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `trades` | array | Array of trade objects |
-| `paging` | object | Pagination cursor for fetching more results |
+| `trades` | array | Array of trade objects with trade_id and count_fp |
+| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_candlesticks`
-Retrieve OHLC candlestick data for a specific market
+Retrieve OHLC candlestick data for a specific market (V2 - full API response)
#### Input
@@ -243,7 +349,8 @@ Retrieve OHLC candlestick data for a specific market
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `candlesticks` | array | Array of OHLC candlestick data |
+| `ticker` | string | Market ticker |
+| `candlesticks` | array | Array of OHLC candlestick data with nested bid/ask/price objects |
### `kalshi_get_fills`
@@ -266,12 +373,12 @@ Retrieve your portfolio
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `fills` | array | Array of fill/trade objects |
-| `paging` | object | Pagination cursor for fetching more results |
+| `fills` | array | Array of fill/trade objects with all API fields |
+| `cursor` | string | Pagination cursor for fetching more results |
### `kalshi_get_series_by_ticker`
-Retrieve details of a specific market series by ticker
+Retrieve details of a specific market series by ticker (V2 - exact API response)
#### Input
@@ -283,11 +390,25 @@ Retrieve details of a specific market series by ticker
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `series` | object | Series object with details |
+| `series` | object | Series object with full details matching Kalshi API response |
+| ↳ `ticker` | string | Series ticker |
+| ↳ `title` | string | Series title |
+| ↳ `frequency` | string | Event frequency |
+| ↳ `category` | string | Series category |
+| ↳ `tags` | array | Series tags |
+| ↳ `settlement_sources` | array | Settlement sources |
+| ↳ `contract_url` | string | Contract URL |
+| ↳ `contract_terms_url` | string | Contract terms URL |
+| ↳ `fee_type` | string | Fee type |
+| ↳ `fee_multiplier` | number | Fee multiplier |
+| ↳ `additional_prohibitions` | array | Additional prohibitions |
+| ↳ `product_metadata` | object | Product metadata |
+| ↳ `volume` | number | Series volume |
+| ↳ `volume_fp` | number | Volume \(fixed-point\) |
### `kalshi_get_exchange_status`
-Retrieve the current status of the Kalshi exchange (trading and exchange activity)
+Retrieve the current status of the Kalshi exchange (V2 - exact API response)
#### Input
@@ -298,11 +419,13 @@ Retrieve the current status of the Kalshi exchange (trading and exchange activit
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `status` | object | Exchange status with trading_active and exchange_active flags |
+| `exchange_active` | boolean | Whether the exchange is active |
+| `trading_active` | boolean | Whether trading is active |
+| `exchange_estimated_resume_time` | string | Estimated time when exchange will resume \(if inactive\) |
### `kalshi_create_order`
-Create a new order on a Kalshi prediction market
+Create a new order on a Kalshi prediction market (V2 with full API response)
#### Input
@@ -332,11 +455,44 @@ Create a new order on a Kalshi prediction market
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `order` | object | The created order object |
+| `order` | object | The created order object with full API response fields |
+| ↳ `order_id` | string | Order ID |
+| ↳ `user_id` | string | User ID |
+| ↳ `client_order_id` | string | Client order ID |
+| ↳ `ticker` | string | Market ticker |
+| ↳ `side` | string | Order side \(yes/no\) |
+| ↳ `action` | string | Action \(buy/sell\) |
+| ↳ `type` | string | Order type \(limit/market\) |
+| ↳ `status` | string | Order status \(resting/canceled/executed\) |
+| ↳ `yes_price` | number | Yes price in cents |
+| ↳ `no_price` | number | No price in cents |
+| ↳ `yes_price_dollars` | string | Yes price in dollars |
+| ↳ `no_price_dollars` | string | No price in dollars |
+| ↳ `fill_count` | number | Filled contract count |
+| ↳ `fill_count_fp` | string | Filled count \(fixed-point\) |
+| ↳ `remaining_count` | number | Remaining contracts |
+| ↳ `remaining_count_fp` | string | Remaining count \(fixed-point\) |
+| ↳ `initial_count` | number | Initial contract count |
+| ↳ `initial_count_fp` | string | Initial count \(fixed-point\) |
+| ↳ `taker_fees` | number | Taker fees in cents |
+| ↳ `maker_fees` | number | Maker fees in cents |
+| ↳ `taker_fees_dollars` | string | Taker fees in dollars |
+| ↳ `maker_fees_dollars` | string | Maker fees in dollars |
+| ↳ `taker_fill_cost` | number | Taker fill cost in cents |
+| ↳ `maker_fill_cost` | number | Maker fill cost in cents |
+| ↳ `taker_fill_cost_dollars` | string | Taker fill cost in dollars |
+| ↳ `maker_fill_cost_dollars` | string | Maker fill cost in dollars |
+| ↳ `queue_position` | number | Queue position \(deprecated\) |
+| ↳ `expiration_time` | string | Order expiration time |
+| ↳ `created_time` | string | Order creation time |
+| ↳ `last_update_time` | string | Last update time |
+| ↳ `self_trade_prevention_type` | string | Self-trade prevention type |
+| ↳ `order_group_id` | string | Order group ID |
+| ↳ `cancel_order_on_pause` | boolean | Cancel on market pause |
### `kalshi_cancel_order`
-Cancel an existing order on Kalshi
+Cancel an existing order on Kalshi (V2 with full API response)
#### Input
@@ -350,12 +506,46 @@ Cancel an existing order on Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `order` | object | The canceled order object |
-| `reducedBy` | number | Number of contracts canceled |
+| `order` | object | The canceled order object with full API response fields |
+| ↳ `order_id` | string | Order ID |
+| ↳ `user_id` | string | User ID |
+| ↳ `client_order_id` | string | Client order ID |
+| ↳ `ticker` | string | Market ticker |
+| ↳ `side` | string | Order side \(yes/no\) |
+| ↳ `action` | string | Action \(buy/sell\) |
+| ↳ `type` | string | Order type \(limit/market\) |
+| ↳ `status` | string | Order status \(resting/canceled/executed\) |
+| ↳ `yes_price` | number | Yes price in cents |
+| ↳ `no_price` | number | No price in cents |
+| ↳ `yes_price_dollars` | string | Yes price in dollars |
+| ↳ `no_price_dollars` | string | No price in dollars |
+| ↳ `fill_count` | number | Filled contract count |
+| ↳ `fill_count_fp` | string | Filled count \(fixed-point\) |
+| ↳ `remaining_count` | number | Remaining contracts |
+| ↳ `remaining_count_fp` | string | Remaining count \(fixed-point\) |
+| ↳ `initial_count` | number | Initial contract count |
+| ↳ `initial_count_fp` | string | Initial count \(fixed-point\) |
+| ↳ `taker_fees` | number | Taker fees in cents |
+| ↳ `maker_fees` | number | Maker fees in cents |
+| ↳ `taker_fees_dollars` | string | Taker fees in dollars |
+| ↳ `maker_fees_dollars` | string | Maker fees in dollars |
+| ↳ `taker_fill_cost` | number | Taker fill cost in cents |
+| ↳ `maker_fill_cost` | number | Maker fill cost in cents |
+| ↳ `taker_fill_cost_dollars` | string | Taker fill cost in dollars |
+| ↳ `maker_fill_cost_dollars` | string | Maker fill cost in dollars |
+| ↳ `queue_position` | number | Queue position \(deprecated\) |
+| ↳ `expiration_time` | string | Order expiration time |
+| ↳ `created_time` | string | Order creation time |
+| ↳ `last_update_time` | string | Last update time |
+| ↳ `self_trade_prevention_type` | string | Self-trade prevention type |
+| ↳ `order_group_id` | string | Order group ID |
+| ↳ `cancel_order_on_pause` | boolean | Cancel on market pause |
+| `reduced_by` | number | Number of contracts canceled |
+| `reduced_by_fp` | string | Number of contracts canceled in fixed-point format |
### `kalshi_amend_order`
-Modify the price or quantity of an existing order on Kalshi
+Modify the price or quantity of an existing order on Kalshi (V2 with full API response)
#### Input
@@ -379,6 +569,63 @@ Modify the price or quantity of an existing order on Kalshi
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `order` | object | The amended order object |
+| `old_order` | object | The original order object before amendment |
+| ↳ `order_id` | string | Order ID |
+| ↳ `user_id` | string | User ID |
+| ↳ `ticker` | string | Market ticker |
+| ↳ `event_ticker` | string | Event ticker |
+| ↳ `status` | string | Order status |
+| ↳ `side` | string | Order side \(yes/no\) |
+| ↳ `type` | string | Order type \(limit/market\) |
+| ↳ `yes_price` | number | Yes price in cents |
+| ↳ `no_price` | number | No price in cents |
+| ↳ `action` | string | Action \(buy/sell\) |
+| ↳ `count` | number | Number of contracts |
+| ↳ `remaining_count` | number | Remaining contracts |
+| ↳ `created_time` | string | Order creation time |
+| ↳ `expiration_time` | string | Order expiration time |
+| ↳ `order_group_id` | string | Order group ID |
+| ↳ `client_order_id` | string | Client order ID |
+| ↳ `place_count` | number | Place count |
+| ↳ `decrease_count` | number | Decrease count |
+| ↳ `queue_position` | number | Queue position |
+| ↳ `maker_fill_count` | number | Maker fill count |
+| ↳ `taker_fill_count` | number | Taker fill count |
+| ↳ `maker_fees` | number | Maker fees |
+| ↳ `taker_fees` | number | Taker fees |
+| ↳ `last_update_time` | string | Last update time |
+| ↳ `take_profit_order_id` | string | Take profit order ID |
+| ↳ `stop_loss_order_id` | string | Stop loss order ID |
+| ↳ `amend_count` | number | Amend count |
+| ↳ `amend_taker_fill_count` | number | Amend taker fill count |
+| `order` | object | The amended order object with full API response fields |
+| ↳ `order_id` | string | Order ID |
+| ↳ `user_id` | string | User ID |
+| ↳ `ticker` | string | Market ticker |
+| ↳ `event_ticker` | string | Event ticker |
+| ↳ `status` | string | Order status |
+| ↳ `side` | string | Order side \(yes/no\) |
+| ↳ `type` | string | Order type \(limit/market\) |
+| ↳ `yes_price` | number | Yes price in cents |
+| ↳ `no_price` | number | No price in cents |
+| ↳ `action` | string | Action \(buy/sell\) |
+| ↳ `count` | number | Number of contracts |
+| ↳ `remaining_count` | number | Remaining contracts |
+| ↳ `created_time` | string | Order creation time |
+| ↳ `expiration_time` | string | Order expiration time |
+| ↳ `order_group_id` | string | Order group ID |
+| ↳ `client_order_id` | string | Client order ID |
+| ↳ `place_count` | number | Place count |
+| ↳ `decrease_count` | number | Decrease count |
+| ↳ `queue_position` | number | Queue position |
+| ↳ `maker_fill_count` | number | Maker fill count |
+| ↳ `taker_fill_count` | number | Taker fill count |
+| ↳ `maker_fees` | number | Maker fees |
+| ↳ `taker_fees` | number | Taker fees |
+| ↳ `last_update_time` | string | Last update time |
+| ↳ `take_profit_order_id` | string | Take profit order ID |
+| ↳ `stop_loss_order_id` | string | Stop loss order ID |
+| ↳ `amend_count` | number | Amend count |
+| ↳ `amend_taker_fill_count` | number | Amend taker fill count |
diff --git a/apps/docs/content/docs/en/tools/meta.json b/apps/docs/content/docs/en/tools/meta.json
index f7db7e1be6..28bd455450 100644
--- a/apps/docs/content/docs/en/tools/meta.json
+++ b/apps/docs/content/docs/en/tools/meta.json
@@ -97,7 +97,6 @@
"shopify",
"slack",
"smtp",
- "spotify",
"sqs",
"ssh",
"stagehand",
diff --git a/apps/docs/content/docs/en/tools/polymarket.mdx b/apps/docs/content/docs/en/tools/polymarket.mdx
index 6a6d17852d..9370b5031d 100644
--- a/apps/docs/content/docs/en/tools/polymarket.mdx
+++ b/apps/docs/content/docs/en/tools/polymarket.mdx
@@ -29,7 +29,7 @@ By using these documented API endpoints, you can seamlessly integrate Polymarket
## Usage Instructions
-Integrate Polymarket prediction markets into the workflow. Can get markets, market, events, event, tags, series, orderbook, price, midpoint, price history, last trade price, spread, tick size, positions, trades, and search.
+Integrate Polymarket prediction markets into the workflow. Can get markets, market, events, event, tags, series, orderbook, price, midpoint, price history, last trade price, spread, tick size, positions, trades, activity, leaderboard, holders, and search.
@@ -43,7 +43,7 @@ Retrieve a list of prediction markets from Polymarket with optional filtering
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `closed` | string | No | Filter by closed status \(true/false\). Use false for active markets only. |
+| `closed` | string | No | Filter by closed status \(true/false\). Use false for open markets only. |
| `order` | string | No | Sort field \(e.g., volumeNum, liquidityNum, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID |
@@ -55,6 +55,21 @@ Retrieve a list of prediction markets from Polymarket with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `markets` | array | Array of market objects |
+| ↳ `id` | string | Market ID |
+| ↳ `question` | string | Market question |
+| ↳ `conditionId` | string | Condition ID |
+| ↳ `slug` | string | Market slug |
+| ↳ `endDate` | string | End date |
+| ↳ `image` | string | Market image URL |
+| ↳ `outcomes` | string | Outcomes JSON string |
+| ↳ `outcomePrices` | string | Outcome prices JSON string |
+| ↳ `volume` | string | Total volume |
+| ↳ `liquidity` | string | Total liquidity |
+| ↳ `active` | boolean | Whether market is active |
+| ↳ `closed` | boolean | Whether market is closed |
+| ↳ `volumeNum` | number | Volume as number |
+| ↳ `liquidityNum` | number | Liquidity as number |
+| ↳ `clobTokenIds` | array | CLOB token IDs |
### `polymarket_get_market`
@@ -72,6 +87,28 @@ Retrieve details of a specific prediction market by ID or slug
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `market` | object | Market object with details |
+| ↳ `id` | string | Market ID |
+| ↳ `question` | string | Market question |
+| ↳ `conditionId` | string | Condition ID |
+| ↳ `slug` | string | Market slug |
+| ↳ `resolutionSource` | string | Resolution source |
+| ↳ `endDate` | string | End date |
+| ↳ `startDate` | string | Start date |
+| ↳ `image` | string | Market image URL |
+| ↳ `icon` | string | Market icon URL |
+| ↳ `description` | string | Market description |
+| ↳ `outcomes` | string | Outcomes JSON string |
+| ↳ `outcomePrices` | string | Outcome prices JSON string |
+| ↳ `volume` | string | Total volume |
+| ↳ `liquidity` | string | Total liquidity |
+| ↳ `active` | boolean | Whether market is active |
+| ↳ `closed` | boolean | Whether market is closed |
+| ↳ `archived` | boolean | Whether market is archived |
+| ↳ `volumeNum` | number | Volume as number |
+| ↳ `liquidityNum` | number | Liquidity as number |
+| ↳ `clobTokenIds` | array | CLOB token IDs |
+| ↳ `acceptingOrders` | boolean | Whether accepting orders |
+| ↳ `negRisk` | boolean | Whether negative risk |
### `polymarket_get_events`
@@ -81,7 +118,7 @@ Retrieve a list of events from Polymarket with optional filtering
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
-| `closed` | string | No | Filter by closed status \(true/false\). Use false for active events only. |
+| `closed` | string | No | Filter by closed status \(true/false\). Use false for open events only. |
| `order` | string | No | Sort field \(e.g., volume, liquidity, startDate, endDate, createdAt\) |
| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
| `tagId` | string | No | Filter by tag ID |
@@ -93,6 +130,21 @@ Retrieve a list of events from Polymarket with optional filtering
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `events` | array | Array of event objects |
+| ↳ `id` | string | Event ID |
+| ↳ `ticker` | string | Event ticker |
+| ↳ `slug` | string | Event slug |
+| ↳ `title` | string | Event title |
+| ↳ `description` | string | Event description |
+| ↳ `startDate` | string | Start date |
+| ↳ `endDate` | string | End date |
+| ↳ `image` | string | Event image URL |
+| ↳ `icon` | string | Event icon URL |
+| ↳ `active` | boolean | Whether event is active |
+| ↳ `closed` | boolean | Whether event is closed |
+| ↳ `archived` | boolean | Whether event is archived |
+| ↳ `liquidity` | number | Total liquidity |
+| ↳ `volume` | number | Total volume |
+| ↳ `markets` | array | Array of markets in this event |
### `polymarket_get_event`
@@ -110,6 +162,24 @@ Retrieve details of a specific event by ID or slug
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `event` | object | Event object with details |
+| ↳ `id` | string | Event ID |
+| ↳ `ticker` | string | Event ticker |
+| ↳ `slug` | string | Event slug |
+| ↳ `title` | string | Event title |
+| ↳ `description` | string | Event description |
+| ↳ `startDate` | string | Start date |
+| ↳ `creationDate` | string | Creation date |
+| ↳ `endDate` | string | End date |
+| ↳ `image` | string | Event image URL |
+| ↳ `icon` | string | Event icon URL |
+| ↳ `active` | boolean | Whether event is active |
+| ↳ `closed` | boolean | Whether event is closed |
+| ↳ `archived` | boolean | Whether event is archived |
+| ↳ `liquidity` | number | Total liquidity |
+| ↳ `volume` | number | Total volume |
+| ↳ `openInterest` | number | Open interest |
+| ↳ `commentCount` | number | Comment count |
+| ↳ `markets` | array | Array of markets in this event |
### `polymarket_get_tags`
@@ -126,7 +196,12 @@ Retrieve available tags for filtering markets from Polymarket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `tags` | array | Array of tag objects with id, label, and slug |
+| `tags` | array | Array of tag objects |
+| ↳ `id` | string | Tag ID |
+| ↳ `label` | string | Tag label |
+| ↳ `slug` | string | Tag slug |
+| ↳ `createdAt` | string | Creation timestamp |
+| ↳ `updatedAt` | string | Last update timestamp |
### `polymarket_search`
@@ -138,13 +213,28 @@ Search for markets, events, and profiles on Polymarket
| --------- | ---- | -------- | ----------- |
| `query` | string | Yes | Search query term |
| `limit` | string | No | Number of results per page \(max 50\) |
-| `offset` | string | No | Pagination offset |
+| `page` | string | No | Page number for pagination \(1-indexed\) |
+| `cache` | string | No | Enable caching \(true/false\) |
+| `eventsStatus` | string | No | Filter events by status |
+| `limitPerType` | string | No | Limit results per type \(markets, events, profiles\) |
+| `eventsTag` | string | No | Filter by event tags \(comma-separated\) |
+| `sort` | string | No | Sort field |
+| `ascending` | string | No | Sort direction \(true for ascending, false for descending\) |
+| `searchTags` | string | No | Include tags in search results \(true/false\) |
+| `searchProfiles` | string | No | Include profiles in search results \(true/false\) |
+| `recurrence` | string | No | Filter by recurrence type |
+| `excludeTagId` | string | No | Exclude events with these tag IDs \(comma-separated\) |
+| `keepClosedMarkets` | string | No | Include closed markets in results \(0 or 1\) |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `results` | object | Search results containing markets, events, and profiles arrays |
+| `results` | object | Search results containing markets, events, tags, and profiles arrays |
+| ↳ `markets` | array | Array of matching market objects |
+| ↳ `events` | array | Array of matching event objects |
+| ↳ `tags` | array | Array of matching tag objects |
+| ↳ `profiles` | array | Array of matching profile objects |
### `polymarket_get_series`
@@ -162,6 +252,21 @@ Retrieve series (related market groups) from Polymarket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `series` | array | Array of series objects |
+| ↳ `id` | string | Series ID |
+| ↳ `ticker` | string | Series ticker |
+| ↳ `slug` | string | Series slug |
+| ↳ `title` | string | Series title |
+| ↳ `seriesType` | string | Series type |
+| ↳ `recurrence` | string | Recurrence pattern |
+| ↳ `image` | string | Series image URL |
+| ↳ `icon` | string | Series icon URL |
+| ↳ `active` | boolean | Whether series is active |
+| ↳ `closed` | boolean | Whether series is closed |
+| ↳ `archived` | boolean | Whether series is archived |
+| ↳ `featured` | boolean | Whether series is featured |
+| ↳ `volume` | number | Total volume |
+| ↳ `liquidity` | number | Total liquidity |
+| ↳ `eventCount` | number | Number of events in series |
### `polymarket_get_series_by_id`
@@ -178,6 +283,23 @@ Retrieve a specific series (related market group) by ID from Polymarket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `series` | object | Series object with details |
+| ↳ `id` | string | Series ID |
+| ↳ `ticker` | string | Series ticker |
+| ↳ `slug` | string | Series slug |
+| ↳ `title` | string | Series title |
+| ↳ `seriesType` | string | Series type |
+| ↳ `recurrence` | string | Recurrence pattern |
+| ↳ `image` | string | Series image URL |
+| ↳ `icon` | string | Series icon URL |
+| ↳ `active` | boolean | Whether series is active |
+| ↳ `closed` | boolean | Whether series is closed |
+| ↳ `archived` | boolean | Whether series is archived |
+| ↳ `featured` | boolean | Whether series is featured |
+| ↳ `volume` | number | Total volume |
+| ↳ `liquidity` | number | Total liquidity |
+| ↳ `commentCount` | number | Comment count |
+| ↳ `eventCount` | number | Number of events in series |
+| ↳ `events` | array | Array of events in this series |
### `polymarket_get_orderbook`
@@ -194,6 +316,21 @@ Retrieve the order book summary for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `orderbook` | object | Order book with bids and asks arrays |
+| ↳ `market` | string | Market identifier |
+| ↳ `asset_id` | string | Asset token ID |
+| ↳ `hash` | string | Order book hash |
+| ↳ `timestamp` | string | Timestamp |
+| ↳ `bids` | array | Bid orders |
+| ↳ `price` | string | Bid price |
+| ↳ `size` | string | Bid size |
+| ↳ `price` | string | Ask price |
+| ↳ `size` | string | Ask size |
+| ↳ `asks` | array | Ask orders |
+| ↳ `price` | string | Ask price |
+| ↳ `size` | string | Ask size |
+| ↳ `min_order_size` | string | Minimum order size |
+| ↳ `tick_size` | string | Tick size |
+| ↳ `neg_risk` | boolean | Whether negative risk |
### `polymarket_get_price`
@@ -246,7 +383,9 @@ Retrieve historical price data for a specific market token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `history` | array | Array of price history entries with timestamp \(t\) and price \(p\) |
+| `history` | array | Array of price history entries |
+| ↳ `t` | number | Unix timestamp |
+| ↳ `p` | number | Price at timestamp |
### `polymarket_get_last_trade_price`
@@ -263,6 +402,7 @@ Retrieve the last trade price for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `price` | string | Last trade price |
+| `side` | string | Side of the last trade \(BUY or SELL\) |
### `polymarket_get_spread`
@@ -278,7 +418,8 @@ Retrieve the bid-ask spread for a specific token
| Parameter | Type | Description |
| --------- | ---- | ----------- |
-| `spread` | object | Bid-ask spread with bid and ask prices |
+| `spread` | object | Spread value between bid and ask |
+| ↳ `spread` | string | The spread value |
### `polymarket_get_tick_size`
@@ -305,13 +446,47 @@ Retrieve user positions from Polymarket
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `user` | string | Yes | User wallet address |
-| `market` | string | No | Optional market ID to filter positions |
+| `market` | string | No | Condition IDs to filter positions \(comma-separated, mutually exclusive with eventId\) |
+| `eventId` | string | No | Event ID to filter positions \(mutually exclusive with market\) |
+| `sizeThreshold` | string | No | Minimum position size threshold \(default: 1\) |
+| `redeemable` | string | No | Filter for redeemable positions only \(true/false\) |
+| `mergeable` | string | No | Filter for mergeable positions only \(true/false\) |
+| `sortBy` | string | No | Sort field \(TOKENS, CURRENT, INITIAL, CASHPNL, PERCENTPNL, TITLE, RESOLVING, PRICE, AVGPRICE\) |
+| `sortDirection` | string | No | Sort direction \(ASC or DESC\) |
+| `title` | string | No | Search filter by title |
+| `limit` | string | No | Number of results per page |
+| `offset` | string | No | Pagination offset |
#### Output
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `positions` | array | Array of position objects |
+| ↳ `proxyWallet` | string | Proxy wallet address |
+| ↳ `asset` | string | Asset token ID |
+| ↳ `conditionId` | string | Condition ID |
+| ↳ `size` | number | Position size |
+| ↳ `avgPrice` | number | Average price |
+| ↳ `initialValue` | number | Initial value |
+| ↳ `currentValue` | number | Current value |
+| ↳ `cashPnl` | number | Cash profit/loss |
+| ↳ `percentPnl` | number | Percent profit/loss |
+| ↳ `totalBought` | number | Total bought |
+| ↳ `realizedPnl` | number | Realized profit/loss |
+| ↳ `percentRealizedPnl` | number | Percent realized profit/loss |
+| ↳ `curPrice` | number | Current price |
+| ↳ `redeemable` | boolean | Whether position is redeemable |
+| ↳ `mergeable` | boolean | Whether position is mergeable |
+| ↳ `title` | string | Market title |
+| ↳ `slug` | string | Market slug |
+| ↳ `icon` | string | Market icon URL |
+| ↳ `eventSlug` | string | Event slug |
+| ↳ `outcome` | string | Outcome name |
+| ↳ `outcomeIndex` | number | Outcome index |
+| ↳ `oppositeOutcome` | string | Opposite outcome name |
+| ↳ `oppositeAsset` | string | Opposite asset token ID |
+| ↳ `endDate` | string | End date |
+| ↳ `negativeRisk` | boolean | Whether negative risk |
### `polymarket_get_trades`
@@ -322,8 +497,13 @@ Retrieve trade history from Polymarket
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `user` | string | No | User wallet address to filter trades |
-| `market` | string | No | Market ID to filter trades |
-| `limit` | string | No | Number of results per page \(max 50\) |
+| `market` | string | No | Market/condition ID to filter trades \(mutually exclusive with eventId\) |
+| `eventId` | string | No | Event ID to filter trades \(mutually exclusive with market\) |
+| `side` | string | No | Trade direction filter \(BUY or SELL\) |
+| `takerOnly` | string | No | Filter for taker trades only \(true/false, default: true\) |
+| `filterType` | string | No | Filter type \(CASH or TOKENS\) - requires filterAmount |
+| `filterAmount` | string | No | Filter amount threshold - requires filterType |
+| `limit` | string | No | Number of results per page \(default: 100, max: 10000\) |
| `offset` | string | No | Pagination offset \(skip this many results\) |
#### Output
@@ -331,5 +511,141 @@ Retrieve trade history from Polymarket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `trades` | array | Array of trade objects |
+| ↳ `proxyWallet` | string | Proxy wallet address |
+| ↳ `side` | string | Trade side \(BUY or SELL\) |
+| ↳ `asset` | string | Asset token ID |
+| ↳ `conditionId` | string | Condition ID |
+| ↳ `size` | number | Trade size |
+| ↳ `price` | number | Trade price |
+| ↳ `timestamp` | number | Unix timestamp |
+| ↳ `title` | string | Market title |
+| ↳ `slug` | string | Market slug |
+| ↳ `icon` | string | Market icon URL |
+| ↳ `eventSlug` | string | Event slug |
+| ↳ `outcome` | string | Outcome name |
+| ↳ `outcomeIndex` | number | Outcome index |
+| ↳ `name` | string | Trader name |
+| ↳ `pseudonym` | string | Trader pseudonym |
+| ↳ `bio` | string | Trader bio |
+| ↳ `profileImage` | string | Profile image URL |
+| ↳ `profileImageOptimized` | string | Optimized profile image URL |
+| ↳ `transactionHash` | string | Transaction hash |
+
+### `polymarket_get_activity`
+
+Retrieve on-chain activity for a user including trades, splits, merges, redemptions, rewards, and conversions
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `user` | string | Yes | User wallet address \(0x-prefixed\) |
+| `limit` | string | No | Maximum results \(default: 100, max: 500\) |
+| `offset` | string | No | Pagination offset \(default: 0, max: 10000\) |
+| `market` | string | No | Comma-separated condition IDs \(mutually exclusive with eventId\) |
+| `eventId` | string | No | Comma-separated event IDs \(mutually exclusive with market\) |
+| `type` | string | No | Activity type filter: TRADE, SPLIT, MERGE, REDEEM, REWARD, CONVERSION, MAKER_REBATE |
+| `start` | number | No | Start timestamp \(Unix seconds\) |
+| `end` | number | No | End timestamp \(Unix seconds\) |
+| `sortBy` | string | No | Sort field: TIMESTAMP, TOKENS, or CASH \(default: TIMESTAMP\) |
+| `sortDirection` | string | No | Sort direction: ASC or DESC \(default: DESC\) |
+| `side` | string | No | Trade side filter: BUY or SELL \(only applies to trades\) |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `activity` | array | Array of activity entries |
+| ↳ `proxyWallet` | string | User proxy wallet address |
+| ↳ `timestamp` | number | Unix timestamp of activity |
+| ↳ `conditionId` | string | Market condition ID |
+| ↳ `type` | string | Activity type \(TRADE, SPLIT, MERGE, REDEEM, REWARD, CONVERSION\) |
+| ↳ `size` | number | Size in tokens |
+| ↳ `usdcSize` | number | Size in USDC |
+| ↳ `transactionHash` | string | Blockchain transaction hash |
+| ↳ `price` | number | Price \(for trades\) |
+| ↳ `asset` | string | Asset/token ID |
+| ↳ `side` | string | Trade side \(BUY/SELL\) |
+| ↳ `outcomeIndex` | number | Outcome index |
+| ↳ `title` | string | Market title |
+| ↳ `slug` | string | Market slug |
+| ↳ `icon` | string | Market icon URL |
+| ↳ `eventSlug` | string | Event slug |
+| ↳ `outcome` | string | Outcome name |
+| ↳ `name` | string | User display name |
+| ↳ `pseudonym` | string | User pseudonym |
+| ↳ `bio` | string | User bio |
+| ↳ `profileImage` | string | User profile image URL |
+| ↳ `profileImageOptimized` | string | Optimized profile image URL |
+
+### `polymarket_get_leaderboard`
+
+Retrieve trader leaderboard rankings by profit/loss or volume
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `category` | string | No | Category filter: OVERALL, POLITICS, SPORTS, CRYPTO, CULTURE, MENTIONS, WEATHER, ECONOMICS, TECH, FINANCE \(default: OVERALL\) |
+| `timePeriod` | string | No | Time period: DAY, WEEK, MONTH, ALL \(default: DAY\) |
+| `orderBy` | string | No | Order by: PNL or VOL \(default: PNL\) |
+| `limit` | string | No | Number of results \(1-50, default: 25\) |
+| `offset` | string | No | Pagination offset \(0-1000, default: 0\) |
+| `user` | string | No | Filter by specific user wallet address |
+| `userName` | string | No | Filter by username |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `leaderboard` | array | Array of leaderboard entries |
+| ↳ `rank` | string | Leaderboard rank position |
+| ↳ `proxyWallet` | string | User proxy wallet address |
+| ↳ `userName` | string | User display name |
+| ↳ `vol` | number | Trading volume |
+| ↳ `pnl` | number | Profit and loss |
+| ↳ `profileImage` | string | User profile image URL |
+| ↳ `xUsername` | string | Twitter/X username |
+| ↳ `verifiedBadge` | boolean | Whether user has verified badge |
+
+### `polymarket_get_holders`
+
+Retrieve top holders of a specific market token
+
+#### Input
+
+| Parameter | Type | Required | Description |
+| --------- | ---- | -------- | ----------- |
+| `market` | string | Yes | Comma-separated list of condition IDs |
+| `limit` | string | No | Number of holders to return \(0-20, default: 20\) |
+| `minBalance` | string | No | Minimum balance threshold \(default: 1\) |
+
+#### Output
+
+| Parameter | Type | Description |
+| --------- | ---- | ----------- |
+| `holders` | array | Array of market holder groups by token |
+| ↳ `token` | string | Token/asset ID |
+| ↳ `holders` | array | Array of holders for this token |
+| ↳ `proxyWallet` | string | Holder wallet address |
+| ↳ `bio` | string | Holder bio |
+| ↳ `asset` | string | Asset ID |
+| ↳ `pseudonym` | string | Holder pseudonym |
+| ↳ `amount` | number | Amount held |
+| ↳ `displayUsernamePublic` | boolean | Whether username is publicly displayed |
+| ↳ `outcomeIndex` | number | Outcome index |
+| ↳ `name` | string | Holder display name |
+| ↳ `profileImage` | string | Profile image URL |
+| ↳ `profileImageOptimized` | string | Optimized profile image URL |
+| ↳ `proxyWallet` | string | Holder wallet address |
+| ↳ `bio` | string | Holder bio |
+| ↳ `asset` | string | Asset ID |
+| ↳ `pseudonym` | string | Holder pseudonym |
+| ↳ `amount` | number | Amount held |
+| ↳ `displayUsernamePublic` | boolean | Whether username is publicly displayed |
+| ↳ `outcomeIndex` | number | Outcome index |
+| ↳ `name` | string | Holder display name |
+| ↳ `profileImage` | string | Profile image URL |
+| ↳ `profileImageOptimized` | string | Optimized profile image URL |
diff --git a/apps/docs/content/docs/en/tools/spotify.mdx b/apps/docs/content/docs/en/tools/spotify.mdx
deleted file mode 100644
index a9d7974330..0000000000
--- a/apps/docs/content/docs/en/tools/spotify.mdx
+++ /dev/null
@@ -1,1551 +0,0 @@
----
-title: Spotify
-description: Search music, manage playlists, control playback, and access your library
----
-
-import { BlockInfoCard } from "@/components/ui/block-info-card"
-
-
-
-{/* MANUAL-CONTENT-START:intro */}
-Effortlessly discover, play, and organize music with **Spotify**—the ultimate streaming platform millions rely on for their music, podcasts, and audiobooks. Integrate Spotify into your workflows to control your musical experience and manage your library with ease.
-
-With the Spotify integration, you can:
-
-- **Search & explore:** Instantly search the Spotify catalog for tracks, albums, artists, or playlists to find exactly what you’re looking for.
-- **Manage playlists:** Create and modify playlists, add or remove tracks, and organize your favorite music collections on the go.
-- **Control playback:** Play, pause, skip tracks, adjust volume, and switch playback devices seamlessly within your workflow.
-- **Access your library:** Retrieve and browse your saved tracks, liked albums, and followed artists at any time.
-- **Fetch detailed track info:** Get in-depth details on any track, album, or artist, including popularity, duration, and preview audio.
-- **Seamlessly integrate music into automation:** Trigger specific music actions or updates based on events or other app workflows.
-
-Spotify empowers music lovers, curators, and creators to personalize their audio experience, automate routine tasks, and spend more time enjoying and sharing what they love. Enhance your productivity and add a soundtrack to your day—connect Spotify to your automated workflows now!
-{/* MANUAL-CONTENT-END */}
-
-
-## Usage Instructions
-
-Integrate Spotify into your workflow. Search for tracks, albums, artists, and playlists. Manage playlists, access your library, control playback, browse podcasts and audiobooks.
-
-
-
-## Tools
-
-### `spotify_search`
-
-Search for tracks, albums, artists, or playlists on Spotify. Returns matching results based on the query.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `query` | string | Yes | Search query \(e.g., "Bohemian Rhapsody", "artist:Queen", "genre:rock"\) |
-| `type` | string | No | Type of results: track, album, artist, playlist, or comma-separated \(e.g., "track,artist"\) |
-| `limit` | number | No | Maximum number of results to return \(1-50\) |
-| `offset` | number | No | Index of the first result to return for pagination |
-| `market` | string | No | ISO 3166-1 alpha-2 country code to filter results \(e.g., "US", "GB"\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | array | List of matching tracks |
-| ↳ `id` | string | Spotify track ID |
-| ↳ `name` | string | Track name |
-| ↳ `artists` | array | List of artist names |
-| ↳ `album` | string | Album name |
-| ↳ `duration_ms` | number | Track duration in milliseconds |
-| ↳ `popularity` | number | Popularity score \(0-100\) |
-| ↳ `preview_url` | string | URL to 30-second preview |
-| ↳ `external_url` | string | Spotify URL |
-| `artists` | array | List of matching artists |
-| `albums` | array | List of matching albums |
-| `playlists` | array | List of matching playlists |
-
-### `spotify_get_track`
-
-Get detailed information about a specific track on Spotify by its ID.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `trackId` | string | Yes | The Spotify ID of the track |
-| `market` | string | No | ISO 3166-1 alpha-2 country code for track availability |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Spotify track ID |
-| `name` | string | Track name |
-| `artists` | array | List of artists |
-| `album` | object | Album information |
-| `duration_ms` | number | Track duration in milliseconds |
-| `explicit` | boolean | Whether the track has explicit content |
-| `popularity` | number | Popularity score \(0-100\) |
-| `preview_url` | string | URL to 30-second preview |
-| `external_url` | string | Spotify URL |
-| `uri` | string | Spotify URI for the track |
-
-### `spotify_get_tracks`
-
-Get detailed information about multiple tracks on Spotify by their IDs (up to 50).
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `trackIds` | string | Yes | Comma-separated list of Spotify track IDs \(max 50\) |
-| `market` | string | No | ISO 3166-1 alpha-2 country code for track availability |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | array | List of tracks |
-| ↳ `id` | string | Spotify track ID |
-| ↳ `name` | string | Track name |
-| ↳ `artists` | array | List of artists |
-| ↳ `album` | object | Album information |
-| ↳ `duration_ms` | number | Track duration in milliseconds |
-| ↳ `explicit` | boolean | Whether the track has explicit content |
-| ↳ `popularity` | number | Popularity score \(0-100\) |
-| ↳ `preview_url` | string | URL to 30-second preview |
-| ↳ `external_url` | string | Spotify URL |
-
-### `spotify_get_album`
-
-Get detailed information about an album on Spotify by its ID, including track listing.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `albumId` | string | Yes | The Spotify ID of the album |
-| `market` | string | No | ISO 3166-1 alpha-2 country code for track availability |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Spotify album ID |
-| `name` | string | Album name |
-| `artists` | array | List of artists |
-| `album_type` | string | Type of album \(album, single, compilation\) |
-| `total_tracks` | number | Total number of tracks |
-| `release_date` | string | Release date |
-| `label` | string | Record label |
-| `popularity` | number | Popularity score \(0-100\) |
-| `genres` | array | List of genres |
-| `image_url` | string | Album cover image URL |
-| `tracks` | array | List of tracks on the album |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_albums`
-
-Get details for multiple albums by their IDs.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `albumIds` | string | Yes | Comma-separated album IDs \(max 20\) |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `albums` | json | List of albums |
-
-### `spotify_get_album_tracks`
-
-Get the tracks from an album.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `albumId` | string | Yes | The Spotify album ID |
-| `limit` | number | No | Number of tracks to return \(1-50\) |
-| `offset` | number | No | Index of first track to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | json | List of tracks |
-| `total` | number | Total number of tracks |
-| `next` | string | URL for next page |
-
-### `spotify_get_saved_albums`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of albums to return \(1-50\) |
-| `offset` | number | No | Index of first album to return |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `albums` | json | List of saved albums |
-| `total` | number | Total saved albums |
-| `next` | string | URL for next page |
-
-### `spotify_save_albums`
-
-Save albums to the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `albumIds` | string | Yes | Comma-separated album IDs \(max 20\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether albums were saved |
-
-### `spotify_remove_saved_albums`
-
-Remove albums from the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `albumIds` | string | Yes | Comma-separated album IDs \(max 20\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether albums were removed |
-
-### `spotify_check_saved_albums`
-
-Check if albums are saved in library.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `albumIds` | string | Yes | Comma-separated album IDs \(max 20\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of booleans for each album |
-
-### `spotify_get_artist`
-
-Get detailed information about an artist on Spotify by their ID.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `artistId` | string | Yes | The Spotify ID of the artist |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Spotify artist ID |
-| `name` | string | Artist name |
-| `genres` | array | List of genres associated with the artist |
-| `popularity` | number | Popularity score \(0-100\) |
-| `followers` | number | Number of followers |
-| `image_url` | string | Artist image URL |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_artists`
-
-Get details for multiple artists by their IDs.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `artistIds` | string | Yes | Comma-separated artist IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `artists` | json | List of artists |
-
-### `spotify_get_artist_albums`
-
-Get albums by an artist on Spotify. Can filter by album type.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `artistId` | string | Yes | The Spotify ID of the artist |
-| `include_groups` | string | No | Filter by album type: album, single, appears_on, compilation \(comma-separated\) |
-| `limit` | number | No | Maximum number of albums to return \(1-50\) |
-| `offset` | number | No | Index of the first album to return |
-| `market` | string | No | ISO 3166-1 alpha-2 country code |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `albums` | array | Artist |
-| ↳ `id` | string | Spotify album ID |
-| ↳ `name` | string | Album name |
-| ↳ `album_type` | string | Type \(album, single, compilation\) |
-| ↳ `total_tracks` | number | Number of tracks |
-| ↳ `release_date` | string | Release date |
-| ↳ `image_url` | string | Album cover URL |
-| ↳ `external_url` | string | Spotify URL |
-| `total` | number | Total number of albums available |
-| `next` | string | URL for next page of results |
-
-### `spotify_get_artist_top_tracks`
-
-Get the top 10 most popular tracks by an artist on Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `artistId` | string | Yes | The Spotify ID of the artist |
-| `market` | string | No | ISO 3166-1 alpha-2 country code \(required for this endpoint\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | array | Artist |
-| ↳ `id` | string | Spotify track ID |
-| ↳ `name` | string | Track name |
-| ↳ `album` | object | Album information |
-| ↳ `duration_ms` | number | Track duration in milliseconds |
-| ↳ `popularity` | number | Popularity score \(0-100\) |
-| ↳ `preview_url` | string | URL to 30-second preview |
-| ↳ `external_url` | string | Spotify URL |
-
-### `spotify_follow_artists`
-
-Follow one or more artists.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `artistIds` | string | Yes | Comma-separated artist IDs to follow \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether artists were followed successfully |
-
-### `spotify_unfollow_artists`
-
-Unfollow one or more artists.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `artistIds` | string | Yes | Comma-separated artist IDs to unfollow \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether artists were unfollowed successfully |
-
-### `spotify_get_followed_artists`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of artists to return \(1-50\) |
-| `after` | string | No | Cursor for pagination \(last artist ID from previous request\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `artists` | json | List of followed artists |
-| `total` | number | Total number of followed artists |
-| `next` | string | Cursor for next page |
-
-### `spotify_check_following`
-
-Check if the user follows artists or users.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `type` | string | Yes | Type to check: "artist" or "user" |
-| `ids` | string | Yes | Comma-separated artist or user IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of booleans for each ID |
-
-### `spotify_get_show`
-
-Get details for a podcast show.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `showId` | string | Yes | The Spotify show ID |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Show ID |
-| `name` | string | Show name |
-| `description` | string | Show description |
-| `publisher` | string | Publisher name |
-| `total_episodes` | number | Total episodes |
-| `explicit` | boolean | Contains explicit content |
-| `languages` | json | Languages |
-| `image_url` | string | Cover image URL |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_shows`
-
-Get details for multiple podcast shows.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `showIds` | string | Yes | Comma-separated show IDs \(max 50\) |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `shows` | json | List of shows |
-
-### `spotify_get_show_episodes`
-
-Get episodes from a podcast show.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `showId` | string | Yes | The Spotify show ID |
-| `limit` | number | No | Number of episodes to return \(1-50\) |
-| `offset` | number | No | Index of first episode to return |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `episodes` | json | List of episodes |
-| `total` | number | Total episodes |
-| `next` | string | URL for next page |
-
-### `spotify_get_saved_shows`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of shows to return \(1-50\) |
-| `offset` | number | No | Index of first show to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `shows` | json | List of saved shows |
-| `total` | number | Total saved shows |
-| `next` | string | URL for next page |
-
-### `spotify_save_shows`
-
-Save podcast shows to the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `showIds` | string | Yes | Comma-separated show IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether shows were saved |
-
-### `spotify_remove_saved_shows`
-
-Remove podcast shows from the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `showIds` | string | Yes | Comma-separated show IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether shows were removed |
-
-### `spotify_check_saved_shows`
-
-Check if shows are saved in library.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `showIds` | string | Yes | Comma-separated show IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of booleans for each show |
-
-### `spotify_get_episode`
-
-Get details for a podcast episode.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `episodeId` | string | Yes | The Spotify episode ID |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Episode ID |
-| `name` | string | Episode name |
-| `description` | string | Episode description |
-| `duration_ms` | number | Duration in ms |
-| `release_date` | string | Release date |
-| `explicit` | boolean | Contains explicit content |
-| `show` | json | Parent show info |
-| `image_url` | string | Cover image URL |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_episodes`
-
-Get details for multiple podcast episodes.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `episodeIds` | string | Yes | Comma-separated episode IDs \(max 50\) |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `episodes` | json | List of episodes |
-
-### `spotify_get_saved_episodes`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of episodes to return \(1-50\) |
-| `offset` | number | No | Index of first episode to return |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `episodes` | json | List of saved episodes |
-| `total` | number | Total saved episodes |
-| `next` | string | URL for next page |
-
-### `spotify_save_episodes`
-
-Save podcast episodes to the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `episodeIds` | string | Yes | Comma-separated episode IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether episodes were saved |
-
-### `spotify_remove_saved_episodes`
-
-Remove podcast episodes from the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `episodeIds` | string | Yes | Comma-separated episode IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether episodes were removed |
-
-### `spotify_check_saved_episodes`
-
-Check if episodes are saved in library.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `episodeIds` | string | Yes | Comma-separated episode IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of booleans for each episode |
-
-### `spotify_get_audiobook`
-
-Get details for an audiobook.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `audiobookId` | string | Yes | The Spotify audiobook ID |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Audiobook ID |
-| `name` | string | Audiobook name |
-| `authors` | json | Authors |
-| `narrators` | json | Narrators |
-| `publisher` | string | Publisher |
-| `description` | string | Description |
-| `total_chapters` | number | Total chapters |
-| `languages` | json | Languages |
-| `image_url` | string | Cover image URL |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_audiobooks`
-
-Get details for multiple audiobooks.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `audiobookIds` | string | Yes | Comma-separated audiobook IDs \(max 50\) |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `audiobooks` | json | List of audiobooks |
-
-### `spotify_get_audiobook_chapters`
-
-Get chapters from an audiobook.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `audiobookId` | string | Yes | The Spotify audiobook ID |
-| `limit` | number | No | Number of chapters to return \(1-50\) |
-| `offset` | number | No | Index of first chapter to return |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `chapters` | json | List of chapters |
-| `total` | number | Total chapters |
-| `next` | string | URL for next page |
-
-### `spotify_get_saved_audiobooks`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of audiobooks to return \(1-50\) |
-| `offset` | number | No | Index of first audiobook to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `audiobooks` | json | List of saved audiobooks |
-| `total` | number | Total saved audiobooks |
-| `next` | string | URL for next page |
-
-### `spotify_save_audiobooks`
-
-Save audiobooks to the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `audiobookIds` | string | Yes | Comma-separated audiobook IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether audiobooks were saved |
-
-### `spotify_remove_saved_audiobooks`
-
-Remove audiobooks from the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `audiobookIds` | string | Yes | Comma-separated audiobook IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether audiobooks were removed |
-
-### `spotify_check_saved_audiobooks`
-
-Check if audiobooks are saved in library.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `audiobookIds` | string | Yes | Comma-separated audiobook IDs \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of booleans for each audiobook |
-
-### `spotify_get_playlist`
-
-Get detailed information about a playlist on Spotify by its ID.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify ID of the playlist |
-| `market` | string | No | ISO 3166-1 alpha-2 country code for track availability |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Spotify playlist ID |
-| `name` | string | Playlist name |
-| `description` | string | Playlist description |
-| `public` | boolean | Whether the playlist is public |
-| `collaborative` | boolean | Whether the playlist is collaborative |
-| `owner` | object | Playlist owner information |
-| `image_url` | string | Playlist cover image URL |
-| `total_tracks` | number | Total number of tracks |
-| `snapshot_id` | string | Playlist snapshot ID for versioning |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_playlist_tracks`
-
-Get the tracks in a Spotify playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify ID of the playlist |
-| `limit` | number | No | Maximum number of tracks to return \(1-100\) |
-| `offset` | number | No | Index of the first track to return |
-| `market` | string | No | ISO 3166-1 alpha-2 country code for track availability |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | array | List of tracks in the playlist |
-| ↳ `added_at` | string | When the track was added |
-| ↳ `added_by` | string | User ID who added the track |
-| ↳ `track` | object | Track information |
-| `total` | number | Total number of tracks in playlist |
-| `next` | string | URL for next page of results |
-
-### `spotify_get_playlist_cover`
-
-Get a playlist
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `images` | json | List of cover images |
-
-### `spotify_get_user_playlists`
-
-Get the current user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Maximum number of playlists to return \(1-50\) |
-| `offset` | number | No | Index of the first playlist to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `playlists` | array | User |
-| ↳ `id` | string | Spotify playlist ID |
-| ↳ `name` | string | Playlist name |
-| ↳ `description` | string | Playlist description |
-| ↳ `public` | boolean | Whether public |
-| ↳ `collaborative` | boolean | Whether collaborative |
-| ↳ `owner` | string | Owner display name |
-| ↳ `total_tracks` | number | Number of tracks |
-| ↳ `image_url` | string | Cover image URL |
-| ↳ `external_url` | string | Spotify URL |
-| `total` | number | Total number of playlists |
-| `next` | string | URL for next page |
-
-### `spotify_create_playlist`
-
-Create a new playlist for the current user on Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `name` | string | Yes | Name for the new playlist |
-| `description` | string | No | Description for the playlist |
-| `public` | boolean | No | Whether the playlist should be public |
-| `collaborative` | boolean | No | Whether the playlist should be collaborative \(requires public to be false\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Spotify playlist ID |
-| `name` | string | Playlist name |
-| `description` | string | Playlist description |
-| `public` | boolean | Whether the playlist is public |
-| `collaborative` | boolean | Whether collaborative |
-| `snapshot_id` | string | Playlist snapshot ID |
-| `external_url` | string | Spotify URL |
-
-### `spotify_update_playlist`
-
-Update a playlist
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-| `name` | string | No | New name for the playlist |
-| `description` | string | No | New description for the playlist |
-| `public` | boolean | No | Whether the playlist should be public |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether update succeeded |
-
-### `spotify_add_playlist_cover`
-
-Upload a custom cover image for a playlist. Image must be JPEG and under 256KB.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-| `imageBase64` | string | Yes | Base64-encoded JPEG image \(max 256KB\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether upload succeeded |
-
-### `spotify_add_tracks_to_playlist`
-
-Add one or more tracks to a Spotify playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify ID of the playlist |
-| `uris` | string | Yes | Comma-separated Spotify URIs \(e.g., "spotify:track:xxx,spotify:track:yyy"\) |
-| `position` | number | No | Position to insert tracks \(0-based\). If omitted, tracks are appended. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `snapshot_id` | string | New playlist snapshot ID after modification |
-
-### `spotify_remove_tracks_from_playlist`
-
-Remove one or more tracks from a Spotify playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify ID of the playlist |
-| `uris` | string | Yes | Comma-separated Spotify URIs to remove \(e.g., "spotify:track:xxx,spotify:track:yyy"\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `snapshot_id` | string | New playlist snapshot ID after modification |
-
-### `spotify_reorder_playlist_items`
-
-Move tracks to a different position in a playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-| `range_start` | number | Yes | Start index of items to reorder |
-| `insert_before` | number | Yes | Index to insert items before |
-| `range_length` | number | No | Number of items to reorder |
-| `snapshot_id` | string | No | Playlist snapshot ID for concurrency control |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `snapshot_id` | string | New playlist snapshot ID |
-
-### `spotify_replace_playlist_items`
-
-Replace all items in a playlist with new tracks.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-| `uris` | string | Yes | Comma-separated Spotify URIs \(max 100\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `snapshot_id` | string | New playlist snapshot ID |
-
-### `spotify_follow_playlist`
-
-Follow (save) a playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-| `public` | boolean | No | Whether the playlist will be in public playlists |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether follow succeeded |
-
-### `spotify_unfollow_playlist`
-
-Unfollow (unsave) a playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether unfollow succeeded |
-
-### `spotify_check_playlist_followers`
-
-Check if users follow a playlist.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `playlistId` | string | Yes | The Spotify playlist ID |
-| `userIds` | string | Yes | Comma-separated user IDs to check \(max 5\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of booleans for each user |
-
-### `spotify_get_current_user`
-
-Get the current user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | Spotify user ID |
-| `display_name` | string | Display name |
-| `email` | string | Email address |
-| `country` | string | Country code |
-| `product` | string | Subscription level \(free, premium\) |
-| `followers` | number | Number of followers |
-| `image_url` | string | Profile image URL |
-| `external_url` | string | Spotify profile URL |
-
-### `spotify_get_user_profile`
-
-Get a user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `userId` | string | Yes | The Spotify user ID |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `id` | string | User ID |
-| `display_name` | string | Display name |
-| `followers` | number | Number of followers |
-| `image_url` | string | Profile image URL |
-| `external_url` | string | Spotify URL |
-
-### `spotify_get_top_tracks`
-
-Get the current user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `time_range` | string | No | Time range: short_term \(~4 weeks\), medium_term \(~6 months\), long_term \(years\) |
-| `limit` | number | No | Number of tracks to return \(1-50\) |
-| `offset` | number | No | Index of the first track to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | array | User |
-| ↳ `id` | string | Spotify track ID |
-| ↳ `name` | string | Track name |
-| ↳ `artists` | array | List of artists |
-| ↳ `album` | object | Album information |
-| ↳ `duration_ms` | number | Duration in milliseconds |
-| ↳ `popularity` | number | Popularity score |
-| ↳ `external_url` | string | Spotify URL |
-| `total` | number | Total number of top tracks |
-| `next` | string | URL for next page |
-
-### `spotify_get_top_artists`
-
-Get the current user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `time_range` | string | No | Time range: short_term \(~4 weeks\), medium_term \(~6 months\), long_term \(years\) |
-| `limit` | number | No | Number of artists to return \(1-50\) |
-| `offset` | number | No | Index of the first artist to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `artists` | array | User |
-| ↳ `id` | string | Spotify artist ID |
-| ↳ `name` | string | Artist name |
-| ↳ `genres` | array | List of genres |
-| ↳ `popularity` | number | Popularity score |
-| ↳ `followers` | number | Number of followers |
-| ↳ `image_url` | string | Artist image URL |
-| ↳ `external_url` | string | Spotify URL |
-| `total` | number | Total number of top artists |
-| `next` | string | URL for next page |
-
-### `spotify_get_saved_tracks`
-
-Get the current user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of tracks to return \(1-50\) |
-| `offset` | number | No | Index of the first track to return |
-| `market` | string | No | ISO 3166-1 alpha-2 country code |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `tracks` | array | User |
-| ↳ `added_at` | string | When the track was saved |
-| ↳ `track` | object | Track information |
-| `total` | number | Total number of saved tracks |
-| `next` | string | URL for next page |
-
-### `spotify_save_tracks`
-
-Save tracks to the current user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `trackIds` | string | Yes | Comma-separated Spotify track IDs to save \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether the tracks were saved successfully |
-
-### `spotify_remove_saved_tracks`
-
-Remove tracks from the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `trackIds` | string | Yes | Comma-separated track IDs to remove \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether tracks were removed successfully |
-
-### `spotify_check_saved_tracks`
-
-Check if one or more tracks are saved in the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `trackIds` | string | Yes | Comma-separated track IDs to check \(max 50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `results` | json | Array of track IDs with saved status |
-| `all_saved` | boolean | Whether all tracks are saved |
-| `none_saved` | boolean | Whether no tracks are saved |
-
-### `spotify_get_recently_played`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `limit` | number | No | Number of tracks to return \(1-50\) |
-| `after` | number | No | Unix timestamp in milliseconds. Returns items after this cursor. |
-| `before` | number | No | Unix timestamp in milliseconds. Returns items before this cursor. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `items` | array | Recently played tracks |
-| ↳ `played_at` | string | When the track was played |
-| ↳ `track` | object | Track information |
-| `next` | string | URL for next page |
-
-### `spotify_get_new_releases`
-
-Get a list of new album releases featured in Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `country` | string | No | ISO 3166-1 alpha-2 country code \(e.g., "US", "GB"\) |
-| `limit` | number | No | Number of releases to return \(1-50\) |
-| `offset` | number | No | Index of first release to return |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `albums` | json | List of new releases |
-| `total` | number | Total number of new releases |
-| `next` | string | URL for next page |
-
-### `spotify_get_categories`
-
-Get a list of browse categories used to tag items in Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `country` | string | No | ISO 3166-1 alpha-2 country code \(e.g., "US", "GB"\) |
-| `locale` | string | No | Locale code \(e.g., "en_US", "es_MX"\) |
-| `limit` | number | No | Number of categories to return \(1-50\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `categories` | json | List of browse categories |
-| `total` | number | Total number of categories |
-
-### `spotify_get_markets`
-
-Get the list of markets where Spotify is available.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `markets` | json | List of ISO country codes |
-
-### `spotify_get_playback_state`
-
-Get the current playback state including device, track, and progress.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `market` | string | No | ISO 3166-1 alpha-2 country code |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `is_playing` | boolean | Whether playback is active |
-| `device` | object | Active device information |
-| `progress_ms` | number | Progress in milliseconds |
-| `currently_playing_type` | string | Type of content playing |
-| `shuffle_state` | boolean | Whether shuffle is enabled |
-| `repeat_state` | string | Repeat mode \(off, track, context\) |
-| `track` | object | Currently playing track |
-
-### `spotify_get_currently_playing`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `market` | string | No | ISO country code for market |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `is_playing` | boolean | Whether playback is active |
-| `progress_ms` | number | Current position in track \(ms\) |
-| `track` | json | Currently playing track |
-
-### `spotify_get_devices`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `devices` | array | Available playback devices |
-| ↳ `id` | string | Device ID |
-| ↳ `is_active` | boolean | Whether device is active |
-| ↳ `is_private_session` | boolean | Whether in private session |
-| ↳ `is_restricted` | boolean | Whether device is restricted |
-| ↳ `name` | string | Device name |
-| ↳ `type` | string | Device type \(Computer, Smartphone, etc.\) |
-| ↳ `volume_percent` | number | Current volume \(0-100\) |
-
-### `spotify_get_queue`
-
-Get the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `currently_playing` | json | Currently playing track |
-| `queue` | json | Upcoming tracks in queue |
-
-### `spotify_play`
-
-Start or resume playback on Spotify. Can play specific tracks, albums, or playlists.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `device_id` | string | No | Device ID to play on. If not provided, plays on active device. |
-| `context_uri` | string | No | Spotify URI of album, artist, or playlist to play \(e.g., "spotify:album:xxx"\) |
-| `uris` | string | No | Comma-separated track URIs to play \(e.g., "spotify:track:xxx,spotify:track:yyy"\) |
-| `offset` | number | No | Position in context to start playing \(0-based index\) |
-| `position_ms` | number | No | Position in track to start from \(in milliseconds\) |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether playback started successfully |
-
-### `spotify_pause`
-
-Pause playback on Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `device_id` | string | No | Device ID to pause. If not provided, pauses active device. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether playback was paused |
-
-### `spotify_skip_next`
-
-Skip to the next track on Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `device_id` | string | No | Device ID. If not provided, uses active device. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether skip was successful |
-
-### `spotify_skip_previous`
-
-Skip to the previous track on Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `device_id` | string | No | Device ID. If not provided, uses active device. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether skip was successful |
-
-### `spotify_seek`
-
-Seek to a position in the currently playing track.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `position_ms` | number | Yes | Position in milliseconds to seek to |
-| `device_id` | string | No | Device ID to target |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether seek was successful |
-
-### `spotify_add_to_queue`
-
-Add a track to the user
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `uri` | string | Yes | Spotify URI of the track to add \(e.g., "spotify:track:xxx"\) |
-| `device_id` | string | No | Device ID. If not provided, uses active device. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether track was added to queue |
-
-### `spotify_set_volume`
-
-Set the playback volume on Spotify.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `volume_percent` | number | Yes | Volume level \(0 to 100\) |
-| `device_id` | string | No | Device ID. If not provided, uses active device. |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether volume was set |
-
-### `spotify_set_repeat`
-
-Set the repeat mode for playback.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `state` | string | Yes | Repeat mode: "off", "track", or "context" |
-| `device_id` | string | No | Device ID to target |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether repeat mode was set successfully |
-
-### `spotify_set_shuffle`
-
-Turn shuffle on or off.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `state` | boolean | Yes | true for shuffle on, false for off |
-| `device_id` | string | No | Device ID to target |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether shuffle was set successfully |
-
-### `spotify_transfer_playback`
-
-Transfer playback to a different device.
-
-#### Input
-
-| Parameter | Type | Required | Description |
-| --------- | ---- | -------- | ----------- |
-| `device_id` | string | Yes | Device ID to transfer playback to |
-| `play` | boolean | No | Whether to start playing on the new device |
-
-#### Output
-
-| Parameter | Type | Description |
-| --------- | ---- | ----------- |
-| `success` | boolean | Whether transfer was successful |
-
-
diff --git a/apps/docs/content/docs/en/tools/supabase.mdx b/apps/docs/content/docs/en/tools/supabase.mdx
index a97307d950..3d7914e84d 100644
--- a/apps/docs/content/docs/en/tools/supabase.mdx
+++ b/apps/docs/content/docs/en/tools/supabase.mdx
@@ -299,7 +299,7 @@ Upload a file to a Supabase storage bucket
| `bucket` | string | Yes | The name of the storage bucket |
| `fileName` | string | Yes | The name of the file \(e.g., "document.pdf", "image.jpg"\) |
| `path` | string | No | Optional folder path \(e.g., "folder/subfolder/"\) |
-| `fileContent` | string | Yes | The file content \(base64 encoded for binary files, or plain text\) |
+| `fileData` | json | Yes | File to upload - UserFile object \(basic mode\) or string content \(advanced mode: base64 or plain text\). Supports data URLs. |
| `contentType` | string | No | MIME type of the file \(e.g., "image/jpeg", "text/plain"\) |
| `upsert` | boolean | No | If true, overwrites existing file \(default: false\) |
| `apiKey` | string | Yes | Your Supabase service role secret key |
@@ -309,7 +309,7 @@ Upload a file to a Supabase storage bucket
| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `message` | string | Operation status message |
-| `results` | object | Upload result including file path and metadata |
+| `results` | object | Upload result including file path, bucket, and public URL |
### `supabase_storage_download`
diff --git a/apps/docs/content/docs/es/mcp/deploy-workflows.mdx b/apps/docs/content/docs/es/mcp/deploy-workflows.mdx
index 5e2c6c51ae..39490d7c73 100644
--- a/apps/docs/content/docs/es/mcp/deploy-workflows.mdx
+++ b/apps/docs/content/docs/es/mcp/deploy-workflows.mdx
@@ -17,7 +17,7 @@ Los servidores MCP agrupan tus herramientas de flujo de trabajo. Créalos y gest
-1. Navega a **Configuración → MCP implementados**
+1. Navega a **Configuración → Servidores MCP**
2. Haz clic en **Crear servidor**
3. Introduce un nombre y una descripción opcional
4. Copia la URL del servidor para usarla en tus clientes MCP
@@ -79,7 +79,7 @@ Incluye tu encabezado de clave API (`X-API-Key`) para acceso autenticado al usar
## Gestión del servidor
-Desde la vista de detalles del servidor en **Configuración → MCP implementados**, puedes:
+Desde la vista de detalles del servidor en **Configuración → Servidores MCP**, puedes:
- **Ver herramientas**: consulta todos los flujos de trabajo añadidos a un servidor
- **Copiar URL**: obtén la URL del servidor para clientes MCP
diff --git a/apps/docs/content/docs/es/mcp/index.mdx b/apps/docs/content/docs/es/mcp/index.mdx
index b6f92b43fa..913a174676 100644
--- a/apps/docs/content/docs/es/mcp/index.mdx
+++ b/apps/docs/content/docs/es/mcp/index.mdx
@@ -27,7 +27,7 @@ Los servidores MCP proporcionan colecciones de herramientas que tus agentes pued
1. Navega a la configuración de tu espacio de trabajo
-2. Ve a la sección **MCP implementados**
+2. Ve a la sección **Servidores MCP**
3. Haz clic en **Añadir servidor MCP**
4. Introduce los detalles de configuración del servidor
5. Guarda la configuración
diff --git a/apps/docs/content/docs/fr/mcp/deploy-workflows.mdx b/apps/docs/content/docs/fr/mcp/deploy-workflows.mdx
index 117f47e0ef..77f3c01378 100644
--- a/apps/docs/content/docs/fr/mcp/deploy-workflows.mdx
+++ b/apps/docs/content/docs/fr/mcp/deploy-workflows.mdx
@@ -17,7 +17,7 @@ Les serveurs MCP regroupent vos outils de workflow. Créez-les et gérez-les dan
-1. Accédez à **Paramètres → MCP déployés**
+1. Accédez à **Paramètres → Serveurs MCP**
2. Cliquez sur **Créer un serveur**
3. Saisissez un nom et une description facultative
4. Copiez l'URL du serveur pour l'utiliser dans vos clients MCP
@@ -79,7 +79,7 @@ Incluez votre en-tête de clé API (`X-API-Key`) pour un accès authentifié lor
## Gestion du serveur
-Depuis la vue détaillée du serveur dans **Paramètres → MCP déployés**, vous pouvez :
+Depuis la vue détaillée du serveur dans **Paramètres → Serveurs MCP**, vous pouvez :
- **Voir les outils** : voir tous les workflows ajoutés à un serveur
- **Copier l'URL** : obtenir l'URL du serveur pour les clients MCP
diff --git a/apps/docs/content/docs/fr/mcp/index.mdx b/apps/docs/content/docs/fr/mcp/index.mdx
index b292186692..e052599607 100644
--- a/apps/docs/content/docs/fr/mcp/index.mdx
+++ b/apps/docs/content/docs/fr/mcp/index.mdx
@@ -28,7 +28,7 @@ Les serveurs MCP fournissent des collections d'outils que vos agents peuvent uti
1. Accédez aux paramètres de votre espace de travail
-2. Allez dans la section **MCP déployés**
+2. Allez dans la section **Serveurs MCP**
3. Cliquez sur **Ajouter un serveur MCP**
4. Saisissez les détails de configuration du serveur
5. Enregistrez la configuration
diff --git a/apps/docs/content/docs/ja/mcp/deploy-workflows.mdx b/apps/docs/content/docs/ja/mcp/deploy-workflows.mdx
index 3b14430e26..815cfdffa0 100644
--- a/apps/docs/content/docs/ja/mcp/deploy-workflows.mdx
+++ b/apps/docs/content/docs/ja/mcp/deploy-workflows.mdx
@@ -16,7 +16,7 @@ MCPサーバーは、ワークフローツールをまとめてグループ化
-1. **設定 → デプロイ済みMCP**に移動します
+1. **設定 → MCP サーバー**に移動します
2. **サーバーを作成**をクリックします
3. 名前とオプションの説明を入力します
4. MCPクライアントで使用するためにサーバーURLをコピーします
@@ -78,7 +78,7 @@ mcp-remoteまたは他のHTTPベースのMCPトランスポートを使用する
## サーバー管理
-**設定 → デプロイ済みMCP**のサーバー詳細ビューから、次のことができます:
+**設定 → MCP サーバー**のサーバー詳細ビューから、次のことができます:
- **ツールを表示**: サーバーに追加されたすべてのワークフローを確認
- **URLをコピー**: MCPクライアント用のサーバーURLを取得
diff --git a/apps/docs/content/docs/ja/mcp/index.mdx b/apps/docs/content/docs/ja/mcp/index.mdx
index 6b2a49c421..be0fc699ca 100644
--- a/apps/docs/content/docs/ja/mcp/index.mdx
+++ b/apps/docs/content/docs/ja/mcp/index.mdx
@@ -27,7 +27,7 @@ MCPサーバーはエージェントが使用できるツールのコレクシ
1. ワークスペース設定に移動します
-2. **デプロイ済みMCP**セクションに移動します
+2. **MCP サーバー**セクションに移動します
3. **MCPサーバーを追加**をクリックします
4. サーバー設定の詳細を入力します
5. 設定を保存します
diff --git a/apps/docs/content/docs/zh/mcp/deploy-workflows.mdx b/apps/docs/content/docs/zh/mcp/deploy-workflows.mdx
index b5d20de930..94373c0ee5 100644
--- a/apps/docs/content/docs/zh/mcp/deploy-workflows.mdx
+++ b/apps/docs/content/docs/zh/mcp/deploy-workflows.mdx
@@ -16,7 +16,7 @@ MCP 服务器用于将您的工作流工具进行分组。您可以在工作区
-1. 进入 **设置 → 已部署的 MCPs**
+1. 进入 **设置 → MCP 服务器**
2. 点击 **创建服务器**
3. 输入名称和可选描述
4. 复制服务器 URL 以在你的 MCP 客户端中使用
@@ -78,7 +78,7 @@ MCP 服务器用于将您的工作流工具进行分组。您可以在工作区
## 服务器管理
-在 **设置 → 已部署的 MCPs** 的服务器详情页,你可以:
+在 **设置 → MCP 服务器** 的服务器详情页,你可以:
- **查看工具**:查看添加到服务器的所有工作流
- **复制 URL**:获取 MCP 客户端的服务器 URL
diff --git a/apps/docs/content/docs/zh/mcp/index.mdx b/apps/docs/content/docs/zh/mcp/index.mdx
index 98e72d4507..b81792cebe 100644
--- a/apps/docs/content/docs/zh/mcp/index.mdx
+++ b/apps/docs/content/docs/zh/mcp/index.mdx
@@ -27,7 +27,7 @@ MCP 服务器提供工具集合,供您的代理使用。您可以在工作区
1. 进入您的工作区设置
-2. 前往 **Deployed MCPs** 部分
+2. 前往 **MCP Servers** 部分
3. 点击 **Add MCP Server**
4. 输入服务器配置信息
5. 保存配置
diff --git a/apps/sim/app/api/function/execute/route.ts b/apps/sim/app/api/function/execute/route.ts
index 434b2d54d3..4ccbd8d7c0 100644
--- a/apps/sim/app/api/function/execute/route.ts
+++ b/apps/sim/app/api/function/execute/route.ts
@@ -8,6 +8,7 @@ import { executeInIsolatedVM } from '@/lib/execution/isolated-vm'
import { CodeLanguage, DEFAULT_CODE_LANGUAGE, isValidCodeLanguage } from '@/lib/execution/languages'
import { escapeRegExp, normalizeName, REFERENCE } from '@/executor/constants'
import { type OutputSchema, resolveBlockReference } from '@/executor/utils/block-reference'
+import { formatLiteralForCode } from '@/executor/utils/code-formatting'
import {
createEnvVarPattern,
createWorkflowVariablePattern,
@@ -387,7 +388,12 @@ function resolveWorkflowVariables(
if (type === 'number') {
variableValue = Number(variableValue)
} else if (type === 'boolean') {
- variableValue = variableValue === 'true' || variableValue === true
+ if (typeof variableValue === 'boolean') {
+ // Already a boolean, keep as-is
+ } else {
+ const normalized = String(variableValue).toLowerCase().trim()
+ variableValue = normalized === 'true'
+ }
} else if (type === 'json' && typeof variableValue === 'string') {
try {
variableValue = JSON.parse(variableValue)
@@ -687,11 +693,7 @@ export async function POST(req: NextRequest) {
prologue += `const environmentVariables = JSON.parse(${JSON.stringify(JSON.stringify(envVars))});\n`
prologueLineCount++
for (const [k, v] of Object.entries(contextVariables)) {
- if (v === undefined) {
- prologue += `const ${k} = undefined;\n`
- } else {
- prologue += `const ${k} = JSON.parse(${JSON.stringify(JSON.stringify(v))});\n`
- }
+ prologue += `const ${k} = ${formatLiteralForCode(v, 'javascript')};\n`
prologueLineCount++
}
@@ -762,11 +764,7 @@ export async function POST(req: NextRequest) {
prologue += `environmentVariables = json.loads(${JSON.stringify(JSON.stringify(envVars))})\n`
prologueLineCount++
for (const [k, v] of Object.entries(contextVariables)) {
- if (v === undefined) {
- prologue += `${k} = None\n`
- } else {
- prologue += `${k} = json.loads(${JSON.stringify(JSON.stringify(v))})\n`
- }
+ prologue += `${k} = ${formatLiteralForCode(v, 'python')}\n`
prologueLineCount++
}
const wrapped = [
diff --git a/apps/sim/app/api/knowledge/route.test.ts b/apps/sim/app/api/knowledge/route.test.ts
index 2a59f45409..bd93fab3b3 100644
--- a/apps/sim/app/api/knowledge/route.test.ts
+++ b/apps/sim/app/api/knowledge/route.test.ts
@@ -16,6 +16,10 @@ mockKnowledgeSchemas()
mockDrizzleOrm()
mockConsoleLogger()
+vi.mock('@/lib/workspaces/permissions/utils', () => ({
+ getUserEntityPermissions: vi.fn().mockResolvedValue({ role: 'owner' }),
+}))
+
describe('Knowledge Base API Route', () => {
const mockAuth$ = mockAuth()
@@ -86,6 +90,7 @@ describe('Knowledge Base API Route', () => {
const validKnowledgeBaseData = {
name: 'Test Knowledge Base',
description: 'Test description',
+ workspaceId: 'test-workspace-id',
chunkingConfig: {
maxSize: 1024,
minSize: 100,
@@ -133,11 +138,25 @@ describe('Knowledge Base API Route', () => {
expect(data.details).toBeDefined()
})
+ it('should require workspaceId', async () => {
+ mockAuth$.mockAuthenticatedUser()
+
+ const req = createMockRequest('POST', { name: 'Test KB' })
+ const { POST } = await import('@/app/api/knowledge/route')
+ const response = await POST(req)
+ const data = await response.json()
+
+ expect(response.status).toBe(400)
+ expect(data.error).toBe('Invalid request data')
+ expect(data.details).toBeDefined()
+ })
+
it('should validate chunking config constraints', async () => {
mockAuth$.mockAuthenticatedUser()
const invalidData = {
name: 'Test KB',
+ workspaceId: 'test-workspace-id',
chunkingConfig: {
maxSize: 100, // 100 tokens = 400 characters
minSize: 500, // Invalid: minSize (500 chars) > maxSize (400 chars)
@@ -157,7 +176,7 @@ describe('Knowledge Base API Route', () => {
it('should use default values for optional fields', async () => {
mockAuth$.mockAuthenticatedUser()
- const minimalData = { name: 'Test KB' }
+ const minimalData = { name: 'Test KB', workspaceId: 'test-workspace-id' }
const req = createMockRequest('POST', minimalData)
const { POST } = await import('@/app/api/knowledge/route')
const response = await POST(req)
diff --git a/apps/sim/app/api/knowledge/route.ts b/apps/sim/app/api/knowledge/route.ts
index 07d439fe8c..9aaf52b5ab 100644
--- a/apps/sim/app/api/knowledge/route.ts
+++ b/apps/sim/app/api/knowledge/route.ts
@@ -19,7 +19,7 @@ const logger = createLogger('KnowledgeBaseAPI')
const CreateKnowledgeBaseSchema = z.object({
name: z.string().min(1, 'Name is required'),
description: z.string().optional(),
- workspaceId: z.string().optional(),
+ workspaceId: z.string().min(1, 'Workspace ID is required'),
embeddingModel: z.literal('text-embedding-3-small').default('text-embedding-3-small'),
embeddingDimension: z.literal(1536).default(1536),
chunkingConfig: z
diff --git a/apps/sim/app/templates/[id]/template.tsx b/apps/sim/app/templates/[id]/template.tsx
index ac09e5af9d..afdf0e6bb6 100644
--- a/apps/sim/app/templates/[id]/template.tsx
+++ b/apps/sim/app/templates/[id]/template.tsx
@@ -36,7 +36,7 @@ import { useSession } from '@/lib/auth/auth-client'
import { cn } from '@/lib/core/utils/cn'
import { getBaseUrl } from '@/lib/core/utils/urls'
import type { CredentialRequirement } from '@/lib/workflows/credentials/credential-extractor'
-import { WorkflowPreview } from '@/app/workspace/[workspaceId]/w/components/preview'
+import { PreviewWorkflow } from '@/app/workspace/[workspaceId]/w/components/preview'
import { getBlock } from '@/blocks/registry'
import { useStarTemplate, useTemplate } from '@/hooks/queries/templates'
@@ -330,7 +330,7 @@ export default function TemplateDetails({ isWorkspaceContext = false }: Template
try {
return (
-
{normalizedState && isInView ? (
-
) : (
diff --git a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/execution-snapshot.tsx b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/execution-snapshot.tsx
index a0f2a73764..ec52e6bcef 100644
--- a/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/execution-snapshot.tsx
+++ b/apps/sim/app/workspace/[workspaceId]/logs/components/log-details/components/execution-snapshot/execution-snapshot.tsx
@@ -1,6 +1,6 @@
'use client'
-import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import { useCallback, useRef, useState } from 'react'
import { AlertCircle, Loader2 } from 'lucide-react'
import { createPortal } from 'react-dom'
import {
@@ -13,13 +13,8 @@ import {
PopoverContent,
PopoverItem,
} from '@/components/emcn'
-import { redactApiKeys } from '@/lib/core/security/redaction'
import { cn } from '@/lib/core/utils/cn'
-import {
- getLeftmostBlockId,
- PreviewEditor,
- WorkflowPreview,
-} from '@/app/workspace/[workspaceId]/w/components/preview'
+import { Preview } from '@/app/workspace/[workspaceId]/w/components/preview'
import { useExecutionSnapshot } from '@/hooks/queries/logs'
import type { WorkflowState } from '@/stores/workflows/workflow/types'
@@ -32,13 +27,6 @@ interface TraceSpan {
children?: TraceSpan[]
}
-interface BlockExecutionData {
- input: unknown
- output: unknown
- status: string
- durationMs: number
-}
-
interface MigratedWorkflowState extends WorkflowState {
_migrated: true
_note?: string
@@ -70,99 +58,29 @@ export function ExecutionSnapshot({
onClose = () => {},
}: ExecutionSnapshotProps) {
const { data, isLoading, error } = useExecutionSnapshot(executionId)
- const [pinnedBlockId, setPinnedBlockId] = useState(null)
- const autoSelectedForExecutionRef = useRef(null)
const [isMenuOpen, setIsMenuOpen] = useState(false)
const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 })
- const [contextMenuBlockId, setContextMenuBlockId] = useState(null)
const menuRef = useRef(null)
const closeMenu = useCallback(() => {
setIsMenuOpen(false)
- setContextMenuBlockId(null)
}, [])
const handleCanvasContextMenu = useCallback((e: React.MouseEvent) => {
e.preventDefault()
e.stopPropagation()
- setContextMenuBlockId(null)
setMenuPosition({ x: e.clientX, y: e.clientY })
setIsMenuOpen(true)
}, [])
- const handleNodeContextMenu = useCallback(
- (blockId: string, mousePosition: { x: number; y: number }) => {
- setContextMenuBlockId(blockId)
- setMenuPosition(mousePosition)
- setIsMenuOpen(true)
- },
- []
- )
-
const handleCopyExecutionId = useCallback(() => {
navigator.clipboard.writeText(executionId)
closeMenu()
}, [executionId, closeMenu])
- const handleOpenDetails = useCallback(() => {
- if (contextMenuBlockId) {
- setPinnedBlockId(contextMenuBlockId)
- }
- closeMenu()
- }, [contextMenuBlockId, closeMenu])
-
- const blockExecutions = useMemo(() => {
- if (!traceSpans || !Array.isArray(traceSpans)) return {}
-
- const blockExecutionMap: Record = {}
-
- const collectBlockSpans = (spans: TraceSpan[]): TraceSpan[] => {
- const blockSpans: TraceSpan[] = []
-
- for (const span of spans) {
- if (span.blockId) {
- blockSpans.push(span)
- }
- if (span.children && Array.isArray(span.children)) {
- blockSpans.push(...collectBlockSpans(span.children))
- }
- }
-
- return blockSpans
- }
-
- const allBlockSpans = collectBlockSpans(traceSpans)
-
- for (const span of allBlockSpans) {
- if (span.blockId && !blockExecutionMap[span.blockId]) {
- blockExecutionMap[span.blockId] = {
- input: redactApiKeys(span.input || {}),
- output: redactApiKeys(span.output || {}),
- status: span.status || 'unknown',
- durationMs: span.duration || 0,
- }
- }
- }
-
- return blockExecutionMap
- }, [traceSpans])
-
const workflowState = data?.workflowState as WorkflowState | undefined
- // Auto-select the leftmost block once when data loads for a new executionId
- useEffect(() => {
- if (
- workflowState &&
- !isMigratedWorkflowState(workflowState) &&
- autoSelectedForExecutionRef.current !== executionId
- ) {
- autoSelectedForExecutionRef.current = executionId
- const leftmostId = getLeftmostBlockId(workflowState)
- setPinnedBlockId(leftmostId)
- }
- }, [executionId, workflowState])
-
const renderContent = () => {
if (isLoading) {
return (
@@ -226,44 +144,17 @@ export function ExecutionSnapshot({
}
return (
-