@mindstudio-ai/agent 0.0.15 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/llms.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # @mindstudio-ai/agent
2
2
 
3
- TypeScript SDK for executing MindStudio workflow steps. Each method calls a specific AI/automation action and returns typed results.
3
+ TypeScript SDK, CLI, and MCP server for executing MindStudio workflow steps. Each method calls a specific AI/automation action and returns typed results.
4
4
 
5
5
  This file is the complete API reference. No other documentation is needed to use the SDK.
6
6
 
@@ -12,6 +12,70 @@ npm install @mindstudio-ai/agent
12
12
 
13
13
  Requires Node.js >= 18.
14
14
 
15
+ ## CLI
16
+
17
+ The package includes a CLI for executing steps from the command line or scripts:
18
+
19
+ ```bash
20
+ # Execute with named flags (kebab-case)
21
+ mindstudio generate-image --prompt "A mountain landscape"
22
+
23
+ # Execute with JSON input (JSON5-tolerant)
24
+ mindstudio generate-image '{prompt: "A mountain landscape"}'
25
+
26
+ # Extract a single output field
27
+ mindstudio generate-image --prompt "A sunset" --output-key imageUrl
28
+
29
+ # List all available methods
30
+ mindstudio list
31
+
32
+ # Show method details (params, types, output)
33
+ mindstudio info generate-image
34
+
35
+ # Run via npx without installing
36
+ npx @mindstudio-ai/agent generate-text --message "Hello"
37
+ ```
38
+
39
+ Auth: run `mindstudio login`, set `MINDSTUDIO_API_KEY` env var, or pass `--api-key <key>`.
40
+ Method names are kebab-case on the CLI (camelCase also accepted). Flags are kebab-case (`--video-url` for `videoUrl`).
41
+ Use `--output-key <key>` to extract a single field, `--no-meta` to strip $-prefixed metadata.
42
+
43
+ ### Authentication
44
+
45
+ ```bash
46
+ # Interactive login (opens browser, saves key to ~/.mindstudio/config.json)
47
+ mindstudio login
48
+
49
+ # Check current auth status
50
+ mindstudio whoami
51
+
52
+ # Clear stored credentials
53
+ mindstudio logout
54
+ ```
55
+
56
+ Auth resolution order: `--api-key` flag > `MINDSTUDIO_API_KEY` env > `~/.mindstudio/config.json` > `CALLBACK_TOKEN` env.
57
+
58
+ ## MCP server
59
+
60
+ The package includes an MCP server exposing all methods as tools:
61
+
62
+ ```bash
63
+ mindstudio mcp
64
+ ```
65
+
66
+ MCP client config:
67
+ ```json
68
+ {
69
+ "mcpServers": {
70
+ "mindstudio": {
71
+ "command": "npx",
72
+ "args": ["-y", "@mindstudio-ai/agent", "mcp"],
73
+ "env": { "MINDSTUDIO_API_KEY": "your-api-key" }
74
+ }
75
+ }
76
+ }
77
+ ```
78
+
15
79
  ## Setup
16
80
 
17
81
  ```typescript
@@ -19,20 +83,39 @@ import { MindStudioAgent } from '@mindstudio-ai/agent';
19
83
 
20
84
  // With API key (or set MINDSTUDIO_API_KEY env var)
21
85
  const agent = new MindStudioAgent({ apiKey: 'your-key' });
22
-
23
- // Inside MindStudio custom functions, auth is automatic (CALLBACK_TOKEN + REMOTE_HOSTNAME)
24
- const agent = new MindStudioAgent();
25
86
  ```
26
87
 
88
+ Your MindStudio API key authenticates all requests. MindStudio routes to the correct AI provider (OpenAI, Google, Anthropic, etc.) server-side — you do NOT need separate provider API keys.
89
+
27
90
  Constructor options:
28
91
  ```typescript
29
92
  new MindStudioAgent({
30
- apiKey?: string, // Auth token. Falls back to MINDSTUDIO_API_KEY env, then CALLBACK_TOKEN env.
31
- baseUrl?: string, // API base URL. Falls back to MINDSTUDIO_BASE_URL env, then REMOTE_HOSTNAME env, then "https://v1.mindstudio-api.com".
93
+ apiKey?: string, // Auth token. Falls back to MINDSTUDIO_API_KEY env var.
94
+ baseUrl?: string, // API base URL. Defaults to "https://v1.mindstudio-api.com".
32
95
  maxRetries?: number, // Retries on 429 rate limit (default: 3). Uses Retry-After header for delay.
33
96
  })
34
97
  ```
35
98
 
99
+ ## Models
100
+
101
+ MindStudio provides access to models from many providers (OpenAI, Google, Anthropic, Meta, xAI, DeepSeek, etc.) through a single API key. You do NOT need provider-specific API keys.
102
+
103
+ Use `listModels()` or `listModelsByType("llm_chat")` to discover available models. Pass a model ID to `modelOverride.model` in methods like `generateText` to select a specific model:
104
+
105
+ ```typescript
106
+ const { models } = await agent.listModelsByType('llm_chat');
107
+ const model = models.find(m => m.name.includes("Gemini"));
108
+
109
+ const { content } = await agent.generateText({
110
+ message: 'Hello',
111
+ modelOverride: {
112
+ model: model.rawName,
113
+ temperature: 0.7,
114
+ maxResponseTokens: 1024,
115
+ },
116
+ });
117
+ ```
118
+
36
119
  ## Calling convention
37
120
 
38
121
  Every method has the signature:
@@ -53,6 +136,8 @@ result.content; // step-specific output field
53
136
  result.$appId; // string — app ID for this execution
54
137
  result.$threadId; // string — thread ID for this execution
55
138
  result.$rateLimitRemaining; // number | undefined — API calls remaining in rate limit window
139
+ result.$billingCost; // number | undefined — cost in credits for this call
140
+ result.$billingEvents; // object[] | undefined — itemized billing events
56
141
  ```
57
142
 
58
143
  ## Thread persistence
@@ -87,7 +172,6 @@ try {
87
172
  ```
88
173
 
89
174
  429 rate limit errors are retried automatically (configurable via `maxRetries`).
90
- Internal tokens (CALLBACK_TOKEN) are capped at 500 calls — exceeding this throws `call_cap_exceeded`.
91
175
 
92
176
  ## Low-level access
93
177
 
@@ -215,7 +299,7 @@ Fetch the full extracted text contents of a document in a data source.
215
299
  #### fetchSlackChannelHistory
216
300
  Fetch recent message history from a Slack channel.
217
301
  - The user is responsible for connecting their Slack workspace and selecting the channel
218
- - Input: `{ connectionId: string, channelId: string, limit?: number, startDate?: string, endDate?: string, includeImages?: boolean, includeRawMessage?: boolean }`
302
+ - Input: `{ connectionId?: string, channelId: string, limit?: number, startDate?: string, endDate?: string, includeImages?: boolean, includeRawMessage?: boolean }`
219
303
  - Output: `{ messages: { from: string, content: string, timestamp?: string, images?: string[], rawMessage?: { app_id?: string, assistant_app_thread?: { first_user_thread_reply?: string, title?: string, title_blocks?: unknown[] }, attachments?: { actions?: unknown[], app_id?: string, app_unfurl_url?: string, author_icon?: string, author_id?: string, author_link?: string, author_name?: string, author_subname?: string, blocks?: unknown[], bot_id?: string, bot_team_id?: string, callback_id?: string, channel_id?: string, channel_name?: string, channel_team?: string, color?: string, fallback?: string, fields?: unknown[], file_id?: string, filename?: string, files?: unknown[], footer?: string, footer_icon?: string, from_url?: string, hide_border?: boolean, hide_color?: boolean, id?: number, image_bytes?: number, image_height?: number, image_url?: string, image_width?: number, indent?: boolean, is_app_unfurl?: boolean, is_file_attachment?: boolean, is_msg_unfurl?: boolean, is_reply_unfurl?: boolean, is_thread_root_unfurl?: boolean, list?: unknown, list_record?: unknown, list_record_id?: string, list_records?: unknown[], list_schema?: unknown[], list_view?: unknown, list_view_id?: string, message_blocks?: unknown[], metadata?: unknown, mimetype?: string, mrkdwn_in?: string[], msg_subtype?: string, original_url?: string, pretext?: string, preview?: unknown, service_icon?: string, service_name?: string, service_url?: string, size?: number, text?: string, thumb_height?: number, thumb_url?: string, thumb_width?: number, title?: string, title_link?: string, ts?: string, url?: string, video_html?: string, video_html_height?: number, video_html_width?: number, video_url?: string }[], blocks?: { accessory?: unknown, alt_text?: string, api_decoration_available?: boolean, app_collaborators?: string[], app_id?: string, author_name?: string, block_id?: string, bot_user_id?: string, button_label?: string, call?: unknown, call_id?: string, description?: unknown, developer_trace_id?: string, dispatch_action?: boolean, element?: unknown, elements?: unknown[], expand?: boolean, external_id?: string, fallback?: string, fields?: unknown[], file?: unknown, file_id?: string, function_trigger_id?: string, hint?: unknown, image_bytes?: number, image_height?: number, image_url?: string, image_width?: number, is_animated?: boolean, is_workflow_app?: boolean, label?: unknown, optional?: boolean, owning_team_id?: string, provider_icon_url?: string, provider_name?: string, sales_home_workflow_app_type?: number, share_url?: string, slack_file?: unknown, source?: string, text?: unknown, thumbnail_url?: string, title?: unknown, title_url?: string, trigger_subtype?: string, trigger_type?: string, type?: unknown, url?: string, video_url?: string, workflow_id?: string }[], bot_id?: string, bot_profile?: { app_id?: string, deleted?: boolean, icons?: unknown, id?: string, name?: string, team_id?: string, updated?: number }, client_msg_id?: string, display_as_bot?: boolean, edited?: { ts?: string, user?: string }, files?: { access?: string, alt_txt?: string, app_id?: string, app_name?: string, attachments?: unknown[], blocks?: unknown[], bot_id?: string, can_toggle_canvas_lock?: boolean, canvas_printing_enabled?: boolean, canvas_template_mode?: string, cc?: unknown[], channel_actions_count?: number, channel_actions_ts?: string, channels?: string[], comments_count?: number, converted_pdf?: string, created?: number, deanimate?: string, deanimate_gif?: string, display_as_bot?: boolean, dm_mpdm_users_with_file_access?: unknown[], duration_ms?: number, edit_link?: string, edit_timestamp?: number, editable?: boolean, editor?: string, editors?: string[], external_id?: string, external_type?: string, external_url?: string, favorites?: unknown[], file_access?: string, filetype?: string, from?: unknown[], groups?: string[], has_more?: boolean, has_more_shares?: boolean, has_rich_preview?: boolean, headers?: unknown, hls?: string, hls_embed?: string, id?: string, image_exif_rotation?: number, ims?: string[], initial_comment?: unknown, is_channel_space?: boolean, is_external?: boolean, is_public?: boolean, is_restricted_sharing_enabled?: boolean, is_starred?: boolean, last_editor?: string, last_read?: number, lines?: number, lines_more?: number, linked_channel_id?: string, list_csv_download_url?: string, list_limits?: unknown, list_metadata?: unknown, media_display_type?: string, media_progress?: unknown, mimetype?: string, mode?: string, mp4?: string, mp4_low?: string, name?: string, non_owner_editable?: boolean, num_stars?: number, org_or_workspace_access?: string, original_attachment_count?: number, original_h?: string, original_w?: string, permalink?: string, permalink_public?: string, pinned_to?: string[], pjpeg?: string, plain_text?: string, pretty_type?: string, preview?: string, preview_highlight?: string, preview_is_truncated?: boolean, preview_plain_text?: string, private_channels_with_file_access_count?: number, private_file_with_access_count?: number, public_url_shared?: boolean, quip_thread_id?: string, reactions?: unknown[], saved?: unknown, sent_to_self?: boolean, shares?: unknown, show_badge?: boolean, simplified_html?: string, size?: number, source_team?: string, subject?: string, subtype?: string, team_pref_version_history_enabled?: boolean, teams_shared_with?: unknown[], template_conversion_ts?: number, template_description?: string, template_icon?: string, template_name?: string, template_title?: string, thumb_1024?: string, thumb_1024_gif?: string, thumb_1024_h?: string, thumb_1024_w?: string, thumb_160?: string, thumb_160_gif?: string, thumb_160_h?: string, thumb_160_w?: string, thumb_360?: string, thumb_360_gif?: string, thumb_360_h?: string, thumb_360_w?: string, thumb_480?: string, thumb_480_gif?: string, thumb_480_h?: string, thumb_480_w?: string, thumb_64?: string, thumb_64_gif?: string, thumb_64_h?: string, thumb_64_w?: string, thumb_720?: string, thumb_720_gif?: string, thumb_720_h?: string, thumb_720_w?: string, thumb_80?: string, thumb_800?: string, thumb_800_gif?: string, thumb_800_h?: string, thumb_800_w?: string, thumb_80_gif?: string, thumb_80_h?: string, thumb_80_w?: string, thumb_960?: string, thumb_960_gif?: string, thumb_960_h?: string, thumb_960_w?: string, thumb_gif?: string, thumb_pdf?: string, thumb_pdf_h?: string, thumb_pdf_w?: string, thumb_tiny?: string, thumb_video?: string, thumb_video_h?: number, thumb_video_w?: number, timestamp?: number, title?: string, title_blocks?: unknown[], to?: unknown[], transcription?: unknown, update_notification?: number, updated?: number, url_private?: string, url_private_download?: string, url_static_preview?: string, user?: string, user_team?: string, username?: string, vtt?: string }[], icons?: { emoji?: string, image_36?: string, image_48?: string, image_64?: string, image_72?: string }, inviter?: string, is_locked?: boolean, latest_reply?: string, metadata?: { event_payload?: unknown, event_type?: string }, parent_user_id?: string, purpose?: string, reactions?: { count?: number, name?: string, url?: string, users?: string[] }[], reply_count?: number, reply_users?: string[], reply_users_count?: number, root?: { bot_id?: string, icons?: unknown, latest_reply?: string, parent_user_id?: string, reply_count?: number, reply_users?: string[], reply_users_count?: number, subscribed?: boolean, subtype?: string, text?: string, thread_ts?: string, ts?: string, type?: string, username?: string }, subscribed?: boolean, subtype?: string, team?: string, text?: string, thread_ts?: string, topic?: string, ts?: string, type?: string, upload?: boolean, user?: string, username?: string, x_files?: string[] } }[] }`
220
304
 
221
305
  #### generateAsset
@@ -225,7 +309,7 @@ Generate an HTML asset and export it as a webpage, PDF, or image
225
309
  - If PDF or composited image generation are part of the workflow, assistant adds the block and leaves the "source" empty. In a separate step, assistant generates a detailed request for the developer who will write the HTML.
226
310
  - Can also auto-generate HTML from a prompt (like a generate text block to generate HTML). In these cases, create a prompt with variables in the dynamicPrompt variable describing, in detail, the document to generate
227
311
  - Can either display output directly to user (foreground mode) or save the URL of the asset to a variable (background mode)
228
- - Input: `{ source: string, sourceType: "html" | "markdown" | "spa" | "raw" | "dynamic" | "customInterface", outputFormat: "pdf" | "png" | "html" | "mp4" | "openGraph", pageSize: "full" | "letter" | "A4" | "custom", testData: object, options?: { pageWidthPx?: number, pageHeightPx?: number, pageOrientation?: "portrait" | "landscape", rehostMedia?: boolean, videoDurationSeconds?: number }, spaSource?: { paths: string[], root: string, zipUrl: string }, rawSource?: string, dynamicPrompt?: string, dynamicSourceModelOverride?: { model: string, temperature: number, maxResponseTokens: number, ignorePreamble?: boolean, userMessagePreprocessor?: { dataSource?: string, messageTemplate?: string, maxResults?: number, enabled?: boolean, shouldInherit?: boolean }, preamble?: string, multiModelEnabled?: boolean, editResponseEnabled?: boolean, config?: object }, transitionControl?: "default" | "native", shareControl?: "default" | "hidden", shareImageUrl?: string, skipAssetCreation?: boolean }`
312
+ - Input: `{ source: string, sourceType: "html" | "markdown" | "spa" | "raw" | "dynamic" | "customInterface", outputFormat: "pdf" | "png" | "html" | "mp4" | "openGraph", pageSize: "full" | "letter" | "A4" | "custom", testData: object, options?: { pageWidthPx?: number, pageHeightPx?: number, pageOrientation?: "portrait" | "landscape", rehostMedia?: boolean, videoDurationSeconds?: number }, spaSource?: { source?: string, lastCompiledSource?: string, files?: object, paths: string[], root: string, zipUrl: string }, rawSource?: string, dynamicPrompt?: string, dynamicSourceModelOverride?: { model: string, temperature: number, maxResponseTokens: number, ignorePreamble?: boolean, userMessagePreprocessor?: { dataSource?: string, messageTemplate?: string, maxResults?: number, enabled?: boolean, shouldInherit?: boolean }, preamble?: string, multiModelEnabled?: boolean, editResponseEnabled?: boolean, config?: object }, transitionControl?: "default" | "native", shareControl?: "default" | "hidden", shareImageUrl?: string, skipAssetCreation?: boolean }`
229
313
  - Output: `{ url: string }`
230
314
 
231
315
  #### generateChart
@@ -370,7 +454,7 @@ Send a message to a Slack channel via a connected bot.
370
454
  - The user is responsible for connecting their Slack workspace and selecting the channel
371
455
  - Supports both simple text messages and slack blocks messages
372
456
  - Text messages can use limited markdown (slack-only fomatting—e.g., headers are just rendered as bold)
373
- - Input: `{ channelId: string, messageType: "string" | "blocks", message: string, connectionId: string }`
457
+ - Input: `{ channelId: string, messageType: "string" | "blocks", message: string, connectionId?: string }`
374
458
  - Output: `unknown`
375
459
 
376
460
  #### postToZapier
@@ -393,7 +477,7 @@ Execute a SQL query against an external database connected to the workspace.
393
477
  - Requires a database connection configured in the workspace.
394
478
  - Supports PostgreSQL (including Supabase), MySQL, and MSSQL.
395
479
  - Results can be returned as JSON or CSV.
396
- - Input: `{ connectionId: string, query: string, outputFormat: "json" | "csv" }`
480
+ - Input: `{ connectionId?: string, query: string, outputFormat: "json" | "csv" }`
397
481
  - Output: `{ data: unknown }`
398
482
 
399
483
  #### redactPII
@@ -503,13 +587,16 @@ Send an email to one or more configured recipient addresses.
503
587
  - When generateHtml is enabled, the body text is converted to a styled HTML email using an AI model.
504
588
  - connectionId can be a comma-separated list to send to multiple recipients.
505
589
  - The special connectionId "trigger_email" uses the email address that triggered the workflow.
506
- - Input: `{ subject: string, body: string, connectionId: string, generateHtml?: boolean, generateHtmlInstructions?: string, generateHtmlModelOverride?: { model: string, temperature: number, maxResponseTokens: number, ignorePreamble?: boolean, userMessagePreprocessor?: { dataSource?: string, messageTemplate?: string, maxResults?: number, enabled?: boolean, shouldInherit?: boolean }, preamble?: string, multiModelEnabled?: boolean, editResponseEnabled?: boolean, config?: object }, attachments?: string[] }`
590
+ - Input: `{ subject: string, body: string, connectionId?: string, generateHtml?: boolean, generateHtmlInstructions?: string, generateHtmlModelOverride?: { model: string, temperature: number, maxResponseTokens: number, ignorePreamble?: boolean, userMessagePreprocessor?: { dataSource?: string, messageTemplate?: string, maxResults?: number, enabled?: boolean, shouldInherit?: boolean }, preamble?: string, multiModelEnabled?: boolean, editResponseEnabled?: boolean, config?: object }, attachments?: string[] }`
507
591
  - Output: `{ recipients: string[] }`
508
592
 
509
593
  #### sendSMS
510
- Send an SMS text message to a phone number configured via OAuth connection.
594
+ Send an SMS or MMS message to a phone number configured via OAuth connection.
511
595
  - User is responsible for configuring the connection to the number (MindStudio requires double opt-in to prevent spam)
512
- - Input: `{ body: string, connectionId: string }`
596
+ - If mediaUrls are provided, the message is sent as MMS instead of SMS
597
+ - MMS supports up to 10 media URLs (images, video, audio, PDF) with a 5MB limit per file
598
+ - MMS is only supported on US and Canadian carriers; international numbers will receive SMS only (media silently dropped)
599
+ - Input: `{ body: string, connectionId?: string, mediaUrls?: string[] }`
513
600
  - Output: `unknown`
514
601
 
515
602
  #### setRunTitle
@@ -522,8 +609,24 @@ Explicitly set a variable to a given value.
522
609
  - Useful for bootstrapping global variables or setting constants.
523
610
  - The variable name and value both support variable interpolation.
524
611
  - The type field is a UI hint only (controls input widget in the editor).
525
- - Input: `{ value: string | string[], type: "imageUrl" | "videoUrl" | "fileUrl" | "plaintext" | "textArray" | "imageUrlArray" | "videoUrlArray" }`
526
- - Output: `{ variableName: string, value: string | string[] }`
612
+ - Input: `{ value: string | string[] }`
613
+ - Output: `object`
614
+
615
+ #### telegramEditMessage
616
+ Edit a previously sent Telegram message. Use with the message ID returned by Send Telegram Message.
617
+ - Only text messages sent by the bot can be edited.
618
+ - The messageId is returned by the Send Telegram Message step.
619
+ - Common pattern: send a "Processing..." message, do work, then edit it with the result.
620
+ - Input: `{ botToken: string, chatId: string, messageId: string, text: string }`
621
+ - Output: `unknown`
622
+
623
+ #### telegramReplyToMessage
624
+ Send a reply to a specific Telegram message. The reply will be visually threaded in the chat.
625
+ - Use the rawMessage.message_id from the incoming trigger variables to reply to the user's message.
626
+ - Especially useful in group chats where replies provide context.
627
+ - Returns the sent message ID, which can be used with Edit Telegram Message.
628
+ - Input: `{ botToken: string, chatId: string, replyToMessageId: string, text: string }`
629
+ - Output: `{ messageId: number }`
527
630
 
528
631
  #### telegramSendAudio
529
632
  Send an audio file to a Telegram chat as music or a voice note via a bot.
@@ -545,8 +648,9 @@ Send an image to a Telegram chat via a bot.
545
648
  Send a text message to a Telegram chat via a bot.
546
649
  - Messages are sent using MarkdownV2 formatting. Special characters are auto-escaped.
547
650
  - botToken format is "botId:token" — both parts are required.
651
+ - Returns the sent message ID, which can be used with Edit Telegram Message to update the message later.
548
652
  - Input: `{ botToken: string, chatId: string, text: string }`
549
- - Output: `unknown`
653
+ - Output: `{ messageId: number }`
550
654
 
551
655
  #### telegramSendVideo
552
656
  Send a video to a Telegram chat via a bot.
@@ -630,7 +734,7 @@ Add an image watermark to a video
630
734
  Add a note to an existing contact in ActiveCampaign.
631
735
  - Requires an ActiveCampaign OAuth connection (connectionId).
632
736
  - The contact must already exist — use the contact ID from a previous create or search step.
633
- - Input: `{ contactId: string, note: string, connectionId: string }`
737
+ - Input: `{ contactId: string, note: string, connectionId?: string }`
634
738
  - Output: `unknown`
635
739
 
636
740
  #### activeCampaignCreateContact
@@ -638,7 +742,7 @@ Create or sync a contact in ActiveCampaign.
638
742
  - Requires an ActiveCampaign OAuth connection (connectionId).
639
743
  - If a contact with the email already exists, it may be updated depending on ActiveCampaign settings.
640
744
  - Custom fields are passed as a key-value map where keys are field IDs.
641
- - Input: `{ email: string, firstName: string, lastName: string, phone: string, accountId: string, customFields: object, connectionId: string }`
745
+ - Input: `{ email: string, firstName: string, lastName: string, phone: string, accountId: string, customFields: object, connectionId?: string }`
642
746
  - Output: `{ contactId: string }`
643
747
 
644
748
  ### Airtable
@@ -648,21 +752,21 @@ Create a new record or update an existing record in an Airtable table.
648
752
  - If recordId is provided, updates that record. Otherwise, creates a new one.
649
753
  - When updating with updateMode "onlySpecified", unspecified fields are left as-is. With "all", unspecified fields are cleared.
650
754
  - Array fields (e.g. multipleAttachments) accept arrays of values.
651
- - Input: `{ connectionId: string, baseId: string, tableId: string, recordId?: string, updateMode?: "onlySpecified" | "all", fields: unknown, recordData: object }`
755
+ - Input: `{ connectionId?: string, baseId: string, tableId: string, recordId?: string, updateMode?: "onlySpecified" | "all", fields: unknown, recordData: object }`
652
756
  - Output: `{ recordId: string }`
653
757
 
654
758
  #### airtableDeleteRecord
655
759
  Delete a record from an Airtable table by its record ID.
656
760
  - Requires an active Airtable OAuth connection (connectionId).
657
761
  - Silently succeeds if the record does not exist.
658
- - Input: `{ connectionId: string, baseId: string, tableId: string, recordId: string }`
762
+ - Input: `{ connectionId?: string, baseId: string, tableId: string, recordId: string }`
659
763
  - Output: `{ deleted: boolean }`
660
764
 
661
765
  #### airtableGetRecord
662
766
  Fetch a single record from an Airtable table by its record ID.
663
767
  - Requires an active Airtable OAuth connection (connectionId).
664
768
  - If the record is not found, returns a string message instead of a record object.
665
- - Input: `{ connectionId: string, baseId: string, tableId: string, recordId: string }`
769
+ - Input: `{ connectionId?: string, baseId: string, tableId: string, recordId: string }`
666
770
  - Output: `{ record: { id: string, createdTime: string, fields: object } | null }`
667
771
 
668
772
  #### airtableGetTableRecords
@@ -670,7 +774,7 @@ Fetch multiple records from an Airtable table with optional pagination.
670
774
  - Requires an active Airtable OAuth connection (connectionId).
671
775
  - Default limit is 100 records. Maximum is 1000.
672
776
  - When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed records.
673
- - Input: `{ connectionId: string, baseId: string, tableId: string, outputFormat?: "json" | "csv", limit?: number }`
777
+ - Input: `{ connectionId?: string, baseId: string, tableId: string, outputFormat?: "json" | "csv", limit?: number }`
674
778
  - Output: `{ records: { id: string, createdTime: string, fields: object }[] }`
675
779
 
676
780
  ### Apollo
@@ -699,7 +803,7 @@ Create a new page or update an existing page in a Coda document.
699
803
  - If pageData.pageId is provided, updates that page. Otherwise, creates a new one.
700
804
  - Page content is provided as markdown and converted to Coda's canvas format.
701
805
  - When updating, insertionMode controls how content is applied (default: 'append').
702
- - Input: `{ connectionId: string, pageData: { docId: string, pageId?: string, name: string, subtitle: string, iconName: string, imageUrl: string, parentPageId?: string, pageContent: string | unknown, contentUpdate?: unknown, insertionMode?: string } }`
806
+ - Input: `{ connectionId?: string, pageData: { docId: string, pageId?: string, name: string, subtitle: string, iconName: string, imageUrl: string, parentPageId?: string, pageContent: string | unknown, contentUpdate?: unknown, insertionMode?: string } }`
703
807
  - Output: `{ pageId: string }`
704
808
 
705
809
  #### codaCreateUpdateRow
@@ -707,7 +811,7 @@ Create a new row or update an existing row in a Coda table.
707
811
  - Requires a Coda OAuth connection (connectionId).
708
812
  - If rowId is provided, updates that row. Otherwise, creates a new one.
709
813
  - Row data keys are column IDs. Empty values are excluded.
710
- - Input: `{ connectionId: string, docId: string, tableId: string, rowId?: string, rowData: object }`
814
+ - Input: `{ connectionId?: string, docId: string, tableId: string, rowId?: string, rowData: object }`
711
815
  - Output: `{ rowId: string }`
712
816
 
713
817
  #### codaFindRow
@@ -715,7 +819,7 @@ Search for a row in a Coda table by matching column values.
715
819
  - Requires a Coda OAuth connection (connectionId).
716
820
  - Returns the first row matching all specified column values, or null if no match.
717
821
  - Search criteria in rowData are ANDed together.
718
- - Input: `{ connectionId: string, docId: string, tableId: string, rowData: object }`
822
+ - Input: `{ connectionId?: string, docId: string, tableId: string, rowData: object }`
719
823
  - Output: `{ row: { id: string, values: object } | null }`
720
824
 
721
825
  #### codaGetPage
@@ -723,7 +827,7 @@ Export and read the contents of a page from a Coda document.
723
827
  - Requires a Coda OAuth connection (connectionId).
724
828
  - Page export is asynchronous on Coda's side — there may be a brief delay while it processes.
725
829
  - If a page was just created in a prior step, there is an automatic 20-second retry if the first export attempt fails.
726
- - Input: `{ connectionId: string, docId: string, pageId: string, outputFormat?: "html" | "markdown" }`
830
+ - Input: `{ connectionId?: string, docId: string, pageId: string, outputFormat?: "html" | "markdown" }`
727
831
  - Output: `{ content: string }`
728
832
 
729
833
  #### codaGetTableRows
@@ -731,7 +835,7 @@ Fetch rows from a Coda table with optional pagination.
731
835
  - Requires a Coda OAuth connection (connectionId).
732
836
  - Default limit is 10000 rows. Rows are fetched in pages of 500.
733
837
  - When outputFormat is 'csv', the variable receives CSV text. The direct execution output always returns parsed rows.
734
- - Input: `{ connectionId: string, docId: string, tableId: string, limit?: number | string, outputFormat?: "json" | "csv" }`
838
+ - Input: `{ connectionId?: string, docId: string, tableId: string, limit?: number | string, outputFormat?: "json" | "csv" }`
735
839
  - Output: `{ rows: { id: string, values: object }[] }`
736
840
 
737
841
  ### Facebook
@@ -746,44 +850,98 @@ Get all the posts for a Facebook page
746
850
  - Input: `{ pageUrl: string }`
747
851
  - Output: `{ data: unknown }`
748
852
 
853
+ ### Gmail
854
+
855
+ #### deleteGmailEmail
856
+ Move an email to trash in the connected Gmail account (recoverable delete).
857
+ - Requires a Google OAuth connection with Gmail modify scope.
858
+ - Uses trash (recoverable) rather than permanent delete.
859
+ - Input: `{ messageId: string, connectionId?: string }`
860
+ - Output: `unknown`
861
+
862
+ #### getGmailDraft
863
+ Retrieve a specific draft from Gmail by draft ID.
864
+ - Requires a Google OAuth connection with Gmail readonly scope.
865
+ - Returns the draft content including subject, recipients, sender, and body.
866
+ - Input: `{ draftId: string, connectionId?: string }`
867
+ - Output: `{ draftId: string, messageId: string, subject: string, to: string, from: string, body: string }`
868
+
869
+ #### getGmailEmail
870
+ Retrieve a specific email from Gmail by message ID.
871
+ - Requires a Google OAuth connection with Gmail readonly scope.
872
+ - Returns the email subject, sender, recipient, date, body (plain text preferred, falls back to HTML), and labels.
873
+ - Input: `{ messageId: string, connectionId?: string }`
874
+ - Output: `{ messageId: string, subject: string, from: string, to: string, date: string, body: string, labels: string }`
875
+
876
+ #### listGmailDrafts
877
+ List drafts in the connected Gmail account.
878
+ - Requires a Google OAuth connection with Gmail readonly scope.
879
+ - Returns up to 50 drafts (default 10).
880
+ - The variable receives text or JSON depending on exportType.
881
+ - Input: `{ connectionId?: string, limit?: string, exportType: "json" | "text" }`
882
+ - Output: `{ drafts: { draftId: string, messageId: string, subject: string, to: string, snippet: string }[] }`
883
+
884
+ #### replyToGmailEmail
885
+ Reply to an existing email in Gmail. The reply is threaded under the original message.
886
+ - Requires a Google OAuth connection with Gmail compose and readonly scopes.
887
+ - The reply is sent to the original sender and threaded under the original message.
888
+ - messageType controls the body format: "plain", "html", or "markdown".
889
+ - Input: `{ messageId: string, message: string, messageType: "plain" | "html" | "markdown", connectionId?: string }`
890
+ - Output: `{ messageId: string }`
891
+
749
892
  ### Google
750
893
 
751
894
  #### createGoogleDoc
752
895
  Create a new Google Document and optionally populate it with content.
753
896
  - textType determines how the text field is interpreted: "plain" for plain text, "html" for HTML markup, "markdown" for Markdown.
754
- - Input: `{ title: string, text: string, connectionId: string, textType: "plain" | "html" | "markdown" }`
897
+ - Input: `{ title: string, text: string, connectionId?: string, textType: "plain" | "html" | "markdown" }`
755
898
  - Output: `{ documentUrl: string }`
756
899
 
757
900
  #### createGoogleSheet
758
901
  Create a new Google Spreadsheet and populate it with CSV data.
759
- - Input: `{ title: string, text: string, connectionId: string }`
902
+ - Input: `{ title: string, text: string, connectionId?: string }`
760
903
  - Output: `{ spreadsheetUrl: string }`
761
904
 
905
+ #### deleteGoogleSheetRows
906
+ Delete a range of rows from a Google Spreadsheet.
907
+ - Requires a Google OAuth connection with Drive scope.
908
+ - startRow and endRow are 1-based row numbers (inclusive).
909
+ - If sheetName is omitted, operates on the first sheet.
910
+ - Input: `{ documentId: string, sheetName?: string, startRow: string, endRow: string, connectionId?: string }`
911
+ - Output: `unknown`
912
+
762
913
  #### fetchGoogleDoc
763
914
  Fetch the contents of an existing Google Document.
764
915
  - exportType controls the output format: "html" for HTML markup, "markdown" for Markdown, "json" for structured JSON, "plain" for plain text.
765
- - Input: `{ documentId: string, connectionId: string, exportType: "html" | "markdown" | "json" | "plain" }`
916
+ - Input: `{ documentId: string, connectionId?: string, exportType: "html" | "markdown" | "json" | "plain" }`
766
917
  - Output: `{ content: string }`
767
918
 
768
919
  #### fetchGoogleSheet
769
920
  Fetch contents of a Google Spreadsheet range.
770
921
  - range uses A1 notation (e.g. "Sheet1!A1:C10"). Omit to fetch the entire first sheet.
771
922
  - exportType controls the output format: "csv" for comma-separated values, "json" for structured JSON.
772
- - Input: `{ spreadsheetId: string, range: string, connectionId: string, exportType: "csv" | "json" }`
923
+ - Input: `{ spreadsheetId: string, range: string, connectionId?: string, exportType: "csv" | "json" }`
773
924
  - Output: `{ content: string }`
774
925
 
926
+ #### getGoogleSheetInfo
927
+ Get metadata about a Google Spreadsheet including sheet names, row counts, and column counts.
928
+ - Requires a Google OAuth connection with Drive scope.
929
+ - Returns the spreadsheet title and a list of all sheets with their dimensions.
930
+ - Input: `{ documentId: string, connectionId?: string }`
931
+ - Output: `{ title: string, sheets: { sheetId: number, title: string, rowCount: number, columnCount: number }[] }`
932
+
775
933
  #### updateGoogleDoc
776
934
  Update the contents of an existing Google Document.
777
935
  - operationType controls how content is applied: "addToTop" prepends, "addToBottom" appends, "overwrite" replaces all content.
778
936
  - textType determines how the text field is interpreted: "plain" for plain text, "html" for HTML markup, "markdown" for Markdown.
779
- - Input: `{ documentId: string, connectionId: string, text: string, textType: "plain" | "html" | "markdown", operationType: "addToTop" | "addToBottom" | "overwrite" }`
937
+ - Input: `{ documentId: string, connectionId?: string, text: string, textType: "plain" | "html" | "markdown", operationType: "addToTop" | "addToBottom" | "overwrite" }`
780
938
  - Output: `{ documentUrl: string }`
781
939
 
782
940
  #### updateGoogleSheet
783
941
  Update a Google Spreadsheet with new data.
784
942
  - operationType controls how data is written: "addToBottom" appends rows, "overwrite" replaces all data, "range" writes to a specific cell range.
785
943
  - Data should be provided as CSV in the text field.
786
- - Input: `{ text: string, connectionId: string, spreadsheetId: string, range: string, operationType: "addToBottom" | "overwrite" | "range" }`
944
+ - Input: `{ text: string, connectionId?: string, spreadsheetId: string, range: string, operationType: "addToBottom" | "overwrite" | "range" }`
787
945
  - Output: `{ spreadsheetUrl: string }`
788
946
 
789
947
  ### Google Calendar
@@ -794,21 +952,21 @@ Create a new event on a Google Calendar.
794
952
  - Date/time values must be ISO 8601 format (e.g. "2025-07-02T10:00:00-07:00").
795
953
  - Attendees are specified as one email address per line in a single string.
796
954
  - Set addMeetLink to true to automatically attach a Google Meet video call.
797
- - Input: `{ connectionId: string, summary: string, description?: string, location?: string, startDateTime: string, endDateTime: string, attendees?: string, addMeetLink?: boolean, calendarId?: string }`
955
+ - Input: `{ connectionId?: string, summary: string, description?: string, location?: string, startDateTime: string, endDateTime: string, attendees?: string, addMeetLink?: boolean, calendarId?: string }`
798
956
  - Output: `{ eventId: string, htmlLink: string }`
799
957
 
800
958
  #### deleteGoogleCalendarEvent
801
959
  Retrieve a specific event from a Google Calendar by event ID.
802
960
  - Requires a Google OAuth connection with Calendar events scope.
803
961
  - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.
804
- - Input: `{ connectionId: string, eventId: string, calendarId?: string }`
962
+ - Input: `{ connectionId?: string, eventId: string, calendarId?: string }`
805
963
  - Output: `unknown`
806
964
 
807
965
  #### getGoogleCalendarEvent
808
966
  Retrieve a specific event from a Google Calendar by event ID.
809
967
  - Requires a Google OAuth connection with Calendar events scope.
810
968
  - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns the structured event.
811
- - Input: `{ connectionId: string, eventId: string, exportType: "json" | "text", calendarId?: string }`
969
+ - Input: `{ connectionId?: string, eventId: string, exportType: "json" | "text", calendarId?: string }`
812
970
  - Output: `{ event: { id?: string | null, status?: string | null, htmlLink?: string | null, created?: string | null, updated?: string | null, summary?: string | null, description?: string | null, location?: string | null, organizer?: { displayName?: string | null, email?: string | null } | null, start?: { dateTime?: string | null, timeZone?: string | null } | null, end?: { dateTime?: string | null, timeZone?: string | null } | null, attendees?: ({ displayName?: string | null, email?: string | null, responseStatus?: string | null })[] | null } }`
813
971
 
814
972
  #### listGoogleCalendarEvents
@@ -816,7 +974,15 @@ List upcoming events from a Google Calendar, ordered by start time.
816
974
  - Requires a Google OAuth connection with Calendar events scope.
817
975
  - Only returns future events (timeMin = now).
818
976
  - The variable receives JSON or XML-like text depending on exportType. The direct execution output always returns structured events.
819
- - Input: `{ connectionId: string, limit: number, exportType: "json" | "text", calendarId?: string }`
977
+ - Input: `{ connectionId?: string, limit: number, exportType: "json" | "text", calendarId?: string }`
978
+ - Output: `{ events: ({ id?: string | null, status?: string | null, htmlLink?: string | null, created?: string | null, updated?: string | null, summary?: string | null, description?: string | null, location?: string | null, organizer?: { displayName?: string | null, email?: string | null } | null, start?: { dateTime?: string | null, timeZone?: string | null } | null, end?: { dateTime?: string | null, timeZone?: string | null } | null, attendees?: ({ displayName?: string | null, email?: string | null, responseStatus?: string | null })[] | null })[] }`
979
+
980
+ #### searchGoogleCalendarEvents
981
+ Search for events in a Google Calendar by keyword, date range, or both.
982
+ - Requires a Google OAuth connection with Calendar events scope.
983
+ - Supports keyword search via "query" and date filtering via "timeMin"/"timeMax" (ISO 8601 format).
984
+ - Unlike "List Events" which only shows future events, this allows searching past events too.
985
+ - Input: `{ query?: string, timeMin?: string, timeMax?: string, calendarId?: string, limit?: number, exportType: "json" | "text", connectionId?: string }`
820
986
  - Output: `{ events: ({ id?: string | null, status?: string | null, htmlLink?: string | null, created?: string | null, updated?: string | null, summary?: string | null, description?: string | null, location?: string | null, organizer?: { displayName?: string | null, email?: string | null } | null, start?: { dateTime?: string | null, timeZone?: string | null } | null, end?: { dateTime?: string | null, timeZone?: string | null } | null, attendees?: ({ displayName?: string | null, email?: string | null, responseStatus?: string | null })[] | null })[] }`
821
987
 
822
988
  #### updateGoogleCalendarEvent
@@ -824,9 +990,35 @@ Update an existing event on a Google Calendar. Only specified fields are changed
824
990
  - Requires a Google OAuth connection with Calendar events scope.
825
991
  - Fetches the existing event first, then applies only the provided updates. Omitted fields are left unchanged.
826
992
  - Attendees are specified as one email address per line, and replace the entire attendee list.
827
- - Input: `{ connectionId: string, eventId: string, summary?: string, description?: string, location?: string, startDateTime?: string, endDateTime?: string, attendees?: string, calendarId?: string }`
993
+ - Input: `{ connectionId?: string, eventId: string, summary?: string, description?: string, location?: string, startDateTime?: string, endDateTime?: string, attendees?: string, calendarId?: string }`
828
994
  - Output: `{ eventId: string, htmlLink: string }`
829
995
 
996
+ ### Google Drive
997
+
998
+ #### getGoogleDriveFile
999
+ Download a file from Google Drive and rehost it on the CDN. Returns a public CDN URL.
1000
+ - Requires a Google OAuth connection with Drive scope.
1001
+ - Google-native files (Docs, Sheets, Slides) cannot be downloaded — use dedicated steps instead.
1002
+ - Maximum file size: 200MB.
1003
+ - The file is downloaded and re-uploaded to the CDN; the returned URL is publicly accessible.
1004
+ - Input: `{ fileId: string, connectionId?: string }`
1005
+ - Output: `{ url: string, name: string, mimeType: string, size: number }`
1006
+
1007
+ #### listGoogleDriveFiles
1008
+ List files in a Google Drive folder.
1009
+ - Requires a Google OAuth connection with Drive scope.
1010
+ - If folderId is omitted, lists files in the root folder.
1011
+ - Returns file metadata including name, type, size, and links.
1012
+ - Input: `{ folderId?: string, limit?: number, connectionId?: string, exportType: "json" | "text" }`
1013
+ - Output: `{ files: { id: string, name: string, mimeType: string, size: string, webViewLink: string, createdTime: string, modifiedTime: string }[] }`
1014
+
1015
+ #### searchGoogleDrive
1016
+ Search for files in Google Drive by keyword.
1017
+ - Requires a Google OAuth connection with Drive scope.
1018
+ - Searches file content and names using Google Drive's fullText search.
1019
+ - Input: `{ query: string, limit?: number, connectionId?: string, exportType: "json" | "text" }`
1020
+ - Output: `{ files: { id: string, name: string, mimeType: string, size: string, webViewLink: string, createdTime: string, modifiedTime: string }[] }`
1021
+
830
1022
  ### HubSpot
831
1023
 
832
1024
  #### hubspotCreateCompany
@@ -834,7 +1026,7 @@ Create a new company or update an existing one in HubSpot. Matches by domain.
834
1026
  - Requires a HubSpot OAuth connection (connectionId).
835
1027
  - If a company with the given domain already exists, it is updated. Otherwise, a new one is created.
836
1028
  - Property values are type-checked against enabledProperties before being sent to HubSpot.
837
- - Input: `{ connectionId: string, company: { domain: string, name: string }, enabledProperties: ({ label: string, value: string, type: "string" | "number" | "bool" })[] }`
1029
+ - Input: `{ connectionId?: string, company: { domain: string, name: string }, enabledProperties: ({ label: string, value: string, type: "string" | "number" | "bool" })[] }`
838
1030
  - Output: `{ companyId: string }`
839
1031
 
840
1032
  #### hubspotCreateContact
@@ -843,7 +1035,7 @@ Create a new contact or update an existing one in HubSpot. Matches by email addr
843
1035
  - If a contact with the given email already exists, it is updated. Otherwise, a new one is created.
844
1036
  - If companyDomain is provided, the contact is associated with that company (creating the company if needed).
845
1037
  - Property values are type-checked against enabledProperties before being sent to HubSpot.
846
- - Input: `{ connectionId: string, contact: { email: string, firstname: string, lastname: string }, enabledProperties: ({ label: string, value: string, type: "string" | "number" | "bool" })[], companyDomain: string }`
1038
+ - Input: `{ connectionId?: string, contact: { email: string, firstname: string, lastname: string }, enabledProperties: ({ label: string, value: string, type: "string" | "number" | "bool" })[], companyDomain: string }`
847
1039
  - Output: `{ contactId: string }`
848
1040
 
849
1041
  #### hubspotGetCompany
@@ -852,7 +1044,7 @@ Look up a HubSpot company by domain name or company ID.
852
1044
  - Returns null if the company is not found.
853
1045
  - When searching by domain, performs a search query then fetches the full company record.
854
1046
  - Use additionalProperties to request specific HubSpot properties beyond the defaults.
855
- - Input: `{ connectionId: string, searchBy: "domain" | "id", companyDomain: string, companyId: string, additionalProperties: string[] }`
1047
+ - Input: `{ connectionId?: string, searchBy: "domain" | "id", companyDomain: string, companyId: string, additionalProperties: string[] }`
856
1048
  - Output: `{ company: { id: string, properties: object, createdAt: string, updatedAt: string, archived: boolean } | null }`
857
1049
 
858
1050
  #### hubspotGetContact
@@ -860,7 +1052,7 @@ Look up a HubSpot contact by email address or contact ID.
860
1052
  - Requires a HubSpot OAuth connection (connectionId).
861
1053
  - Returns null if the contact is not found.
862
1054
  - Use additionalProperties to request specific HubSpot properties beyond the defaults.
863
- - Input: `{ connectionId: string, searchBy: "email" | "id", contactEmail: string, contactId: string, additionalProperties: string[] }`
1055
+ - Input: `{ connectionId?: string, searchBy: "email" | "id", contactEmail: string, contactId: string, additionalProperties: string[] }`
864
1056
  - Output: `{ contact: { id: string, properties: object, createdAt: string, updatedAt: string, archived: boolean } | null }`
865
1057
 
866
1058
  ### Hunter.io
@@ -936,7 +1128,7 @@ Create a post on LinkedIn from the connected account.
936
1128
  - Requires a LinkedIn OAuth connection (connectionId).
937
1129
  - Supports text posts, image posts, and video posts.
938
1130
  - Visibility controls who can see the post.
939
- - Input: `{ message: string, visibility: "PUBLIC" | "CONNECTIONS", videoUrl?: string, descriptionText?: string, titleText?: string, imageUrl?: string, connectionId: string }`
1131
+ - Input: `{ message: string, visibility: "PUBLIC" | "CONNECTIONS", videoUrl?: string, descriptionText?: string, titleText?: string, imageUrl?: string, connectionId?: string }`
940
1132
  - Output: `unknown`
941
1133
 
942
1134
  ### Meta Threads
@@ -953,7 +1145,7 @@ Create a new page in Notion as a child of an existing page.
953
1145
  - Requires a Notion OAuth connection (connectionId).
954
1146
  - Content is provided as markdown and converted to Notion blocks (headings, paragraphs, lists, code, quotes).
955
1147
  - The page is created as a child of the specified parent page (pageId).
956
- - Input: `{ pageId: string, content: string, title: string, connectionId: string }`
1148
+ - Input: `{ pageId: string, content: string, title: string, connectionId?: string }`
957
1149
  - Output: `{ pageId: string, pageUrl: string }`
958
1150
 
959
1151
  #### notionUpdatePage
@@ -961,7 +1153,7 @@ Update the content of an existing Notion page.
961
1153
  - Requires a Notion OAuth connection (connectionId).
962
1154
  - Content is provided as markdown and converted to Notion blocks.
963
1155
  - "append" mode adds content to the end of the page. "overwrite" mode deletes all existing blocks first.
964
- - Input: `{ pageId: string, content: string, mode: "append" | "overwrite", connectionId: string }`
1156
+ - Input: `{ pageId: string, content: string, mode: "append" | "overwrite", connectionId?: string }`
965
1157
  - Output: `{ pageId: string, pageUrl: string }`
966
1158
 
967
1159
  ### X
@@ -970,7 +1162,7 @@ Update the content of an existing Notion page.
970
1162
  Create a post on X (Twitter) from the connected account.
971
1163
  - Requires an X OAuth connection (connectionId).
972
1164
  - Posts are plain text. Maximum 280 characters.
973
- - Input: `{ text: string, connectionId: string }`
1165
+ - Input: `{ text: string, connectionId?: string }`
974
1166
  - Output: `unknown`
975
1167
 
976
1168
  #### searchXPosts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindstudio-ai/agent",
3
- "version": "0.0.15",
3
+ "version": "0.0.17",
4
4
  "description": "TypeScript SDK for MindStudio direct step execution",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -12,6 +12,9 @@
12
12
  "default": "./dist/index.js"
13
13
  }
14
14
  },
15
+ "bin": {
16
+ "mindstudio": "./dist/cli.js"
17
+ },
15
18
  "files": [
16
19
  "dist",
17
20
  "llms.txt"