@tostudy-ai/mcp-setup 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -2
- package/dist/__tests__/ide-handlers.test.js +36 -14
- package/dist/__tests__/ide-handlers.test.js.map +1 -1
- package/dist/__tests__/install-command.test.js +106 -95
- package/dist/__tests__/install-command.test.js.map +1 -1
- package/dist/config.d.ts +15 -4
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +79 -29
- package/dist/config.js.map +1 -1
- package/dist/diagnose.d.ts +1 -1
- package/dist/diagnose.d.ts.map +1 -1
- package/dist/diagnose.js +154 -164
- package/dist/diagnose.js.map +1 -1
- package/dist/ide-handlers/antigravity.d.ts +16 -0
- package/dist/ide-handlers/antigravity.d.ts.map +1 -0
- package/dist/ide-handlers/antigravity.js +46 -0
- package/dist/ide-handlers/antigravity.js.map +1 -0
- package/dist/ide-handlers/base.d.ts +8 -8
- package/dist/ide-handlers/base.d.ts.map +1 -1
- package/dist/ide-handlers/base.js +29 -4
- package/dist/ide-handlers/base.js.map +1 -1
- package/dist/ide-handlers/claude-code.js +1 -1
- package/dist/ide-handlers/claude-code.js.map +1 -1
- package/dist/ide-handlers/codex.d.ts +15 -0
- package/dist/ide-handlers/codex.d.ts.map +1 -0
- package/dist/ide-handlers/codex.js +53 -0
- package/dist/ide-handlers/codex.js.map +1 -0
- package/dist/ide-handlers/cursor.js +1 -1
- package/dist/ide-handlers/cursor.js.map +1 -1
- package/dist/ide-handlers/desktop.d.ts +3 -3
- package/dist/ide-handlers/desktop.d.ts.map +1 -1
- package/dist/ide-handlers/desktop.js +32 -8
- package/dist/ide-handlers/desktop.js.map +1 -1
- package/dist/ide-handlers/index.d.ts +1 -1
- package/dist/ide-handlers/index.d.ts.map +1 -1
- package/dist/ide-handlers/index.js +6 -0
- package/dist/ide-handlers/index.js.map +1 -1
- package/dist/ide-handlers/manual.js +1 -1
- package/dist/ide-handlers/manual.js.map +1 -1
- package/dist/ide-handlers/opencode.js +1 -1
- package/dist/ide-handlers/opencode.js.map +1 -1
- package/dist/ide-handlers/vscode.js +1 -1
- package/dist/ide-handlers/vscode.js.map +1 -1
- package/dist/ide-handlers/windsurf.d.ts +16 -0
- package/dist/ide-handlers/windsurf.d.ts.map +1 -0
- package/dist/ide-handlers/windsurf.js +46 -0
- package/dist/ide-handlers/windsurf.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/repair.d.ts +1 -1
- package/dist/repair.d.ts.map +1 -1
- package/dist/repair.js +213 -168
- package/dist/repair.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @tostudy-ai/mcp-setup
|
|
2
2
|
|
|
3
|
-
CLI to configure Claude Code to connect to the
|
|
3
|
+
CLI to configure Claude Code to connect to the ToStudy MCP server.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -63,7 +63,7 @@ npx @tostudy-ai/mcp-setup install --ide cursor --key <key>
|
|
|
63
63
|
npx @tostudy-ai/mcp-setup install --ide vscode --key <key> --url http://localhost:3700
|
|
64
64
|
```
|
|
65
65
|
|
|
66
|
-
Supported IDEs: `claude-code`, `cursor`, `vscode`, `desktop`, `opencode`, `manual`
|
|
66
|
+
Supported IDEs: `claude-code`, `cursor`, `vscode`, `desktop`, `windsurf`, `opencode`, `codex`, `antigravity`, `manual`
|
|
67
67
|
|
|
68
68
|
| IDE | Config Location | Config Key |
|
|
69
69
|
|-----|----------------|------------|
|
|
@@ -71,7 +71,10 @@ Supported IDEs: `claude-code`, `cursor`, `vscode`, `desktop`, `opencode`, `manua
|
|
|
71
71
|
| `cursor` | `~/.cursor/mcp.json` | `mcpServers` |
|
|
72
72
|
| `vscode` | `.vscode/mcp.json` | `servers` |
|
|
73
73
|
| `desktop` | Claude Desktop config | `mcpServers` |
|
|
74
|
+
| `windsurf` | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` |
|
|
74
75
|
| `opencode` | `~/.opencode/opencode.json` | `mcp` |
|
|
76
|
+
| `codex` | `~/.codex/config.toml` (via `codex mcp add`) | `mcp_servers` |
|
|
77
|
+
| `antigravity` | `~/.gemini/antigravity/mcp_config.json` | `mcpServers` |
|
|
75
78
|
| `manual` | stdout (prints config) | N/A |
|
|
76
79
|
|
|
77
80
|
Each handler reads-then-merges config to preserve other MCP servers.
|
|
@@ -59,26 +59,30 @@ function cleanupTempDir(dir) {
|
|
|
59
59
|
async function testBaseUtilities() {
|
|
60
60
|
log('\n── Base Utilities ──');
|
|
61
61
|
await runTest('buildMcpRemoteArgs returns correct args', () => {
|
|
62
|
-
const args = buildMcpRemoteArgs(TEST_API_KEY, TEST_MCP_URL);
|
|
62
|
+
const args = buildMcpRemoteArgs(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
63
63
|
assert(Array.isArray(args), 'Should return an array');
|
|
64
64
|
assert(args[0] === '-y', 'First arg should be -y');
|
|
65
65
|
assert(args[1] === 'mcp-remote', 'Second arg should be mcp-remote');
|
|
66
66
|
assert(args[2] === `${TEST_MCP_URL}/mcp`, 'Third arg should be MCP URL + /mcp');
|
|
67
67
|
assert(args[3] === '--header', 'Fourth arg should be --header');
|
|
68
68
|
assert(args[4] === `Authorization:Bearer ${TEST_API_KEY}`, 'Fifth arg should be auth header');
|
|
69
|
+
assert(args[5] === '--header', 'Sixth arg should be --header');
|
|
70
|
+
assert(args[6] === 'X-Tostudy-Client-IDE:manual', 'Seventh arg should be IDE header');
|
|
71
|
+
assert(args[7] === '--header', 'Eighth arg should be --header');
|
|
72
|
+
assert(args[8].startsWith('X-Tostudy-Client-OS:'), 'Ninth arg should be OS header');
|
|
69
73
|
});
|
|
70
74
|
await runTest('buildTostudyServerEntry returns command + args', () => {
|
|
71
|
-
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
75
|
+
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
72
76
|
assert(entry.command === 'npx', 'Command should be npx');
|
|
73
77
|
assert(Array.isArray(entry.args), 'Args should be an array');
|
|
74
|
-
assert(entry.args.length ===
|
|
78
|
+
assert(entry.args.length === 9, 'Should have 9 args');
|
|
75
79
|
assert(entry.args[1] === 'mcp-remote', 'Should include mcp-remote');
|
|
76
80
|
});
|
|
77
81
|
}
|
|
78
82
|
// ───────────── Handler Factory ─────────────
|
|
79
83
|
async function testHandlerFactory() {
|
|
80
84
|
log('\n── Handler Factory ──');
|
|
81
|
-
const validIDEs = ['claude-code', 'cursor', 'vscode', 'desktop', 'opencode', 'manual'];
|
|
85
|
+
const validIDEs = ['claude-code', 'cursor', 'vscode', 'desktop', 'windsurf', 'opencode', 'codex', 'antigravity', 'manual'];
|
|
82
86
|
await runTest('getIDEHandler returns handler for each valid IDE', () => {
|
|
83
87
|
for (const ide of validIDEs) {
|
|
84
88
|
const handler = getIDEHandler(ide);
|
|
@@ -102,9 +106,9 @@ async function testHandlerFactory() {
|
|
|
102
106
|
}
|
|
103
107
|
assert(threw, 'Should throw for unknown IDE');
|
|
104
108
|
});
|
|
105
|
-
await runTest('getAllIDEHandlers returns all
|
|
109
|
+
await runTest('getAllIDEHandlers returns all 9 handlers', () => {
|
|
106
110
|
const all = getAllIDEHandlers();
|
|
107
|
-
assert(all.length ===
|
|
111
|
+
assert(all.length === 9, `Should return 9 handlers, got ${all.length}`);
|
|
108
112
|
const ids = all.map((h) => h.id).sort();
|
|
109
113
|
const expected = [...validIDEs].sort();
|
|
110
114
|
assert(JSON.stringify(ids) === JSON.stringify(expected), `IDs should match: ${JSON.stringify(ids)} vs ${JSON.stringify(expected)}`);
|
|
@@ -131,6 +135,24 @@ async function testHandlerProperties() {
|
|
|
131
135
|
assert(path.includes('.opencode'), 'Path should contain .opencode');
|
|
132
136
|
assert(path.endsWith('opencode.json'), 'Path should end with opencode.json');
|
|
133
137
|
});
|
|
138
|
+
await runTest('Windsurf handler has correct config path', () => {
|
|
139
|
+
const handler = getIDEHandler('windsurf');
|
|
140
|
+
const path = handler.getConfigPath();
|
|
141
|
+
assert(path.includes('.codeium'), 'Path should contain .codeium');
|
|
142
|
+
assert(path.endsWith('mcp_config.json'), 'Path should end with mcp_config.json');
|
|
143
|
+
});
|
|
144
|
+
await runTest('Codex handler has correct config path', () => {
|
|
145
|
+
const handler = getIDEHandler('codex');
|
|
146
|
+
const path = handler.getConfigPath();
|
|
147
|
+
assert(path.includes('.codex'), 'Path should contain .codex');
|
|
148
|
+
assert(path.endsWith('config.toml'), 'Path should end with config.toml');
|
|
149
|
+
});
|
|
150
|
+
await runTest('Antigravity handler has correct config path', () => {
|
|
151
|
+
const handler = getIDEHandler('antigravity');
|
|
152
|
+
const path = handler.getConfigPath();
|
|
153
|
+
assert(path.includes('.gemini'), 'Path should contain .gemini');
|
|
154
|
+
assert(path.endsWith('mcp_config.json'), 'Path should end with mcp_config.json');
|
|
155
|
+
});
|
|
134
156
|
await runTest('Manual handler config path is stdout', () => {
|
|
135
157
|
const handler = getIDEHandler('manual');
|
|
136
158
|
assert(handler.getConfigPath() === 'stdout', 'Manual handler config path should be stdout');
|
|
@@ -161,7 +183,7 @@ async function testCursorConfigMerge() {
|
|
|
161
183
|
try {
|
|
162
184
|
await runTest('Cursor: writes new config when none exists', () => {
|
|
163
185
|
// Simulate what CursorHandler.writeConfig does
|
|
164
|
-
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
186
|
+
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
165
187
|
const config = { mcpServers: { tostudy: entry } };
|
|
166
188
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
167
189
|
assert(existsSync(configPath), 'Config file should exist');
|
|
@@ -181,7 +203,7 @@ async function testCursorConfigMerge() {
|
|
|
181
203
|
// Merge tostudy into existing
|
|
182
204
|
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
183
205
|
const mcpServers = config.mcpServers ?? {};
|
|
184
|
-
mcpServers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
206
|
+
mcpServers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
185
207
|
config.mcpServers = mcpServers;
|
|
186
208
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
187
209
|
const merged = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
@@ -201,7 +223,7 @@ async function testCursorConfigMerge() {
|
|
|
201
223
|
// Update tostudy
|
|
202
224
|
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
203
225
|
const mcpServers = config.mcpServers;
|
|
204
|
-
mcpServers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
226
|
+
mcpServers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
205
227
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
206
228
|
const updated = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
207
229
|
assert(updated.mcpServers.tostudy.command === 'npx', 'tostudy should be updated to npx');
|
|
@@ -219,7 +241,7 @@ async function testCursorConfigMerge() {
|
|
|
219
241
|
config = {};
|
|
220
242
|
}
|
|
221
243
|
const mcpServers = config.mcpServers ?? {};
|
|
222
|
-
mcpServers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
244
|
+
mcpServers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
223
245
|
config.mcpServers = mcpServers;
|
|
224
246
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
225
247
|
const fixed = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
@@ -237,7 +259,7 @@ async function testVSCodeConfigMerge() {
|
|
|
237
259
|
const configPath = join(tempDir, 'mcp.json');
|
|
238
260
|
try {
|
|
239
261
|
await runTest('VSCode: uses "servers" key (not "mcpServers")', () => {
|
|
240
|
-
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
262
|
+
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
241
263
|
const config = { servers: { tostudy: entry } };
|
|
242
264
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
243
265
|
const written = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
@@ -250,7 +272,7 @@ async function testVSCodeConfigMerge() {
|
|
|
250
272
|
writeFileSync(configPath, JSON.stringify(existing, null, 2), 'utf-8');
|
|
251
273
|
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
252
274
|
const servers = config.servers ?? {};
|
|
253
|
-
servers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
275
|
+
servers['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
254
276
|
config.servers = servers;
|
|
255
277
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
256
278
|
const merged = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
@@ -269,7 +291,7 @@ async function testOpenCodeConfigMerge() {
|
|
|
269
291
|
const configPath = join(tempDir, 'opencode.json');
|
|
270
292
|
try {
|
|
271
293
|
await runTest('OpenCode: uses "mcp" key', () => {
|
|
272
|
-
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
294
|
+
const entry = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
273
295
|
const config = { mcp: { tostudy: entry } };
|
|
274
296
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
275
297
|
const written = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
@@ -284,7 +306,7 @@ async function testOpenCodeConfigMerge() {
|
|
|
284
306
|
writeFileSync(configPath, JSON.stringify(existing, null, 2), 'utf-8');
|
|
285
307
|
const config = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
286
308
|
const mcp = config.mcp ?? {};
|
|
287
|
-
mcp['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL);
|
|
309
|
+
mcp['tostudy'] = buildTostudyServerEntry(TEST_API_KEY, TEST_MCP_URL, 'manual');
|
|
288
310
|
config.mcp = mcp;
|
|
289
311
|
writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
290
312
|
const merged = JSON.parse(readFileSync(configPath, 'utf-8'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ide-handlers.test.js","sourceRoot":"","sources":["../../src/__tests__/ide-handlers.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ide-handlers.test.js","sourceRoot":"","sources":["../../src/__tests__/ide-handlers.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,19 +6,19 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Run with: npx tsx src/__tests__/install-command.test.ts
|
|
8
8
|
*/
|
|
9
|
-
import { getIDEHandler
|
|
10
|
-
import { buildTostudyServerEntry, buildMcpRemoteArgs } from
|
|
9
|
+
import { getIDEHandler } from "../ide-handlers/index.js";
|
|
10
|
+
import { buildTostudyServerEntry, buildMcpRemoteArgs } from "../ide-handlers/base.js";
|
|
11
11
|
// We can't import resolveMcpServerUrl directly since it's a module-scoped function in index.ts.
|
|
12
12
|
// Replicate the logic here and test it.
|
|
13
13
|
function resolveMcpServerUrl(platformUrl) {
|
|
14
|
-
if (platformUrl.includes(
|
|
15
|
-
return platformUrl.replace(
|
|
14
|
+
if (platformUrl.includes(":3700")) {
|
|
15
|
+
return platformUrl.replace(":3700", ":3701");
|
|
16
16
|
}
|
|
17
|
-
if (platformUrl.includes(
|
|
18
|
-
return
|
|
17
|
+
if (platformUrl.includes("localhost") && !platformUrl.includes(":")) {
|
|
18
|
+
return "http://localhost:3701";
|
|
19
19
|
}
|
|
20
|
-
if (platformUrl.includes(
|
|
21
|
-
return process.env.MCP_SERVER_URL ||
|
|
20
|
+
if (platformUrl.includes("tostudy")) {
|
|
21
|
+
return process.env.MCP_SERVER_URL || "https://mcp.tostudy.ai";
|
|
22
22
|
}
|
|
23
23
|
return platformUrl;
|
|
24
24
|
}
|
|
@@ -34,7 +34,7 @@ function assert(condition, message) {
|
|
|
34
34
|
async function runTest(name, testFn) {
|
|
35
35
|
try {
|
|
36
36
|
await testFn();
|
|
37
|
-
results.push({ name, passed: true, message:
|
|
37
|
+
results.push({ name, passed: true, message: "OK" });
|
|
38
38
|
log(` \x1b[32m✓\x1b[0m ${name}`);
|
|
39
39
|
}
|
|
40
40
|
catch (error) {
|
|
@@ -45,36 +45,36 @@ async function runTest(name, testFn) {
|
|
|
45
45
|
}
|
|
46
46
|
// ───────────── resolveMcpServerUrl ─────────────
|
|
47
47
|
async function testUrlResolution() {
|
|
48
|
-
log(
|
|
49
|
-
await runTest(
|
|
50
|
-
const result = resolveMcpServerUrl(
|
|
51
|
-
assert(result ===
|
|
48
|
+
log("\n── resolveMcpServerUrl ──");
|
|
49
|
+
await runTest("Resolves localhost:3700 to localhost:3701", () => {
|
|
50
|
+
const result = resolveMcpServerUrl("http://localhost:3700");
|
|
51
|
+
assert(result === "http://localhost:3701", `Expected http://localhost:3701, got ${result}`);
|
|
52
52
|
});
|
|
53
|
-
await runTest(
|
|
54
|
-
const result = resolveMcpServerUrl(
|
|
55
|
-
assert(result ===
|
|
53
|
+
await runTest("Resolves https://localhost:3700 to https://localhost:3701", () => {
|
|
54
|
+
const result = resolveMcpServerUrl("https://localhost:3700");
|
|
55
|
+
assert(result === "https://localhost:3701", `Expected https://localhost:3701, got ${result}`);
|
|
56
56
|
});
|
|
57
|
-
await runTest(
|
|
57
|
+
await runTest("Bare localhost with protocol is returned as-is (has colon in URL)", () => {
|
|
58
58
|
// "http://localhost" contains a colon (from http:), so the `!platformUrl.includes(':')` check fails.
|
|
59
59
|
// This is expected — the function targets the edge case of literally "localhost" with no protocol.
|
|
60
|
-
const result = resolveMcpServerUrl(
|
|
61
|
-
assert(result ===
|
|
60
|
+
const result = resolveMcpServerUrl("http://localhost");
|
|
61
|
+
assert(result === "http://localhost", `Expected http://localhost unchanged, got ${result}`);
|
|
62
62
|
});
|
|
63
|
-
await runTest(
|
|
63
|
+
await runTest("Resolves tostudy.com to mcp.tostudy.ai", () => {
|
|
64
64
|
// Clear env var to test default
|
|
65
65
|
const saved = process.env.MCP_SERVER_URL;
|
|
66
66
|
delete process.env.MCP_SERVER_URL;
|
|
67
|
-
const result = resolveMcpServerUrl(
|
|
68
|
-
assert(result ===
|
|
67
|
+
const result = resolveMcpServerUrl("https://tostudy.com");
|
|
68
|
+
assert(result === "https://mcp.tostudy.ai", `Expected https://mcp.tostudy.ai, got ${result}`);
|
|
69
69
|
// Restore
|
|
70
70
|
if (saved !== undefined)
|
|
71
71
|
process.env.MCP_SERVER_URL = saved;
|
|
72
72
|
});
|
|
73
|
-
await runTest(
|
|
73
|
+
await runTest("Respects MCP_SERVER_URL env var for tostudy URLs", () => {
|
|
74
74
|
const saved = process.env.MCP_SERVER_URL;
|
|
75
|
-
process.env.MCP_SERVER_URL =
|
|
76
|
-
const result = resolveMcpServerUrl(
|
|
77
|
-
assert(result ===
|
|
75
|
+
process.env.MCP_SERVER_URL = "https://custom-mcp.example.com";
|
|
76
|
+
const result = resolveMcpServerUrl("https://tostudy.com");
|
|
77
|
+
assert(result === "https://custom-mcp.example.com", `Expected custom URL, got ${result}`);
|
|
78
78
|
// Restore
|
|
79
79
|
if (saved !== undefined) {
|
|
80
80
|
process.env.MCP_SERVER_URL = saved;
|
|
@@ -83,139 +83,150 @@ async function testUrlResolution() {
|
|
|
83
83
|
delete process.env.MCP_SERVER_URL;
|
|
84
84
|
}
|
|
85
85
|
});
|
|
86
|
-
await runTest(
|
|
87
|
-
const result = resolveMcpServerUrl(
|
|
88
|
-
assert(result ===
|
|
86
|
+
await runTest("Returns unknown URLs unchanged", () => {
|
|
87
|
+
const result = resolveMcpServerUrl("https://example.com/api");
|
|
88
|
+
assert(result === "https://example.com/api", `Expected unchanged URL, got ${result}`);
|
|
89
89
|
});
|
|
90
90
|
}
|
|
91
91
|
// ───────────── Install Command Logic ─────────────
|
|
92
92
|
async function testInstallCommandLogic() {
|
|
93
|
-
log(
|
|
94
|
-
const SUPPORTED_IDES = [
|
|
95
|
-
|
|
93
|
+
log("\n── Install Command Logic ──");
|
|
94
|
+
const SUPPORTED_IDES = [
|
|
95
|
+
"claude-code",
|
|
96
|
+
"cursor",
|
|
97
|
+
"vscode",
|
|
98
|
+
"desktop",
|
|
99
|
+
"windsurf",
|
|
100
|
+
"opencode",
|
|
101
|
+
"codex",
|
|
102
|
+
"antigravity",
|
|
103
|
+
"manual",
|
|
104
|
+
];
|
|
105
|
+
await runTest("All supported IDEs can be resolved to a handler", () => {
|
|
96
106
|
for (const ide of SUPPORTED_IDES) {
|
|
97
107
|
const handler = getIDEHandler(ide);
|
|
98
108
|
assert(handler !== undefined, `Handler for ${ide} should be resolved`);
|
|
99
109
|
assert(handler.id === ide, `Handler id should match ${ide}`);
|
|
100
110
|
}
|
|
101
111
|
});
|
|
102
|
-
await runTest(
|
|
112
|
+
await runTest("Unsupported IDE throws error", () => {
|
|
103
113
|
let threw = false;
|
|
104
114
|
try {
|
|
105
|
-
getIDEHandler(
|
|
115
|
+
getIDEHandler("vim");
|
|
106
116
|
}
|
|
107
117
|
catch {
|
|
108
118
|
threw = true;
|
|
109
119
|
}
|
|
110
|
-
assert(threw,
|
|
120
|
+
assert(threw, "Should throw for unsupported IDE");
|
|
111
121
|
});
|
|
112
|
-
await runTest(
|
|
122
|
+
await runTest("Handler writeConfig accepts key and URL", async () => {
|
|
113
123
|
// Manual handler doesn't write to filesystem, safe to call
|
|
114
|
-
const handler = getIDEHandler(
|
|
124
|
+
const handler = getIDEHandler("manual");
|
|
115
125
|
// Capture stdout to prevent output during test
|
|
116
126
|
const originalWrite = process.stdout.write;
|
|
117
|
-
let output =
|
|
127
|
+
let output = "";
|
|
118
128
|
process.stdout.write = ((chunk) => {
|
|
119
129
|
output += chunk;
|
|
120
130
|
return true;
|
|
121
131
|
});
|
|
122
132
|
try {
|
|
123
|
-
await handler.writeConfig(
|
|
124
|
-
assert(output.includes('"command": "npx"'),
|
|
125
|
-
assert(output.includes(
|
|
126
|
-
assert(output.includes(
|
|
133
|
+
await handler.writeConfig("test-key-123", "https://mcp.tostudy.ai");
|
|
134
|
+
assert(output.includes('"command": "npx"'), "Manual output should include npx command");
|
|
135
|
+
assert(output.includes("mcp-remote"), "Manual output should include mcp-remote");
|
|
136
|
+
assert(output.includes("test-key-123"), "Manual output should include the API key");
|
|
127
137
|
}
|
|
128
138
|
finally {
|
|
129
139
|
process.stdout.write = originalWrite;
|
|
130
140
|
}
|
|
131
141
|
});
|
|
132
|
-
await runTest(
|
|
142
|
+
await runTest("Handler verify returns boolean", async () => {
|
|
133
143
|
// Verify against a non-existent server should return false
|
|
134
|
-
const handler = getIDEHandler(
|
|
135
|
-
const result = await handler.verify(
|
|
136
|
-
assert(typeof result ===
|
|
137
|
-
assert(result === false,
|
|
144
|
+
const handler = getIDEHandler("manual");
|
|
145
|
+
const result = await handler.verify("fake-key", "http://localhost:99999");
|
|
146
|
+
assert(typeof result === "boolean", "verify() should return boolean");
|
|
147
|
+
assert(result === false, "verify() against non-existent server should return false");
|
|
138
148
|
});
|
|
139
149
|
}
|
|
140
150
|
// ───────────── Server Entry Structure ─────────────
|
|
141
151
|
async function testServerEntryStructure() {
|
|
142
|
-
log(
|
|
143
|
-
await runTest(
|
|
144
|
-
const entry = buildTostudyServerEntry(
|
|
145
|
-
assert(typeof entry ===
|
|
146
|
-
assert(entry.command ===
|
|
147
|
-
assert(Array.isArray(entry.args),
|
|
152
|
+
log("\n── Server Entry Structure ──");
|
|
153
|
+
await runTest("Entry has correct shape for IDE configs", () => {
|
|
154
|
+
const entry = buildTostudyServerEntry("my-key", "https://mcp.tostudy.ai", "manual");
|
|
155
|
+
assert(typeof entry === "object", "Entry should be an object");
|
|
156
|
+
assert(entry.command === "npx", "Command should be npx");
|
|
157
|
+
assert(Array.isArray(entry.args), "Args should be an array");
|
|
148
158
|
// Verify args structure
|
|
149
159
|
const args = entry.args;
|
|
150
|
-
assert(args.includes(
|
|
151
|
-
assert(args.includes(
|
|
152
|
-
assert(args.includes(
|
|
153
|
-
assert(args.some((a) => a.includes(
|
|
154
|
-
assert(args.some((a) => a.includes(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
160
|
+
assert(args.includes("-y"), "Should have -y flag");
|
|
161
|
+
assert(args.includes("mcp-remote"), "Should have mcp-remote");
|
|
162
|
+
assert(args.includes("--header"), "Should have --header flag");
|
|
163
|
+
assert(args.some((a) => a.includes("Authorization:Bearer my-key")), "Should have authorization header with key");
|
|
164
|
+
assert(args.some((a) => a.includes("X-Tostudy-Client-IDE:manual")), "Should have IDE metadata header");
|
|
165
|
+
assert(args.some((a) => a.startsWith("X-Tostudy-Client-OS:")), "Should have OS metadata header");
|
|
166
|
+
assert(args.some((a) => a.includes("https://mcp.tostudy.ai/mcp")), "Should have MCP URL with /mcp suffix");
|
|
167
|
+
});
|
|
168
|
+
await runTest("Args encode API key correctly", () => {
|
|
169
|
+
const specialKey = "key-with-special-chars!@#";
|
|
170
|
+
const args = buildMcpRemoteArgs(specialKey, "https://mcp.test.com", "manual");
|
|
171
|
+
const authArg = args.find((a) => a.includes("Authorization"));
|
|
172
|
+
assert(authArg !== undefined, "Should have auth arg");
|
|
173
|
+
assert(authArg === `Authorization:Bearer ${specialKey}`, "Auth arg should contain exact key without encoding");
|
|
174
|
+
assert(args.includes("X-Tostudy-Client-IDE:manual"), "Should include IDE metadata");
|
|
175
|
+
});
|
|
176
|
+
await runTest("MCP URL gets /mcp suffix", () => {
|
|
177
|
+
const args = buildMcpRemoteArgs("key", "https://mcp.tostudy.ai", "manual");
|
|
165
178
|
const urlArg = args[2];
|
|
166
|
-
assert(urlArg ===
|
|
179
|
+
assert(urlArg === "https://mcp.tostudy.ai/mcp", `URL should have /mcp suffix, got ${urlArg}`);
|
|
167
180
|
});
|
|
168
181
|
}
|
|
169
182
|
// ───────────── IDE-specific Config Formats ─────────────
|
|
170
183
|
async function testIDEConfigFormats() {
|
|
171
|
-
log(
|
|
172
|
-
await runTest(
|
|
173
|
-
const entry = buildTostudyServerEntry(
|
|
184
|
+
log("\n── IDE Config Formats ──");
|
|
185
|
+
await runTest("Cursor uses mcpServers key", () => {
|
|
186
|
+
const entry = buildTostudyServerEntry("key", "https://mcp.tostudy.ai", "manual");
|
|
174
187
|
// Simulate Cursor config shape
|
|
175
188
|
const config = { mcpServers: { tostudy: entry } };
|
|
176
189
|
const json = JSON.stringify(config);
|
|
177
|
-
assert(json.includes('"mcpServers"'),
|
|
178
|
-
assert(!json.includes('"servers"'),
|
|
190
|
+
assert(json.includes('"mcpServers"'), "Cursor config should use mcpServers");
|
|
191
|
+
assert(!json.includes('"servers"'), "Cursor config should NOT use bare servers");
|
|
179
192
|
});
|
|
180
|
-
await runTest(
|
|
181
|
-
const entry = buildTostudyServerEntry(
|
|
193
|
+
await runTest("VS Code uses servers key", () => {
|
|
194
|
+
const entry = buildTostudyServerEntry("key", "https://mcp.tostudy.ai", "manual");
|
|
182
195
|
// Simulate VS Code config shape
|
|
183
196
|
const config = { servers: { tostudy: entry } };
|
|
184
197
|
const json = JSON.stringify(config);
|
|
185
|
-
assert(json.includes('"servers"'),
|
|
198
|
+
assert(json.includes('"servers"'), "VSCode config should use servers");
|
|
186
199
|
});
|
|
187
|
-
await runTest(
|
|
188
|
-
const entry = buildTostudyServerEntry(
|
|
200
|
+
await runTest("OpenCode uses mcp key", () => {
|
|
201
|
+
const entry = buildTostudyServerEntry("key", "https://mcp.tostudy.ai", "manual");
|
|
189
202
|
// Simulate OpenCode config shape
|
|
190
203
|
const config = { mcp: { tostudy: entry } };
|
|
191
204
|
const json = JSON.stringify(config);
|
|
192
|
-
assert(json.includes('"mcp"'),
|
|
205
|
+
assert(json.includes('"mcp"'), "OpenCode config should use mcp");
|
|
193
206
|
});
|
|
194
|
-
await runTest(
|
|
195
|
-
// Desktop handler uses
|
|
196
|
-
//
|
|
197
|
-
const handler = getIDEHandler(
|
|
198
|
-
assert(handler.name ===
|
|
199
|
-
// The desktop handler's config includes SSE transport via addTostudyMcpServer
|
|
200
|
-
// We can't easily test this without writing files, so just verify the handler exists
|
|
207
|
+
await runTest("Desktop uses stdio transport (command + args via mcp-remote)", () => {
|
|
208
|
+
// Desktop handler uses buildTostudyServerEntry which writes stdio config
|
|
209
|
+
// (command: npx, args: [...mcp-remote...]) matching all other handlers
|
|
210
|
+
const handler = getIDEHandler("desktop");
|
|
211
|
+
assert(handler.name === "Claude Desktop", "Should be Claude Desktop handler");
|
|
201
212
|
});
|
|
202
213
|
}
|
|
203
214
|
// ───────────── Summary ─────────────
|
|
204
215
|
function printSummary() {
|
|
205
|
-
log(
|
|
206
|
-
log(
|
|
207
|
-
log(
|
|
216
|
+
log("\n" + "═".repeat(50));
|
|
217
|
+
log("INSTALL COMMAND TEST SUMMARY");
|
|
218
|
+
log("═".repeat(50));
|
|
208
219
|
const passed = results.filter((r) => r.passed).length;
|
|
209
220
|
const failed = results.filter((r) => !r.passed).length;
|
|
210
221
|
log(`\nTotal: ${results.length} | Passed: ${passed} | Failed: ${failed}\n`);
|
|
211
222
|
if (failed > 0) {
|
|
212
|
-
log(
|
|
223
|
+
log("FAILED:");
|
|
213
224
|
for (const r of results.filter((r) => !r.passed)) {
|
|
214
225
|
log(` \x1b[31m✗\x1b[0m ${r.name}: ${r.message}`);
|
|
215
226
|
}
|
|
216
227
|
}
|
|
217
228
|
if (failed === 0) {
|
|
218
|
-
log(
|
|
229
|
+
log("\x1b[32m✓ All install command tests passed!\x1b[0m\n");
|
|
219
230
|
}
|
|
220
231
|
else {
|
|
221
232
|
log(`\x1b[31m✗ ${failed} test(s) failed\x1b[0m\n`);
|
|
@@ -224,9 +235,9 @@ function printSummary() {
|
|
|
224
235
|
}
|
|
225
236
|
// Main
|
|
226
237
|
async function main() {
|
|
227
|
-
log(
|
|
228
|
-
log(
|
|
229
|
-
log(
|
|
238
|
+
log("═".repeat(50));
|
|
239
|
+
log("TEST: CLI Install Command & URL Resolution");
|
|
240
|
+
log("═".repeat(50));
|
|
230
241
|
await testUrlResolution();
|
|
231
242
|
await testInstallCommandLogic();
|
|
232
243
|
await testServerEntryStructure();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install-command.test.js","sourceRoot":"","sources":["../../src/__tests__/install-command.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"install-command.test.js","sourceRoot":"","sources":["../../src/__tests__/install-command.test.ts"],"names":[],"mappings":"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"}
|