@otwa/mcp-server 0.1.1 → 0.4.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.4.0 — 2026-05-31
4
+
5
+ - **New: server snapshots.** Four tools for the full snapshot lifecycle, backed by real vSphere snapshots:
6
+ - `otwa_list_snapshots` (scope: `servers:read`) — list a server's point-in-time disk snapshots.
7
+ - `otwa_create_snapshot` (scope: `servers:write`) — capture a disk snapshot (max 10/server).
8
+ - `otwa_revert_snapshot` (scope: `servers:destroy`) — roll the disk back to a snapshot. DESTRUCTIVE; guarded by `confirm` + `iAcknowledgeDataLoss` + an `expectedLabel` typo-guard (same pattern as `otwa_destroy_server`).
9
+ - `otwa_delete_snapshot` (scope: `servers:write`) — remove a snapshot; non-destructive to live data, single `confirm` flag.
10
+ - Brings the toolset to 30 tools.
11
+
12
+ ## 0.3.0 — 2026-05-26
13
+
14
+ - **🔧 Fix: default API base now includes `/api` global-prefix** (`https://api.otwa.cloud/api`). otwa-cloud-api uses NestJS `setGlobalPrefix('api')` so every endpoint is under `/api/v1/*`. v0.1.x + v0.2.0 shipped with the prefix missing — every stdio tool call 404'd. Latent bug closed.
15
+ - **Optional fire-and-forget telemetry** for tool calls. Posts `{toolName, transport, success, errorCode?, durationMs, clientLabel?}` to `api.otwa.cloud/api/v1/integrations/mcp/usage` after every invocation, using the caller's own API key.
16
+ - **Hosted** (`mcp.otwa.cloud`): always on. We already see every request server-side; logging metadata has no privacy delta.
17
+ - **stdio**: OFF by default. Set `OTWA_TELEMETRY=1` to opt in. The local CLI never makes surprise network calls without an explicit env flip.
18
+ - Single integration point: `instrumentRegisterTool()` in `_register.ts` monkey-patches `server.registerTool` so every tool — current and future — is auto-instrumented. Per-surface tool files don't need to know about telemetry at all.
19
+ - Failure classification: `classifyErrorFromResult()` maps `isError: true` results back to typed codes (`unauthorized | forbidden | payment_required | not_found | conflict | validation_failed | rate_limited | upstream_error | error`) so dashboard counters bucket failures meaningfully.
20
+
21
+ > v0.2.0 tag exists on GitHub but never published to npm (Actions outage 2026-05-26 dropped the event). v0.3.0 supersedes it with all 0.2.0 content + the prefix fix above.
22
+
23
+ ## 0.2.0 — 2026-05-26
24
+
25
+ - New tool `otwa_get_reseller_state` (scope: `account:read`) — returns reseller tier, discount %, rolling 30-day GMV, and next-tier progression. Useful for resellers asking the AI "how close am I to the next tier?"
26
+ - Expanded README install instructions: now covers Claude Code, **Claude Desktop**, Cursor, Windsurf, **VS Code (Copilot Agent Mode)**, Zed, Continue, and **OpenCode**.
27
+ - Added README status badges: npm version, CI, license, Node engines, MCP transport.
28
+ - Added vitest scaffold under `test/` — 16 smoke tests for `_helpers`, `errors`, and the full tool-registration surface. CI now runs `pnpm test` on every push (Node 20 + 22 matrix).
29
+
3
30
  ## 0.1.1 — 2026-05-25
4
31
 
5
32
  - Renamed bin entries from `otwa-mcp` / `otwa-mcp-http` to `mcp-server` / `mcp-server-http` so the unscoped package name matches the default bin — this makes `npx -y @otwa/mcp-server` resolve correctly (npx requires the bin name to match the unscoped package name when multiple bins exist).
package/README.md CHANGED
@@ -1,8 +1,15 @@
1
1
  # @otwa/mcp-server
2
2
 
3
+ [![npm version](https://img.shields.io/npm/v/@otwa/mcp-server.svg?style=flat)](https://www.npmjs.com/package/@otwa/mcp-server)
4
+ [![CI](https://github.com/otwacloud/mcp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/otwacloud/mcp-server/actions/workflows/ci.yml)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Node.js](https://img.shields.io/node/v/@otwa/mcp-server.svg)](https://nodejs.org)
7
+ [![MCP](https://img.shields.io/badge/MCP-Streamable_HTTP-blue.svg)](https://modelcontextprotocol.io)
8
+
3
9
  Official Model Context Protocol server for [otwa.cloud](https://otwa.cloud).
4
- Provision and manage servers from Claude Code, Cursor, Windsurf, Zed, or any
5
- other MCP-capable AI tool — just by talking to it.
10
+ Provision and manage servers from Claude Code, Claude Desktop, Cursor, Windsurf,
11
+ VS Code, Zed, Continue, OpenCode, or any other MCP-capable AI tool — just by
12
+ talking to it.
6
13
 
7
14
  ```
8
15
  > "Spin up a 4 vCPU Ubuntu 22 box in Frankfurt called prod-api-01"
@@ -24,11 +31,36 @@ Claude → calls otwa_list_products, otwa_list_os_templates, otwa_list_regions
24
31
 
25
32
  ```
26
33
  URL: https://mcp.otwa.cloud/mcp
27
- Auth: Authorization: Bearer otwa_xxxxxxxxxxxxxxxxxxxx
34
+ Auth: Authorization: Bearer otwa_… (API key)
35
+ OR Authorization: Bearer otwa_at_… (OAuth 2.0 device-code, RFC 8628)
28
36
  Health: GET https://mcp.otwa.cloud/healthz
29
37
  ```
30
38
 
31
- The hosted server is stateless — every request is authenticated independently with your API key. No session state lives on `mcp.otwa.cloud`, so a leaked session id is useless.
39
+ The hosted server is stateless — every request is authenticated independently. No session state lives on `mcp.otwa.cloud`, so a leaked session id is useless. Both API keys and OAuth tokens are first-class — pick what your client supports.
40
+
41
+ ### OAuth 2.0 device-code flow
42
+
43
+ Spec-compliant MCP clients can discover authorization automatically:
44
+
45
+ | Endpoint | Spec |
46
+ |---|---|
47
+ | `GET https://mcp.otwa.cloud/.well-known/oauth-protected-resource` | RFC 9728 |
48
+ | `GET https://api.otwa.cloud/.well-known/oauth-authorization-server` | RFC 8414 |
49
+ | `POST https://api.otwa.cloud/api/oauth/register` (DCR, no auth) | RFC 7591 |
50
+ | `POST https://api.otwa.cloud/api/oauth/device/code` | RFC 8628 §3.1 |
51
+ | `POST https://api.otwa.cloud/api/oauth/token` | RFC 8628 §3.4 |
52
+ | `POST https://api.otwa.cloud/api/oauth/revoke` | RFC 7009 |
53
+
54
+ Flow:
55
+ 1. Client POSTs to `/oauth/register` with `client_name + scope` → gets a `client_id`.
56
+ 2. POSTs to `/oauth/device/code` → receives `user_code` (XXXX-YYYY) + `verification_uri=https://otwa.cloud/oauth/device`.
57
+ 3. User opens the URI, signs in, approves the requested scopes.
58
+ 4. Client polls `/oauth/token` at the returned interval → receives `otwa_at_…` access + `otwa_rt_…` refresh tokens.
59
+ 5. Use as `Authorization: Bearer otwa_at_…` against `/mcp` or any `/api/v1/*` endpoint.
60
+ 6. Before access expires, refresh: POST `/oauth/token` with `grant_type=refresh_token` + the `otwa_rt_…` value → fresh pair. Refresh tokens are single-use — replaying one fails with `invalid_grant`.
61
+ 7. User can revoke any time at [dashboard/api](https://otwa.cloud/dashboard/api) → OAuth grants tab.
62
+
63
+ A 401 from `/mcp` includes `WWW-Authenticate: Bearer realm="otwa-mcp", resource_metadata="…"` per RFC 9728 §5.3 to point clients at the discovery URL.
32
64
 
33
65
  ## Quick start (local stdio)
34
66
 
@@ -61,6 +93,26 @@ claude mcp add otwa npx -y @otwa/mcp-server
61
93
  claude mcp env otwa OTWA_API_KEY=otwa_xxxxxxxxxxxxxxxxxxxx
62
94
  ```
63
95
 
96
+ #### Claude Desktop
97
+
98
+ Add to your `claude_desktop_config.json`
99
+ (`~/Library/Application Support/Claude/` on macOS,
100
+ `%APPDATA%\Claude\` on Windows):
101
+
102
+ ```json
103
+ {
104
+ "mcpServers": {
105
+ "otwa": {
106
+ "command": "npx",
107
+ "args": ["-y", "@otwa/mcp-server"],
108
+ "env": {
109
+ "OTWA_API_KEY": "otwa_xxxxxxxxxxxxxxxxxxxx"
110
+ }
111
+ }
112
+ }
113
+ }
114
+ ```
115
+
64
116
  #### Cursor
65
117
 
66
118
  Add to `~/.cursor/mcp.json`:
@@ -97,6 +149,25 @@ Add to `~/.codeium/windsurf/mcp_config.json`:
97
149
  }
98
150
  ```
99
151
 
152
+ #### VS Code (Copilot Agent Mode)
153
+
154
+ Add to `.vscode/mcp.json` in your workspace:
155
+
156
+ ```json
157
+ {
158
+ "servers": {
159
+ "otwa": {
160
+ "type": "stdio",
161
+ "command": "npx",
162
+ "args": ["-y", "@otwa/mcp-server"],
163
+ "env": {
164
+ "OTWA_API_KEY": "otwa_xxxxxxxxxxxxxxxxxxxx"
165
+ }
166
+ }
167
+ }
168
+ }
169
+ ```
170
+
100
171
  #### Zed
101
172
 
102
173
  Add to `~/.config/zed/settings.json`:
@@ -136,6 +207,24 @@ Add to `~/.continue/config.json` under `experimental.modelContextProtocolServers
136
207
  }
137
208
  ```
138
209
 
210
+ #### OpenCode
211
+
212
+ Add to `opencode.json` (or `opencode.jsonc`) in your config directory:
213
+
214
+ ```json
215
+ {
216
+ "$schema": "https://opencode.ai/config.json",
217
+ "mcp": {
218
+ "otwa": {
219
+ "type": "local",
220
+ "command": ["npx", "-y", "@otwa/mcp-server"],
221
+ "environment": { "OTWA_API_KEY": "otwa_xxxxxxxxxxxxxxxxxxxx" },
222
+ "enabled": true
223
+ }
224
+ }
225
+ }
226
+ ```
227
+
139
228
  ### 3. Try it
140
229
 
141
230
  Restart your client and ask:
@@ -147,7 +236,7 @@ Restart your client and ask:
147
236
 
148
237
  ## Tools
149
238
 
150
- 20 tools across six surfaces:
239
+ 30 tools across seven surfaces:
151
240
 
152
241
  ### Account & catalogue (read-only, `account:read`)
153
242
  - `otwa_account` — current account, balance, tier
@@ -166,6 +255,10 @@ Restart your client and ask:
166
255
  - `otwa_reset_server_password` — rotate root password *(servers:write)*
167
256
  - `otwa_reinstall_server` — wipe and reinstall OS *(servers:destroy)*
168
257
  - `otwa_destroy_server` — permanently terminate *(servers:destroy)*
258
+ - `otwa_list_snapshots` — list a server's disk snapshots *(servers:read)*
259
+ - `otwa_create_snapshot` — capture a disk snapshot, max 10/server *(servers:write)*
260
+ - `otwa_revert_snapshot` — roll the disk back to a snapshot *(servers:destroy)*
261
+ - `otwa_delete_snapshot` — remove a snapshot *(servers:write)*
169
262
  - `otwa_get_dashboard_sso` — 5-min SSO link to dashboard *(servers:read or account:read)*
170
263
 
171
264
  ### Networking
@@ -184,9 +277,12 @@ Restart your client and ask:
184
277
  - `otwa_create_webhook` *(webhooks:write)*
185
278
  - `otwa_delete_webhook` *(webhooks:write)*
186
279
 
280
+ ### Reseller
281
+ - `otwa_get_reseller_state` — reseller tier, discount, rolling 30-day GMV, next-tier progression *(account:read)*
282
+
187
283
  ## Safety
188
284
 
189
- Destructive tools (`otwa_destroy_server`, `otwa_reinstall_server`) require:
285
+ Destructive tools (`otwa_destroy_server`, `otwa_reinstall_server`, `otwa_revert_snapshot`) require:
190
286
 
191
287
  1. **`confirm: true`** and **`iAcknowledgeDataLoss: true`** in the tool call
192
288
  2. **`expectedLabel`** matching the server's current label (typo-guard, only on destroy)
@@ -7,13 +7,21 @@ Object.defineProperty(exports, "__esModule", { value: true });
7
7
  const express_1 = __importDefault(require("express"));
8
8
  const crypto_1 = require("crypto");
9
9
  const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
10
- const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
11
- const http_1 = require("../client/http");
12
- const _register_1 = require("../tools/_register");
10
+ const server_1 = require("../server");
13
11
  const version_1 = require("../util/version");
14
12
  const PORT = parseInt(process.env.PORT || '3210', 10);
15
13
  const HOST = process.env.HOST || '127.0.0.1';
16
- const API_BASE = (process.env.OTWA_API_BASE?.trim() || 'https://api.otwa.cloud').replace(/\/+$/, '');
14
+ // See note in src/util/env.ts default MUST include the /api globalPrefix.
15
+ const API_BASE = (process.env.OTWA_API_BASE?.trim() || 'https://api.otwa.cloud/api').replace(/\/+$/, '');
16
+ // Public hostname this server is exposed under. Used to build absolute URLs in
17
+ // the RFC 9728 protected-resource metadata and the WWW-Authenticate challenge.
18
+ // Override for staging.
19
+ const PUBLIC_BASE = (process.env.MCP_PUBLIC_BASE?.trim() || 'https://mcp.otwa.cloud').replace(/\/+$/, '');
20
+ // The OAuth 2.0 Authorization Server clients should talk to. This is currently
21
+ // the same otwa-cloud-api host that issues API keys; once the AS endpoints
22
+ // (RFC 8628 device-code + RFC 7591 DCR + RFC 8414 metadata) ship, clients that
23
+ // support OAuth will discover them automatically via the metadata below.
24
+ const OAUTH_AS = (process.env.OTWA_OAUTH_AS?.trim() || 'https://api.otwa.cloud').replace(/\/+$/, '');
17
25
  const app = (0, express_1.default)();
18
26
  app.disable('x-powered-by');
19
27
  app.set('trust proxy', 'loopback');
@@ -22,6 +30,35 @@ const pkg = (0, version_1.packageInfo)();
22
30
  app.get('/healthz', (_req, res) => {
23
31
  res.json({ ok: true, service: pkg.name, version: pkg.version, apiBase: API_BASE });
24
32
  });
33
+ // RFC 9728 OAuth 2.0 Protected Resource Metadata.
34
+ // Announces that this MCP server is an OAuth-protected resource served by the
35
+ // otwa.cloud authorization server. Clients that support OAuth discover the AS
36
+ // here, then fetch its metadata from `${OAUTH_AS}/.well-known/oauth-authorization-server`
37
+ // to learn the device-code + token endpoints.
38
+ //
39
+ // Until the AS endpoints ship, callers using Bearer API keys continue to work
40
+ // unchanged — this metadata document is purely additive.
41
+ const protectedResourceMetadata = () => ({
42
+ resource: `${PUBLIC_BASE}/mcp`,
43
+ authorization_servers: [OAUTH_AS],
44
+ bearer_methods_supported: ['header'],
45
+ scopes_supported: [
46
+ 'account:read',
47
+ 'servers:read', 'servers:write', 'servers:destroy',
48
+ 'billing:read',
49
+ 'webhooks:read', 'webhooks:write',
50
+ ],
51
+ resource_name: '@otwa/mcp-server',
52
+ resource_documentation: 'https://otwa.cloud/docs/integrations/mcp',
53
+ });
54
+ app.get('/.well-known/oauth-protected-resource', (_req, res) => {
55
+ res.set('Cache-Control', 'public, max-age=3600').json(protectedResourceMetadata());
56
+ });
57
+ // Also serve the path-suffixed form some clients try first.
58
+ app.get('/.well-known/oauth-protected-resource/mcp', (_req, res) => {
59
+ res.set('Cache-Control', 'public, max-age=3600').json(protectedResourceMetadata());
60
+ });
61
+ const WWW_AUTH_HEADER = `Bearer realm="otwa-mcp", resource_metadata="${PUBLIC_BASE}/.well-known/oauth-protected-resource"`;
25
62
  app.get('/', (_req, res) => {
26
63
  res.json({
27
64
  name: pkg.name,
@@ -48,7 +85,7 @@ function extractBearer(req) {
48
85
  app.post('/mcp', async (req, res) => {
49
86
  const apiKey = extractBearer(req);
50
87
  if (!apiKey) {
51
- res.status(401).json({
88
+ res.set('WWW-Authenticate', WWW_AUTH_HEADER).status(401).json({
52
89
  jsonrpc: '2.0',
53
90
  error: {
54
91
  code: -32001,
@@ -60,7 +97,7 @@ app.post('/mcp', async (req, res) => {
60
97
  return;
61
98
  }
62
99
  if (!apiKey.startsWith('otwa_')) {
63
- res.status(401).json({
100
+ res.set('WWW-Authenticate', WWW_AUTH_HEADER).status(401).json({
64
101
  jsonrpc: '2.0',
65
102
  error: {
66
103
  code: -32001,
@@ -74,9 +111,11 @@ app.post('/mcp', async (req, res) => {
74
111
  sessionIdGenerator: undefined,
75
112
  enableJsonResponse: true,
76
113
  });
77
- const server = new mcp_js_1.McpServer({ name: pkg.name, version: pkg.version });
78
- const client = new http_1.OtwaClient({ apiKey, apiBase: API_BASE });
79
- (0, _register_1.registerAllTools)(server, client);
114
+ // Capture User-Agent (truncated) as the telemetry client label so the SA
115
+ // dashboard can show "X% Claude Code, Y% Cursor, …" without a separate
116
+ // header. Header is optional + untrusted — only kept as a labelling hint.
117
+ const clientLabel = (req.header('user-agent') || '').slice(0, 200) || null;
118
+ const server = (0, server_1.createServer)({ apiKey, apiBase: API_BASE, telemetry: true }, { transport: 'http', clientLabel });
80
119
  res.on('close', () => {
81
120
  transport.close().catch(() => { });
82
121
  server.close().catch(() => { });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/http/index.ts"],"names":[],"mappings":"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"}
package/dist/server.js CHANGED
@@ -5,7 +5,8 @@ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
5
  const http_1 = require("./client/http");
6
6
  const _register_1 = require("./tools/_register");
7
7
  const version_1 = require("./util/version");
8
- function createServer(env) {
8
+ const telemetry_1 = require("./util/telemetry");
9
+ function createServer(env, opts = {}) {
9
10
  const pkg = (0, version_1.packageInfo)();
10
11
  const server = new mcp_js_1.McpServer({
11
12
  name: pkg.name,
@@ -15,7 +16,16 @@ function createServer(env) {
15
16
  apiKey: env.apiKey,
16
17
  apiBase: env.apiBase,
17
18
  });
18
- (0, _register_1.registerAllTools)(server, client);
19
+ const transport = opts.transport ?? 'stdio';
20
+ const telemetry = (0, telemetry_1.createTelemetry)({
21
+ apiKey: env.apiKey,
22
+ apiBase: env.apiBase,
23
+ transport,
24
+ // Hosted transport always records; stdio respects OTWA_TELEMETRY env opt-in.
25
+ enabled: transport === 'http' ? true : env.telemetry,
26
+ clientLabel: opts.clientLabel ?? null,
27
+ });
28
+ (0, _register_1.registerAllTools)(server, client, telemetry);
19
29
  return server;
20
30
  }
21
31
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;AAMA,oCAcC;AApBD,oEAAoE;AACpE,wCAA2C;AAC3C,iDAAqD;AACrD,4CAA6C;AAG7C,SAAgB,YAAY,CAAC,GAAY;IACvC,MAAM,GAAG,GAAG,IAAA,qBAAW,GAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,iBAAU,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,IAAA,4BAAgB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;AAgBA,oCAwBC;AAxCD,oEAAoE;AACpE,wCAA2C;AAC3C,iDAAqD;AACrD,4CAA6C;AAE7C,gDAAmD;AAWnD,SAAgB,YAAY,CAAC,GAAY,EAAE,OAA4B,EAAE;IACvE,MAAM,GAAG,GAAG,IAAA,qBAAW,GAAE,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,iBAAU,CAAC;QAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;KACrB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;IAC5C,MAAM,SAAS,GAAG,IAAA,2BAAe,EAAC;QAChC,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,SAAS;QACT,6EAA6E;QAC7E,OAAO,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS;QACpD,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;KACtC,CAAC,CAAC;IAEH,IAAA,4BAAgB,EAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAC5C,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,18 +1,54 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.registerAllTools = registerAllTools;
4
+ const telemetry_1 = require("../util/telemetry");
4
5
  const account_1 = require("./account");
5
6
  const billing_1 = require("./billing");
6
7
  const catalog_1 = require("./catalog");
7
8
  const networking_1 = require("./networking");
9
+ const reseller_1 = require("./reseller");
8
10
  const servers_1 = require("./servers");
9
11
  const webhooks_1 = require("./webhooks");
10
- function registerAllTools(server, client) {
12
+ /** Wrap `server.registerTool` so every tool handler is automatically
13
+ * instrumented with start/finish timing + fire-and-forget telemetry.
14
+ * Single integration point — none of the per-surface tool files need
15
+ * to know about telemetry at all. */
16
+ function instrumentRegisterTool(server, telemetry) {
17
+ if (!telemetry.enabled)
18
+ return;
19
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
+ const original = server.registerTool.bind(server);
21
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
22
+ server.registerTool = (name, config, handler) => {
23
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
24
+ const wrapped = async (...args) => {
25
+ const startMs = Date.now();
26
+ try {
27
+ const result = await handler(...args);
28
+ const durationMs = Date.now() - startMs;
29
+ const success = !result?.isError;
30
+ const errorCode = success ? null : (0, telemetry_1.classifyErrorFromResult)(result);
31
+ telemetry.record({ toolName: name, success, errorCode, durationMs });
32
+ return result;
33
+ }
34
+ catch (err) {
35
+ const durationMs = Date.now() - startMs;
36
+ telemetry.record({ toolName: name, success: false, errorCode: 'thrown', durationMs });
37
+ throw err;
38
+ }
39
+ };
40
+ return original(name, config, wrapped);
41
+ };
42
+ }
43
+ function registerAllTools(server, client, telemetry) {
44
+ if (telemetry)
45
+ instrumentRegisterTool(server, telemetry);
11
46
  (0, account_1.registerAccountTools)(server, client);
12
47
  (0, catalog_1.registerCatalogTools)(server, client);
13
48
  (0, servers_1.registerServerTools)(server, client);
14
49
  (0, networking_1.registerNetworkingTools)(server, client);
15
50
  (0, billing_1.registerBillingTools)(server, client);
16
51
  (0, webhooks_1.registerWebhookTools)(server, client);
52
+ (0, reseller_1.registerResellerTools)(server, client);
17
53
  }
18
54
  //# sourceMappingURL=_register.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"_register.js","sourceRoot":"","sources":["../../src/tools/_register.ts"],"names":[],"mappings":";;AASA,4CAOC;AAdD,uCAAiD;AACjD,uCAAiD;AACjD,uCAAiD;AACjD,6CAAuD;AACvD,uCAAgD;AAChD,yCAAkD;AAElD,SAAgB,gBAAgB,CAAC,MAAiB,EAAE,MAAkB;IACpE,IAAA,8BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,8BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,6BAAmB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAA,oCAAuB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,IAAA,8BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,+BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"_register.js","sourceRoot":"","sources":["../../src/tools/_register.ts"],"names":[],"mappings":";;AAyCA,4CAaC;AApDD,iDAAuE;AACvE,uCAAiD;AACjD,uCAAiD;AACjD,uCAAiD;AACjD,6CAAuD;AACvD,yCAAmD;AACnD,uCAAgD;AAChD,yCAAkD;AAElD;;;sCAGsC;AACtC,SAAS,sBAAsB,CAAC,MAAiB,EAAE,SAAoB;IACrE,IAAI,CAAC,SAAS,CAAC,OAAO;QAAE,OAAO;IAC/B,8DAA8D;IAC9D,MAAM,QAAQ,GAAI,MAAc,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3D,8DAA8D;IAC7D,MAAc,CAAC,YAAY,GAAG,CAAC,IAAY,EAAE,MAAW,EAAE,OAAY,EAAE,EAAE;QACzE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;YACvC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;gBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;gBACxC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC;gBACjC,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAA,mCAAuB,EAAC,MAAM,CAAC,CAAC;gBACnE,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,CAAC;gBACrE,OAAO,MAAM,CAAC;YAChB,CAAC;YAAC,OAAO,GAAY,EAAE,CAAC;gBACtB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC;gBACxC,SAAS,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;gBACtF,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC;AAED,SAAgB,gBAAgB,CAC9B,MAAiB,EACjB,MAAkB,EAClB,SAAqB;IAErB,IAAI,SAAS;QAAE,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzD,IAAA,8BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,8BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,6BAAmB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,IAAA,oCAAuB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,IAAA,8BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,+BAAoB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,IAAA,gCAAqB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACxC,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerResellerTools = registerResellerTools;
4
+ const _helpers_1 = require("./_helpers");
5
+ function registerResellerTools(server, client) {
6
+ server.registerTool('otwa_get_reseller_state', {
7
+ title: 'Get reseller program state',
8
+ description: "Returns the caller's reseller program state: whether they're enrolled, " +
9
+ 'current tier and discount percentage, rolling 30-day GMV, next tier ' +
10
+ 'progression (GMV required + remaining), and minimum balance threshold. ' +
11
+ 'Use this when the user asks about their reseller status, commission, ' +
12
+ 'tier, discount, or how close they are to the next tier. Read-only.',
13
+ inputSchema: {},
14
+ }, (0, _helpers_1.safeHandler)(async () => {
15
+ const state = await client.request('/v1/reseller');
16
+ return (0, _helpers_1.jsonResult)(state);
17
+ }));
18
+ }
19
+ //# sourceMappingURL=reseller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reseller.js","sourceRoot":"","sources":["../../src/tools/reseller.ts"],"names":[],"mappings":";;AAKA,sDAkBC;AApBD,yCAAqD;AAErD,SAAgB,qBAAqB,CAAC,MAAiB,EAAE,MAAkB;IACzE,MAAM,CAAC,YAAY,CACjB,yBAAyB,EACzB;QACE,KAAK,EAAE,4BAA4B;QACnC,WAAW,EACT,yEAAyE;YACzE,sEAAsE;YACtE,yEAAyE;YACzE,uEAAuE;YACvE,oEAAoE;QACtE,WAAW,EAAE,EAAE;KAChB,EACD,IAAA,sBAAW,EAAC,KAAK,IAAI,EAAE;QACrB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAwB,cAAc,CAAC,CAAC;QAC1E,OAAO,IAAA,qBAAU,EAAC,KAAK,CAAC,CAAC;IAC3B,CAAC,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -53,6 +53,18 @@ function registerServerTools(server, client) {
53
53
  const stats = await client.request(`/v1/servers/${encodeURIComponent(id)}/stats`);
54
54
  return (0, _helpers_1.jsonResult)(stats);
55
55
  }));
56
+ server.registerTool('otwa_list_snapshots', {
57
+ title: "List a server's snapshots",
58
+ description: "Returns the point-in-time disk snapshots for a server: id, name, createTime, power state when " +
59
+ "taken, and whether it's the current one. Pass a snapshot `id` to otwa_revert_snapshot or " +
60
+ 'otwa_delete_snapshot.',
61
+ inputSchema: {
62
+ id: zod_1.z.string().describe('Server UUID.'),
63
+ },
64
+ }, (0, _helpers_1.safeHandler)(async ({ id }) => {
65
+ const snaps = await client.request(`/v1/servers/${encodeURIComponent(id)}/snapshots`);
66
+ return (0, _helpers_1.jsonResult)(snaps);
67
+ }));
56
68
  // ── Create ──────────────────────────────────────────────────────────────
57
69
  server.registerTool('otwa_create_server', {
58
70
  title: 'Provision a new server',
@@ -108,6 +120,33 @@ function registerServerTools(server, client) {
108
120
  });
109
121
  return (0, _helpers_1.jsonResult)(created);
110
122
  }));
123
+ server.registerTool('otwa_create_snapshot', {
124
+ title: 'Create a server snapshot',
125
+ description: "Captures a point-in-time snapshot of the server's disk (memory not included). Fast and " +
126
+ 'non-destructive — a good restore point to take before a risky change. Max 10 snapshots per ' +
127
+ 'server; if full, delete an old one with otwa_delete_snapshot first.',
128
+ inputSchema: {
129
+ id: zod_1.z.string().describe('Server UUID.'),
130
+ name: zod_1.z
131
+ .string()
132
+ .min(1)
133
+ .max(80)
134
+ .optional()
135
+ .describe('Optional snapshot name. Defaults to a timestamp.'),
136
+ description: zod_1.z
137
+ .string()
138
+ .max(255)
139
+ .optional()
140
+ .describe('Optional description, e.g. "before the kernel upgrade".'),
141
+ },
142
+ }, (0, _helpers_1.safeHandler)(async ({ id, name, description }) => {
143
+ const res = await client.request(`/v1/servers/${encodeURIComponent(id)}/snapshots`, {
144
+ method: 'POST',
145
+ body: { name, description },
146
+ timeoutMs: 120_000,
147
+ });
148
+ return (0, _helpers_1.jsonResult)(res);
149
+ }));
111
150
  // ── Updates ─────────────────────────────────────────────────────────────
112
151
  server.registerTool('otwa_rename_server', {
113
152
  title: 'Rename a server',
@@ -189,6 +228,48 @@ function registerServerTools(server, client) {
189
228
  });
190
229
  return (0, _helpers_1.jsonResult)(res);
191
230
  }));
231
+ server.registerTool('otwa_revert_snapshot', {
232
+ title: 'Revert a server to a snapshot',
233
+ description: "Rolls the server's disk back to a snapshot. DESTRUCTIVE — everything written since the snapshot " +
234
+ 'was taken is lost, and the server may reboot. Requires the API key to carry the ' +
235
+ '`servers:destroy` scope.\n\n' +
236
+ 'SAFETY: Before calling, (1) call otwa_list_snapshots and otwa_get_server and show the user the ' +
237
+ 'target snapshot plus the current label, (2) wait for explicit confirmation in chat, (3) pass ' +
238
+ '`expectedLabel` matching the current label as a typo-guard.',
239
+ inputSchema: {
240
+ id: zod_1.z.string().describe('Server UUID.'),
241
+ snapshotId: zod_1.z
242
+ .string()
243
+ .describe('Snapshot id from otwa_list_snapshots, e.g. "snapshot-1234".'),
244
+ expectedLabel: zod_1.z
245
+ .string()
246
+ .describe("The server's CURRENT label (from otwa_get_server). The call fails if this does not match — " +
247
+ 'a typo-guard against reverting the wrong server.'),
248
+ ...confirm_1.destructiveConfirm,
249
+ },
250
+ }, (0, _helpers_1.safeHandler)(async ({ id, snapshotId, expectedLabel }) => {
251
+ const current = await client.request(`/v1/servers/${encodeURIComponent(id)}`);
252
+ const actualLabel = current.label || '';
253
+ if (actualLabel.trim() !== expectedLabel.trim()) {
254
+ throw new errors_1.OtwaApiError(`Refusing to revert server ${id}: expectedLabel "${expectedLabel}" does not match the current ` +
255
+ `label "${actualLabel}". Re-fetch via otwa_get_server, confirm with the user, and call again.`, 400, 'label_mismatch');
256
+ }
257
+ const res = await client.request(`/v1/servers/${encodeURIComponent(id)}/snapshots/${encodeURIComponent(snapshotId)}/revert`, { method: 'POST', timeoutMs: 120_000 });
258
+ return (0, _helpers_1.jsonResult)(res);
259
+ }));
260
+ server.registerTool('otwa_delete_snapshot', {
261
+ title: 'Delete a server snapshot',
262
+ description: 'Removes a snapshot and frees its delta disk. Non-destructive to your running data — the live ' +
263
+ 'disk is unaffected. Confirm with the user first.',
264
+ inputSchema: {
265
+ id: zod_1.z.string().describe('Server UUID.'),
266
+ snapshotId: zod_1.z.string().describe('Snapshot id from otwa_list_snapshots.'),
267
+ ...confirm_1.mediumConfirm,
268
+ },
269
+ }, (0, _helpers_1.safeHandler)(async ({ id, snapshotId }) => {
270
+ const res = await client.request(`/v1/servers/${encodeURIComponent(id)}/snapshots/${encodeURIComponent(snapshotId)}`, { method: 'DELETE', timeoutMs: 120_000 });
271
+ return (0, _helpers_1.jsonResult)(res);
272
+ }));
192
273
  server.registerTool('otwa_destroy_server', {
193
274
  title: 'Permanently destroy a server',
194
275
  description: 'Terminates a server permanently. Disk is wiped, IPs are released, billing stops. CANNOT BE ' +
@@ -1 +1 @@
1
- {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../src/tools/servers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"servers.js","sourceRoot":"","sources":["../../src/tools/servers.ts"],"names":[],"mappings":"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"}
package/dist/util/env.js CHANGED
@@ -11,7 +11,11 @@ function readEnv() {
11
11
  throw new Error('OTWA_API_KEY does not look like an otwa.cloud API key (expected prefix "otwa_"). ' +
12
12
  'Generate a new key at https://otwa.cloud/dashboard/settings/api-keys.');
13
13
  }
14
- const apiBase = (process.env.OTWA_API_BASE?.trim() || 'https://api.otwa.cloud').replace(/\/+$/, '');
14
+ // otwa-cloud-api uses NestJS setGlobalPrefix('api'), so the public surface is
15
+ // https://api.otwa.cloud/api/v1/*. The default below must include the prefix
16
+ // or every tool call 404s. v0.1.x shipped with the prefix missing — that bug
17
+ // is closed here. Override via OTWA_API_BASE for staging / dev only.
18
+ const apiBase = (process.env.OTWA_API_BASE?.trim() || 'https://api.otwa.cloud/api').replace(/\/+$/, '');
15
19
  const telemetry = /^(1|true|yes)$/i.test(process.env.OTWA_TELEMETRY?.trim() || '');
16
20
  return { apiKey, apiBase, telemetry };
17
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":";;AAMA,0BAiBC;AAjBD,SAAgB,OAAO;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,wFAAwF;YACtF,8EAA8E,CACjF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,mFAAmF;YACjF,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpG,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC"}
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/util/env.ts"],"names":[],"mappings":";;AAMA,0BAqBC;AArBD,SAAgB,OAAO;IACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IACtD,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,wFAAwF;YACtF,8EAA8E,CACjF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,KAAK,CACb,mFAAmF;YACjF,uEAAuE,CAC1E,CAAC;IACJ,CAAC;IACD,8EAA8E;IAC9E,6EAA6E;IAC7E,6EAA6E;IAC7E,qEAAqE;IACrE,MAAM,OAAO,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,4BAA4B,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACxG,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC"}
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ /** Optional fire-and-forget telemetry for MCP tool calls.
3
+ *
4
+ * Hosted transport (mcp.otwa.cloud) always records — we already see every
5
+ * request server-side, logging metadata to our own DB has no privacy delta.
6
+ *
7
+ * Stdio transport is OFF by default and only records when the user sets
8
+ * OTWA_TELEMETRY=1. Stdio runs on the user's machine and we want to be a
9
+ * good neighbour — no surprise network calls per tool invocation. */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.createTelemetry = createTelemetry;
12
+ exports.classifyErrorFromResult = classifyErrorFromResult;
13
+ exports.classifyErrorFromException = classifyErrorFromException;
14
+ const errors_1 = require("../client/errors");
15
+ function createTelemetry(opts) {
16
+ if (!opts.enabled) {
17
+ return {
18
+ enabled: false,
19
+ transport: opts.transport,
20
+ record: () => undefined,
21
+ };
22
+ }
23
+ const url = `${opts.apiBase.replace(/\/+$/, '')}/v1/integrations/mcp/usage`;
24
+ const headers = {
25
+ 'content-type': 'application/json',
26
+ authorization: `Bearer ${opts.apiKey}`,
27
+ };
28
+ return {
29
+ enabled: true,
30
+ transport: opts.transport,
31
+ record: (event) => {
32
+ const body = JSON.stringify({
33
+ toolName: event.toolName,
34
+ transport: opts.transport,
35
+ success: event.success,
36
+ errorCode: event.errorCode ?? undefined,
37
+ durationMs: event.durationMs,
38
+ clientLabel: opts.clientLabel ?? undefined,
39
+ });
40
+ // Fire-and-forget. We never await this — the tool result must never be
41
+ // delayed by telemetry. We swallow errors entirely; one missed log row
42
+ // is cheaper than surfacing infrastructure noise to the LLM.
43
+ void fetch(url, { method: 'POST', headers, body, signal: AbortSignal.timeout(2_000) })
44
+ .catch(() => undefined);
45
+ },
46
+ };
47
+ }
48
+ /** Read the error_code from an `isError: true` CallToolResult so we can bucket
49
+ * failures meaningfully in the dashboard (forbidden / not_found / rate_limited
50
+ * / etc) rather than just counting "failed".
51
+ * Returns null if the failure didn't come from OtwaApiError (e.g. a generic
52
+ * JS throw inside the handler). */
53
+ function classifyErrorFromResult(result) {
54
+ if (!result || typeof result !== 'object')
55
+ return null;
56
+ const r = result;
57
+ if (!r.isError)
58
+ return null;
59
+ // We re-classify by message string because OtwaApiError instances are lost
60
+ // by the time safeHandler has stringified them into the content array. The
61
+ // strings are fixed in errors.ts so this stays accurate.
62
+ const text = r.content?.[0]?.text || '';
63
+ if (text.includes('OTWA_API_KEY is invalid'))
64
+ return 'unauthorized';
65
+ if (text.includes('missing a required scope') || text.includes('missing required scope'))
66
+ return 'forbidden';
67
+ if (text.includes('Account balance is too low'))
68
+ return 'payment_required';
69
+ if (text.includes('Resource not found') || text.startsWith('Not found'))
70
+ return 'not_found';
71
+ if (text.startsWith('Conflict'))
72
+ return 'conflict';
73
+ if (text.startsWith('Validation failed'))
74
+ return 'validation_failed';
75
+ if (text.includes('Rate-limited'))
76
+ return 'rate_limited';
77
+ if (text.includes('otwa-cloud-api returned 5'))
78
+ return 'upstream_error';
79
+ return 'error';
80
+ }
81
+ /** Stamp a tool name onto an OtwaApiError-derived classification, only used
82
+ * when an exception leaks past safeHandler. */
83
+ function classifyErrorFromException(err) {
84
+ if (err instanceof errors_1.OtwaApiError)
85
+ return err.code;
86
+ return 'thrown';
87
+ }
88
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/util/telemetry.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@otwa/mcp-server",
3
- "version": "0.1.1",
4
- "description": "Official Model Context Protocol server for otwa.cloud — provision and manage servers from Claude Code, Cursor, Windsurf and other MCP-capable AI tools.",
3
+ "version": "0.4.0",
4
+ "description": "Official Model Context Protocol server for otwa.cloud — provision and manage servers from Claude Code, Claude Desktop, Cursor, Windsurf, VS Code, Zed, Continue, OpenCode and other MCP-capable AI tools.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://otwa.cloud/docs/integrations/mcp",
7
7
  "repository": {
@@ -49,7 +49,8 @@
49
49
  "@types/express": "^4.17.21",
50
50
  "@types/node": "^22.0.0",
51
51
  "tsx": "^4.19.0",
52
- "typescript": "^5.7.2"
52
+ "typescript": "^5.7.2",
53
+ "vitest": "^4.0.0"
53
54
  },
54
55
  "scripts": {
55
56
  "dev": "tsx watch src/index.ts",
@@ -58,6 +59,8 @@
58
59
  "start:http": "node dist/http/index.js",
59
60
  "build": "tsc -p tsconfig.json",
60
61
  "type-check": "tsc -p tsconfig.json --noEmit",
62
+ "test": "tsc -p tsconfig.test.json && vitest run",
63
+ "test:watch": "vitest",
61
64
  "clean": "rm -rf dist"
62
65
  }
63
66
  }