@spekoai/mcp 1.0.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.
Files changed (50) hide show
  1. package/README.md +59 -0
  2. package/dist/data/benchmarks.d.ts +124 -0
  3. package/dist/data/benchmarks.d.ts.map +1 -0
  4. package/dist/data/benchmarks.js +176 -0
  5. package/dist/data/benchmarks.js.map +1 -0
  6. package/dist/data/templates.d.ts +39 -0
  7. package/dist/data/templates.d.ts.map +1 -0
  8. package/dist/data/templates.js +385 -0
  9. package/dist/data/templates.js.map +1 -0
  10. package/dist/index.d.ts +3 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +26 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/lib/api-client.d.ts +71 -0
  15. package/dist/lib/api-client.d.ts.map +1 -0
  16. package/dist/lib/api-client.js +282 -0
  17. package/dist/lib/api-client.js.map +1 -0
  18. package/dist/lib/benchmark-utils.d.ts +45 -0
  19. package/dist/lib/benchmark-utils.d.ts.map +1 -0
  20. package/dist/lib/benchmark-utils.js +244 -0
  21. package/dist/lib/benchmark-utils.js.map +1 -0
  22. package/dist/lib/project-scanner.d.ts +16 -0
  23. package/dist/lib/project-scanner.d.ts.map +1 -0
  24. package/dist/lib/project-scanner.js +154 -0
  25. package/dist/lib/project-scanner.js.map +1 -0
  26. package/dist/lib/tier-gate.d.ts +14 -0
  27. package/dist/lib/tier-gate.d.ts.map +1 -0
  28. package/dist/lib/tier-gate.js +27 -0
  29. package/dist/lib/tier-gate.js.map +1 -0
  30. package/dist/tools/agent-crud.d.ts +3 -0
  31. package/dist/tools/agent-crud.d.ts.map +1 -0
  32. package/dist/tools/agent-crud.js +114 -0
  33. package/dist/tools/agent-crud.js.map +1 -0
  34. package/dist/tools/legacy.d.ts +3 -0
  35. package/dist/tools/legacy.d.ts.map +1 -0
  36. package/dist/tools/legacy.js +354 -0
  37. package/dist/tools/legacy.js.map +1 -0
  38. package/dist/tools/migrate.d.ts +3 -0
  39. package/dist/tools/migrate.d.ts.map +1 -0
  40. package/dist/tools/migrate.js +145 -0
  41. package/dist/tools/migrate.js.map +1 -0
  42. package/dist/tools/recommend.d.ts +3 -0
  43. package/dist/tools/recommend.d.ts.map +1 -0
  44. package/dist/tools/recommend.js +163 -0
  45. package/dist/tools/recommend.js.map +1 -0
  46. package/dist/tools/setup.d.ts +3 -0
  47. package/dist/tools/setup.d.ts.map +1 -0
  48. package/dist/tools/setup.js +104 -0
  49. package/dist/tools/setup.js.map +1 -0
  50. package/package.json +54 -0
@@ -0,0 +1,354 @@
1
+ import * as z from "zod";
2
+ import { BENCHMARK_DATA, PROVIDER_INFO, S2S_PROVIDER_INFO, SUPPORTED_LANGUAGES, } from "../data/benchmarks.js";
3
+ import { DATA_SOURCE_UPDATED_AT, DEFAULT_WEIGHTS, describeParsedCombo, formatToolResponse, getLanguageSuggestions, listKnownProviders, makeProviderMatch, parseComboMatches, rankBenchmarks, resolveLanguage, resolveProvider, } from "../lib/benchmark-utils.js";
4
+ import { hasSpekoApiKey, tier2GateResponse } from "../lib/tier-gate.js";
5
+ export function registerLegacyTools(server) {
6
+ registerBenchmarkTool(server);
7
+ registerCompareTool(server);
8
+ registerProvidersTool(server);
9
+ registerHealthTool(server);
10
+ }
11
+ function registerBenchmarkTool(server) {
12
+ server.registerTool("speko_benchmark", {
13
+ description: "View benchmark data for tested cascaded STT+LLM+TTS combinations. Filter by language/provider and sort by latency, quality, or cost.",
14
+ inputSchema: z.object({
15
+ language: z.string().optional().describe("Filter by language, e.g. 'Thai'"),
16
+ provider: z.string().optional().describe("Filter by provider, e.g. 'Deepgram'"),
17
+ sort_by: z
18
+ .enum(["latency", "quality", "cost"])
19
+ .default("quality")
20
+ .describe("Sort results by metric"),
21
+ output_format: z
22
+ .enum(["markdown", "json"])
23
+ .default("markdown")
24
+ .describe("Set to json for machine-readable output"),
25
+ }),
26
+ }, async ({ language, provider, sort_by, output_format }) => {
27
+ const format = output_format;
28
+ const resolvedLanguage = language ? resolveLanguage(language) : null;
29
+ const resolvedProvider = provider ? resolveProvider(provider) : null;
30
+ if (language && !resolvedLanguage) {
31
+ const suggestions = getLanguageSuggestions(language);
32
+ const markdown = `Language "${language}" is not recognized. Try one of: ${suggestions.join(", ")}.`;
33
+ return formatToolResponse(format, markdown, {
34
+ status: "error",
35
+ reason: "unsupported-language",
36
+ requested_language: language,
37
+ suggestions,
38
+ });
39
+ }
40
+ if (provider && !resolvedProvider) {
41
+ const markdown = `Provider "${provider}" is not recognized. Try: ${listKnownProviders().join(", ")}`;
42
+ return formatToolResponse(format, markdown, {
43
+ status: "error",
44
+ reason: "unsupported-provider",
45
+ requested_provider: provider,
46
+ supported_providers: listKnownProviders(),
47
+ });
48
+ }
49
+ let results = [...BENCHMARK_DATA];
50
+ if (resolvedLanguage) {
51
+ results = results.filter((entry) => entry.languages.some((entryLanguage) => entryLanguage.toLowerCase() === resolvedLanguage.toLowerCase()));
52
+ }
53
+ if (resolvedProvider) {
54
+ results = results.filter((entry) => makeProviderMatch(resolvedProvider, entry.stt) ||
55
+ makeProviderMatch(resolvedProvider, entry.llm) ||
56
+ makeProviderMatch(resolvedProvider, entry.tts));
57
+ }
58
+ if (results.length === 0) {
59
+ const markdown = `No benchmark rows match the selected filters.${resolvedLanguage ? ` Language=${resolvedLanguage}.` : ""}${resolvedProvider ? ` Provider=${resolvedProvider}.` : ""}`;
60
+ return formatToolResponse(format, markdown, {
61
+ status: "ok",
62
+ language: resolvedLanguage,
63
+ provider: resolvedProvider,
64
+ sort_by,
65
+ rows: [],
66
+ count: 0,
67
+ });
68
+ }
69
+ if (sort_by === "latency")
70
+ results.sort((a, b) => a.latencyMs - b.latencyMs);
71
+ else if (sort_by === "cost")
72
+ results.sort((a, b) => a.costPerMin - b.costPerMin);
73
+ else
74
+ results.sort((a, b) => b.quality - a.quality);
75
+ const lines = [
76
+ "## Speko Benchmarks",
77
+ `**${results.length} combinations**${resolvedLanguage ? ` for ${resolvedLanguage}` : ""}${resolvedProvider ? ` with ${resolvedProvider}` : ""} (sorted by ${sort_by})`,
78
+ "",
79
+ "| # | STT | LLM | TTS | Latency | Quality | Cost/min | Languages |",
80
+ "|---|-----|-----|-----|---------|---------|----------|-----------|",
81
+ ];
82
+ results.forEach((entry, index) => {
83
+ lines.push(`| ${index + 1} | ${entry.stt} ${entry.sttModel} | ${entry.llm} ${entry.llmModel} | ${entry.tts} ${entry.ttsModel} | ${entry.latencyMs}ms | ${entry.quality}/5 | $${entry.costPerMin} | ${entry.languages.slice(0, 3).join(", ")} |`);
84
+ });
85
+ lines.push("");
86
+ lines.push("### Key Insights");
87
+ const fastest = [...results].sort((a, b) => a.latencyMs - b.latencyMs)[0];
88
+ const bestQuality = [...results].sort((a, b) => b.quality - a.quality)[0];
89
+ const cheapest = [...results].sort((a, b) => a.costPerMin - b.costPerMin)[0];
90
+ if (fastest)
91
+ lines.push(`- Fastest: ${fastest.stt} + ${fastest.llm} + ${fastest.tts} (${fastest.latencyMs}ms)`);
92
+ if (bestQuality)
93
+ lines.push(`- Best quality: ${bestQuality.stt} + ${bestQuality.llm} + ${bestQuality.tts} (${bestQuality.quality}/5)`);
94
+ if (cheapest)
95
+ lines.push(`- Cheapest: ${cheapest.stt} + ${cheapest.llm} + ${cheapest.tts} ($${cheapest.costPerMin}/min)`);
96
+ return formatToolResponse(format, lines.join("\n"), {
97
+ status: "ok",
98
+ language: resolvedLanguage,
99
+ provider: resolvedProvider,
100
+ sort_by,
101
+ count: results.length,
102
+ rows: results,
103
+ summary: {
104
+ fastest,
105
+ best_quality: bestQuality,
106
+ cheapest,
107
+ },
108
+ });
109
+ });
110
+ }
111
+ function registerCompareTool(server) {
112
+ server.registerTool("speko_compare", {
113
+ description: "Compare two cascaded STT+LLM+TTS combinations side-by-side on latency, quality, cost, and language coverage.",
114
+ inputSchema: z.object({
115
+ combo_a: z.string().describe("First combination, e.g., 'Deepgram + OpenAI + Cartesia'"),
116
+ combo_b: z.string().describe("Second combination, e.g., 'AssemblyAI + OpenAI + ElevenLabs'"),
117
+ output_format: z
118
+ .enum(["markdown", "json"])
119
+ .default("markdown")
120
+ .describe("Set to json for machine-readable output"),
121
+ }),
122
+ }, async ({ combo_a, combo_b, output_format }) => {
123
+ const format = output_format;
124
+ const resolvedA = parseComboMatches(combo_a);
125
+ const resolvedB = parseComboMatches(combo_b);
126
+ if (!resolvedA || !resolvedB) {
127
+ const missing = [];
128
+ if (!resolvedA)
129
+ missing.push("A");
130
+ if (!resolvedB)
131
+ missing.push("B");
132
+ const markdown = `Could not parse combo ${missing.join(" and ")} from benchmark rows.\n` +
133
+ "Expected format: provider-only or provider + model per segment, separated by + or commas.\n" +
134
+ "Examples:\n" +
135
+ "- Deepgram + OpenAI + Cartesia\n" +
136
+ "- Deepgram nova-3 + OpenAI gpt-4.1-mini + Cartesia sonic-3";
137
+ return formatToolResponse(format, markdown, {
138
+ status: "error",
139
+ reason: "unparseable-combo",
140
+ missing,
141
+ combo_a,
142
+ combo_b,
143
+ supported_providers: listKnownProviders(),
144
+ });
145
+ }
146
+ const noMatch = [];
147
+ if (resolvedA.entries.length === 0)
148
+ noMatch.push(`A (${describeParsedCombo(resolvedA.parsed)})`);
149
+ if (resolvedB.entries.length === 0)
150
+ noMatch.push(`B (${describeParsedCombo(resolvedB.parsed)})`);
151
+ if (noMatch.length > 0) {
152
+ return formatToolResponse(format, `No benchmark rows found for ${noMatch.join(" and ")}.`, {
153
+ status: "error",
154
+ reason: "no-matching-combo",
155
+ combo_a: describeParsedCombo(resolvedA.parsed),
156
+ combo_b: describeParsedCombo(resolvedB.parsed),
157
+ matches_found: {
158
+ a: resolvedA.entries.length,
159
+ b: resolvedB.entries.length,
160
+ },
161
+ });
162
+ }
163
+ const rankedA = rankBenchmarks(resolvedA.entries, DEFAULT_WEIGHTS);
164
+ const rankedB = rankBenchmarks(resolvedB.entries, DEFAULT_WEIGHTS);
165
+ const a = rankedA[0];
166
+ const b = rankedB[0];
167
+ const ambiguityA = resolvedA.entries.length > 1;
168
+ const ambiguityB = resolvedB.entries.length > 1;
169
+ if (!a || !b) {
170
+ return formatToolResponse(format, "Could not resolve benchmark rows for one or both stacks.", {
171
+ status: "error",
172
+ reason: "unresolved-combo",
173
+ combo_a: describeParsedCombo(resolvedA.parsed),
174
+ combo_b: describeParsedCombo(resolvedB.parsed),
175
+ counts: {
176
+ a: resolvedA.entries.length,
177
+ b: resolvedB.entries.length,
178
+ },
179
+ });
180
+ }
181
+ const latencyWinner = a.latencyMs <= b.latencyMs ? "A" : "B";
182
+ const qualityWinner = a.quality >= b.quality ? "A" : "B";
183
+ const costWinner = a.costPerMin <= b.costPerMin ? "A" : "B";
184
+ const aLanguageSet = new Set(a.languages);
185
+ const bLanguageSet = new Set(b.languages);
186
+ const shared = a.languages.filter((language) => bLanguageSet.has(language));
187
+ const aOnly = a.languages.filter((language) => !bLanguageSet.has(language));
188
+ const bOnly = b.languages.filter((language) => !aLanguageSet.has(language));
189
+ const lines = [
190
+ "## Speko Comparison",
191
+ "",
192
+ `**Stack A:** ${a.stt} ${a.sttModel} -> ${a.llm} ${a.llmModel} -> ${a.tts} ${a.ttsModel}`,
193
+ `- Latency: ${a.latencyMs}ms | Quality: ${a.quality}/5 | Cost: $${a.costPerMin}/min`,
194
+ "",
195
+ `**Stack B:** ${b.stt} ${b.sttModel} -> ${b.llm} ${b.llmModel} -> ${b.tts} ${b.ttsModel}`,
196
+ `- Latency: ${b.latencyMs}ms | Quality: ${b.quality}/5 | Cost: $${b.costPerMin}/min`,
197
+ "",
198
+ "### Head-to-Head",
199
+ "",
200
+ "| Metric | Stack A | Stack B | Winner |",
201
+ "|--------|---------|---------|--------|",
202
+ `| Latency | ${a.latencyMs}ms | ${b.latencyMs}ms | Stack ${latencyWinner} |`,
203
+ `| Quality | ${a.quality}/5 | ${b.quality}/5 | Stack ${qualityWinner} |`,
204
+ `| Cost | $${a.costPerMin}/min | $${b.costPerMin}/min | Stack ${costWinner} |`,
205
+ "",
206
+ "### Language Coverage",
207
+ `- Both: ${shared.join(", ") || "none"}`,
208
+ ...(aOnly.length ? [`- Only Stack A: ${aOnly.join(", ")}`] : []),
209
+ ...(bOnly.length ? [`- Only Stack B: ${bOnly.join(", ")}`] : []),
210
+ ];
211
+ if (ambiguityA || ambiguityB) {
212
+ lines.push("", `Multiple benchmark matches were found for ${ambiguityA ? "Stack A" : ""}${ambiguityA && ambiguityB ? " and " : ""}${ambiguityB ? "Stack B" : ""}; selected best-scoring rows automatically.`);
213
+ }
214
+ return formatToolResponse(format, lines.join("\n"), {
215
+ status: "ok",
216
+ combo_a: `${a.stt} ${a.sttModel} -> ${a.llm} ${a.llmModel} -> ${a.tts} ${a.ttsModel}`,
217
+ combo_b: `${b.stt} ${b.sttModel} -> ${b.llm} ${b.llmModel} -> ${b.tts} ${b.ttsModel}`,
218
+ winners: {
219
+ latency: latencyWinner,
220
+ quality: qualityWinner,
221
+ cost: costWinner,
222
+ },
223
+ deltas: {
224
+ latencyMs: Math.abs(a.latencyMs - b.latencyMs),
225
+ quality: Math.abs(a.quality - b.quality),
226
+ costPerMin: Number(Math.abs(a.costPerMin - b.costPerMin).toFixed(3)),
227
+ },
228
+ overlap_languages: {
229
+ both: shared,
230
+ only_a: aOnly,
231
+ only_b: bOnly,
232
+ },
233
+ requested: {
234
+ a: describeParsedCombo(resolvedA.parsed),
235
+ b: describeParsedCombo(resolvedB.parsed),
236
+ },
237
+ candidate_counts: {
238
+ a: resolvedA.entries.length,
239
+ b: resolvedB.entries.length,
240
+ },
241
+ ambiguity: {
242
+ a: ambiguityA,
243
+ b: ambiguityB,
244
+ },
245
+ });
246
+ });
247
+ }
248
+ function registerProvidersTool(server) {
249
+ server.registerTool("speko_providers", {
250
+ description: "List supported voice providers and models across STT, LLM, TTS, and S2S (OpenAI Realtime/Gemini Live).",
251
+ inputSchema: z.object({
252
+ category: z.enum(["all", "stt", "llm", "tts", "s2s"]).default("all").describe("Filter by category"),
253
+ output_format: z
254
+ .enum(["markdown", "json"])
255
+ .default("markdown")
256
+ .describe("Set to json for machine-readable output"),
257
+ }),
258
+ }, async ({ category, output_format }) => {
259
+ const format = output_format;
260
+ const lines = ["## Speko Provider Directory", ""];
261
+ const payload = {};
262
+ const renderCategory = (title, key, data) => {
263
+ lines.push(`### ${title}`);
264
+ lines.push("");
265
+ lines.push("| Provider | Models | Strengths |", "|----------|--------|-----------|");
266
+ for (const [provider, info] of Object.entries(data)) {
267
+ lines.push(`| [${provider}](${info.url}) | ${info.models.join(", ")} | ${info.strengths} |`);
268
+ }
269
+ lines.push("");
270
+ payload[key] = Object.entries(data).map(([provider, info]) => ({
271
+ provider,
272
+ models: info.models,
273
+ strengths: info.strengths,
274
+ url: info.url,
275
+ }));
276
+ };
277
+ if (category === "all" || category === "stt")
278
+ renderCategory("STT Providers", "stt", PROVIDER_INFO.stt);
279
+ if (category === "all" || category === "llm")
280
+ renderCategory("LLM Providers", "llm", PROVIDER_INFO.llm);
281
+ if (category === "all" || category === "tts")
282
+ renderCategory("TTS Providers", "tts", PROVIDER_INFO.tts);
283
+ if (category === "all" || category === "s2s")
284
+ renderCategory("S2S Providers", "s2s", S2S_PROVIDER_INFO);
285
+ lines.push("> Includes direct S2S and cascaded pipeline providers.");
286
+ return formatToolResponse(format, lines.join("\n"), {
287
+ status: "ok",
288
+ category,
289
+ providers: category === "all" ? payload : payload[category],
290
+ total: {
291
+ stt: Object.keys(PROVIDER_INFO.stt).length,
292
+ llm: Object.keys(PROVIDER_INFO.llm).length,
293
+ tts: Object.keys(PROVIDER_INFO.tts).length,
294
+ s2s: Object.keys(S2S_PROVIDER_INFO).length,
295
+ },
296
+ });
297
+ });
298
+ }
299
+ function registerHealthTool(server) {
300
+ server.registerTool("speko_health", {
301
+ description: "Show benchmark and provider coverage health metrics.",
302
+ inputSchema: z.object({
303
+ verbose: z.boolean().default(false).describe("Include per-language coverage counts"),
304
+ output_format: z
305
+ .enum(["markdown", "json"])
306
+ .default("markdown")
307
+ .describe("Set to json for machine-readable output"),
308
+ }),
309
+ }, async ({ verbose, output_format }) => {
310
+ if (!hasSpekoApiKey())
311
+ return tier2GateResponse();
312
+ const format = output_format;
313
+ const now = new Date().toISOString();
314
+ const all = [...BENCHMARK_DATA];
315
+ const byLanguage = SUPPORTED_LANGUAGES.map((language) => {
316
+ const count = all.filter((entry) => entry.languages.some((entryLanguage) => entryLanguage.toLowerCase() === language.toLowerCase())).length;
317
+ return {
318
+ language,
319
+ count,
320
+ };
321
+ });
322
+ const fastest = [...all].sort((a, b) => a.latencyMs - b.latencyMs)[0];
323
+ const highestQuality = [...all].sort((a, b) => b.quality - a.quality)[0];
324
+ const cheapest = [...all].sort((a, b) => a.costPerMin - b.costPerMin)[0];
325
+ const lines = [
326
+ "## Speko MCP Health",
327
+ `- Total benchmark rows: ${all.length}`,
328
+ `- Supported languages: ${SUPPORTED_LANGUAGES.length}`,
329
+ `- Cascaded providers: STT=${Object.keys(PROVIDER_INFO.stt).length}, LLM=${Object.keys(PROVIDER_INFO.llm).length}, TTS=${Object.keys(PROVIDER_INFO.tts).length}`,
330
+ `- S2S providers: ${Object.keys(S2S_PROVIDER_INFO).length}`,
331
+ `- Fastest observed: ${fastest?.stt} + ${fastest?.llm} + ${fastest?.tts} (${fastest?.latencyMs}ms)`,
332
+ `- Highest quality: ${highestQuality?.stt} + ${highestQuality?.llm} + ${highestQuality?.tts} (${highestQuality?.quality}/5)`,
333
+ `- Cheapest: ${cheapest?.stt} + ${cheapest?.llm} + ${cheapest?.tts} ($${cheapest?.costPerMin}/min)`,
334
+ ];
335
+ if (verbose) {
336
+ lines.push("", "### Coverage", ...byLanguage.map((entry) => `- ${entry.language}: ${entry.count}`));
337
+ }
338
+ lines.push("", `Last updated: ${now}`, `Data snapshot: ${DATA_SOURCE_UPDATED_AT}`);
339
+ return formatToolResponse(format, lines.join("\n"), {
340
+ status: "ok",
341
+ timestamp: now,
342
+ total_benchmarks: all.length,
343
+ data_snapshot: DATA_SOURCE_UPDATED_AT,
344
+ supported_languages: SUPPORTED_LANGUAGES.length,
345
+ s2s_providers: Object.keys(S2S_PROVIDER_INFO).length,
346
+ fastest,
347
+ highest_quality: highestQuality,
348
+ cheapest,
349
+ coverage_by_language: byLanguage,
350
+ verbose,
351
+ });
352
+ });
353
+ }
354
+ //# sourceMappingURL=legacy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/tools/legacy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerMigrateTool(server: McpServer): void;
3
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/tools/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA8HpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAgD3D"}
@@ -0,0 +1,145 @@
1
+ import * as z from "zod";
2
+ import { scanProjectForVoiceSetups, } from "../lib/project-scanner.js";
3
+ const MIGRATION_RULES = {
4
+ elevenlabs: {
5
+ summary: "Replace direct ElevenLabs client/widget usage with Speko SDK component.",
6
+ before: `import { useConversation } from "@elevenlabs/react";
7
+
8
+ const conversation = useConversation();
9
+ await conversation.startSession({ agentId: "..." });`,
10
+ after: `import { VoiceAgent } from "@speko/js/react";
11
+
12
+ <VoiceAgent
13
+ agentId="ag_..."
14
+ apiKey={process.env.NEXT_PUBLIC_SPEKO_KEY}
15
+ priority="quality"
16
+ />`,
17
+ removePackages: ["@elevenlabs/react", "@elevenlabs/client", "elevenlabs"],
18
+ },
19
+ deepgram: {
20
+ summary: "Remove direct STT wiring and let Speko negotiate STT provider.",
21
+ before: `import { createClient } from "@deepgram/sdk";
22
+
23
+ const dg = createClient(process.env.DEEPGRAM_API_KEY);
24
+ const connection = dg.listen.live({ model: "nova-3" });`,
25
+ after: `import { VoiceAgent } from "@speko/js/react";
26
+
27
+ <VoiceAgent
28
+ agentId="ag_..."
29
+ apiKey={process.env.NEXT_PUBLIC_SPEKO_KEY}
30
+ language="auto"
31
+ />`,
32
+ removePackages: ["@deepgram/sdk", "deepgram"],
33
+ },
34
+ cartesia: {
35
+ summary: "Replace direct TTS calls with Speko managed synthesis.",
36
+ before: `import { CartesiaClient } from "cartesia";
37
+
38
+ const cartesia = new CartesiaClient({ apiKey: process.env.CARTESIA_API_KEY });
39
+ await cartesia.tts.speak({ text });`,
40
+ after: `import { VoiceAgent } from "@speko/js/react";
41
+
42
+ <VoiceAgent
43
+ agentId="ag_..."
44
+ apiKey={process.env.NEXT_PUBLIC_SPEKO_KEY}
45
+ />`,
46
+ removePackages: ["cartesia", "@cartesia/client"],
47
+ },
48
+ "openai-audio": {
49
+ summary: "Move OpenAI audio/realtime integration behind Speko routing (S2S or cascaded).",
50
+ before: `import OpenAI from "openai";
51
+
52
+ const client = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });
53
+ await client.audio.transcriptions.create({ model: "gpt-4o-transcribe", file });`,
54
+ after: `import { VoiceAgent } from "@speko/js/react";
55
+
56
+ <VoiceAgent
57
+ agentId="ag_..."
58
+ apiKey={process.env.NEXT_PUBLIC_SPEKO_KEY}
59
+ priority="speed"
60
+ />`,
61
+ removePackages: [],
62
+ },
63
+ };
64
+ function summarizeProviders(scanResult) {
65
+ const providers = new Set();
66
+ for (const [provider, deps] of Object.entries(scanResult.packageSignals)) {
67
+ if (deps.length > 0)
68
+ providers.add(provider);
69
+ }
70
+ scanResult.matches.forEach((match) => providers.add(match.provider));
71
+ return [...providers];
72
+ }
73
+ function buildMigrationPlan(scanResult) {
74
+ const providers = summarizeProviders(scanResult);
75
+ return providers.map((provider) => {
76
+ const rule = MIGRATION_RULES[provider];
77
+ const packageHits = scanResult.packageSignals[provider];
78
+ const fileHits = scanResult.matches
79
+ .filter((match) => match.provider === provider)
80
+ .slice(0, 6)
81
+ .map((match) => ({
82
+ file: match.file,
83
+ line: match.line,
84
+ snippet: match.snippet,
85
+ }));
86
+ const uninstallTargets = [...new Set([...packageHits, ...rule.removePackages])];
87
+ const uninstallCommand = uninstallTargets.length > 0 ? `npm uninstall ${uninstallTargets.join(" ")}` : null;
88
+ return {
89
+ provider,
90
+ summary: rule.summary,
91
+ evidence: {
92
+ packageHits,
93
+ fileHits,
94
+ },
95
+ before: rule.before,
96
+ after: rule.after,
97
+ commands: {
98
+ install: "npm install @speko/js",
99
+ uninstall: uninstallCommand,
100
+ },
101
+ };
102
+ });
103
+ }
104
+ export function registerMigrateTool(server) {
105
+ server.registerTool("speko_migrate", {
106
+ description: "Scan a project for existing voice providers (ElevenLabs, Deepgram, Cartesia, OpenAI audio) and return a Speko migration plan.",
107
+ inputSchema: z.object({
108
+ scanDir: z.string().default(".").describe("Directory to scan"),
109
+ dryRun: z.boolean().default(true).describe("Preview-only mode"),
110
+ }),
111
+ }, async ({ scanDir, dryRun }) => {
112
+ const scanResult = await scanProjectForVoiceSetups(scanDir);
113
+ const migrationPlan = buildMigrationPlan(scanResult);
114
+ const response = {
115
+ status: "ok",
116
+ scanDir: scanResult.rootDir,
117
+ dryRun,
118
+ filesScanned: scanResult.filesScanned,
119
+ detectedProviders: summarizeProviders(scanResult),
120
+ packageSignals: scanResult.packageSignals,
121
+ migrationPlan,
122
+ summary: migrationPlan.length === 0
123
+ ? "No existing voice setup detected. Use speko_setup for a fresh install."
124
+ : `Detected ${migrationPlan.length} provider integration(s). Generated migration plan with before/after snippets.`,
125
+ notes: dryRun
126
+ ? [
127
+ "Dry run mode: no files were changed.",
128
+ "Use the plan to replace provider-specific imports with Speko SDK usage.",
129
+ ]
130
+ : [
131
+ "Automatic file rewrites are not applied yet.",
132
+ "Run the returned commands and apply the after snippets manually or via your editor agent.",
133
+ ],
134
+ };
135
+ return {
136
+ content: [
137
+ {
138
+ type: "text",
139
+ text: JSON.stringify(response, null, 2),
140
+ },
141
+ ],
142
+ };
143
+ });
144
+ }
145
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/tools/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerRecommendTool(server: McpServer): void;
3
+ //# sourceMappingURL=recommend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../src/tools/recommend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAuDpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAiL7D"}