@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,154 @@
1
+ import { promises as fs } from "node:fs";
2
+ import path from "node:path";
3
+ const SKIP_DIRS = new Set([
4
+ "node_modules",
5
+ ".git",
6
+ "dist",
7
+ "build",
8
+ "coverage",
9
+ ".next",
10
+ ".turbo",
11
+ ".idea",
12
+ ".vscode",
13
+ ]);
14
+ const SCANNABLE_EXTENSIONS = new Set([
15
+ ".ts",
16
+ ".tsx",
17
+ ".js",
18
+ ".jsx",
19
+ ".mjs",
20
+ ".cjs",
21
+ ".mts",
22
+ ".cts",
23
+ ".py",
24
+ ]);
25
+ const PROVIDER_PACKAGE_MAP = {
26
+ elevenlabs: [/^@elevenlabs\//i, /^elevenlabs$/i],
27
+ deepgram: [/^@deepgram\/sdk$/i, /^deepgram$/i],
28
+ cartesia: [/^@cartesia\//i, /^cartesia$/i],
29
+ "openai-audio": [/^openai$/i],
30
+ };
31
+ const PROVIDER_CONTENT_PATTERNS = [
32
+ {
33
+ provider: "elevenlabs",
34
+ regex: /@elevenlabs\/react|@elevenlabs\/client|\belevenlabs\b|useConversation\s*\(/gi,
35
+ },
36
+ {
37
+ provider: "deepgram",
38
+ regex: /@deepgram\/sdk|\bDeepgram\b|\bdeepgram\b/gi,
39
+ },
40
+ {
41
+ provider: "cartesia",
42
+ regex: /\bcartesia\b|@cartesia\//gi,
43
+ },
44
+ {
45
+ provider: "openai-audio",
46
+ regex: /audio\.transcriptions|audio\.speech|gpt-4o-transcribe|realtime|openai\s*\.audio|new\s+OpenAI\s*\(/gi,
47
+ },
48
+ ];
49
+ function lineForIndex(text, index) {
50
+ let line = 1;
51
+ for (let i = 0; i < index; i += 1) {
52
+ if (text[i] === "\n")
53
+ line += 1;
54
+ }
55
+ return line;
56
+ }
57
+ function getLineSnippet(text, lineNumber) {
58
+ const lines = text.split(/\r?\n/);
59
+ return (lines[lineNumber - 1] ?? "").trim().slice(0, 180);
60
+ }
61
+ async function collectFiles(rootDir) {
62
+ const files = [];
63
+ const queue = [rootDir];
64
+ while (queue.length > 0) {
65
+ const current = queue.pop();
66
+ if (!current)
67
+ continue;
68
+ const entries = await fs.readdir(current, { withFileTypes: true });
69
+ for (const entry of entries) {
70
+ const fullPath = path.join(current, entry.name);
71
+ if (entry.isDirectory()) {
72
+ if (SKIP_DIRS.has(entry.name))
73
+ continue;
74
+ queue.push(fullPath);
75
+ continue;
76
+ }
77
+ if (!entry.isFile())
78
+ continue;
79
+ const extension = path.extname(entry.name);
80
+ if (!SCANNABLE_EXTENSIONS.has(extension))
81
+ continue;
82
+ files.push(fullPath);
83
+ }
84
+ }
85
+ return files;
86
+ }
87
+ function relative(rootDir, filePath) {
88
+ return path.relative(rootDir, filePath) || ".";
89
+ }
90
+ async function scanPackageSignals(rootDir) {
91
+ const packageSignals = {
92
+ elevenlabs: [],
93
+ deepgram: [],
94
+ cartesia: [],
95
+ "openai-audio": [],
96
+ };
97
+ const packageJsonPath = path.join(rootDir, "package.json");
98
+ try {
99
+ const raw = await fs.readFile(packageJsonPath, "utf8");
100
+ const pkg = JSON.parse(raw);
101
+ const names = new Set([
102
+ ...Object.keys(pkg.dependencies ?? {}),
103
+ ...Object.keys(pkg.devDependencies ?? {}),
104
+ ]);
105
+ for (const depName of names) {
106
+ for (const [provider, matchers] of Object.entries(PROVIDER_PACKAGE_MAP)) {
107
+ if (matchers.some((matcher) => matcher.test(depName))) {
108
+ packageSignals[provider].push(depName);
109
+ }
110
+ }
111
+ }
112
+ }
113
+ catch {
114
+ // ignore missing or invalid package.json
115
+ }
116
+ return packageSignals;
117
+ }
118
+ export async function scanProjectForVoiceSetups(scanDir = ".") {
119
+ const rootDir = path.resolve(scanDir);
120
+ const [files, packageSignals] = await Promise.all([
121
+ collectFiles(rootDir),
122
+ scanPackageSignals(rootDir),
123
+ ]);
124
+ const matches = [];
125
+ for (const file of files) {
126
+ const content = await fs.readFile(file, "utf8");
127
+ for (const pattern of PROVIDER_CONTENT_PATTERNS) {
128
+ pattern.regex.lastIndex = 0;
129
+ let result = pattern.regex.exec(content);
130
+ let perFileMatches = 0;
131
+ while (result) {
132
+ const line = lineForIndex(content, result.index);
133
+ matches.push({
134
+ provider: pattern.provider,
135
+ file: relative(rootDir, file),
136
+ line,
137
+ match: result[0],
138
+ snippet: getLineSnippet(content, line),
139
+ });
140
+ perFileMatches += 1;
141
+ if (perFileMatches >= 3)
142
+ break;
143
+ result = pattern.regex.exec(content);
144
+ }
145
+ }
146
+ }
147
+ return {
148
+ rootDir,
149
+ filesScanned: files.length,
150
+ packageSignals,
151
+ matches,
152
+ };
153
+ }
154
+ //# sourceMappingURL=project-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-scanner.js","sourceRoot":"","sources":["../../src/lib/project-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Tier gating for Speko MCP tools.
3
+ *
4
+ * Tier 1 (free, no API key): recommend, compare, benchmark, providers, migrate
5
+ * Tier 2 (needs SPEKO_API_KEY): setup, agent_create, agent_update, agent_status, health
6
+ */
7
+ export declare function hasSpekoApiKey(): boolean;
8
+ export declare function tier2GateResponse(): {
9
+ content: Array<{
10
+ type: "text";
11
+ text: string;
12
+ }>;
13
+ };
14
+ //# sourceMappingURL=tier-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier-gate.d.ts","sourceRoot":"","sources":["../../src/lib/tier-gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,wBAAgB,iBAAiB,IAAI;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAkBtF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Tier gating for Speko MCP tools.
3
+ *
4
+ * Tier 1 (free, no API key): recommend, compare, benchmark, providers, migrate
5
+ * Tier 2 (needs SPEKO_API_KEY): setup, agent_create, agent_update, agent_status, health
6
+ */
7
+ const TIER_GATE_MESSAGE = "This tool requires a Speko API key. Get one free at https://app.speko.ai/\n\n" +
8
+ "Set the SPEKO_API_KEY environment variable and try again.";
9
+ export function hasSpekoApiKey() {
10
+ return !!(process.env.SPEKO_API_KEY || process.env.SPEKO_KEY);
11
+ }
12
+ export function tier2GateResponse() {
13
+ return {
14
+ content: [
15
+ {
16
+ type: "text",
17
+ text: JSON.stringify({
18
+ status: "error",
19
+ reason: "api-key-required",
20
+ message: TIER_GATE_MESSAGE,
21
+ help: "https://app.speko.ai/",
22
+ }, null, 2),
23
+ },
24
+ ],
25
+ };
26
+ }
27
+ //# sourceMappingURL=tier-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier-gate.js","sourceRoot":"","sources":["../../src/lib/tier-gate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,iBAAiB,GACrB,+EAA+E;IAC/E,2DAA2D,CAAC;AAE9D,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,MAAM,EAAE,OAAO;oBACf,MAAM,EAAE,kBAAkB;oBAC1B,OAAO,EAAE,iBAAiB;oBAC1B,IAAI,EAAE,uBAAuB;iBAC9B,EACD,IAAI,EACJ,CAAC,CACF;aACF;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerAgentCrudTools(server: McpServer): void;
3
+ //# sourceMappingURL=agent-crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-crud.d.ts","sourceRoot":"","sources":["../../src/tools/agent-crud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAI9D"}
@@ -0,0 +1,114 @@
1
+ import * as z from "zod";
2
+ import { SpekoApiClient } from "../lib/api-client.js";
3
+ import { hasSpekoApiKey, tier2GateResponse } from "../lib/tier-gate.js";
4
+ export function registerAgentCrudTools(server) {
5
+ registerAgentCreateTool(server);
6
+ registerAgentUpdateTool(server);
7
+ registerAgentStatusTool(server);
8
+ }
9
+ function registerAgentCreateTool(server) {
10
+ server.registerTool("speko_agent_create", {
11
+ description: "Create a Speko voice agent via API.",
12
+ inputSchema: z.object({
13
+ name: z.string().min(1),
14
+ context: z.string().min(1),
15
+ systemPrompt: z.string().optional(),
16
+ language: z.string().default("auto"),
17
+ priority: z.enum(["speed", "quality", "cost"]).default("quality"),
18
+ greeting: z.string().optional(),
19
+ }),
20
+ }, async ({ name, context, systemPrompt, language, priority, greeting }) => {
21
+ if (!hasSpekoApiKey())
22
+ return tier2GateResponse();
23
+ const api = new SpekoApiClient();
24
+ const result = await api.createAgent({
25
+ name,
26
+ context,
27
+ systemPrompt,
28
+ language,
29
+ priority: priority,
30
+ greeting,
31
+ });
32
+ return {
33
+ content: [
34
+ {
35
+ type: "text",
36
+ text: JSON.stringify({
37
+ status: "ok",
38
+ action: "create",
39
+ agent: result.data,
40
+ dashboardUrl: api.getDashboardUrl(result.data.id),
41
+ api: result.meta,
42
+ }, null, 2),
43
+ },
44
+ ],
45
+ };
46
+ });
47
+ }
48
+ function registerAgentUpdateTool(server) {
49
+ server.registerTool("speko_agent_update", {
50
+ description: "Update a Speko voice agent config via API.",
51
+ inputSchema: z.object({
52
+ agentId: z.string().min(1),
53
+ context: z.string().optional(),
54
+ systemPrompt: z.string().optional(),
55
+ language: z.string().optional(),
56
+ priority: z.enum(["speed", "quality", "cost"]).optional(),
57
+ greeting: z.string().optional(),
58
+ }),
59
+ }, async ({ agentId, context, systemPrompt, language, priority, greeting }) => {
60
+ if (!hasSpekoApiKey())
61
+ return tier2GateResponse();
62
+ const api = new SpekoApiClient();
63
+ const result = await api.updateAgent(agentId, {
64
+ context,
65
+ systemPrompt,
66
+ language,
67
+ priority: priority,
68
+ greeting,
69
+ });
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: JSON.stringify({
75
+ status: "ok",
76
+ action: "update",
77
+ agent: result.data,
78
+ dashboardUrl: api.getDashboardUrl(result.data.id),
79
+ api: result.meta,
80
+ }, null, 2),
81
+ },
82
+ ],
83
+ };
84
+ });
85
+ }
86
+ function registerAgentStatusTool(server) {
87
+ server.registerTool("speko_agent_status", {
88
+ description: "Get Speko voice agent health and metrics.",
89
+ inputSchema: z.object({
90
+ agentId: z.string().min(1),
91
+ }),
92
+ }, async ({ agentId }) => {
93
+ if (!hasSpekoApiKey())
94
+ return tier2GateResponse();
95
+ const api = new SpekoApiClient();
96
+ const result = await api.getAgentStatus(agentId);
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: JSON.stringify({
102
+ status: "ok",
103
+ action: "status",
104
+ agentId,
105
+ metrics: result.data,
106
+ dashboardUrl: api.getDashboardUrl(agentId),
107
+ api: result.meta,
108
+ }, null, 2),
109
+ },
110
+ ],
111
+ };
112
+ });
113
+ }
114
+ //# sourceMappingURL=agent-crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-crud.js","sourceRoot":"","sources":["../../src/tools/agent-crud.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,cAAc,EAAsB,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExE,MAAM,UAAU,sBAAsB,CAAC,MAAiB;IACtD,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,uBAAuB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EAAE,qCAAqC;QAClD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;YACpC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;YACjE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAChC,CAAC;KACH,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QACtE,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,iBAAiB,EAAE,CAAC;QAElD,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC;YACnC,IAAI;YACJ,OAAO;YACP,YAAY;YACZ,QAAQ;YACR,QAAQ,EAAE,QAAyB;YACnC,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,QAAQ;wBAChB,KAAK,EAAE,MAAM,CAAC,IAAI;wBAClB,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjD,GAAG,EAAE,MAAM,CAAC,IAAI;qBACjB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC9B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YACnC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;YAC/B,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;YACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAChC,CAAC;KACH,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;QACzE,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,iBAAiB,EAAE,CAAC;QAElD,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE;YAC5C,OAAO;YACP,YAAY;YACZ,QAAQ;YACR,QAAQ,EAAE,QAAqC;YAC/C,QAAQ;SACT,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,QAAQ;wBAChB,KAAK,EAAE,MAAM,CAAC,IAAI;wBAClB,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjD,GAAG,EAAE,MAAM,CAAC,IAAI;qBACjB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,oBAAoB,EACpB;QACE,WAAW,EAAE,2CAA2C;QACxD,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;YACpB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;SAC3B,CAAC;KACH,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC,cAAc,EAAE;YAAE,OAAO,iBAAiB,EAAE,CAAC;QAElD,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAEjD,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,MAAM,EAAE,IAAI;wBACZ,MAAM,EAAE,QAAQ;wBAChB,OAAO;wBACP,OAAO,EAAE,MAAM,CAAC,IAAI;wBACpB,YAAY,EAAE,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC;wBAC1C,GAAG,EAAE,MAAM,CAAC,IAAI;qBACjB,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerLegacyTools(server: McpServer): void;
3
+ //# sourceMappingURL=legacy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy.d.ts","sourceRoot":"","sources":["../../src/tools/legacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAwBpE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAK3D"}