@spekoai/mcp 1.0.0 → 1.0.4
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/LICENSE +21 -0
- package/README.md +142 -36
- package/dist/index.d.ts +26 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +112 -25
- package/package.json +44 -40
- package/dist/data/benchmarks.d.ts +0 -124
- package/dist/data/benchmarks.d.ts.map +0 -1
- package/dist/data/benchmarks.js +0 -176
- package/dist/data/benchmarks.js.map +0 -1
- package/dist/data/templates.d.ts +0 -39
- package/dist/data/templates.d.ts.map +0 -1
- package/dist/data/templates.js +0 -385
- package/dist/data/templates.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lib/api-client.d.ts +0 -71
- package/dist/lib/api-client.d.ts.map +0 -1
- package/dist/lib/api-client.js +0 -282
- package/dist/lib/api-client.js.map +0 -1
- package/dist/lib/benchmark-utils.d.ts +0 -45
- package/dist/lib/benchmark-utils.d.ts.map +0 -1
- package/dist/lib/benchmark-utils.js +0 -244
- package/dist/lib/benchmark-utils.js.map +0 -1
- package/dist/lib/project-scanner.d.ts +0 -16
- package/dist/lib/project-scanner.d.ts.map +0 -1
- package/dist/lib/project-scanner.js +0 -154
- package/dist/lib/project-scanner.js.map +0 -1
- package/dist/lib/tier-gate.d.ts +0 -14
- package/dist/lib/tier-gate.d.ts.map +0 -1
- package/dist/lib/tier-gate.js +0 -27
- package/dist/lib/tier-gate.js.map +0 -1
- package/dist/tools/agent-crud.d.ts +0 -3
- package/dist/tools/agent-crud.d.ts.map +0 -1
- package/dist/tools/agent-crud.js +0 -114
- package/dist/tools/agent-crud.js.map +0 -1
- package/dist/tools/legacy.d.ts +0 -3
- package/dist/tools/legacy.d.ts.map +0 -1
- package/dist/tools/legacy.js +0 -354
- package/dist/tools/legacy.js.map +0 -1
- package/dist/tools/migrate.d.ts +0 -3
- package/dist/tools/migrate.d.ts.map +0 -1
- package/dist/tools/migrate.js +0 -145
- package/dist/tools/migrate.js.map +0 -1
- package/dist/tools/recommend.d.ts +0 -3
- package/dist/tools/recommend.d.ts.map +0 -1
- package/dist/tools/recommend.js +0 -163
- package/dist/tools/recommend.js.map +0 -1
- package/dist/tools/setup.d.ts +0 -3
- package/dist/tools/setup.d.ts.map +0 -1
- package/dist/tools/setup.js +0 -104
- package/dist/tools/setup.js.map +0 -1
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 SpekoAI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,59 +1,165 @@
|
|
|
1
|
-
# @
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
# @spekoai/mcp
|
|
2
|
+
|
|
3
|
+
Local stdio bridge for MCP clients that cannot connect to remote HTTP MCP
|
|
4
|
+
servers directly. It proxies SpekoAI's hosted MCP server and does not contain
|
|
5
|
+
Speko tool logic of its own.
|
|
6
|
+
|
|
7
|
+
Use the hosted endpoint directly when your client supports remote MCP:
|
|
8
|
+
|
|
9
|
+
```json
|
|
10
|
+
{
|
|
11
|
+
"mcpServers": {
|
|
12
|
+
"spekoai": {
|
|
13
|
+
"url": "https://mcp.speko.ai/mcp-auth"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
```
|
|
4
18
|
|
|
5
|
-
|
|
19
|
+
Use this package for stdio-only clients.
|
|
6
20
|
|
|
7
21
|
## Install
|
|
8
22
|
|
|
9
23
|
```bash
|
|
10
|
-
|
|
24
|
+
npx @spekoai/mcp@latest --help
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
The package exposes the `spekoai-mcp` binary.
|
|
28
|
+
|
|
29
|
+
## Claude Code
|
|
30
|
+
|
|
31
|
+
OAuth-capable remote MCP clients should prefer the hosted endpoint:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
claude mcp add --transport http spekoai https://mcp.speko.ai/mcp-auth
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
For a stdio bridge install:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
claude mcp add spekoai -- npx -y @spekoai/mcp@latest
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
For API-key auth in a headless setup, provide `SPEKO_API_KEY` in the MCP
|
|
44
|
+
client environment. The bridge forwards it as `Authorization: Bearer ...`.
|
|
45
|
+
|
|
46
|
+
## Cursor
|
|
47
|
+
|
|
48
|
+
Add this to `~/.cursor/mcp.json`:
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"mcpServers": {
|
|
53
|
+
"spekoai": {
|
|
54
|
+
"command": "npx",
|
|
55
|
+
"args": ["-y", "@spekoai/mcp@latest"]
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
With API-key auth:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"mcpServers": {
|
|
66
|
+
"spekoai": {
|
|
67
|
+
"command": "npx",
|
|
68
|
+
"args": ["-y", "@spekoai/mcp@latest"],
|
|
69
|
+
"env": {
|
|
70
|
+
"SPEKO_API_KEY": "sk_live_xxx"
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## OpenCode
|
|
78
|
+
|
|
79
|
+
Add this to `opencode.json`:
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"$schema": "https://opencode.ai/config.json",
|
|
84
|
+
"mcp": {
|
|
85
|
+
"spekoai": {
|
|
86
|
+
"type": "local",
|
|
87
|
+
"command": ["pnpm", "dlx", "@spekoai/mcp@latest"],
|
|
88
|
+
"enabled": true
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
11
92
|
```
|
|
12
93
|
|
|
13
|
-
|
|
94
|
+
With API-key auth:
|
|
95
|
+
|
|
96
|
+
```json
|
|
97
|
+
{
|
|
98
|
+
"$schema": "https://opencode.ai/config.json",
|
|
99
|
+
"mcp": {
|
|
100
|
+
"spekoai": {
|
|
101
|
+
"type": "local",
|
|
102
|
+
"command": ["pnpm", "dlx", "@spekoai/mcp@latest"],
|
|
103
|
+
"enabled": true,
|
|
104
|
+
"environment": {
|
|
105
|
+
"SPEKO_API_KEY": "{env:SPEKO_API_KEY}"
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Generic MCP Config
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"mcpServers": {
|
|
117
|
+
"spekoai": {
|
|
118
|
+
"command": "npx",
|
|
119
|
+
"args": ["-y", "@spekoai/mcp@latest"]
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
14
124
|
|
|
15
|
-
|
|
125
|
+
## Configuration
|
|
16
126
|
|
|
17
|
-
|
|
18
|
-
|------|-------------|
|
|
19
|
-
| `speko_recommend` | Recommend optimal STT+LLM+TTS combo for your language, use case, and priorities |
|
|
20
|
-
| `speko_benchmark` | Browse benchmark data for tested voice AI combinations |
|
|
21
|
-
| `speko_compare` | Side-by-side comparison of two stacks |
|
|
22
|
-
| `speko_providers` | List supported providers across STT, LLM, TTS, and S2S |
|
|
23
|
-
| `speko_health` | System health and coverage metrics |
|
|
24
|
-
| `speko_migrate` | Scan codebase for existing voice providers and generate migration plan |
|
|
127
|
+
Defaults:
|
|
25
128
|
|
|
26
|
-
|
|
129
|
+
- Authenticated endpoint: `https://mcp.speko.ai/mcp-auth`
|
|
130
|
+
- Public-only endpoint: `https://mcp.speko.ai/mcp`
|
|
27
131
|
|
|
28
|
-
|
|
29
|
-
|------|-------------|
|
|
30
|
-
| `speko_setup` | Scaffold Speko SDK integration into Next.js/React/vanilla projects |
|
|
31
|
-
| `speko_agent_create` | Create a voice agent via API |
|
|
32
|
-
| `speko_agent_update` | Update voice agent configuration |
|
|
33
|
-
| `speko_agent_status` | Get agent health and metrics |
|
|
132
|
+
Environment variables:
|
|
34
133
|
|
|
35
|
-
|
|
134
|
+
- `SPEKOAI_MCP_AUTH_URL`: override the authenticated endpoint.
|
|
135
|
+
- `SPEKOAI_MCP_URL`: override the public endpoint.
|
|
136
|
+
- `SPEKO_API_KEY`: forward an API key as a bearer token.
|
|
36
137
|
|
|
37
|
-
|
|
138
|
+
CLI examples:
|
|
38
139
|
|
|
39
140
|
```bash
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
141
|
+
npx @spekoai/mcp@latest
|
|
142
|
+
npx @spekoai/mcp@latest --public
|
|
143
|
+
SPEKO_API_KEY=sk_live_xxx npx @spekoai/mcp@latest
|
|
144
|
+
SPEKOAI_MCP_AUTH_URL=https://mcp-staging.speko.dev/mcp-auth npx @spekoai/mcp@latest
|
|
145
|
+
npx @spekoai/mcp@latest https://mcp-staging.speko.dev/mcp-auth --debug
|
|
43
146
|
```
|
|
44
147
|
|
|
45
|
-
|
|
148
|
+
All remaining arguments are passed through to `mcp-remote`.
|
|
46
149
|
|
|
47
|
-
|
|
48
|
-
- `SPEKO_API_URL` — override API endpoint (default: `https://api.speko.ai`)
|
|
150
|
+
## Troubleshooting
|
|
49
151
|
|
|
50
|
-
|
|
152
|
+
Run:
|
|
51
153
|
|
|
52
|
-
|
|
154
|
+
```bash
|
|
155
|
+
npx @spekoai/mcp@latest --help
|
|
156
|
+
```
|
|
53
157
|
|
|
54
|
-
-
|
|
55
|
-
- Website: [speko.ai](https://speko.ai)
|
|
158
|
+
For `mcp-remote` auth cache issues, restart the MCP client after clearing:
|
|
56
159
|
|
|
57
|
-
|
|
160
|
+
```bash
|
|
161
|
+
rm -rf ~/.mcp-auth
|
|
162
|
+
```
|
|
58
163
|
|
|
59
|
-
|
|
164
|
+
For connection or OAuth issues, pass `--debug` and inspect the log path printed
|
|
165
|
+
by `mcp-remote`.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,28 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
export
|
|
2
|
+
export declare const DEFAULT_AUTH_MCP_URL = "https://mcp.speko.ai/mcp-auth";
|
|
3
|
+
export declare const DEFAULT_PUBLIC_MCP_URL = "https://mcp.speko.ai/mcp";
|
|
4
|
+
export declare const AUTH_HEADER_ENV = "SPEKOAI_MCP_AUTH_HEADER";
|
|
5
|
+
export type Environment = Record<string, string | undefined>;
|
|
6
|
+
export type CliConfig = {
|
|
7
|
+
serverUrl: string;
|
|
8
|
+
passthroughArgs: string[];
|
|
9
|
+
publicOnly: boolean;
|
|
10
|
+
help: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type AuthHeaderConfig = {
|
|
13
|
+
args: string[];
|
|
14
|
+
envValue?: string;
|
|
15
|
+
};
|
|
16
|
+
export declare const HELP_TEXT = "Usage: spekoai-mcp [url] [mcp-remote flags]\n\nBridge local stdio MCP clients to SpekoAI's hosted MCP server.\n\nDefaults:\n Authenticated endpoint: https://mcp.speko.ai/mcp-auth\n Public-only endpoint: https://mcp.speko.ai/mcp\n\nOptions:\n --public Connect to the public docs/scaffolding endpoint.\n -h, --help Print this help text.\n\nEnvironment:\n SPEKOAI_MCP_AUTH_URL Override the authenticated endpoint.\n SPEKOAI_MCP_URL Override the public endpoint.\n SPEKO_API_KEY Forward as Authorization bearer token.\n\nExamples:\n spekoai-mcp\n spekoai-mcp --public\n SPEKO_API_KEY=sk_live_xxx spekoai-mcp\n SPEKOAI_MCP_AUTH_URL=https://mcp-staging.speko.dev/mcp-auth spekoai-mcp\n spekoai-mcp https://mcp-staging.speko.dev/mcp-auth --debug\n\nAll remaining arguments are passed through to mcp-remote.\n";
|
|
17
|
+
export declare function resolveCliConfig(argv: readonly string[], env?: Environment): CliConfig;
|
|
18
|
+
export declare function buildAuthHeaderArgs(env?: Environment): AuthHeaderConfig;
|
|
19
|
+
export declare function buildProxyArgv(options: {
|
|
20
|
+
nodePath: string;
|
|
21
|
+
proxyPath: string;
|
|
22
|
+
serverUrl: string;
|
|
23
|
+
authArgs: readonly string[];
|
|
24
|
+
passthroughArgs: readonly string[];
|
|
25
|
+
}): string[];
|
|
26
|
+
export declare function resolveProxyPath(): string;
|
|
27
|
+
export declare function run(argv?: string[], env?: NodeJS.ProcessEnv): Promise<void>;
|
|
3
28
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAKA,eAAO,MAAM,oBAAoB,kCAAkC,CAAC;AACpE,eAAO,MAAM,sBAAsB,6BAA6B,CAAC;AACjE,eAAO,MAAM,eAAe,4BAA4B,CAAC;AAEzD,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE7D,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,eAAO,MAAM,SAAS,g1BAyBrB,CAAC;AAEF,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,GAAE,WAAyB,GAC7B,SAAS,CAwBX;AAED,wBAAgB,mBAAmB,CAAC,GAAG,GAAE,WAAyB,GAAG,gBAAgB,CAUpF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,GAAG,MAAM,EAAE,CAQX;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAsB,GAAG,CAAC,IAAI,WAAwB,EAAE,GAAG,oBAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxF"}
|
package/dist/index.js
CHANGED
|
@@ -1,26 +1,113 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
export const DEFAULT_AUTH_MCP_URL = 'https://mcp.speko.ai/mcp-auth';
|
|
5
|
+
export const DEFAULT_PUBLIC_MCP_URL = 'https://mcp.speko.ai/mcp';
|
|
6
|
+
export const AUTH_HEADER_ENV = 'SPEKOAI_MCP_AUTH_HEADER';
|
|
7
|
+
export const HELP_TEXT = `Usage: spekoai-mcp [url] [mcp-remote flags]
|
|
8
|
+
|
|
9
|
+
Bridge local stdio MCP clients to SpekoAI's hosted MCP server.
|
|
10
|
+
|
|
11
|
+
Defaults:
|
|
12
|
+
Authenticated endpoint: ${DEFAULT_AUTH_MCP_URL}
|
|
13
|
+
Public-only endpoint: ${DEFAULT_PUBLIC_MCP_URL}
|
|
14
|
+
|
|
15
|
+
Options:
|
|
16
|
+
--public Connect to the public docs/scaffolding endpoint.
|
|
17
|
+
-h, --help Print this help text.
|
|
18
|
+
|
|
19
|
+
Environment:
|
|
20
|
+
SPEKOAI_MCP_AUTH_URL Override the authenticated endpoint.
|
|
21
|
+
SPEKOAI_MCP_URL Override the public endpoint.
|
|
22
|
+
SPEKO_API_KEY Forward as Authorization bearer token.
|
|
23
|
+
|
|
24
|
+
Examples:
|
|
25
|
+
spekoai-mcp
|
|
26
|
+
spekoai-mcp --public
|
|
27
|
+
SPEKO_API_KEY=sk_live_xxx spekoai-mcp
|
|
28
|
+
SPEKOAI_MCP_AUTH_URL=https://mcp-staging.speko.dev/mcp-auth spekoai-mcp
|
|
29
|
+
spekoai-mcp https://mcp-staging.speko.dev/mcp-auth --debug
|
|
30
|
+
|
|
31
|
+
All remaining arguments are passed through to mcp-remote.
|
|
32
|
+
`;
|
|
33
|
+
export function resolveCliConfig(argv, env = process.env) {
|
|
34
|
+
const help = argv.includes('--help') || argv.includes('-h');
|
|
35
|
+
const withoutPublicFlag = argv.filter((arg) => arg !== '--public');
|
|
36
|
+
const publicOnly = withoutPublicFlag.length !== argv.length;
|
|
37
|
+
const first = withoutPublicFlag[0];
|
|
38
|
+
const hasExplicitUrl = isHttpUrl(first);
|
|
39
|
+
if (hasExplicitUrl) {
|
|
40
|
+
return {
|
|
41
|
+
serverUrl: first,
|
|
42
|
+
passthroughArgs: withoutPublicFlag.slice(1),
|
|
43
|
+
publicOnly,
|
|
44
|
+
help,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
serverUrl: publicOnly
|
|
49
|
+
? envUrl(env.SPEKOAI_MCP_URL, DEFAULT_PUBLIC_MCP_URL)
|
|
50
|
+
: envUrl(env.SPEKOAI_MCP_AUTH_URL, DEFAULT_AUTH_MCP_URL),
|
|
51
|
+
passthroughArgs: withoutPublicFlag,
|
|
52
|
+
publicOnly,
|
|
53
|
+
help,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
export function buildAuthHeaderArgs(env = process.env) {
|
|
57
|
+
const apiKey = env.SPEKO_API_KEY?.trim();
|
|
58
|
+
if (!apiKey) {
|
|
59
|
+
return { args: [] };
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
args: ['--header', `Authorization:\${${AUTH_HEADER_ENV}}`],
|
|
63
|
+
envValue: `Bearer ${apiKey}`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export function buildProxyArgv(options) {
|
|
67
|
+
return [
|
|
68
|
+
options.nodePath,
|
|
69
|
+
options.proxyPath,
|
|
70
|
+
options.serverUrl,
|
|
71
|
+
...options.authArgs,
|
|
72
|
+
...options.passthroughArgs,
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
export function resolveProxyPath() {
|
|
76
|
+
return createRequire(import.meta.url).resolve('mcp-remote/dist/proxy.js');
|
|
77
|
+
}
|
|
78
|
+
export async function run(argv = process.argv.slice(2), env = process.env) {
|
|
79
|
+
const config = resolveCliConfig(argv, env);
|
|
80
|
+
if (config.help) {
|
|
81
|
+
process.stdout.write(HELP_TEXT);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const auth = buildAuthHeaderArgs(env);
|
|
85
|
+
if (auth.envValue) {
|
|
86
|
+
env[AUTH_HEADER_ENV] = auth.envValue;
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
delete env[AUTH_HEADER_ENV];
|
|
90
|
+
}
|
|
91
|
+
const proxyPath = resolveProxyPath();
|
|
92
|
+
process.argv = buildProxyArgv({
|
|
93
|
+
nodePath: process.execPath,
|
|
94
|
+
proxyPath,
|
|
95
|
+
serverUrl: config.serverUrl,
|
|
96
|
+
authArgs: auth.args,
|
|
97
|
+
passthroughArgs: config.passthroughArgs,
|
|
98
|
+
});
|
|
99
|
+
await import(pathToFileURL(proxyPath).href);
|
|
100
|
+
}
|
|
101
|
+
function envUrl(value, fallback) {
|
|
102
|
+
const trimmed = value?.trim();
|
|
103
|
+
return trimmed || fallback;
|
|
104
|
+
}
|
|
105
|
+
function isHttpUrl(value) {
|
|
106
|
+
return value?.startsWith('https://') === true || value?.startsWith('http://') === true;
|
|
107
|
+
}
|
|
108
|
+
if (pathToFileURL(process.argv[1] ?? '').href === import.meta.url) {
|
|
109
|
+
run().catch((error) => {
|
|
110
|
+
process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
111
|
+
process.exit(1);
|
|
112
|
+
});
|
|
113
|
+
}
|
package/package.json
CHANGED
|
@@ -1,54 +1,58 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spekoai/mcp",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"description": "
|
|
5
|
-
"author": "Beknazar Abdikamalov <bek@speko.ai>",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "Local stdio bridge for the hosted SpekoAI MCP server",
|
|
6
5
|
"license": "MIT",
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
6
|
+
"author": "Speko",
|
|
7
|
+
"homepage": "https://github.com/SpekoAI/mcp-bridge#readme",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/SpekoAI/mcp-bridge.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/SpekoAI/mcp-bridge/issues"
|
|
10
14
|
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"speko",
|
|
17
|
+
"spekoai",
|
|
18
|
+
"mcp",
|
|
19
|
+
"stdio",
|
|
20
|
+
"voice-ai"
|
|
21
|
+
],
|
|
22
|
+
"type": "module",
|
|
11
23
|
"main": "./dist/index.js",
|
|
24
|
+
"module": "./dist/index.js",
|
|
12
25
|
"types": "./dist/index.d.ts",
|
|
26
|
+
"bin": {
|
|
27
|
+
"spekoai-mcp": "dist/index.js"
|
|
28
|
+
},
|
|
29
|
+
"sideEffects": false,
|
|
13
30
|
"files": [
|
|
14
|
-
"dist"
|
|
31
|
+
"dist",
|
|
32
|
+
"README.md",
|
|
33
|
+
"LICENSE"
|
|
15
34
|
],
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
35
|
+
"exports": {
|
|
36
|
+
"./package.json": "./package.json",
|
|
37
|
+
".": {
|
|
38
|
+
"@spekoai/source": "./src/index.ts",
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"import": "./dist/index.js",
|
|
41
|
+
"default": "./dist/index.js"
|
|
42
|
+
}
|
|
43
|
+
},
|
|
44
|
+
"publishConfig": {
|
|
45
|
+
"access": "public",
|
|
46
|
+
"registry": "https://registry.npmjs.org/",
|
|
47
|
+
"provenance": true
|
|
26
48
|
},
|
|
27
49
|
"dependencies": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
50
|
+
"mcp-remote": "^0.1.38",
|
|
51
|
+
"tslib": "^2.3.0"
|
|
30
52
|
},
|
|
31
53
|
"devDependencies": {
|
|
32
|
-
"@types/node": "^
|
|
33
|
-
"typescript": "
|
|
34
|
-
"vitest": "
|
|
35
|
-
},
|
|
36
|
-
"keywords": [
|
|
37
|
-
"mcp",
|
|
38
|
-
"voice-ai",
|
|
39
|
-
"stt",
|
|
40
|
-
"tts",
|
|
41
|
-
"llm",
|
|
42
|
-
"elevenlabs",
|
|
43
|
-
"deepgram",
|
|
44
|
-
"cartesia",
|
|
45
|
-
"livekit",
|
|
46
|
-
"speko",
|
|
47
|
-
"claude-code",
|
|
48
|
-
"voice-agents"
|
|
49
|
-
],
|
|
50
|
-
"repository": {
|
|
51
|
-
"type": "git",
|
|
52
|
-
"url": "https://github.com/spekoAI/speko-mcp"
|
|
54
|
+
"@types/node": "^25",
|
|
55
|
+
"typescript": "~6.0.3",
|
|
56
|
+
"vitest": "~4.1.6"
|
|
53
57
|
}
|
|
54
58
|
}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Benchmark data from production voice AI deployments.
|
|
3
|
-
* Covers 8+ languages across enterprise use cases.
|
|
4
|
-
*
|
|
5
|
-
* Each row is a tested STT+LLM+TTS combination with real latency,
|
|
6
|
-
* quality (UTMOS), and cost measurements.
|
|
7
|
-
*/
|
|
8
|
-
export interface BenchmarkEntry {
|
|
9
|
-
stt: string;
|
|
10
|
-
sttModel: string;
|
|
11
|
-
llm: string;
|
|
12
|
-
llmModel: string;
|
|
13
|
-
tts: string;
|
|
14
|
-
ttsModel: string;
|
|
15
|
-
latencyMs: number;
|
|
16
|
-
quality: number;
|
|
17
|
-
costPerMin: number;
|
|
18
|
-
mos?: number;
|
|
19
|
-
languages: string[];
|
|
20
|
-
notes?: string;
|
|
21
|
-
}
|
|
22
|
-
export interface UseCasePriorities {
|
|
23
|
-
latency: number;
|
|
24
|
-
quality: number;
|
|
25
|
-
cost: number;
|
|
26
|
-
}
|
|
27
|
-
export interface ProviderCatalogEntry {
|
|
28
|
-
url: string;
|
|
29
|
-
models: string[];
|
|
30
|
-
strengths: string;
|
|
31
|
-
}
|
|
32
|
-
export interface S2SOption {
|
|
33
|
-
provider: "openai-realtime" | "gemini-live";
|
|
34
|
-
model: string;
|
|
35
|
-
latencyMs: number;
|
|
36
|
-
quality: number;
|
|
37
|
-
costPerHour: number;
|
|
38
|
-
languages: string[];
|
|
39
|
-
notes: string;
|
|
40
|
-
}
|
|
41
|
-
export declare const BENCHMARK_DATA: BenchmarkEntry[];
|
|
42
|
-
export declare const USE_CASE_PRIORITIES: Record<string, UseCasePriorities>;
|
|
43
|
-
export declare const SUPPORTED_LANGUAGES: string[];
|
|
44
|
-
export declare const PROVIDER_INFO: {
|
|
45
|
-
stt: {
|
|
46
|
-
Deepgram: {
|
|
47
|
-
url: string;
|
|
48
|
-
models: string[];
|
|
49
|
-
strengths: string;
|
|
50
|
-
};
|
|
51
|
-
AssemblyAI: {
|
|
52
|
-
url: string;
|
|
53
|
-
models: string[];
|
|
54
|
-
strengths: string;
|
|
55
|
-
};
|
|
56
|
-
OpenAI: {
|
|
57
|
-
url: string;
|
|
58
|
-
models: string[];
|
|
59
|
-
strengths: string;
|
|
60
|
-
};
|
|
61
|
-
Speechmatics: {
|
|
62
|
-
url: string;
|
|
63
|
-
models: string[];
|
|
64
|
-
strengths: string;
|
|
65
|
-
};
|
|
66
|
-
Google: {
|
|
67
|
-
url: string;
|
|
68
|
-
models: string[];
|
|
69
|
-
strengths: string;
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
llm: {
|
|
73
|
-
OpenAI: {
|
|
74
|
-
url: string;
|
|
75
|
-
models: string[];
|
|
76
|
-
strengths: string;
|
|
77
|
-
};
|
|
78
|
-
Anthropic: {
|
|
79
|
-
url: string;
|
|
80
|
-
models: string[];
|
|
81
|
-
strengths: string;
|
|
82
|
-
};
|
|
83
|
-
Google: {
|
|
84
|
-
url: string;
|
|
85
|
-
models: string[];
|
|
86
|
-
strengths: string;
|
|
87
|
-
};
|
|
88
|
-
Groq: {
|
|
89
|
-
url: string;
|
|
90
|
-
models: string[];
|
|
91
|
-
strengths: string;
|
|
92
|
-
};
|
|
93
|
-
ElevenLabs: {
|
|
94
|
-
url: string;
|
|
95
|
-
models: string[];
|
|
96
|
-
strengths: string;
|
|
97
|
-
};
|
|
98
|
-
};
|
|
99
|
-
tts: {
|
|
100
|
-
Cartesia: {
|
|
101
|
-
url: string;
|
|
102
|
-
models: string[];
|
|
103
|
-
strengths: string;
|
|
104
|
-
};
|
|
105
|
-
ElevenLabs: {
|
|
106
|
-
url: string;
|
|
107
|
-
models: string[];
|
|
108
|
-
strengths: string;
|
|
109
|
-
};
|
|
110
|
-
PlayHT: {
|
|
111
|
-
url: string;
|
|
112
|
-
models: string[];
|
|
113
|
-
strengths: string;
|
|
114
|
-
};
|
|
115
|
-
Rime: {
|
|
116
|
-
url: string;
|
|
117
|
-
models: string[];
|
|
118
|
-
strengths: string;
|
|
119
|
-
};
|
|
120
|
-
};
|
|
121
|
-
};
|
|
122
|
-
export declare const S2S_PROVIDER_INFO: Record<string, ProviderCatalogEntry>;
|
|
123
|
-
export declare const S2S_OPTIONS: S2SOption[];
|
|
124
|
-
//# sourceMappingURL=benchmarks.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"benchmarks.d.ts","sourceRoot":"","sources":["../../src/data/benchmarks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,iBAAiB,GAAG,aAAa,CAAC;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,cAAc,EAAE,cAAc,EAiG1C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAWjE,CAAC;AAEF,eAAO,MAAM,mBAAmB,UAG/B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqBzB,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAWlE,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,SAAS,EAmBlC,CAAC"}
|