@speakai/mcp-server 1.13.3 → 1.13.5
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/README.md +10 -10
- package/dist/index.js +67 -54
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -246,14 +246,14 @@ Speak AI ships 107 tools your AI assistant can call. You don't memorize them —
|
|
|
246
246
|
|
|
247
247
|
| Ask | Tools used (auto) |
|
|
248
248
|
|---|---|
|
|
249
|
-
| "Find customer interviews about pricing and group the feedback by theme" | `search_media`, `
|
|
249
|
+
| "Find customer interviews about pricing and group the feedback by theme" | `search_media`, `ask_ai_chat` |
|
|
250
250
|
| "Summarize this week's meetings into decisions, owners, and risks" | `list_media`, `get_media_insights` |
|
|
251
|
-
| "Pull action items from yesterday's call" | `get_media_insights`, `
|
|
251
|
+
| "Pull action items from yesterday's call" | `get_media_insights`, `ask_ai_chat` |
|
|
252
252
|
| "Schedule the AI to join my 2pm Zoom" | `schedule_meeting_event` |
|
|
253
253
|
| "Pull the live transcript from my current MS Teams meeting since last fetch" | `list_meeting_events`, `get_live_meeting_transcript` |
|
|
254
254
|
| "Find a 30-second webinar highlight and export captions" | `create_clip`, `export_media` |
|
|
255
255
|
| "Export the transcript as a PDF and captions as SRT" | `export_media` |
|
|
256
|
-
| "Compare Q1 sales calls against Q2 sales calls and summarize changed objections" | `search_media`, `
|
|
256
|
+
| "Compare Q1 sales calls against Q2 sales calls and summarize changed objections" | `search_media`, `ask_ai_chat` |
|
|
257
257
|
|
|
258
258
|
Full tool catalog is in the developer reference below.
|
|
259
259
|
|
|
@@ -421,13 +421,13 @@ SPEAK_API_KEY=your-key npx @speakai/mcp-server
|
|
|
421
421
|
</details>
|
|
422
422
|
|
|
423
423
|
<details>
|
|
424
|
-
<summary>
|
|
424
|
+
<summary>AI Chat (12 tools)</summary>
|
|
425
425
|
|
|
426
426
|
| Tool | Description |
|
|
427
427
|
|---|---|
|
|
428
|
-
| `
|
|
428
|
+
| `ask_ai_chat` | Ask AI questions about media, folders, or your whole workspace |
|
|
429
429
|
| `retry_magic_prompt` | Retry a failed or incomplete AI response |
|
|
430
|
-
| `get_chat_history` | List recent
|
|
430
|
+
| `get_chat_history` | List recent AI Chat conversations |
|
|
431
431
|
| `get_chat_messages` | Get full message history for conversations |
|
|
432
432
|
| `delete_chat_message` | Delete a specific chat message |
|
|
433
433
|
| `list_prompts` | List available AI prompt templates |
|
|
@@ -435,7 +435,7 @@ SPEAK_API_KEY=your-key npx @speakai/mcp-server
|
|
|
435
435
|
| `toggle_prompt_favorite` | Mark or unmark a chat message as favorite |
|
|
436
436
|
| `update_chat_title` | Rename a chat conversation |
|
|
437
437
|
| `submit_chat_feedback` | Rate a chat response (thumbs up/down) |
|
|
438
|
-
| `get_chat_statistics` | Get
|
|
438
|
+
| `get_chat_statistics` | Get AI Chat usage statistics |
|
|
439
439
|
| `export_chat_answer` | Export a conversation or answer |
|
|
440
440
|
|
|
441
441
|
</details>
|
|
@@ -723,7 +723,7 @@ npx @speakai/mcp-server config set-key
|
|
|
723
723
|
| Command | Description |
|
|
724
724
|
|---|---|
|
|
725
725
|
| `ask <prompt>` | Ask AI about media, folders, or your whole workspace |
|
|
726
|
-
| `chat-history` | List past
|
|
726
|
+
| `chat-history` | List past AI Chat conversations |
|
|
727
727
|
| `search <query>` | Full-text search across transcripts and insights |
|
|
728
728
|
|
|
729
729
|
#### Folders & Clips
|
|
@@ -822,7 +822,7 @@ You: "What themes came up across all our customer interviews this month?"
|
|
|
822
822
|
|
|
823
823
|
AI: Let me search your media library.
|
|
824
824
|
→ search_media(query: "customer interview", startDate: "2026-04-01")
|
|
825
|
-
→
|
|
825
|
+
→ ask_ai_chat(mediaIds: [...], prompt: "What are the recurring themes?")
|
|
826
826
|
|
|
827
827
|
Across 12 interviews, the top themes were:
|
|
828
828
|
1. Pricing sensitivity (mentioned in 8/12)
|
|
@@ -842,7 +842,7 @@ AI: → schedule_meeting_event(meetingUrl, scheduledAt: "2026-04-25T14:00:00Z")
|
|
|
842
842
|
|
|
843
843
|
[After the meeting]
|
|
844
844
|
→ get_media_insights(mediaId)
|
|
845
|
-
→
|
|
845
|
+
→ ask_ai_chat(mediaIds: [...], prompt: "List all action items with owners")
|
|
846
846
|
|
|
847
847
|
Here's your meeting summary with 7 action items...
|
|
848
848
|
```
|
package/dist/index.js
CHANGED
|
@@ -1251,7 +1251,7 @@ function register(server, client) {
|
|
|
1251
1251
|
registerSpeakTool(
|
|
1252
1252
|
server,
|
|
1253
1253
|
"list_media",
|
|
1254
|
-
"List and search media files in the workspace with filtering, pagination, and sorting. Use filterName for text search, mediaType to filter by audio/video/text, folderId for folder-specific results, and from/to for date ranges. Use the include param to embed additional data (transcripts, speakers, keywords) inline with each result, avoiding N+1 API calls. Returns mediaIds you can pass to get_transcript, get_media_insights, or
|
|
1254
|
+
"List and search media files in the workspace with filtering, pagination, and sorting. Use filterName for text search, mediaType to filter by audio/video/text, folderId for folder-specific results, and from/to for date ranges. Use the include param to embed additional data (transcripts, speakers, keywords) inline with each result, avoiding N+1 API calls. Returns mediaIds you can pass to get_transcript, get_media_insights, or ask_ai_chat. For deep full-text search across transcripts, use search_media instead.",
|
|
1255
1255
|
{
|
|
1256
1256
|
mediaType: import_zod2.z.enum([MediaType.AUDIO, MediaType.VIDEO, MediaType.TEXT]).optional().describe('Filter by media type: "audio", "video", or "text"'),
|
|
1257
1257
|
page: import_zod2.z.number().int().min(0).optional().describe("Page number for pagination (0-based, default: 0)"),
|
|
@@ -1306,7 +1306,7 @@ function register(server, client) {
|
|
|
1306
1306
|
registerSpeakTool(
|
|
1307
1307
|
server,
|
|
1308
1308
|
"get_media_insights",
|
|
1309
|
-
"Retrieve AI-generated insights for a processed media file \u2014 topics, sentiment, keywords, action items, summaries, and more. The media must be in 'processed' state (check with get_media_status first). For asking custom questions about a media file, use
|
|
1309
|
+
"Retrieve AI-generated insights for a processed media file \u2014 topics, sentiment, keywords, action items, summaries, and more. The media must be in 'processed' state (check with get_media_status first). For asking custom questions about a media file, use ask_ai_chat instead.",
|
|
1310
1310
|
{
|
|
1311
1311
|
mediaId: import_zod2.z.string().min(1).describe("Unique identifier of the media file")
|
|
1312
1312
|
},
|
|
@@ -2889,59 +2889,71 @@ __export(prompt_exports, {
|
|
|
2889
2889
|
});
|
|
2890
2890
|
function register7(server, client) {
|
|
2891
2891
|
const api = client ?? speakClient;
|
|
2892
|
+
const askAiChatDescription = [
|
|
2893
|
+
"Ask an AI-powered question about your media using Speak AI's AI Chat.",
|
|
2894
|
+
"Supports querying a single file, multiple files, entire folders, or your whole workspace.",
|
|
2895
|
+
"Pass mediaIds for specific files, folderIds for entire folders, or omit both to search across all media.",
|
|
2896
|
+
"Use assistantType to get specialized responses (e.g., 'researcher' for academic analysis, 'sales' for deal insights).",
|
|
2897
|
+
"To continue a conversation, pass the promptId from a previous response.",
|
|
2898
|
+
"Returns a promptId \u2014 save it to continue the conversation with follow-up questions."
|
|
2899
|
+
].join(" ");
|
|
2900
|
+
const askAiChatInputSchema = {
|
|
2901
|
+
prompt: import_zod8.z.string().min(1).describe("The question or prompt to ask about the media"),
|
|
2902
|
+
mediaIds: import_zod8.z.array(import_zod8.z.string()).optional().describe("Array of media IDs to query. Omit along with folderIds to search across all media in your workspace."),
|
|
2903
|
+
folderIds: import_zod8.z.array(import_zod8.z.string()).optional().describe("Array of folder IDs to scope the query to. Omit along with mediaIds to search across all media."),
|
|
2904
|
+
folderId: import_zod8.z.string().optional().describe("Single folder ID to scope the query to. Use folderIds for multiple folders."),
|
|
2905
|
+
assistantType: import_zod8.z.enum(Object.values(AssistantType)).optional().describe("Assistant persona: 'general' (default), 'researcher' (academic), 'marketer' (content), 'sales' (deals), 'recruiter' (hiring). Use 'custom' with assistantTemplateId."),
|
|
2906
|
+
assistantTemplateId: import_zod8.z.string().optional().describe("Required when assistantType is 'custom'. ID of a custom assistant template from list_prompts."),
|
|
2907
|
+
promptId: import_zod8.z.string().optional().describe("ID of an existing conversation to continue. Pass this to maintain chat context across multiple questions."),
|
|
2908
|
+
speakers: import_zod8.z.array(import_zod8.z.string()).optional().describe("Filter to specific speaker IDs from the transcript"),
|
|
2909
|
+
tags: import_zod8.z.array(import_zod8.z.string()).optional().describe("Filter media by tags"),
|
|
2910
|
+
startDate: import_zod8.z.string().optional().describe("Start date for date range filter (ISO 8601, e.g., '2025-01-01')"),
|
|
2911
|
+
endDate: import_zod8.z.string().optional().describe("End date for date range filter (ISO 8601, e.g., '2025-03-31')"),
|
|
2912
|
+
isIndividualPrompt: import_zod8.z.boolean().optional().describe("When true, processes each media file separately instead of combining context. Useful for comparing responses across files."),
|
|
2913
|
+
fieldId: import_zod8.z.string().optional().describe("Scope the prompt to a single custom field"),
|
|
2914
|
+
fieldIds: import_zod8.z.array(import_zod8.z.string()).max(10).optional().describe("Scope the prompt to multiple custom fields (max 10)"),
|
|
2915
|
+
filters: import_zod8.z.record(import_zod8.z.unknown()).optional().describe("Advanced filter object to scope which media the prompt runs over")
|
|
2916
|
+
};
|
|
2917
|
+
const askAiChatAnnotations = {
|
|
2918
|
+
title: "Ask AI Chat",
|
|
2919
|
+
readOnlyHint: false,
|
|
2920
|
+
destructiveHint: false,
|
|
2921
|
+
idempotentHint: false,
|
|
2922
|
+
openWorldHint: false
|
|
2923
|
+
};
|
|
2924
|
+
const askAiChatHandler = async (params) => {
|
|
2925
|
+
try {
|
|
2926
|
+
const result = await api.post("/v1/prompt", params);
|
|
2927
|
+
return {
|
|
2928
|
+
content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
|
|
2929
|
+
};
|
|
2930
|
+
} catch (err) {
|
|
2931
|
+
return {
|
|
2932
|
+
content: [{ type: "text", text: `Error: ${formatAxiosError(err)}` }],
|
|
2933
|
+
isError: true
|
|
2934
|
+
};
|
|
2935
|
+
}
|
|
2936
|
+
};
|
|
2937
|
+
registerSpeakTool(
|
|
2938
|
+
server,
|
|
2939
|
+
"ask_ai_chat",
|
|
2940
|
+
askAiChatDescription,
|
|
2941
|
+
askAiChatInputSchema,
|
|
2942
|
+
askAiChatAnnotations,
|
|
2943
|
+
askAiChatHandler
|
|
2944
|
+
);
|
|
2892
2945
|
registerSpeakTool(
|
|
2893
2946
|
server,
|
|
2894
2947
|
"ask_magic_prompt",
|
|
2895
|
-
[
|
|
2896
|
-
|
|
2897
|
-
|
|
2898
|
-
|
|
2899
|
-
"Use assistantType to get specialized responses (e.g., 'researcher' for academic analysis, 'sales' for deal insights).",
|
|
2900
|
-
"To continue a conversation, pass the promptId from a previous response.",
|
|
2901
|
-
"Returns a promptId \u2014 save it to continue the conversation with follow-up questions."
|
|
2902
|
-
].join(" "),
|
|
2903
|
-
{
|
|
2904
|
-
prompt: import_zod8.z.string().min(1).describe("The question or prompt to ask about the media"),
|
|
2905
|
-
mediaIds: import_zod8.z.array(import_zod8.z.string()).optional().describe("Array of media IDs to query. Omit along with folderIds to search across all media in your workspace."),
|
|
2906
|
-
folderIds: import_zod8.z.array(import_zod8.z.string()).optional().describe("Array of folder IDs to scope the query to. Omit along with mediaIds to search across all media."),
|
|
2907
|
-
folderId: import_zod8.z.string().optional().describe("Single folder ID to scope the query to. Use folderIds for multiple folders."),
|
|
2908
|
-
assistantType: import_zod8.z.enum(Object.values(AssistantType)).optional().describe("Assistant persona: 'general' (default), 'researcher' (academic), 'marketer' (content), 'sales' (deals), 'recruiter' (hiring). Use 'custom' with assistantTemplateId."),
|
|
2909
|
-
assistantTemplateId: import_zod8.z.string().optional().describe("Required when assistantType is 'custom'. ID of a custom assistant template from list_prompts."),
|
|
2910
|
-
promptId: import_zod8.z.string().optional().describe("ID of an existing conversation to continue. Pass this to maintain chat context across multiple questions."),
|
|
2911
|
-
speakers: import_zod8.z.array(import_zod8.z.string()).optional().describe("Filter to specific speaker IDs from the transcript"),
|
|
2912
|
-
tags: import_zod8.z.array(import_zod8.z.string()).optional().describe("Filter media by tags"),
|
|
2913
|
-
startDate: import_zod8.z.string().optional().describe("Start date for date range filter (ISO 8601, e.g., '2025-01-01')"),
|
|
2914
|
-
endDate: import_zod8.z.string().optional().describe("End date for date range filter (ISO 8601, e.g., '2025-03-31')"),
|
|
2915
|
-
isIndividualPrompt: import_zod8.z.boolean().optional().describe("When true, processes each media file separately instead of combining context. Useful for comparing responses across files."),
|
|
2916
|
-
fieldId: import_zod8.z.string().optional().describe("Scope the prompt to a single custom field"),
|
|
2917
|
-
fieldIds: import_zod8.z.array(import_zod8.z.string()).max(10).optional().describe("Scope the prompt to multiple custom fields (max 10)"),
|
|
2918
|
-
filters: import_zod8.z.record(import_zod8.z.unknown()).optional().describe("Advanced filter object to scope which media the prompt runs over")
|
|
2919
|
-
},
|
|
2920
|
-
{
|
|
2921
|
-
title: "Ask AI About Your Recordings",
|
|
2922
|
-
readOnlyHint: false,
|
|
2923
|
-
destructiveHint: false,
|
|
2924
|
-
idempotentHint: false,
|
|
2925
|
-
openWorldHint: false
|
|
2926
|
-
},
|
|
2927
|
-
async (params) => {
|
|
2928
|
-
try {
|
|
2929
|
-
const result = await api.post("/v1/prompt", params);
|
|
2930
|
-
return {
|
|
2931
|
-
content: [{ type: "text", text: JSON.stringify(result.data, null, 2) }]
|
|
2932
|
-
};
|
|
2933
|
-
} catch (err) {
|
|
2934
|
-
return {
|
|
2935
|
-
content: [{ type: "text", text: `Error: ${formatAxiosError(err)}` }],
|
|
2936
|
-
isError: true
|
|
2937
|
-
};
|
|
2938
|
-
}
|
|
2939
|
-
}
|
|
2948
|
+
`[Deprecated \u2014 use ask_ai_chat] ${askAiChatDescription}`,
|
|
2949
|
+
askAiChatInputSchema,
|
|
2950
|
+
askAiChatAnnotations,
|
|
2951
|
+
askAiChatHandler
|
|
2940
2952
|
);
|
|
2941
2953
|
registerSpeakTool(
|
|
2942
2954
|
server,
|
|
2943
2955
|
"retry_magic_prompt",
|
|
2944
|
-
"Retry a failed or incomplete
|
|
2956
|
+
"Retry a failed or incomplete AI Chat response. Use when a previous ask_ai_chat call returned an error or incomplete answer.",
|
|
2945
2957
|
{
|
|
2946
2958
|
promptId: import_zod8.z.string().min(1).describe("ID of the conversation containing the failed message"),
|
|
2947
2959
|
messageId: import_zod8.z.string().min(1).describe("ID of the specific message to retry")
|
|
@@ -2970,7 +2982,7 @@ function register7(server, client) {
|
|
|
2970
2982
|
registerSpeakTool(
|
|
2971
2983
|
server,
|
|
2972
2984
|
"get_chat_history",
|
|
2973
|
-
"Get a list of recent
|
|
2985
|
+
"Get a list of recent AI Chat conversations. Returns conversation summaries with promptIds that can be used to continue conversations via ask_ai_chat or retrieve full messages via get_chat_messages.",
|
|
2974
2986
|
{
|
|
2975
2987
|
limit: import_zod8.z.number().int().positive().optional().describe("Number of recent conversations to return (default: 10)")
|
|
2976
2988
|
},
|
|
@@ -3061,7 +3073,7 @@ function register7(server, client) {
|
|
|
3061
3073
|
registerSpeakTool(
|
|
3062
3074
|
server,
|
|
3063
3075
|
"list_prompts",
|
|
3064
|
-
"List all available
|
|
3076
|
+
"List all available AI Chat templates. Use template IDs with ask_ai_chat's assistantTemplateId parameter when using assistantType 'custom'.",
|
|
3065
3077
|
{},
|
|
3066
3078
|
{
|
|
3067
3079
|
title: "List Prompt Templates",
|
|
@@ -3203,7 +3215,7 @@ function register7(server, client) {
|
|
|
3203
3215
|
registerSpeakTool(
|
|
3204
3216
|
server,
|
|
3205
3217
|
"get_chat_statistics",
|
|
3206
|
-
"Get usage statistics for
|
|
3218
|
+
"Get usage statistics for AI Chat / chat. Returns metrics on prompt usage, optionally filtered by date range.",
|
|
3207
3219
|
{
|
|
3208
3220
|
startDate: import_zod8.z.string().optional().describe("Start date for stats (ISO 8601)"),
|
|
3209
3221
|
endDate: import_zod8.z.string().optional().describe("End date for stats (ISO 8601)")
|
|
@@ -3232,7 +3244,7 @@ function register7(server, client) {
|
|
|
3232
3244
|
registerSpeakTool(
|
|
3233
3245
|
server,
|
|
3234
3246
|
"export_chat_answer",
|
|
3235
|
-
"Export a specific
|
|
3247
|
+
"Export a specific AI Chat answer. Useful for saving AI-generated summaries, reports, or analysis results.",
|
|
3236
3248
|
{
|
|
3237
3249
|
promptId: import_zod8.z.string().min(1).describe("ID of the conversation to export"),
|
|
3238
3250
|
messageId: import_zod8.z.string().min(1).describe("ID of the specific message/answer to export"),
|
|
@@ -5534,7 +5546,7 @@ function registerPrompts(server) {
|
|
|
5534
5546
|
``,
|
|
5535
5547
|
`Steps:`,
|
|
5536
5548
|
`1. Use search_media to find relevant media matching this topic`,
|
|
5537
|
-
`2. For the most relevant results, use
|
|
5549
|
+
`2. For the most relevant results, use ask_ai_chat with the matching mediaIds to ask: "${topic}"`,
|
|
5538
5550
|
`3. Synthesize findings across all results:`,
|
|
5539
5551
|
` - Common themes and patterns`,
|
|
5540
5552
|
` - Notable quotes or data points`,
|
|
@@ -5679,6 +5691,7 @@ var init_tool_names = __esm({
|
|
|
5679
5691
|
"delete_scheduled_assistant",
|
|
5680
5692
|
"get_live_meeting_transcript",
|
|
5681
5693
|
// prompt
|
|
5694
|
+
"ask_ai_chat",
|
|
5682
5695
|
"ask_magic_prompt",
|
|
5683
5696
|
"list_prompts",
|
|
5684
5697
|
"get_favorite_prompts",
|
|
@@ -6384,7 +6397,7 @@ function createCli() {
|
|
|
6384
6397
|
process.exit(1);
|
|
6385
6398
|
}
|
|
6386
6399
|
});
|
|
6387
|
-
program.command("chat-history").description("List past
|
|
6400
|
+
program.command("chat-history").description("List past AI Chat conversations").option("--json", "Output raw JSON").action(async (opts) => {
|
|
6388
6401
|
requireApiKey();
|
|
6389
6402
|
const client = await getClient();
|
|
6390
6403
|
try {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@speakai/mcp-server",
|
|
3
|
-
"version": "1.13.
|
|
3
|
+
"version": "1.13.5",
|
|
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",
|