@boomstream/mcp 0.1.0 → 0.1.2

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 CHANGED
@@ -25,6 +25,31 @@ npm install -g @boomstream/mcp
25
25
  BOOMSTREAM_API_KEY=your-key boomstream-mcp
26
26
  ```
27
27
 
28
+ ## Available tools
29
+
30
+ <!-- TOOLS:BEGIN -->
31
+ | Section | Tools | Description | Examples |
32
+ |---|---:|---|---|
33
+ | media | 5 | Recorded media (VOD): info, create, upload, bulk-info | `boomstream_media_bulkinfo`, `boomstream_media_info` |
34
+ | live | 7 | Live broadcast streams: create, manage, schedule | `boomstream_live_info`, `boomstream_live_list` |
35
+ | ppv | 13 | Pay-per-view subscriptions: create, buyers, media access | `boomstream_ppv_create`, `boomstream_ppv_update` |
36
+ | conference | 9 | Video conference sessions: create, manage, participants | `boomstream_conference_info`, `boomstream_conference_list` |
37
+ | folder | 12 | Folder hierarchy for organizing media assets | `boomstream_folder_media_folder`, `boomstream_folder_media_folder_create` |
38
+ | playlist | 7 | Playlists of media items: create, update, reorder | `boomstream_playlist_create`, `boomstream_playlist_update` |
39
+ | stats | 3 | Viewing statistics per project, target, or session | `boomstream_stats_project`, `boomstream_stats_target` |
40
+ | chat | 5 | Chat settings and messages for broadcasts | `boomstream_chat_init`, `boomstream_chat_info` |
41
+ | screenshot | 4 | Thumbnail and screenshot management for media | `boomstream_screenshot_info`, `boomstream_screenshot_create` |
42
+ | subtitles | 5 | Subtitle tracks: enable, upload, set default | `boomstream_subtitles_enable`, `boomstream_subtitles_info` |
43
+ | timecodes | 3 | Chapter/timecode markers for video navigation | `boomstream_timecodes_info`, `boomstream_timecodes_enable` |
44
+ | webhooks | 6 | Webhook endpoint management: list, create, update, delete | `boomstream_webhooks_list`, `boomstream_webhooks_info` |
45
+ | project | 5 | Project-level settings, users, and configuration | `boomstream_project_create`, `boomstream_project_info` |
46
+ | record_live | 9 | Record-live sessions: create and manage recordings | `boomstream_record_live_info`, `boomstream_record_live_list` |
47
+ | live_ipcamera | 7 | IP camera stream integration for live broadcasts | `boomstream_live_ipcamera_info`, `boomstream_live_ipcamera_list` |
48
+ | general | 1 | General API utilities (server info, capabilities) | `boomstream_general_info` |
49
+ <!-- TOOLS:END -->
50
+
51
+ The full schema is in `schemas/boomstream.json`. Regenerate with `pnpm build-schema`.
52
+
28
53
  ## Claude Desktop
29
54
 
30
55
  Add to your Claude Desktop config file:
@@ -68,6 +93,64 @@ boomstream-mcp --help, -h Show help
68
93
 
69
94
  JSONSchema for each tool is **not hand-written**. The source of truth is the Boomstream API documentation database (`hwdmedia.documents`). The script `scripts/build-schema.mjs` parses the markdown and produces `schemas/boomstream.json` covering all ~100 methods in a single run. The generated file is committed to the repository and shipped in the npm package.
70
95
 
96
+ ## Development
97
+
98
+ ```bash
99
+ pnpm install # install dependencies
100
+ pnpm dev:stdio # run server locally (stdio transport)
101
+ pnpm test # run unit/integration tests (vitest)
102
+ pnpm build-schema # regenerate schemas/boomstream.json from markdown corpus
103
+ pnpm build-readme-tools # regenerate the Available tools table in this README
104
+ pnpm build # TypeScript compile → dist/
105
+ pnpm test:smoke # end-to-end smoke cycle (requires BOOMSTREAM_TEST_API_KEY)
106
+ ```
107
+
108
+ Offline test runs use fixtures in `tests/fixtures/`. To pull a fresh schema from the database, run `pnpm build-schema:db` (requires the `mariadb-mcp` MCP server).
109
+
110
+ To run the smoke cycle you need:
111
+ - `BOOMSTREAM_TEST_API_KEY` — a sandbox project API key. Source of record: paperclip secret vault (audited, rotatable) for agent runs, mirrored into `~/.config/boomstream-ai.env` on the operator machine for manual `pnpm test:smoke` runs. **Never paste this value into chat, comments, commit messages, or PR descriptions.** The underlying sandbox project is operator-provisioned and intentionally not advertised publicly. Future hardening (dedicated `boomstream-mcp-sandbox` project + `application_keys.allow=read` scoping) is tracked separately and will land after the Phase B SSE kickoff.
112
+ - `BOOMSTREAM_TEST_MEDIA_CODE` — a known media code in that sandbox project. Same delivery channels as the apikey.
113
+
114
+ ## Troubleshooting
115
+
116
+ **`BOOMSTREAM_API_KEY` is not set**
117
+
118
+ The server exits immediately with:
119
+ ```
120
+ Error: BOOMSTREAM_API_KEY env required for Phase A
121
+ ```
122
+ Set it before starting:
123
+ ```bash
124
+ BOOMSTREAM_API_KEY=your-key npx -y @boomstream/mcp stdio
125
+ # or in Claude Desktop config under "env": { "BOOMSTREAM_API_KEY": "…" }
126
+ ```
127
+
128
+ **Network timeout or 5xx from `boomstream.com/api/`**
129
+
130
+ The client retries up to 3 times with exponential backoff (100 ms → 400 ms → 1 600 ms). If all attempts fail, the tool returns an error. Check your network connectivity and `boomstream.com` status.
131
+
132
+ **Invalid API key (401/403)**
133
+
134
+ Verify your key in Boomstream project settings → API. Keys are project-scoped; make sure the key matches the project you intend to query.
135
+
136
+ **Claude Desktop doesn't list any Boomstream tools**
137
+
138
+ 1. Check the MCP server logs:
139
+ - macOS: `~/Library/Logs/Claude/mcp*.log`
140
+ - Windows: `%APPDATA%\Claude\logs\`
141
+ 2. Confirm `BOOMSTREAM_API_KEY` is set in the `env` block of your `claude_desktop_config.json`.
142
+ 3. Restart Claude Desktop after any config change.
143
+ 4. Run the server manually to verify it starts without errors:
144
+ ```bash
145
+ BOOMSTREAM_API_KEY=your-key npx -y @boomstream/mcp stdio
146
+ ```
147
+
148
+ ## Roadmap
149
+
150
+ **Phase B — SSE transport** (`mcp.boomstream.com`): hosted remote server compatible with claude.ai and other SSE-capable MCP clients. No local install required; connect by URL. Coming soon.
151
+
152
+ **Phase C — OAuth**: per-user authentication so each Boomstream account holder can connect with their own credentials instead of a shared environment API key. Coming soon.
153
+
71
154
  ## License
72
155
 
73
156
  MIT — see [LICENSE](LICENSE).
@@ -2,4 +2,5 @@ import type { ToolSchema } from './schema.js';
2
2
  export declare class ApiError extends Error {
3
3
  constructor(message: string);
4
4
  }
5
+ export declare function redactSecrets(value: unknown): unknown;
5
6
  export declare function execute(schema: ToolSchema, args: Record<string, unknown>, apikey: string): Promise<unknown>;
@@ -10,6 +10,29 @@ const BACKOFF_MS = [100, 400, 1600];
10
10
  const MAX_ATTEMPTS = 3;
11
11
  const TIMEOUT_MS = 30_000;
12
12
  const xmlParser = new XMLParser({ ignoreAttributes: false });
13
+ // Patterns covering the query-param secrets the upstream API echoes back in RequestURI.
14
+ const SECRET_PARAMS_RE = /\b(apikey|token|signature)=([^&\s"'<>]+)/gi;
15
+ const AUTH_BEARER_RE = /\bAuthorization:\s*Bearer\s+\S+/gi;
16
+ export function redactSecrets(value) {
17
+ if (typeof value === 'string') {
18
+ return value
19
+ .replace(SECRET_PARAMS_RE, (_, param) => `${param}=REDACTED`)
20
+ .replace(AUTH_BEARER_RE, 'Authorization: Bearer REDACTED');
21
+ }
22
+ if (Array.isArray(value)) {
23
+ return value.map(redactSecrets);
24
+ }
25
+ if (value !== null && typeof value === 'object') {
26
+ const out = {};
27
+ for (const [k, v] of Object.entries(value)) {
28
+ if (k === 'RequestURI')
29
+ continue; // upstream debug echo — useless to LLM, drop outright
30
+ out[k] = redactSecrets(v);
31
+ }
32
+ return out;
33
+ }
34
+ return value;
35
+ }
13
36
  async function parseResponse(response) {
14
37
  const contentType = response.headers.get('content-type') ?? '';
15
38
  const text = await response.text();
@@ -29,10 +52,10 @@ async function parseResponse(response) {
29
52
  typeof parsed === 'object' &&
30
53
  'Status' in parsed &&
31
54
  parsed.Status === 'Failed') {
32
- const message = String(parsed.Message ?? 'API request failed');
33
- throw new ApiError(message);
55
+ const rawMessage = String(parsed.Message ?? 'API request failed');
56
+ throw new ApiError(redactSecrets(rawMessage));
34
57
  }
35
- return parsed;
58
+ return redactSecrets(parsed);
36
59
  }
37
60
  function sleep(ms) {
38
61
  return new Promise((resolve) => setTimeout(resolve, ms));
@@ -1 +1 @@
1
- {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/core/api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;AACpC,MAAM,YAAY,GAAG,CAAC,CAAC;AACvB,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;AAE7D,KAAK,UAAU,aAAa,CAAC,QAAkB;IAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,IAAI,MAAe,CAAC;IACpB,IAAI,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAChF,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,IACE,MAAM,KAAK,IAAI;QACf,OAAO,MAAM,KAAK,QAAQ;QAC1B,QAAQ,IAAK,MAAiB;QAC7B,MAAkC,CAAC,MAAM,KAAK,QAAQ,EACvD,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAE,MAAkC,CAAC,OAAO,IAAI,oBAAoB,CAAC,CAAC;QAC5F,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAkB,EAClB,IAA6B,EAC7B,MAAc;IAEd,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;IACpD,MAAM,OAAO,GAAG,yBAAyB,MAAM,CAAC,QAAQ,EAAE,CAAC;IAE3D,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,YAAY,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,MAAM,KAAK,CAAC,UAAU,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAC/C,IAAI,QAAkB,CAAC;YAEvB,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,EAAE,CAAC;gBAChC,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;gBACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;wBAAE,SAAS;oBACpD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzB,KAAK,MAAM,IAAI,IAAI,KAAK;4BAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;oBAC7D,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACjC,CAAC;gBACH,CAAC;gBACD,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACxE,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;gBAC1D,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE;oBAC9B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,MAAM;iBACP,CAAC,CAAC;YACL,CAAC;YAED,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,0BAA0B,CAAC,CAAC;gBACjG,SAAS,GAAG,IAAI,QAAQ,CAAC,sBAAsB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAClE,SAAS;YACX,CAAC;YAED,OAAO,MAAM,aAAa,CAAC,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,QAAQ;gBAAE,MAAM,GAAG,CAAC;YACvC,MAAM,YAAY,GAChB,GAAG,YAAY,YAAY,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;YAC5F,IAAI,YAAY;gBAAE,MAAM,GAAG,CAAC;YAC5B,SAAS,GAAG,GAAG,CAAC;YAChB,MAAM,CAAC,IAAI,CACT;gBACE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACpD,OAAO,EAAG,GAA4C,EAAE,KAAK,EAAE,IAAI;gBACnE,OAAO;gBACP,IAAI,EAAE,MAAM,CAAC,IAAI;aAClB,EACD,2BAA2B,CAC5B,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/core/api-client.ts"],"names":[],"mappings":"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"}
@@ -10,7 +10,8 @@ function getVersion() {
10
10
  const pkg = JSON.parse(readFileSync(resolve(__dirname, '../../package.json'), 'utf8'));
11
11
  return pkg.version;
12
12
  }
13
- catch {
13
+ catch (err) {
14
+ process.stderr.write(`warn: could not read package.json version: ${String(err)}\n`);
14
15
  return 'unknown';
15
16
  }
16
17
  }
@@ -38,15 +39,22 @@ Claude Desktop config:
38
39
 
39
40
  Environment:
40
41
  BOOMSTREAM_API_KEY Your Boomstream API key (required)`.trim();
41
- const [cmd] = process.argv.slice(2);
42
- if (cmd === '--version' || cmd === '-v') {
43
- process.stdout.write(getVersion() + '\n');
42
+ const argv = process.argv.slice(2);
43
+ // Scan all args so flags work regardless of position (e.g. `stdio --help`)
44
+ if (argv.includes('--help') || argv.includes('-h')) {
45
+ process.stdout.write(HELP + '\n');
44
46
  process.exit(0);
45
47
  }
46
- if (cmd === '--help' || cmd === '-h') {
47
- process.stdout.write(HELP + '\n');
48
+ if (argv.includes('--version') || argv.includes('-v')) {
49
+ process.stdout.write(getVersion() + '\n');
48
50
  process.exit(0);
49
51
  }
52
+ const [cmd, ...rest] = argv;
53
+ if (rest.length > 0) {
54
+ process.stderr.write(`Unknown arguments: ${rest.join(' ')}\n`);
55
+ process.stderr.write('Run with --help for usage.\n');
56
+ process.exit(1);
57
+ }
50
58
  if (cmd !== undefined && cmd !== 'stdio') {
51
59
  process.stderr.write(`Unknown command: ${cmd}\n`);
52
60
  process.stderr.write('Run with --help for usage.\n');
@@ -55,10 +63,16 @@ if (cmd !== undefined && cmd !== 'stdio') {
55
63
  if (!process.env.BOOMSTREAM_API_KEY) {
56
64
  process.stderr.write('Error: BOOMSTREAM_API_KEY environment variable is not set.\n' +
57
65
  'Set it to your Boomstream API key and retry.\n' +
58
- 'Example: BOOMSTREAM_API_KEY=your-key npx @boomstream/mcp stdio\n');
66
+ 'Example: BOOMSTREAM_API_KEY=your-key npx -y @boomstream/mcp stdio\n');
59
67
  process.exit(1);
60
68
  }
61
69
  const server = createServer();
62
70
  const transport = new StdioServerTransport();
63
- await server.connect(transport);
71
+ try {
72
+ await server.connect(transport);
73
+ }
74
+ catch (err) {
75
+ process.stderr.write(`Error: failed to start MCP server: ${String(err)}\n`);
76
+ process.exit(1);
77
+ }
64
78
  //# sourceMappingURL=stdio.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC,CACxC,CAAC;QACzB,OAAO,GAAG,CAAC,OAAO,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;0DAuB6C,CAAC,IAAI,EAAE,CAAC;AAElE,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEpC,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;IACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;IACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACrD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,8DAA8D;QAC5D,gDAAgD;QAChD,kEAAkE,CACrE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC;AAC9B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/transports/stdio.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@boomstream/mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "MCP server providing Boomstream API as tools for LLM agents",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -46,11 +46,11 @@
46
46
  "build-schema": "node scripts/build-schema.mjs",
47
47
  "build-schema:dry": "node scripts/build-schema.mjs --dry-run",
48
48
  "build-schema:db": "node scripts/build-schema.mjs --from-db",
49
+ "build-readme-tools": "node scripts/build-readme-tools.mjs",
49
50
  "dev:stdio": "tsx src/transports/stdio.ts",
50
- "dev:sse": "tsx src/transports/sse.ts",
51
51
  "test": "vitest run",
52
52
  "test:watch": "vitest",
53
- "test:smoke": "echo 'TBD: requires BOOMSTREAM_API_KEY'",
53
+ "test:smoke": "vitest run --dir tests/smoke",
54
54
  "lint": "eslint .",
55
55
  "typecheck": "tsc --noEmit"
56
56
  }