@speakai/mcp-server 1.10.0 → 1.11.0

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/dist/index.d.ts CHANGED
@@ -10,3 +10,12 @@ export declare function createSpeakClient(options: {
10
10
  }): AxiosInstance;
11
11
 
12
12
  export declare function formatAxiosError(error: unknown): string;
13
+
14
+ /**
15
+ * Static manifest of every Speak MCP tool name exposed by `registerAllTools`.
16
+ * Consumers (e.g. speak-server's orchestrator bridge) can import this to route
17
+ * or validate tool calls without spinning up an `McpServer` instance.
18
+ */
19
+ export declare const SPEAK_MCP_TOOL_NAMES: readonly string[];
20
+
21
+ export type SpeakMcpToolName = (typeof SPEAK_MCP_TOOL_NAMES)[number];
package/dist/index.js CHANGED
@@ -410,6 +410,7 @@ var init_export = __esm({
410
410
  ExportFormatType2["DOCX"] = "docx";
411
411
  ExportFormatType2["HTML"] = "html";
412
412
  ExportFormatType2["JSON"] = "json";
413
+ ExportFormatType2["MD"] = "md";
413
414
  ExportFormatType2["PDF"] = "pdf";
414
415
  ExportFormatType2["SOURCEFILE"] = "sourceFile";
415
416
  ExportFormatType2["SRT"] = "srt";
@@ -1386,7 +1387,7 @@ function register(server, client) {
1386
1387
  try {
1387
1388
  const result = await api.put(
1388
1389
  `/v1/media/speakers/${mediaId}`,
1389
- { speakers }
1390
+ speakers
1390
1391
  );
1391
1392
  return {
1392
1393
  content: [
@@ -1437,7 +1438,7 @@ function register(server, client) {
1437
1438
  "Update metadata fields (name, description, tags, status) for an existing media file.",
1438
1439
  {
1439
1440
  mediaId: import_zod2.z.string().min(1).describe("Unique identifier of the media file"),
1440
- name: import_zod2.z.string().optional().describe("New display name for the media"),
1441
+ name: import_zod2.z.string().describe("Display name for the media (required \u2014 the server replaces the metadata)"),
1441
1442
  description: import_zod2.z.string().optional().describe("Description or notes for the media"),
1442
1443
  folderId: import_zod2.z.string().optional().describe("Move media to this folder ID"),
1443
1444
  tags: import_zod2.z.array(import_zod2.z.string()).optional().describe("Array of tags to assign to the media"),
@@ -1587,9 +1588,10 @@ function register(server, client) {
1587
1588
  registerSpeakTool(
1588
1589
  server,
1589
1590
  "toggle_media_favorite",
1590
- "Mark or unmark a media file as a favorite for quick access.",
1591
+ "Mark or unmark media files as favorites for quick access.",
1591
1592
  {
1592
- mediaId: import_zod2.z.string().min(1).describe("Unique identifier of the media file")
1593
+ mediaIds: import_zod2.z.array(import_zod2.z.string().min(1)).min(1).describe("Media file IDs to update"),
1594
+ isFavorite: import_zod2.z.boolean().describe("true to mark as favorite, false to unmark")
1593
1595
  },
1594
1596
  {
1595
1597
  title: "Toggle Media Favorite",
@@ -1617,9 +1619,13 @@ function register(server, client) {
1617
1619
  registerSpeakTool(
1618
1620
  server,
1619
1621
  "reanalyze_media",
1620
- "Re-run AI analysis on a media file using the latest models. Use this after Speak AI has updated its analysis capabilities or if the original analysis was incomplete.",
1622
+ "Re-run AI analysis on a media file using the latest models. Choose which parts to re-run via the flags below.",
1621
1623
  {
1622
- mediaId: import_zod2.z.string().min(1).describe("Unique identifier of the media file to re-analyze")
1624
+ mediaId: import_zod2.z.string().min(1).describe("Unique identifier of the media file to re-analyze"),
1625
+ isInsights: import_zod2.z.boolean().optional().describe("Re-run insights analysis"),
1626
+ isSentiment: import_zod2.z.boolean().optional().describe("Re-run sentiment analysis"),
1627
+ isFillerWords: import_zod2.z.boolean().optional().describe("Re-run filler-word detection"),
1628
+ isEmbeddings: import_zod2.z.boolean().optional().describe("Re-generate embeddings")
1623
1629
  },
1624
1630
  {
1625
1631
  title: "Re-analyze Media",
@@ -1628,9 +1634,9 @@ function register(server, client) {
1628
1634
  idempotentHint: false,
1629
1635
  openWorldHint: false
1630
1636
  },
1631
- async ({ mediaId }) => {
1637
+ async ({ mediaId, ...params }) => {
1632
1638
  try {
1633
- const result = await api.post(`/v1/media/reanalyze/${mediaId}`, {});
1639
+ const result = await api.get(`/v1/media/reanalyze/${mediaId}`, { params });
1634
1640
  return {
1635
1641
  content: [
1636
1642
  { type: "text", text: JSON.stringify(result.data, null, 2) }
@@ -1668,7 +1674,7 @@ function register(server, client) {
1668
1674
  const results = [];
1669
1675
  for (const mediaId of mediaIds) {
1670
1676
  try {
1671
- await api.put(`/v1/media/speakers/${mediaId}`, { speakers });
1677
+ await api.put(`/v1/media/speakers/${mediaId}`, speakers);
1672
1678
  results.push({ mediaId, success: true });
1673
1679
  } catch (err) {
1674
1680
  results.push({ mediaId, success: false, error: formatAxiosError(err) });
@@ -1904,7 +1910,7 @@ function register3(server, client) {
1904
1910
  "Export a media file's transcript or insights in various formats (pdf, docx, srt, vtt, txt, csv).",
1905
1911
  {
1906
1912
  mediaId: import_zod4.z.string().min(1).describe("Unique identifier of the media file"),
1907
- fileType: import_zod4.z.enum(["pdf", "docx", "srt", "vtt", "txt", "csv"]).describe("Desired export format"),
1913
+ fileType: import_zod4.z.nativeEnum(ExportFormatType).describe("Desired export format"),
1908
1914
  isSpeakerNames: import_zod4.z.boolean().optional().describe("Include speaker names in export"),
1909
1915
  isSpeakerEmail: import_zod4.z.boolean().optional().describe("Include speaker emails in export"),
1910
1916
  isTimeStamps: import_zod4.z.boolean().optional().describe("Include timestamps in export"),
@@ -1944,7 +1950,7 @@ function register3(server, client) {
1944
1950
  "Export multiple media files at once, optionally merged into a single file.",
1945
1951
  {
1946
1952
  mediaIds: import_zod4.z.array(import_zod4.z.string()).describe("Array of media IDs to export"),
1947
- fileType: import_zod4.z.enum(["pdf", "docx", "srt", "vtt", "txt", "csv"]).describe("Desired export format"),
1953
+ fileType: import_zod4.z.nativeEnum(ExportFormatType).describe("Desired export format"),
1948
1954
  isSpeakerNames: import_zod4.z.boolean().optional().describe("Include speaker names in export"),
1949
1955
  isSpeakerEmail: import_zod4.z.boolean().optional().describe("Include speaker emails in export"),
1950
1956
  isTimeStamps: import_zod4.z.boolean().optional().describe("Include timestamps in export"),
@@ -1987,6 +1993,7 @@ var init_exports = __esm({
1987
1993
  import_zod4 = require("zod");
1988
1994
  init_helpers();
1989
1995
  init_client();
1996
+ init_dist();
1990
1997
  }
1991
1998
  });
1992
1999
 
@@ -2011,7 +2018,7 @@ function register4(server, client) {
2011
2018
  },
2012
2019
  async () => {
2013
2020
  try {
2014
- const result = await api.get("/v1/folders/views");
2021
+ const result = await api.get("/v1/folder/views");
2015
2022
  return {
2016
2023
  content: [
2017
2024
  { type: "text", text: JSON.stringify(result.data, null, 2) }
@@ -2041,7 +2048,7 @@ function register4(server, client) {
2041
2048
  },
2042
2049
  async ({ folderId }) => {
2043
2050
  try {
2044
- const result = await api.get(`/v1/folders/${folderId}/views`);
2051
+ const result = await api.get(`/v1/folder/${folderId}/views`);
2045
2052
  return {
2046
2053
  content: [
2047
2054
  { type: "text", text: JSON.stringify(result.data, null, 2) }
@@ -2058,11 +2065,20 @@ function register4(server, client) {
2058
2065
  registerSpeakTool(
2059
2066
  server,
2060
2067
  "create_folder_view",
2061
- "Create a new saved view for a folder with custom filters and display settings.",
2068
+ "Create a new saved view for a folder with a custom set of display columns.",
2062
2069
  {
2063
2070
  folderId: import_zod5.z.string().min(1).describe("Unique identifier of the folder"),
2064
- name: import_zod5.z.string().optional().describe("Display name for the view"),
2065
- filters: import_zod5.z.record(import_zod5.z.unknown()).optional().describe("Filter configuration object")
2071
+ name: import_zod5.z.string().describe("Display name for the view"),
2072
+ isDefault: import_zod5.z.boolean().optional().describe("Whether this view is the folder's default view"),
2073
+ columns: import_zod5.z.array(
2074
+ import_zod5.z.object({
2075
+ fieldId: import_zod5.z.string().optional().describe("Field ID this column maps to (omit for built-in columns)"),
2076
+ name: import_zod5.z.string().describe("Column display name"),
2077
+ type: import_zod5.z.string().describe("Column type \u2014 a FieldType or a default view column"),
2078
+ definition: import_zod5.z.string().optional().describe("Optional column definition"),
2079
+ order: import_zod5.z.number().describe("Column display order")
2080
+ })
2081
+ ).describe("Ordered list of columns shown in the view")
2066
2082
  },
2067
2083
  {
2068
2084
  title: "Create Folder View",
@@ -2074,7 +2090,7 @@ function register4(server, client) {
2074
2090
  async ({ folderId, ...body }) => {
2075
2091
  try {
2076
2092
  const result = await api.post(
2077
- `/v1/folders/${folderId}/views`,
2093
+ `/v1/folder/${folderId}/views`,
2078
2094
  body
2079
2095
  );
2080
2096
  return {
@@ -2093,12 +2109,21 @@ function register4(server, client) {
2093
2109
  registerSpeakTool(
2094
2110
  server,
2095
2111
  "update_folder_view",
2096
- "Update an existing saved view's name, filters, or display settings.",
2112
+ "Update an existing saved view. Replaces the whole view, so `name`, `isDefault` and `columns` must all be supplied.",
2097
2113
  {
2098
2114
  folderId: import_zod5.z.string().min(1).describe("Unique identifier of the folder"),
2099
2115
  viewId: import_zod5.z.string().min(1).describe("Unique identifier of the view to update"),
2100
- name: import_zod5.z.string().optional().describe("New display name for the view"),
2101
- filters: import_zod5.z.record(import_zod5.z.unknown()).optional().describe("Updated filter configuration")
2116
+ name: import_zod5.z.string().describe("Display name for the view"),
2117
+ isDefault: import_zod5.z.boolean().describe("Whether this view is the folder's default view"),
2118
+ columns: import_zod5.z.array(
2119
+ import_zod5.z.object({
2120
+ fieldId: import_zod5.z.string().optional().describe("Field ID this column maps to (omit for built-in columns)"),
2121
+ name: import_zod5.z.string().describe("Column display name"),
2122
+ type: import_zod5.z.string().describe("Column type \u2014 a FieldType or a default view column"),
2123
+ definition: import_zod5.z.string().optional().describe("Optional column definition"),
2124
+ order: import_zod5.z.number().describe("Column display order")
2125
+ })
2126
+ ).describe("Ordered list of columns shown in the view")
2102
2127
  },
2103
2128
  {
2104
2129
  title: "Update Folder View",
@@ -2110,7 +2135,7 @@ function register4(server, client) {
2110
2135
  async ({ folderId, viewId, ...body }) => {
2111
2136
  try {
2112
2137
  const result = await api.put(
2113
- `/v1/folders/${folderId}/views/${viewId}`,
2138
+ `/v1/folder/${folderId}/views/${viewId}`,
2114
2139
  body
2115
2140
  );
2116
2141
  return {
@@ -2129,9 +2154,13 @@ function register4(server, client) {
2129
2154
  registerSpeakTool(
2130
2155
  server,
2131
2156
  "clone_folder_view",
2132
- "Duplicate an existing folder view.",
2157
+ "Duplicate an existing folder view into a target folder.",
2133
2158
  {
2134
- viewId: import_zod5.z.string().min(1).describe("Unique identifier of the view to clone")
2159
+ sourceFolderId: import_zod5.z.string().min(1).describe("Folder that currently holds the view"),
2160
+ targetFolderId: import_zod5.z.string().min(1).describe("Folder to copy the view into (must differ from sourceFolderId)"),
2161
+ viewId: import_zod5.z.string().min(1).describe("Unique identifier of the view to clone"),
2162
+ name: import_zod5.z.string().describe("Display name for the cloned view"),
2163
+ isDefault: import_zod5.z.boolean().optional().describe("Whether the cloned view becomes the target folder's default")
2135
2164
  },
2136
2165
  {
2137
2166
  title: "Clone Folder View",
@@ -2142,7 +2171,7 @@ function register4(server, client) {
2142
2171
  },
2143
2172
  async (body) => {
2144
2173
  try {
2145
- const result = await api.post("/v1/folders/views/clone", body);
2174
+ const result = await api.post("/v1/folder/views/clone", body);
2146
2175
  return {
2147
2176
  content: [
2148
2177
  { type: "text", text: JSON.stringify(result.data, null, 2) }
@@ -2224,7 +2253,7 @@ function register4(server, client) {
2224
2253
  "Create a new folder in the workspace.",
2225
2254
  {
2226
2255
  name: import_zod5.z.string().min(1).describe("Display name for the new folder"),
2227
- parentFolderId: import_zod5.z.string().optional().describe("ID of the parent folder for nesting")
2256
+ description: import_zod5.z.string().optional().describe("Optional folder description")
2228
2257
  },
2229
2258
  {
2230
2259
  title: "Create Folder",
@@ -2254,7 +2283,11 @@ function register4(server, client) {
2254
2283
  "clone_folder",
2255
2284
  "Duplicate an existing folder and all of its contents.",
2256
2285
  {
2257
- folderId: import_zod5.z.string().min(1).describe("ID of the folder to clone")
2286
+ folderId: import_zod5.z.string().min(1).describe("ID of the folder to clone"),
2287
+ name: import_zod5.z.string().optional().describe("Name for the cloned folder"),
2288
+ description: import_zod5.z.string().optional().describe("Description for the cloned folder"),
2289
+ assignTo: import_zod5.z.array(import_zod5.z.string()).optional().describe("User IDs to assign the cloned folder to"),
2290
+ isSaveDefaultView: import_zod5.z.boolean().optional().describe("Whether to copy the source folder's default view")
2258
2291
  },
2259
2292
  {
2260
2293
  title: "Clone Folder",
@@ -2282,10 +2315,11 @@ function register4(server, client) {
2282
2315
  registerSpeakTool(
2283
2316
  server,
2284
2317
  "update_folder",
2285
- "Update a folder's name or other properties.",
2318
+ "Update a folder. `name` must always be supplied (the server replaces the folder config).",
2286
2319
  {
2287
2320
  folderId: import_zod5.z.string().min(1).describe("Unique identifier of the folder"),
2288
- name: import_zod5.z.string().optional().describe("New display name for the folder")
2321
+ name: import_zod5.z.string().describe("Display name for the folder"),
2322
+ description: import_zod5.z.string().optional().describe("Optional folder description")
2289
2323
  },
2290
2324
  {
2291
2325
  title: "Update Folder",
@@ -2391,9 +2425,11 @@ function register5(server, client) {
2391
2425
  "create_recorder",
2392
2426
  "Create a new recorder or survey for collecting audio/video submissions.",
2393
2427
  {
2394
- name: import_zod6.z.string().optional().describe("Display name for the recorder"),
2395
- folderId: import_zod6.z.string().optional().describe("Folder to store recordings in"),
2396
- settings: import_zod6.z.record(import_zod6.z.unknown()).optional().describe("Recorder configuration settings")
2428
+ name: import_zod6.z.string().describe("Display name for the recorder"),
2429
+ ...recorderConfigShape,
2430
+ clientInformation: import_zod6.z.record(import_zod6.z.unknown()).optional().describe(
2431
+ "Respondent info & questions: { name:boolean, email:boolean, questions:[{ question, isRequired, answerType, options?, includeOther?, fieldId? }], consent?:{ isEnabled, title, description, yesButtonLabel, noButtonLabel, isRequired, fieldId? } }"
2432
+ )
2397
2433
  },
2398
2434
  {
2399
2435
  title: "Create Recorder",
@@ -2451,7 +2487,10 @@ function register5(server, client) {
2451
2487
  "clone_recorder",
2452
2488
  "Duplicate an existing recorder including all its settings and questions.",
2453
2489
  {
2454
- recorderId: import_zod6.z.string().min(1).describe("ID of the recorder to clone")
2490
+ recorderId: import_zod6.z.string().min(1).describe("ID of the recorder to clone"),
2491
+ name: import_zod6.z.string().optional().describe("Name for the cloned recorder"),
2492
+ description: import_zod6.z.string().optional().describe("Description for the cloned recorder"),
2493
+ folderId: import_zod6.z.string().optional().describe("Folder for the cloned recorder")
2455
2494
  },
2456
2495
  {
2457
2496
  title: "Clone Recorder",
@@ -2561,10 +2600,11 @@ function register5(server, client) {
2561
2600
  registerSpeakTool(
2562
2601
  server,
2563
2602
  "update_recorder_settings",
2564
- "Update configuration settings for a recorder (branding, permissions, etc.).",
2603
+ "Update configuration settings for a recorder (branding, capture options, etc.). `name` must always be supplied.",
2565
2604
  {
2566
2605
  recorderId: import_zod6.z.string().min(1).describe("Unique identifier of the recorder"),
2567
- settings: import_zod6.z.record(import_zod6.z.unknown()).describe("Settings object with updated values")
2606
+ name: import_zod6.z.string().describe("Display name for the recorder"),
2607
+ ...recorderConfigShape
2568
2608
  },
2569
2609
  {
2570
2610
  title: "Update Recorder Settings",
@@ -2573,9 +2613,9 @@ function register5(server, client) {
2573
2613
  idempotentHint: true,
2574
2614
  openWorldHint: true
2575
2615
  },
2576
- async ({ recorderId, settings }) => {
2616
+ async ({ recorderId, ...body }) => {
2577
2617
  try {
2578
- const result = await api.put(`/v1/recorder/settings/${recorderId}`, settings);
2618
+ const result = await api.put(`/v1/recorder/settings/${recorderId}`, body);
2579
2619
  return {
2580
2620
  content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
2581
2621
  };
@@ -2590,10 +2630,17 @@ function register5(server, client) {
2590
2630
  registerSpeakTool(
2591
2631
  server,
2592
2632
  "update_recorder_questions",
2593
- "Update the survey questions for a recorder.",
2633
+ "Update the survey questions and respondent-info settings for a recorder.",
2594
2634
  {
2595
2635
  recorderId: import_zod6.z.string().min(1).describe("Unique identifier of the recorder"),
2596
- questions: import_zod6.z.array(import_zod6.z.record(import_zod6.z.unknown())).describe("Array of question objects")
2636
+ name: import_zod6.z.boolean().optional().describe("Whether to collect the respondent's name"),
2637
+ email: import_zod6.z.boolean().optional().describe("Whether to collect the respondent's email"),
2638
+ questions: import_zod6.z.array(import_zod6.z.record(import_zod6.z.unknown())).describe(
2639
+ "Survey questions. Each: { question, isRequired, answerType, options?, includeOther?, fieldId?, id? }"
2640
+ ),
2641
+ consent: import_zod6.z.record(import_zod6.z.unknown()).optional().describe(
2642
+ "Consent screen: { isEnabled, title, description, yesButtonLabel, noButtonLabel, isRequired, fieldId? }"
2643
+ )
2597
2644
  },
2598
2645
  {
2599
2646
  title: "Update Recorder Questions",
@@ -2602,9 +2649,9 @@ function register5(server, client) {
2602
2649
  idempotentHint: true,
2603
2650
  openWorldHint: true
2604
2651
  },
2605
- async ({ recorderId, questions }) => {
2652
+ async ({ recorderId, ...body }) => {
2606
2653
  try {
2607
- const result = await api.put(`/v1/recorder/questions/${recorderId}`, { questions });
2654
+ const result = await api.put(`/v1/recorder/questions/${recorderId}`, body);
2608
2655
  return {
2609
2656
  content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
2610
2657
  };
@@ -2645,13 +2692,28 @@ function register5(server, client) {
2645
2692
  }
2646
2693
  );
2647
2694
  }
2648
- var import_zod6;
2695
+ var import_zod6, recorderConfigShape;
2649
2696
  var init_recorder3 = __esm({
2650
2697
  "src/tools/recorder.ts"() {
2651
2698
  "use strict";
2652
2699
  import_zod6 = require("zod");
2653
2700
  init_helpers();
2654
2701
  init_client();
2702
+ recorderConfigShape = {
2703
+ description: import_zod6.z.string().optional().describe("Recorder description"),
2704
+ sourceLanguage: import_zod6.z.string().optional().describe("Transcription language code (e.g. en-US)"),
2705
+ folderId: import_zod6.z.string().optional().describe("Folder to store recordings in"),
2706
+ isAutoAnalyze: import_zod6.z.boolean().optional().describe("Whether to auto-analyze submissions"),
2707
+ notifyUsers: import_zod6.z.array(import_zod6.z.string()).optional().describe("User IDs to notify on new submissions"),
2708
+ duration: import_zod6.z.record(import_zod6.z.unknown()).optional().describe("Recording duration: { minDuration, maxDuration } in seconds"),
2709
+ options: import_zod6.z.record(import_zod6.z.unknown()).optional().describe(
2710
+ "Capture options: { audio, video, screenShare, liveTranscription, upload:{ file, text, multiple, url } } \u2014 all booleans"
2711
+ ),
2712
+ notification: import_zod6.z.record(import_zod6.z.unknown()).optional().describe("Notification toggles: { upload, client } \u2014 booleans"),
2713
+ meta: import_zod6.z.record(import_zod6.z.unknown()).optional().describe(
2714
+ "Branding/customization: { primaryColor, backgroundImg, logo, fontColor, fontFamily, theme, customCSS, hideWaveform, hideTitle, hideDescription, hideSubmitButton, submitButtonLabel, countdown, hideImages }"
2715
+ )
2716
+ };
2655
2717
  }
2656
2718
  });
2657
2719
 
@@ -2665,10 +2727,10 @@ function register6(server, client) {
2665
2727
  registerSpeakTool(
2666
2728
  server,
2667
2729
  "create_embed",
2668
- "Create an embeddable player/transcript widget for a media file.",
2730
+ "Create an embeddable player/transcript widget for a media file or a set of folders. Provide `mediaId` for a single-media embed, or `folderIds` for a folder/library embed.",
2669
2731
  {
2670
- mediaId: import_zod7.z.string().min(1).describe("Unique identifier of the media file"),
2671
- settings: import_zod7.z.record(import_zod7.z.unknown()).optional().describe("Embed configuration settings")
2732
+ mediaId: import_zod7.z.string().optional().describe("Media file to embed (for a single-media embed)"),
2733
+ folderIds: import_zod7.z.array(import_zod7.z.string()).optional().describe("Folder IDs to embed (for a folder/library embed)")
2672
2734
  },
2673
2735
  {
2674
2736
  title: "Create Embed Widget",
@@ -2694,10 +2756,16 @@ function register6(server, client) {
2694
2756
  registerSpeakTool(
2695
2757
  server,
2696
2758
  "update_embed",
2697
- "Update settings for an existing embed widget.",
2759
+ "Update an existing embed widget \u2014 appearance/feature toggles via `meta`, plus scope and privacy.",
2698
2760
  {
2699
2761
  embedId: import_zod7.z.string().min(1).describe("Unique identifier of the embed"),
2700
- settings: import_zod7.z.record(import_zod7.z.unknown()).optional().describe("Updated embed settings")
2762
+ mediaId: import_zod7.z.string().optional().describe("Media file the embed points to"),
2763
+ folderIds: import_zod7.z.array(import_zod7.z.string()).optional().describe("Folder IDs the embed covers"),
2764
+ privacyMode: import_zod7.z.string().optional().describe("Privacy mode for the embed"),
2765
+ embedType: import_zod7.z.string().optional().describe("Embed type"),
2766
+ meta: import_zod7.z.record(import_zod7.z.unknown()).optional().describe(
2767
+ "Embed appearance & feature toggles: { backgroundImg, logo, primaryColor, titleColor, chatWelcomeMessage, assistantTemplateId, isTitle, isDescription, isRemarks, isDataVizDownloadable, isSEOIndexing, isPromptAsk, isPromptHistory, isMediaExport, callToActionButtons:[{ url, label }], features:[{ name, isActive, isCustom? }] }"
2768
+ )
2701
2769
  },
2702
2770
  {
2703
2771
  title: "Update Embed Widget",
@@ -2736,7 +2804,7 @@ function register6(server, client) {
2736
2804
  },
2737
2805
  async ({ mediaId }) => {
2738
2806
  try {
2739
- const result = await api.get(`/v1/embed/${mediaId}`);
2807
+ const result = await api.get("/v1/embed", { params: { mediaId } });
2740
2808
  return {
2741
2809
  content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
2742
2810
  };
@@ -2819,7 +2887,10 @@ function register7(server, client) {
2819
2887
  tags: import_zod8.z.array(import_zod8.z.string()).optional().describe("Filter media by tags"),
2820
2888
  startDate: import_zod8.z.string().optional().describe("Start date for date range filter (ISO 8601, e.g., '2025-01-01')"),
2821
2889
  endDate: import_zod8.z.string().optional().describe("End date for date range filter (ISO 8601, e.g., '2025-03-31')"),
2822
- isIndividualPrompt: import_zod8.z.boolean().optional().describe("When true, processes each media file separately instead of combining context. Useful for comparing responses across files.")
2890
+ isIndividualPrompt: import_zod8.z.boolean().optional().describe("When true, processes each media file separately instead of combining context. Useful for comparing responses across files."),
2891
+ fieldId: import_zod8.z.string().optional().describe("Scope the prompt to a single custom field"),
2892
+ fieldIds: import_zod8.z.array(import_zod8.z.string()).max(10).optional().describe("Scope the prompt to multiple custom fields (max 10)"),
2893
+ filters: import_zod8.z.record(import_zod8.z.unknown()).optional().describe("Advanced filter object to scope which media the prompt runs over")
2823
2894
  },
2824
2895
  {
2825
2896
  title: "Ask AI About Your Recordings",
@@ -3080,7 +3151,7 @@ function register7(server, client) {
3080
3151
  {
3081
3152
  promptId: import_zod8.z.string().min(1).describe("ID of the conversation"),
3082
3153
  messageId: import_zod8.z.string().min(1).describe("ID of the message to rate"),
3083
- score: import_zod8.z.number().describe("Feedback score: 1 for thumbs up, -1 for thumbs down"),
3154
+ score: import_zod8.z.union([import_zod8.z.literal(1), import_zod8.z.literal(-1)]).describe("Feedback score: 1 for thumbs up, -1 for thumbs down"),
3084
3155
  reason: import_zod8.z.string().optional().describe("Optional explanation for the feedback")
3085
3156
  },
3086
3157
  {
@@ -3136,9 +3207,11 @@ function register7(server, client) {
3136
3207
  registerSpeakTool(
3137
3208
  server,
3138
3209
  "export_chat_answer",
3139
- "Export a Magic Prompt conversation or answer. Useful for saving AI-generated summaries, reports, or analysis results.",
3210
+ "Export a specific Magic Prompt answer. Useful for saving AI-generated summaries, reports, or analysis results.",
3140
3211
  {
3141
- promptId: import_zod8.z.string().min(1).describe("ID of the conversation to export")
3212
+ promptId: import_zod8.z.string().min(1).describe("ID of the conversation to export"),
3213
+ messageId: import_zod8.z.string().min(1).describe("ID of the specific message/answer to export"),
3214
+ fileType: import_zod8.z.enum(["txt", "docx", "pdf", "md"]).describe("Export file format")
3142
3215
  },
3143
3216
  {
3144
3217
  title: "Export Chat Answer",
@@ -3218,9 +3291,11 @@ function register8(server, client) {
3218
3291
  "schedule_meeting_event",
3219
3292
  "Schedule the Speak AI meeting assistant to join and record an upcoming meeting.",
3220
3293
  {
3221
- meetingUrl: import_zod9.z.string().min(1).describe("URL of the meeting to join"),
3222
- title: import_zod9.z.string().optional().describe("Display title for the event"),
3223
- scheduledAt: import_zod9.z.string().optional().describe("ISO 8601 datetime for when the meeting starts")
3294
+ title: import_zod9.z.string().min(1).describe("Display title for the event"),
3295
+ meetingURL: import_zod9.z.string().min(1).describe("URL of the meeting to join"),
3296
+ meetingDate: import_zod9.z.string().optional().describe("ISO 8601 datetime for when the meeting starts"),
3297
+ meetingLanguage: import_zod9.z.string().optional().describe("Transcription language code for the meeting (e.g. en-US)"),
3298
+ folderId: import_zod9.z.string().optional().describe("Folder ID to store the recording in")
3224
3299
  },
3225
3300
  {
3226
3301
  title: "Schedule AI Meeting Assistant",
@@ -3262,10 +3337,9 @@ function register8(server, client) {
3262
3337
  },
3263
3338
  async ({ meetingAssistantEventId }) => {
3264
3339
  try {
3265
- const result = await api.put(
3340
+ const result = await api.post(
3266
3341
  "/v1/meeting-assistant/events/remove",
3267
- null,
3268
- { params: { meetingAssistantEventId } }
3342
+ { meetingAssistantEventId }
3269
3343
  );
3270
3344
  return {
3271
3345
  content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
@@ -3443,8 +3517,14 @@ function register9(server, client) {
3443
3517
  "Create a new custom field for categorizing and tagging media.",
3444
3518
  {
3445
3519
  name: import_zod10.z.string().min(1).describe("Display name for the field"),
3446
- type: import_zod10.z.string().optional().describe("Field type (text, number, select, etc.)"),
3447
- options: import_zod10.z.array(import_zod10.z.string()).optional().describe("Options for select/multi-select field types")
3520
+ type: import_zod10.z.string().describe("Field type (text, number, select, etc.)"),
3521
+ description: import_zod10.z.string().optional().describe("Optional description for the field"),
3522
+ prompt: import_zod10.z.string().optional().describe("AI prompt used to auto-populate the field"),
3523
+ allowedValues: import_zod10.z.array(import_zod10.z.string()).optional().describe("Allowed values for select/multi-select field types"),
3524
+ allowedValuesMode: import_zod10.z.nativeEnum(AllowedValuesMode).optional().describe("Whether one or multiple allowed values can be selected"),
3525
+ otherValues: import_zod10.z.boolean().optional().describe("Whether values outside allowedValues are permitted"),
3526
+ notApplicableValues: import_zod10.z.string().optional().describe("Value(s) treated as not-applicable"),
3527
+ privacyMode: import_zod10.z.string().optional().describe("Privacy mode for the field")
3448
3528
  },
3449
3529
  {
3450
3530
  title: "Create Custom Field",
@@ -3470,20 +3550,27 @@ function register9(server, client) {
3470
3550
  registerSpeakTool(
3471
3551
  server,
3472
3552
  "update_multiple_fields",
3473
- "Update multiple custom fields in a single batch operation.",
3474
- {
3475
- fields: import_zod10.z.array(import_zod10.z.record(import_zod10.z.unknown())).describe("Array of field objects to update")
3553
+ "Set custom field values across media in a single batch operation. Scope the update with `folderId` (all media in a folder) and/or `mediaIds`.",
3554
+ {
3555
+ folderId: import_zod10.z.string().optional().describe("Apply the field values to all media in this folder"),
3556
+ mediaIds: import_zod10.z.array(import_zod10.z.string()).optional().describe("Apply the field values to these specific media files"),
3557
+ fields: import_zod10.z.array(
3558
+ import_zod10.z.object({
3559
+ id: import_zod10.z.string().min(1).describe("Custom field ID"),
3560
+ value: import_zod10.z.unknown().describe("Value to set for the field")
3561
+ })
3562
+ ).describe("Array of field id/value pairs to set")
3476
3563
  },
3477
3564
  {
3478
- title: "Bulk Update Custom Fields",
3565
+ title: "Bulk Update Custom Field Values",
3479
3566
  readOnlyHint: false,
3480
3567
  destructiveHint: false,
3481
3568
  idempotentHint: true,
3482
3569
  openWorldHint: false
3483
3570
  },
3484
- async ({ fields }) => {
3571
+ async (body) => {
3485
3572
  try {
3486
- const result = await api.post("/v1/fields/multi", { fields });
3573
+ const result = await api.post("/v1/fields/batch", body);
3487
3574
  return {
3488
3575
  content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
3489
3576
  };
@@ -3498,12 +3585,18 @@ function register9(server, client) {
3498
3585
  registerSpeakTool(
3499
3586
  server,
3500
3587
  "update_field",
3501
- "Update a specific custom field by ID.",
3588
+ "Update a specific custom field by ID. `name` must always be supplied (the server replaces the field config).",
3502
3589
  {
3503
3590
  id: import_zod10.z.string().min(1).describe("Unique identifier of the field"),
3504
- name: import_zod10.z.string().optional().describe("New display name"),
3505
- type: import_zod10.z.string().optional().describe("New field type"),
3506
- options: import_zod10.z.array(import_zod10.z.string()).optional().describe("Updated options for select types")
3591
+ name: import_zod10.z.string().describe("Display name for the field"),
3592
+ type: import_zod10.z.string().optional().describe("Field type"),
3593
+ description: import_zod10.z.string().optional().describe("Optional description for the field"),
3594
+ prompt: import_zod10.z.string().optional().describe("AI prompt used to auto-populate the field"),
3595
+ allowedValues: import_zod10.z.array(import_zod10.z.string()).optional().describe("Allowed values for select/multi-select field types"),
3596
+ allowedValuesMode: import_zod10.z.nativeEnum(AllowedValuesMode).optional().describe("Whether one or multiple allowed values can be selected"),
3597
+ otherValues: import_zod10.z.boolean().optional().describe("Whether values outside allowedValues are permitted"),
3598
+ notApplicableValues: import_zod10.z.string().optional().describe("Value(s) treated as not-applicable"),
3599
+ privacyMode: import_zod10.z.string().optional().describe("Privacy mode for the field")
3507
3600
  },
3508
3601
  {
3509
3602
  title: "Update Custom Field",
@@ -3534,6 +3627,7 @@ var init_fields2 = __esm({
3534
3627
  import_zod10 = require("zod");
3535
3628
  init_helpers();
3536
3629
  init_client();
3630
+ init_dist();
3537
3631
  }
3538
3632
  });
3539
3633
 
@@ -3603,10 +3697,17 @@ function register10(server, client) {
3603
3697
  "create_automation",
3604
3698
  "Create a new automation rule for automatic media processing workflows.",
3605
3699
  {
3606
- name: import_zod11.z.string().optional().describe("Display name for the automation"),
3607
- trigger: import_zod11.z.record(import_zod11.z.unknown()).optional().describe("Trigger configuration"),
3608
- actions: import_zod11.z.array(import_zod11.z.record(import_zod11.z.unknown())).optional().describe("Array of action configurations"),
3609
- config: import_zod11.z.record(import_zod11.z.unknown()).optional().describe("Full automation configuration object")
3700
+ name: import_zod11.z.string().min(1).describe("Display name for the automation"),
3701
+ trigger: import_zod11.z.record(import_zod11.z.unknown()).describe(
3702
+ 'Trigger object. Keys: `type` (e.g. "folders") and `folderIds` (array of folder IDs).'
3703
+ ),
3704
+ action: import_zod11.z.record(import_zod11.z.unknown()).describe(
3705
+ 'Single action object (not an array). Keys: `type` ("magic-prompt" or "translation"). For magic-prompt, include a `magicPrompt` object ({ prompt, title?, assistantType?, fieldIds?, ... }). For translation, include a `translation` object ({ targetLanguage }).'
3706
+ ),
3707
+ description: import_zod11.z.string().optional().describe("Optional description"),
3708
+ isActive: import_zod11.z.boolean().optional().describe("Whether the automation is active (defaults to true)"),
3709
+ runType: import_zod11.z.string().optional().describe('Run type, e.g. "instant" (default) or "scheduled"'),
3710
+ schedule: import_zod11.z.record(import_zod11.z.unknown()).optional().describe("Schedule object for scheduled automations: { timePeriod, repeatAt }")
3610
3711
  },
3611
3712
  {
3612
3713
  title: "Create Automation",
@@ -3632,13 +3733,20 @@ function register10(server, client) {
3632
3733
  registerSpeakTool(
3633
3734
  server,
3634
3735
  "update_automation",
3635
- "Update an existing automation rule's configuration.",
3736
+ "Update an existing automation rule. This replaces the whole automation, so fetch the current values with get_automation first and pass them all back.",
3636
3737
  {
3637
3738
  automationId: import_zod11.z.string().min(1).describe("Unique identifier of the automation"),
3638
- name: import_zod11.z.string().optional().describe("New display name"),
3639
- trigger: import_zod11.z.record(import_zod11.z.unknown()).optional().describe("Updated trigger configuration"),
3640
- actions: import_zod11.z.array(import_zod11.z.record(import_zod11.z.unknown())).optional().describe("Updated action configurations"),
3641
- config: import_zod11.z.record(import_zod11.z.unknown()).optional().describe("Full updated configuration object")
3739
+ name: import_zod11.z.string().min(1).describe("Display name for the automation"),
3740
+ trigger: import_zod11.z.record(import_zod11.z.unknown()).describe(
3741
+ 'Trigger object. Keys: `type` (e.g. "folders") and `folderIds` (array of folder IDs).'
3742
+ ),
3743
+ action: import_zod11.z.record(import_zod11.z.unknown()).describe(
3744
+ 'Single action object (not an array). Keys: `type` ("magic-prompt" or "translation"). For magic-prompt, include a `magicPrompt` object ({ prompt, title?, assistantType?, fieldIds?, ... }). For translation, include a `translation` object ({ targetLanguage }).'
3745
+ ),
3746
+ description: import_zod11.z.string().optional().describe("Optional description"),
3747
+ isActive: import_zod11.z.boolean().optional().describe("Whether the automation is active (defaults to true)"),
3748
+ runType: import_zod11.z.string().optional().describe('Run type, e.g. "instant" (default) or "scheduled"'),
3749
+ schedule: import_zod11.z.record(import_zod11.z.unknown()).optional().describe("Schedule object for scheduled automations: { timePeriod, repeatAt }")
3642
3750
  },
3643
3751
  {
3644
3752
  title: "Update Automation",
@@ -3667,23 +3775,21 @@ function register10(server, client) {
3667
3775
  registerSpeakTool(
3668
3776
  server,
3669
3777
  "toggle_automation_status",
3670
- "Enable or disable an automation rule.",
3778
+ "Toggle an automation rule between active and inactive. This flips the current state \u2014 call get_automation first if you need to know which way it will flip.",
3671
3779
  {
3672
- automationId: import_zod11.z.string().min(1).describe("Unique identifier of the automation"),
3673
- enabled: import_zod11.z.boolean().describe("Set to true to enable, false to disable")
3780
+ automationId: import_zod11.z.string().min(1).describe("Unique identifier of the automation")
3674
3781
  },
3675
3782
  {
3676
- title: "Enable or Disable Automation",
3783
+ title: "Toggle Automation Status",
3677
3784
  readOnlyHint: false,
3678
3785
  destructiveHint: false,
3679
- idempotentHint: true,
3786
+ idempotentHint: false,
3680
3787
  openWorldHint: false
3681
3788
  },
3682
- async ({ automationId, enabled }) => {
3789
+ async ({ automationId }) => {
3683
3790
  try {
3684
3791
  const result = await api.put(
3685
- `/v1/automations/status/${automationId}`,
3686
- { enabled }
3792
+ `/v1/automations/status/${automationId}`
3687
3793
  );
3688
3794
  return {
3689
3795
  content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
@@ -3719,8 +3825,9 @@ function register11(server, client) {
3719
3825
  "create_webhook",
3720
3826
  "Create a new webhook to receive real-time notifications when events occur in Speak AI.",
3721
3827
  {
3722
- url: import_zod12.z.string().url().describe("HTTPS endpoint URL to receive webhook payloads"),
3723
- events: import_zod12.z.array(import_zod12.z.string()).optional().describe("Array of event types to subscribe to")
3828
+ callbackUrl: import_zod12.z.string().url().describe("HTTPS endpoint URL to receive webhook payloads"),
3829
+ events: import_zod12.z.array(import_zod12.z.string()).optional().describe("Array of event types to subscribe to"),
3830
+ description: import_zod12.z.string().optional().describe("Optional description for the webhook")
3724
3831
  },
3725
3832
  {
3726
3833
  title: "Create Webhook",
@@ -3772,11 +3879,12 @@ function register11(server, client) {
3772
3879
  registerSpeakTool(
3773
3880
  server,
3774
3881
  "update_webhook",
3775
- "Update an existing webhook's URL or subscribed events.",
3882
+ "Update an existing webhook. This replaces the webhook config, so `callbackUrl` must always be supplied.",
3776
3883
  {
3777
3884
  webhookId: import_zod12.z.string().min(1).describe("Unique identifier of the webhook"),
3778
- url: import_zod12.z.string().url().optional().describe("New endpoint URL"),
3779
- events: import_zod12.z.array(import_zod12.z.string()).optional().describe("Updated array of event types")
3885
+ callbackUrl: import_zod12.z.string().url().describe("HTTPS endpoint URL to receive webhook payloads"),
3886
+ events: import_zod12.z.array(import_zod12.z.string()).optional().describe("Updated array of event types"),
3887
+ description: import_zod12.z.string().optional().describe("Optional description for the webhook")
3780
3888
  },
3781
3889
  {
3782
3890
  title: "Update Webhook",
@@ -5312,7 +5420,7 @@ function createCli() {
5312
5420
  process.exit(1);
5313
5421
  }
5314
5422
  });
5315
- program.command("update").description("Update media metadata").argument("<mediaId>", "Media file ID to update").option("-n, --name <name>", "New display name").option("-d, --description <text>", "New description").option("--tags <tags...>", "New tags").option("-f, --folder <id>", "Move to folder ID").option("--json", "Output raw JSON").action(async (mediaId, opts) => {
5423
+ program.command("update").description("Update media metadata").argument("<mediaId>", "Media file ID to update").requiredOption("-n, --name <name>", "Display name (required by the API)").option("-d, --description <text>", "New description").option("--tags <tags...>", "New tags").option("-f, --folder <id>", "Move to folder ID").option("--json", "Output raw JSON").action(async (mediaId, opts) => {
5316
5424
  requireApiKey();
5317
5425
  const client = await getClient();
5318
5426
  try {
@@ -5369,13 +5477,19 @@ function createCli() {
5369
5477
  process.exit(1);
5370
5478
  }
5371
5479
  });
5372
- program.command("favorites").description("Toggle favorite status for a media file").argument("<mediaId>", "Media file ID").action(async (mediaId) => {
5480
+ program.command("favorites").description("Mark or unmark a media file as a favorite").argument("<mediaId>", "Media file ID").option("--off", "Unmark as favorite (default: mark as favorite)").action(async (mediaId, opts) => {
5373
5481
  requireApiKey();
5374
5482
  const client = await getClient();
5375
5483
  try {
5376
- const res = await client.post("/v1/media/favorites", { mediaId });
5484
+ const isFavorite = !opts.off;
5485
+ const res = await client.post("/v1/media/favorites", {
5486
+ mediaIds: [mediaId],
5487
+ isFavorite
5488
+ });
5377
5489
  const data = res.data?.data;
5378
- printSuccess(data?.message ?? `Favorite toggled for ${mediaId}`);
5490
+ printSuccess(
5491
+ data?.message ?? `${isFavorite ? "Favorited" : "Unfavorited"} ${mediaId}`
5492
+ );
5379
5493
  } catch (err) {
5380
5494
  printError(err.response?.data?.message ?? err.message);
5381
5495
  process.exit(1);
@@ -5599,6 +5713,7 @@ var init_cli = __esm({
5599
5713
  // src/index.ts
5600
5714
  var index_exports = {};
5601
5715
  __export(index_exports, {
5716
+ SPEAK_MCP_TOOL_NAMES: () => SPEAK_MCP_TOOL_NAMES,
5602
5717
  createSpeakClient: () => createSpeakClient,
5603
5718
  formatAxiosError: () => formatAxiosError,
5604
5719
  registerAllTools: () => registerAllTools,
@@ -5610,6 +5725,110 @@ init_tools();
5610
5725
  init_resources();
5611
5726
  init_prompts();
5612
5727
  init_client();
5728
+
5729
+ // src/tool-names.ts
5730
+ var SPEAK_MCP_TOOL_NAMES = [
5731
+ // analytics
5732
+ "get_media_statistics",
5733
+ // automations
5734
+ "list_automations",
5735
+ "get_automation",
5736
+ "create_automation",
5737
+ "update_automation",
5738
+ "toggle_automation_status",
5739
+ // clips
5740
+ "get_clips",
5741
+ "create_clip",
5742
+ "update_clip",
5743
+ "delete_clip",
5744
+ // embed
5745
+ "create_embed",
5746
+ "update_embed",
5747
+ "check_embed",
5748
+ "get_embed_iframe_url",
5749
+ // exports
5750
+ "export_media",
5751
+ "export_multiple_media",
5752
+ // fields
5753
+ "list_fields",
5754
+ "create_field",
5755
+ "update_field",
5756
+ "update_multiple_fields",
5757
+ // folders
5758
+ "list_folders",
5759
+ "create_folder",
5760
+ "update_folder",
5761
+ "delete_folder",
5762
+ "get_folder_info",
5763
+ "clone_folder",
5764
+ "get_folder_views",
5765
+ "get_all_folder_views",
5766
+ "create_folder_view",
5767
+ "update_folder_view",
5768
+ "clone_folder_view",
5769
+ // media
5770
+ "get_signed_upload_url",
5771
+ "upload_media",
5772
+ "get_media_status",
5773
+ "get_media_insights",
5774
+ "get_transcript",
5775
+ "list_media",
5776
+ "search_media",
5777
+ "delete_media",
5778
+ "update_media_metadata",
5779
+ "toggle_media_favorite",
5780
+ "reanalyze_media",
5781
+ "get_captions",
5782
+ "list_supported_languages",
5783
+ "update_transcript_speakers",
5784
+ "bulk_update_transcript_speakers",
5785
+ "bulk_move_media",
5786
+ // meeting
5787
+ "list_meeting_events",
5788
+ "schedule_meeting_event",
5789
+ "remove_assistant_from_meeting",
5790
+ "delete_scheduled_assistant",
5791
+ "get_live_meeting_transcript",
5792
+ // prompt
5793
+ "ask_magic_prompt",
5794
+ "list_prompts",
5795
+ "get_favorite_prompts",
5796
+ "toggle_prompt_favorite",
5797
+ "get_chat_history",
5798
+ "get_chat_messages",
5799
+ "update_chat_title",
5800
+ "delete_chat_message",
5801
+ "submit_chat_feedback",
5802
+ "retry_magic_prompt",
5803
+ "export_chat_answer",
5804
+ "get_chat_statistics",
5805
+ // recorder
5806
+ "list_recorders",
5807
+ "create_recorder",
5808
+ "update_recorder_settings",
5809
+ "update_recorder_questions",
5810
+ "delete_recorder",
5811
+ "generate_recorder_url",
5812
+ "get_recorder_info",
5813
+ "get_recorder_recordings",
5814
+ "check_recorder_status",
5815
+ "clone_recorder",
5816
+ // text
5817
+ "create_text_note",
5818
+ "update_text_note",
5819
+ "get_text_insight",
5820
+ "reanalyze_text",
5821
+ // webhooks
5822
+ "list_webhooks",
5823
+ "create_webhook",
5824
+ "update_webhook",
5825
+ "delete_webhook",
5826
+ // workflows (high-level wrappers around media + upload tools)
5827
+ "upload_and_analyze",
5828
+ "upload_local_file"
5829
+ ];
5830
+
5831
+ // src/index.ts
5613
5832
  var args = process.argv.slice(2);
5614
5833
  var cliCommands = [
5615
5834
  "config",
@@ -5684,6 +5903,7 @@ if (isCliMode) {
5684
5903
  }
5685
5904
  // Annotate the CommonJS export names for ESM import in node:
5686
5905
  0 && (module.exports = {
5906
+ SPEAK_MCP_TOOL_NAMES,
5687
5907
  createSpeakClient,
5688
5908
  formatAxiosError,
5689
5909
  registerAllTools,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@speakai/mcp-server",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "mcpName": "io.github.speakai/mcp-server",
5
5
  "description": "Official Speak AI MCP Server — capture meetings, search thousands of recordings, run async voice and video surveys, create clips, and automate workflows from your AI assistant.",
6
6
  "homepage": "https://mcp.speakai.co",
@@ -49,7 +49,7 @@
49
49
  "zod": "^3.22.0"
50
50
  },
51
51
  "devDependencies": {
52
- "@speakai/shared": "^1.9.1",
52
+ "@speakai/shared": "^1.9.2",
53
53
  "@types/node": "^20.0.0",
54
54
  "@vitest/coverage-v8": "^4.1.6",
55
55
  "tsup": "^8.5.1",