@spekoai/mcp 1.0.0 → 1.0.2

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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +142 -36
  3. package/dist/index.d.ts +26 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +112 -25
  6. package/package.json +44 -40
  7. package/dist/data/benchmarks.d.ts +0 -124
  8. package/dist/data/benchmarks.d.ts.map +0 -1
  9. package/dist/data/benchmarks.js +0 -176
  10. package/dist/data/benchmarks.js.map +0 -1
  11. package/dist/data/templates.d.ts +0 -39
  12. package/dist/data/templates.d.ts.map +0 -1
  13. package/dist/data/templates.js +0 -385
  14. package/dist/data/templates.js.map +0 -1
  15. package/dist/index.js.map +0 -1
  16. package/dist/lib/api-client.d.ts +0 -71
  17. package/dist/lib/api-client.d.ts.map +0 -1
  18. package/dist/lib/api-client.js +0 -282
  19. package/dist/lib/api-client.js.map +0 -1
  20. package/dist/lib/benchmark-utils.d.ts +0 -45
  21. package/dist/lib/benchmark-utils.d.ts.map +0 -1
  22. package/dist/lib/benchmark-utils.js +0 -244
  23. package/dist/lib/benchmark-utils.js.map +0 -1
  24. package/dist/lib/project-scanner.d.ts +0 -16
  25. package/dist/lib/project-scanner.d.ts.map +0 -1
  26. package/dist/lib/project-scanner.js +0 -154
  27. package/dist/lib/project-scanner.js.map +0 -1
  28. package/dist/lib/tier-gate.d.ts +0 -14
  29. package/dist/lib/tier-gate.d.ts.map +0 -1
  30. package/dist/lib/tier-gate.js +0 -27
  31. package/dist/lib/tier-gate.js.map +0 -1
  32. package/dist/tools/agent-crud.d.ts +0 -3
  33. package/dist/tools/agent-crud.d.ts.map +0 -1
  34. package/dist/tools/agent-crud.js +0 -114
  35. package/dist/tools/agent-crud.js.map +0 -1
  36. package/dist/tools/legacy.d.ts +0 -3
  37. package/dist/tools/legacy.d.ts.map +0 -1
  38. package/dist/tools/legacy.js +0 -354
  39. package/dist/tools/legacy.js.map +0 -1
  40. package/dist/tools/migrate.d.ts +0 -3
  41. package/dist/tools/migrate.d.ts.map +0 -1
  42. package/dist/tools/migrate.js +0 -145
  43. package/dist/tools/migrate.js.map +0 -1
  44. package/dist/tools/recommend.d.ts +0 -3
  45. package/dist/tools/recommend.d.ts.map +0 -1
  46. package/dist/tools/recommend.js +0 -163
  47. package/dist/tools/recommend.js.map +0 -1
  48. package/dist/tools/setup.d.ts +0 -3
  49. package/dist/tools/setup.d.ts.map +0 -1
  50. package/dist/tools/setup.js +0 -104
  51. package/dist/tools/setup.js.map +0 -1
@@ -1,354 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"legacy.js","sourceRoot":"","sources":["../../src/tools/legacy.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerMigrateTool(server: McpServer): void;
3
- //# sourceMappingURL=migrate.d.ts.map
@@ -1 +0,0 @@
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"}
@@ -1,145 +0,0 @@
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
@@ -1 +0,0 @@
1
- {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/tools/migrate.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
- export declare function registerRecommendTool(server: McpServer): void;
3
- //# sourceMappingURL=recommend.d.ts.map
@@ -1 +0,0 @@
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"}