opalserve 3.1.0 → 3.2.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 (90) hide show
  1. package/README.md +80 -45
  2. package/dist/auth/api-keys.d.ts +8 -0
  3. package/dist/auth/api-keys.d.ts.map +1 -1
  4. package/dist/auth/api-keys.js +62 -2
  5. package/dist/auth/api-keys.js.map +1 -1
  6. package/dist/auth/index.d.ts +1 -1
  7. package/dist/auth/index.d.ts.map +1 -1
  8. package/dist/auth/index.js +1 -1
  9. package/dist/auth/index.js.map +1 -1
  10. package/dist/auth/middleware.d.ts.map +1 -1
  11. package/dist/auth/middleware.js +3 -11
  12. package/dist/auth/middleware.js.map +1 -1
  13. package/dist/cli/commands/doctor.d.ts +2 -0
  14. package/dist/cli/commands/doctor.d.ts.map +1 -0
  15. package/dist/cli/commands/doctor.js +107 -0
  16. package/dist/cli/commands/doctor.js.map +1 -0
  17. package/dist/cli/commands/link.d.ts +11 -0
  18. package/dist/cli/commands/link.d.ts.map +1 -0
  19. package/dist/cli/commands/link.js +135 -0
  20. package/dist/cli/commands/link.js.map +1 -0
  21. package/dist/cli/commands/mcp.d.ts +7 -0
  22. package/dist/cli/commands/mcp.d.ts.map +1 -0
  23. package/dist/cli/commands/mcp.js +46 -0
  24. package/dist/cli/commands/mcp.js.map +1 -0
  25. package/dist/cli/commands/start.d.ts +1 -0
  26. package/dist/cli/commands/start.d.ts.map +1 -1
  27. package/dist/cli/commands/start.js +13 -0
  28. package/dist/cli/commands/start.js.map +1 -1
  29. package/dist/cli/editors/base.d.ts +23 -0
  30. package/dist/cli/editors/base.d.ts.map +1 -0
  31. package/dist/cli/editors/base.js +75 -0
  32. package/dist/cli/editors/base.js.map +1 -0
  33. package/dist/cli/editors/claude.d.ts +8 -0
  34. package/dist/cli/editors/claude.d.ts.map +1 -0
  35. package/dist/cli/editors/claude.js +31 -0
  36. package/dist/cli/editors/claude.js.map +1 -0
  37. package/dist/cli/editors/cline.d.ts +14 -0
  38. package/dist/cli/editors/cline.d.ts.map +1 -0
  39. package/dist/cli/editors/cline.js +32 -0
  40. package/dist/cli/editors/cline.js.map +1 -0
  41. package/dist/cli/editors/cursor.d.ts +8 -0
  42. package/dist/cli/editors/cursor.d.ts.map +1 -0
  43. package/dist/cli/editors/cursor.js +14 -0
  44. package/dist/cli/editors/cursor.js.map +1 -0
  45. package/dist/cli/editors/index.d.ts +14 -0
  46. package/dist/cli/editors/index.d.ts.map +1 -0
  47. package/dist/cli/editors/index.js +34 -0
  48. package/dist/cli/editors/index.js.map +1 -0
  49. package/dist/cli/editors/types.d.ts +33 -0
  50. package/dist/cli/editors/types.d.ts.map +1 -0
  51. package/dist/cli/editors/types.js +2 -0
  52. package/dist/cli/editors/types.js.map +1 -0
  53. package/dist/cli/index.js +26 -0
  54. package/dist/cli/index.js.map +1 -1
  55. package/dist/config/defaults.d.ts +1 -0
  56. package/dist/config/defaults.d.ts.map +1 -1
  57. package/dist/config/defaults.js +3 -0
  58. package/dist/config/defaults.js.map +1 -1
  59. package/dist/constants.d.ts +1 -1
  60. package/dist/constants.js +1 -1
  61. package/dist/server/app.d.ts.map +1 -1
  62. package/dist/server/app.js +34 -1
  63. package/dist/server/app.js.map +1 -1
  64. package/dist/server/routes/_schemas.d.ts +116 -0
  65. package/dist/server/routes/_schemas.d.ts.map +1 -0
  66. package/dist/server/routes/_schemas.js +53 -0
  67. package/dist/server/routes/_schemas.js.map +1 -0
  68. package/dist/server/routes/auth.d.ts.map +1 -1
  69. package/dist/server/routes/auth.js +28 -14
  70. package/dist/server/routes/auth.js.map +1 -1
  71. package/dist/server/routes/context.d.ts.map +1 -1
  72. package/dist/server/routes/context.js +14 -7
  73. package/dist/server/routes/context.js.map +1 -1
  74. package/dist/server/routes/servers.d.ts.map +1 -1
  75. package/dist/server/routes/servers.js +12 -7
  76. package/dist/server/routes/servers.js.map +1 -1
  77. package/dist/server/routes/stats.d.ts.map +1 -1
  78. package/dist/server/routes/stats.js +26 -5
  79. package/dist/server/routes/stats.js.map +1 -1
  80. package/dist/server/routes/team-servers.d.ts.map +1 -1
  81. package/dist/server/routes/team-servers.js +7 -6
  82. package/dist/server/routes/team-servers.js.map +1 -1
  83. package/dist/server/routes/tools.d.ts.map +1 -1
  84. package/dist/server/routes/tools.js +26 -12
  85. package/dist/server/routes/tools.js.map +1 -1
  86. package/dist/utils/browser.d.ts +7 -0
  87. package/dist/utils/browser.d.ts.map +1 -0
  88. package/dist/utils/browser.js +34 -0
  89. package/dist/utils/browser.js.map +1 -0
  90. package/package.json +93 -91
@@ -1,6 +1,7 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  import { McpServerConfigSchema } from '../../types/index.js';
3
3
  import { createAuthMiddleware } from '../../auth/middleware.js';
4
+ import { NameParam, sendValidationError } from './_schemas.js';
4
5
  export function registerTeamServerRoutes(app, registry) {
5
6
  const db = registry.getDatabase();
6
7
  const requireAuth = createAuthMiddleware(db);
@@ -37,11 +38,7 @@ export function registerTeamServerRoutes(app, registry) {
37
38
  }
38
39
  const parsed = McpServerConfigSchema.safeParse(request.body);
39
40
  if (!parsed.success) {
40
- return reply.status(400).send({
41
- ok: false,
42
- error: 'Invalid server configuration',
43
- details: parsed.error.flatten(),
44
- });
41
+ return sendValidationError(reply, 'Invalid server configuration', parsed.error);
45
42
  }
46
43
  const now = new Date().toISOString();
47
44
  const id = randomUUID();
@@ -77,7 +74,11 @@ export function registerTeamServerRoutes(app, registry) {
77
74
  if (!membership || membership.role !== 'admin') {
78
75
  return reply.status(403).send({ ok: false, error: 'Admin access required' });
79
76
  }
80
- const { name } = request.params;
77
+ const parsedParams = NameParam.safeParse(request.params);
78
+ if (!parsedParams.success) {
79
+ return sendValidationError(reply, 'Invalid server name', parsedParams.error);
80
+ }
81
+ const { name } = parsedParams.data;
81
82
  const existing = db.get('SELECT id FROM team_servers WHERE team_id = ? AND name = ?', [membership.team_id, name]);
82
83
  if (!existing) {
83
84
  return reply.status(404).send({ ok: false, error: `Server "${name}" not found` });
@@ -1 +1 @@
1
- {"version":3,"file":"team-servers.js","sourceRoot":"","sources":["../../../src/server/routes/team-servers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"team-servers.js","sourceRoot":"","sources":["../../../src/server/routes/team-servers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/server/routes/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAkD1F"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/server/routes/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAQhE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,eAAe,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CA+D1F"}
@@ -1,26 +1,33 @@
1
+ import { ToolsQuery, ToolsSearchQuery, ToolIdParam, sendValidationError, } from './_schemas.js';
1
2
  export function registerToolRoutes(app, registry) {
2
3
  app.get('/api/v1/tools', async (request, reply) => {
3
- const { server } = request.query;
4
- const serverFilter = server ? server.split(',') : undefined;
4
+ const parsed = ToolsQuery.safeParse(request.query);
5
+ if (!parsed.success) {
6
+ return sendValidationError(reply, 'Invalid query', parsed.error);
7
+ }
8
+ const serverFilter = parsed.data.server ? parsed.data.server.split(',') : undefined;
5
9
  const tools = registry.listTools(serverFilter);
6
10
  return reply.send({ ok: true, data: tools });
7
11
  });
8
12
  app.get('/api/v1/tools/search', async (request, reply) => {
9
- const { q, limit, server } = request.query;
10
- if (!q) {
11
- return reply.status(400).send({ ok: false, error: 'Query parameter "q" is required' });
13
+ const parsed = ToolsSearchQuery.safeParse(request.query);
14
+ if (!parsed.success) {
15
+ return sendValidationError(reply, 'Invalid search query', parsed.error);
12
16
  }
17
+ const { q, limit, server } = parsed.data;
13
18
  const serverFilter = server ? server.split(',') : undefined;
14
19
  const results = registry.searchTools(q, {
15
- limit: limit ? parseInt(limit, 10) : undefined,
20
+ limit,
16
21
  serverFilter,
17
22
  });
18
23
  return reply.send({ ok: true, data: results });
19
24
  });
20
25
  app.get('/api/v1/tools/:id', async (request, reply) => {
21
- const { id } = request.params;
22
- // Tool IDs contain colons, so decode the URL param
23
- const toolId = decodeURIComponent(id);
26
+ const parsedParams = ToolIdParam.safeParse(request.params);
27
+ if (!parsedParams.success) {
28
+ return sendValidationError(reply, 'Invalid tool id', parsedParams.error);
29
+ }
30
+ const toolId = decodeURIComponent(parsedParams.data.id);
24
31
  const tool = registry.discovery.getById(toolId);
25
32
  if (!tool) {
26
33
  return reply.status(404).send({ ok: false, error: `Tool "${toolId}" not found` });
@@ -28,9 +35,16 @@ export function registerToolRoutes(app, registry) {
28
35
  return reply.send({ ok: true, data: tool });
29
36
  });
30
37
  app.post('/api/v1/tools/:id/call', async (request, reply) => {
31
- const { id } = request.params;
32
- const toolId = decodeURIComponent(id);
33
- const args = request.body || {};
38
+ const parsedParams = ToolIdParam.safeParse(request.params);
39
+ if (!parsedParams.success) {
40
+ return sendValidationError(reply, 'Invalid tool id', parsedParams.error);
41
+ }
42
+ const toolId = decodeURIComponent(parsedParams.data.id);
43
+ const body = request.body;
44
+ if (body !== undefined && body !== null && (typeof body !== 'object' || Array.isArray(body))) {
45
+ return reply.status(400).send({ ok: false, error: 'Tool call body must be a JSON object' });
46
+ }
47
+ const args = body ?? {};
34
48
  try {
35
49
  const result = await registry.callTool(toolId, args);
36
50
  return reply.send({ ok: true, data: result });
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/server/routes/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/server/routes/tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Open a URL in the user's default browser. Returns true if a child was
3
+ * spawned, false if we deliberately skipped (CI, non-interactive, opt-out).
4
+ * Failures are swallowed — opening a browser is best-effort UX, not critical.
5
+ */
6
+ export declare function openInBrowser(url: string): boolean;
7
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAmBlD"}
@@ -0,0 +1,34 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { platform } from 'node:os';
3
+ /**
4
+ * Open a URL in the user's default browser. Returns true if a child was
5
+ * spawned, false if we deliberately skipped (CI, non-interactive, opt-out).
6
+ * Failures are swallowed — opening a browser is best-effort UX, not critical.
7
+ */
8
+ export function openInBrowser(url) {
9
+ if (process.env.OPALSERVE_NO_BROWSER === '1')
10
+ return false;
11
+ if (process.env.CI)
12
+ return false;
13
+ if (process.env.NODE_ENV === 'test')
14
+ return false;
15
+ if (!process.stdout.isTTY)
16
+ return false;
17
+ try {
18
+ const plat = platform();
19
+ if (plat === 'darwin') {
20
+ spawn('open', [url], { detached: true, stdio: 'ignore' }).unref();
21
+ }
22
+ else if (plat === 'win32') {
23
+ spawn('cmd', ['/c', 'start', '""', url], { detached: true, stdio: 'ignore' }).unref();
24
+ }
25
+ else {
26
+ spawn('xdg-open', [url], { detached: true, stdio: 'ignore' }).unref();
27
+ }
28
+ return true;
29
+ }
30
+ catch {
31
+ return false;
32
+ }
33
+ }
34
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../src/utils/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEnC;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,KAAK,CAAC;IACjC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAClD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAExC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAC;QACxB,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACpE,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,KAAK,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxF,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;QACxE,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,91 +1,93 @@
1
- {
2
- "name": "opalserve",
3
- "version": "3.1.0",
4
- "description": "The control plane for your team's AI tools — share MCP servers, knowledge bases, and usage analytics across your engineering team",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "import": "./dist/index.js",
11
- "types": "./dist/index.d.ts"
12
- }
13
- },
14
- "bin": {
15
- "opalserve": "dist/cli/index.js"
16
- },
17
- "files": [
18
- "dist",
19
- "assets/logo.svg",
20
- "LICENSE",
21
- "README.md"
22
- ],
23
- "scripts": {
24
- "build": "tsc && pnpm --filter opalserve-dashboard build",
25
- "start": "node dist/cli/index.js",
26
- "dev": "tsx watch src/cli/index.ts",
27
- "typecheck": "tsc --noEmit",
28
- "lint": "eslint src/",
29
- "test": "vitest run",
30
- "test:watch": "vitest",
31
- "prepublishOnly": "pnpm build",
32
- "docs:dev": "vitepress dev docs",
33
- "docs:build": "vitepress build docs",
34
- "docs:preview": "vitepress preview docs"
35
- },
36
- "keywords": [
37
- "mcp",
38
- "model-context-protocol",
39
- "tool-registry",
40
- "ai-tools",
41
- "cli",
42
- "discovery",
43
- "aggregator",
44
- "llm",
45
- "claude",
46
- "cursor"
47
- ],
48
- "author": "AdityaIdev <aiexpert@adityaai.dev>",
49
- "license": "MIT",
50
- "homepage": "https://opalserve.adityaai.dev",
51
- "repository": {
52
- "type": "git",
53
- "url": "git+https://github.com/adityaidev/opalserve.git"
54
- },
55
- "bugs": {
56
- "url": "https://github.com/adityaidev/opalserve/issues"
57
- },
58
- "engines": {
59
- "node": ">=20.0.0"
60
- },
61
- "dependencies": {
62
- "@fastify/cors": "^11.0.0",
63
- "@fastify/static": "^9.1.3",
64
- "@inquirer/prompts": "^8.4.1",
65
- "@modelcontextprotocol/sdk": "^1.12.1",
66
- "boxen": "^8.0.1",
67
- "chalk": "^5.4.1",
68
- "cli-table3": "^0.6.5",
69
- "commander": "^13.1.0",
70
- "cosmiconfig": "^9.0.0",
71
- "fastify": "^5.8.5",
72
- "gradient-string": "^3.0.0",
73
- "inquirer": "^12.6.0",
74
- "ora": "^8.2.0",
75
- "pino": "^9.14.0",
76
- "pino-pretty": "^13.0.0",
77
- "sql.js": "^1.14.1",
78
- "zod": "^3.24.4"
79
- },
80
- "devDependencies": {
81
- "@eslint/js": "^9.25.1",
82
- "@types/gradient-string": "^1.1.6",
83
- "@types/node": "^22.15.3",
84
- "eslint": "^9.25.1",
85
- "tsx": "^4.19.4",
86
- "typescript": "^5.8.3",
87
- "typescript-eslint": "^8.31.0",
88
- "vitepress": "^1.6.3",
89
- "vitest": "^3.1.2"
90
- }
91
- }
1
+ {
2
+ "name": "opalserve",
3
+ "version": "3.2.0",
4
+ "description": "The control plane for your team's AI tools — share MCP servers, knowledge bases, and usage analytics across your engineering team",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "bin": {
15
+ "opalserve": "dist/cli/index.js"
16
+ },
17
+ "files": [
18
+ "dist",
19
+ "assets/logo.svg",
20
+ "LICENSE",
21
+ "README.md"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc && pnpm --filter opalserve-dashboard build",
25
+ "start": "node dist/cli/index.js",
26
+ "dev": "tsx watch src/cli/index.ts",
27
+ "typecheck": "tsc --noEmit",
28
+ "lint": "eslint src/",
29
+ "test": "vitest run",
30
+ "test:watch": "vitest",
31
+ "prepublishOnly": "pnpm build",
32
+ "docs:dev": "vitepress dev docs",
33
+ "docs:build": "vitepress build docs",
34
+ "docs:preview": "vitepress preview docs"
35
+ },
36
+ "keywords": [
37
+ "mcp",
38
+ "model-context-protocol",
39
+ "tool-registry",
40
+ "ai-tools",
41
+ "cli",
42
+ "discovery",
43
+ "aggregator",
44
+ "llm",
45
+ "claude",
46
+ "cursor"
47
+ ],
48
+ "author": "AdityaIdev <aiexpert@adityaai.dev>",
49
+ "license": "MIT",
50
+ "homepage": "https://opalserve.adityaai.dev",
51
+ "repository": {
52
+ "type": "git",
53
+ "url": "git+https://github.com/adityaidev/opalserve.git"
54
+ },
55
+ "bugs": {
56
+ "url": "https://github.com/adityaidev/opalserve/issues"
57
+ },
58
+ "engines": {
59
+ "node": ">=20.0.0"
60
+ },
61
+ "dependencies": {
62
+ "@fastify/cors": "^11.0.0",
63
+ "@fastify/helmet": "^13.0.2",
64
+ "@fastify/rate-limit": "^10.3.0",
65
+ "@fastify/static": "^9.1.3",
66
+ "@inquirer/prompts": "^8.4.1",
67
+ "@modelcontextprotocol/sdk": "^1.12.1",
68
+ "boxen": "^8.0.1",
69
+ "chalk": "^5.4.1",
70
+ "cli-table3": "^0.6.5",
71
+ "commander": "^13.1.0",
72
+ "cosmiconfig": "^9.0.0",
73
+ "fastify": "^5.8.5",
74
+ "gradient-string": "^3.0.0",
75
+ "inquirer": "^12.6.0",
76
+ "ora": "^8.2.0",
77
+ "pino": "^9.14.0",
78
+ "pino-pretty": "^13.0.0",
79
+ "sql.js": "^1.14.1",
80
+ "zod": "^3.24.4"
81
+ },
82
+ "devDependencies": {
83
+ "@eslint/js": "^9.25.1",
84
+ "@types/gradient-string": "^1.1.6",
85
+ "@types/node": "^22.15.3",
86
+ "eslint": "^9.25.1",
87
+ "tsx": "^4.19.4",
88
+ "typescript": "^5.8.3",
89
+ "typescript-eslint": "^8.31.0",
90
+ "vitepress": "^1.6.3",
91
+ "vitest": "^3.1.2"
92
+ }
93
+ }