@okostream/mcp 0.5.2 → 0.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.4 - 2026-07-10
4
+
5
+ - Separated NMO from the standard webinar workflow throughout instructions, resources, prompts, README, and the companion skill.
6
+ - Marked NMO as an unfinished special MVP mode that must only be enabled after an explicit organizer request and limitation disclosure.
7
+ - Documented the current NMO gaps: hardened email-link/strict single-device, checkpoint auto-close, official portal integration, and remaining Sprint 2 UX/automation.
8
+ - Added protocol assertions preventing future onboarding from silently presenting NMO as a normal production-ready webinar option.
9
+
10
+ ## 0.5.3 - 2026-07-10
11
+
12
+ - Added an explicit product model: OKO wraps an organizer-supplied video player and does not host or start the underlying stream.
13
+ - Added `oko://guide/nmo` and `oko://guide/telegram` for the complete NMO/CME and Telegram claim/publication workflows.
14
+ - Documented form-button precedence, MCP product boundaries, and the Telegram auto-reminder limitation.
15
+ - Updated the README and companion skill, and added protocol coverage for all seven onboarding resources.
16
+
3
17
  ## 0.5.2 - 2026-07-10
4
18
 
5
19
  - Fixed webinar create/duplicate output schemas so successful writes cannot be reported as protocol failures.
package/README.md CHANGED
@@ -52,6 +52,12 @@ OKO_IMAGE_ROOTS=/trusted/assets:/another/trusted/folder
52
52
 
53
53
  Node.js 20.18.1 or newer is required.
54
54
 
55
+ ## What OKO Does
56
+
57
+ OKO is a webinar experience and operations layer, not a video-streaming host. The organizer supplies a YouTube, iframe, or other player URL; OKO adds the event page, configurable audience blocks, chat, analytics, and NMO attendance controls around it. Start/End tools control analytics sessions only, never the underlying video stream.
58
+
59
+ Standard webinars are the default supported workflow. NMO is a separate unfinished MVP mode and must be enabled only on an explicit organizer request after reviewing `oko://guide/nmo`; it is not a normal option inferred from a medical topic or audience.
60
+
55
61
  ## Security Model
56
62
 
57
63
  - Each API key exchanges into its own Firebase identity `mcp_<keyId>`; it never inherits platform-owner claims from the organizer account.
@@ -78,7 +84,7 @@ Every tool returns JSON text plus MCP `structuredContent`. List-like tools use b
78
84
  The server also exposes MCP-native onboarding:
79
85
 
80
86
  - `instructions` on initialize with the supported webinar creation flow and product invariants.
81
- - Resources: `oko://guide/create-webinar`, `oko://guide/platform`, `oko://guide/security`, `oko://schema/event`, `oko://capabilities`.
87
+ - Resources: `oko://guide/create-webinar`, `oko://guide/platform`, `oko://guide/security`, `oko://guide/nmo`, `oko://schema/event`, `oko://guide/telegram`, `oko://capabilities`.
82
88
  - Prompts: `create_webinar_from_brief`, `audit_event_setup`, `prepare_session_report`.
83
89
 
84
90
  This package is published as source-available runtime distribution for OKO customers. `license: UNLICENSED` means all rights reserved unless a separate agreement says otherwise.
@@ -157,7 +163,7 @@ Dangerous or external side-effect tools require `confirm: true`.
157
163
  10. `oko_get_session_report` should return markdown and structured session data for a completed session.
158
164
  11. `oko_list_notifications` -> `oko_mark_notifications_read` should read and clear an own disposable notification.
159
165
  12. `oko_get_analytics` should read an existing event with analytics sessions.
160
- 13. MCP protocol smoke should report 59 tools, 5 resources, 3 prompts, and non-empty initialize instructions.
166
+ 13. MCP protocol smoke should report 59 tools, 7 resources, 3 prompts, and non-empty initialize instructions.
161
167
 
162
168
  CLI help:
163
169
 
package/dist/guides.js CHANGED
@@ -1,6 +1,9 @@
1
1
  import { z } from "zod";
2
2
  export const OKO_MCP_INSTRUCTIONS = [
3
3
  "You are controlling OKO Stream as an organizer through MCP tools.",
4
+ "OKO is a webinar experience and operations layer, not a video-streaming host. The organizer supplies a YouTube, iframe, or other player URL; OKO adds the event page, audience blocks, chat, analytics, and NMO attendance controls around it.",
5
+ "Use the source player or encoder to start video. In OKO, Start and End manage analytics sessions only, while blocks and chat control the attendee experience around the supplied video.",
6
+ "Default to a standard webinar. NMO is a separate unfinished MVP mode, not a normal webinar option: never infer or enable it from the audience or topic. Use it only after the organizer explicitly requests NMO and accepts the current limitations in oko://guide/nmo.",
4
7
  "Start every new workspace session with oko_whoami, then respect the returned scopes.",
5
8
  "OKO events have no draft/live/ended status. Start/End controls manage analytics sessions only, never video streaming.",
6
9
  "For webinar creation, prefer this flow: oko_create_webinar, oko_configure_blocks, oko_configure_cards, image uploads, oko_validate_event_setup, then return public/setup/analytics links.",
@@ -24,13 +27,14 @@ const GUIDE_RESOURCES = [
24
27
  "1. Call `oko_whoami` and inspect scopes.",
25
28
  "2. If the workspace is unclear, call `oko_list_workspaces`.",
26
29
  "3. Call `oko_create_webinar` with title/date/workspace and video URL when known.",
27
- "4. Call `oko_configure_blocks` for video, forms, CTA, banner, Telegram, and NMO settings.",
30
+ "4. Call `oko_configure_blocks` for video, forms, CTA, banner, and Telegram settings.",
28
31
  "5. Call `oko_configure_cards` with stable card ids before uploading card images.",
29
32
  "6. Upload images with `oko_upload_card_images_batch` or `oko_upload_image`, then wait for variants.",
30
33
  "7. Call `oko_validate_event_setup` and fix blocking findings.",
31
34
  "8. Return public, setup, analytics, registration, and login links that apply to the event.",
32
35
  "",
33
36
  "Important: OKO has no event status. Do not invent draft/live/ended lifecycle states.",
37
+ "NMO is not part of this standard workflow. If the organizer explicitly requests the separate NMO MVP mode, read `oko://guide/nmo`, disclose its current limitations, and follow that workflow separately.",
34
38
  ].join("\n"),
35
39
  },
36
40
  {
@@ -41,6 +45,9 @@ const GUIDE_RESOURCES = [
41
45
  text: [
42
46
  "# OKO Platform Invariants",
43
47
  "",
48
+ "## Product model",
49
+ "OKO does not host or encode video. An organizer brings a video source such as YouTube or an iframe player. OKO builds the webinar experience around that source: an event page, configurable blocks, cards, forms, chat, analytics, and NMO attendance controls. Starting the source video happens outside OKO; starting an OKO session starts analytics only.",
50
+ "",
44
51
  "- OKO events have no `draft`, `live`, or `ended` status field.",
45
52
  "- Public event pages render whenever the event exists and normal access rules allow it.",
46
53
  "- Start and End controls manage analytics sessions only; they never start or stop the video stream.",
@@ -50,6 +57,41 @@ const GUIDE_RESOURCES = [
50
57
  "- Image variants are asynchronous. A master upload is not fully ready until `imageVariants` are present.",
51
58
  ].join("\n"),
52
59
  },
60
+ {
61
+ name: "oko_mcp_nmo",
62
+ uri: "oko://guide/nmo",
63
+ title: "NMO Mode (Special MVP Workflow)",
64
+ description: "Separate unfinished NMO mode: current MVP workflow, limits, participants, checkpoints, and technical results.",
65
+ text: [
66
+ "# NMO Mode (Special MVP Workflow)",
67
+ "",
68
+ "NMO is a separate, unfinished MVP mode for attendance-controlled medical education webinars. It is not part of a standard OKO webinar and must never be enabled because the audience happens to be doctors or the topic is medical. Proceed only when the organizer explicitly requests NMO and understands the limitations below.",
69
+ "",
70
+ "## Current limits",
71
+ "- The hardened email-link login and strict instant single-device enforcement are not finished.",
72
+ "- Checkpoint timeout does not auto-close the checkpoint; the organizer must close it manually.",
73
+ "- OKO is not integrated with the official NMO portal and does not issue an official credit or certificate.",
74
+ "- Sprint 2 operator UX and automation remain incomplete. Treat this as a controlled pilot workflow, not a default production promise.",
75
+ "",
76
+ "Within those limits, OKO can record technical eligibility from watch-time and checkpoint ratios. The organizer remains responsible for participant communication, identity assurance, accreditation, and the decision to use the mode.",
77
+ "",
78
+ "## Available MVP workflow",
79
+ "1. Create the event with its video source, then call `oko_configure_blocks` with `nmo.enabled:true`, watch-time and checkpoint criteria, and optional position/organization fields.",
80
+ "2. Add approved participants with `oko_add_nmo_participant` or bulk-import them with `oko_import_nmo_participants`. Inspect per-row import failures before continuing.",
81
+ "3. Return the event's registration and login links to participants. NMO access is gated by the imported participant list.",
82
+ "4. Call `oko_validate_event_setup`; an NMO event without participants or valid criteria is not ready.",
83
+ "",
84
+ "## During the webinar",
85
+ "1. Call `oko_start_session` when attendance analytics should begin. This does not start the supplied video stream.",
86
+ "2. At the organizer's explicit request, call `oko_launch_checkpoint` with `confirm:true`, then call `oko_close_checkpoint` with fresh confirmation when the response window must close.",
87
+ "3. Use `oko_get_live_state` and participant/analytics reads to monitor the live session. Never launch or close a checkpoint silently.",
88
+ "",
89
+ "## After the webinar",
90
+ "1. End the analytics session only after explicit organizer confirmation.",
91
+ "2. Use `oko_get_session_report` or `oko_get_analytics` with NMO rows when detailed technical attendance results are needed.",
92
+ "3. Report watch-time and checkpoint results only as technical OKO evidence. Do not present the NMO mode as complete or promise an official credit, certificate, strict identity proof, or production readiness.",
93
+ ].join("\n"),
94
+ },
53
95
  {
54
96
  name: "oko_mcp_security",
55
97
  uri: "oko://guide/security",
@@ -109,9 +151,36 @@ const GUIDE_RESOURCES = [
109
151
  "- `nmoMode`, `nmoCriteria`, `participantUids`: NMO mode and participant gates.",
110
152
  "- `workspaceId` plus capability arrays (`accessibleBy`, `editors`, `deleters`, `liveControllers`, `chatModerators`, `sessionManagers`, `analyticsViewers`, `reportDownloaders`, `notificationSenders`) are Admin-owned access mirrors.",
111
153
  "",
154
+ "## Button targets and forms",
155
+ "A `formId` on a CTA, banner, or card button opens that event-level lead form in a popup instead of navigating away. Use `buttonUrl` only when the button should navigate to a URL. Although legacy data can contain both, set exactly one target in new MCP writes; `formId` takes precedence in the attendee UI.",
156
+ "",
112
157
  "Do not remove unknown fields or write access mirrors. Use dedicated MCP tools instead of whole-document rewrites.",
113
158
  ].join("\n"),
114
159
  },
160
+ {
161
+ name: "oko_mcp_telegram",
162
+ uri: "oko://guide/telegram",
163
+ title: "Connect Telegram and Publish Webinar Posts",
164
+ description: "Claim a Telegram channel, connect it to an event, and publish or schedule posts safely.",
165
+ text: [
166
+ "# Connect Telegram and Publish Webinar Posts",
167
+ "",
168
+ "## Claim a channel",
169
+ "1. Add `@OKOStreamBot` to the Telegram channel as an administrator with permission to post.",
170
+ "2. The bot provides a claim code for that channel. Copy it exactly; do not invent a channel ID.",
171
+ "3. Call `oko_claim_telegram_channel` with the claim code, optional workspace ids, and `confirm:true`.",
172
+ "4. Call `oko_list_telegram_channels` and choose a channel by its returned title and id.",
173
+ "5. Call `oko_configure_blocks` with `telegramChannelIds` to connect the claimed channel to an event.",
174
+ "",
175
+ "## Publish safely",
176
+ "1. Use `oko_publish_telegram_post` with the event id, returned channel id, caption, optional image/button, and `confirm:true`.",
177
+ "2. Include `scheduleAt` for a scheduled post. Without it, the tool sends immediately to the real channel, so show the exact channel and caption before confirmation.",
178
+ "3. Use `oko_list_telegram_posts` to inspect draft, scheduled, sent, or failed posts. Only cancel draft, scheduled, or failed posts with `oko_cancel_telegram_post` and `confirm:true`.",
179
+ "",
180
+ "## Automatic reminders",
181
+ "OKO has a platform auto-reminder job for opted-in events. The current MCP surface does not toggle `telegram.autoReminder`, so an MCP-only workflow should create a scheduled reminder post explicitly. Use the web setup if the organizer specifically needs the platform auto-reminder setting.",
182
+ ].join("\n"),
183
+ },
115
184
  {
116
185
  name: "oko_mcp_capabilities",
117
186
  uri: "oko://capabilities",
@@ -122,7 +191,7 @@ const GUIDE_RESOURCES = [
122
191
  "",
123
192
  "## Webinar setup",
124
193
  "- Create, duplicate, move, update, validate, and delete webinars.",
125
- "- Configure forms, CTA, banner, cards, video placeholder, Telegram, and NMO settings.",
194
+ "- Configure forms, CTA, banner, cards, video placeholder, and Telegram settings for standard webinars.",
126
195
  "- Upload images from local paths, data URLs, or HTTPS URLs and wait for variants.",
127
196
  "",
128
197
  "## Live analytics",
@@ -133,7 +202,16 @@ const GUIDE_RESOURCES = [
133
202
  "## Collaboration and comms",
134
203
  "- Manage workspaces, members, invites, notifications, and Telegram post lifecycle.",
135
204
  "- Send organizer chat messages and moderate chat users when scoped.",
136
- "- Import/remove NMO participants through scoped Cloud Functions.",
205
+ "",
206
+ "## NMO special mode (unfinished MVP)",
207
+ "- Only after an explicit organizer request, configure NMO criteria, import/remove participants, run manual checkpoints, and read technical attendance evidence.",
208
+ "- Read `oko://guide/nmo` and disclose its current limitations before enabling or operating the mode.",
209
+ "",
210
+ "## Outside the MCP boundary",
211
+ "- OKO MCP does not host, encode, start, or stop the underlying video stream; configure that in the source player or encoder.",
212
+ "- It does not create organizer accounts, manage pricing or payments, or expose arbitrary Firebase administration.",
213
+ "- It does not provide a general theme designer. Use the web product or support for platform-level branding and account administration.",
214
+ "- It does not currently toggle the platform's Telegram auto-reminder setting; schedule a post or use the web setup instead.",
137
215
  ].join("\n"),
138
216
  },
139
217
  ];
@@ -172,10 +250,11 @@ export function registerGuides(server) {
172
250
  "Required flow:",
173
251
  "1. Call oko_whoami and verify scopes.",
174
252
  "2. Create the webinar in the requested workspace if provided.",
175
- "3. Configure metadata, blocks, forms, Telegram, NMO, and cards as needed.",
176
- "4. Upload images only after target slots/cards exist; wait for image variants.",
177
- "5. Run oko_validate_event_setup and fix actionable errors.",
178
- "6. Return public, setup, analytics, registration/login links as applicable.",
253
+ "3. Configure metadata, standard blocks, forms, Telegram, and cards as needed.",
254
+ "4. Do not enable NMO unless the brief explicitly requests the separate NMO MVP mode. If it does, read oko://guide/nmo and disclose the current limitations before any NMO write.",
255
+ "5. Upload images only after target slots/cards exist; wait for image variants.",
256
+ "6. Run oko_validate_event_setup and fix actionable errors.",
257
+ "7. Return public, setup, and analytics links; include NMO registration/login links only for an explicitly requested NMO event.",
179
258
  "",
180
259
  workspaceId ? `Workspace id: ${workspaceId}` : "Workspace id: not specified; choose the personal workspace unless the user clarifies.",
181
260
  "",
@@ -196,8 +275,9 @@ export function registerGuides(server) {
196
275
  "1. Call oko_whoami and verify scopes.",
197
276
  "2. Call oko_get_event and oko_validate_event_setup.",
198
277
  "3. If relevant, inspect live state, Telegram posts, participants, leads, and image variant readiness.",
199
- "4. Separate errors that block launch from warnings and polish suggestions.",
200
- "5. Propose exact MCP tool calls needed to fix issues; execute only if the organizer asked for implementation.",
278
+ "4. If nmoMode is enabled, read oko://guide/nmo and report the unfinished-mode limitations separately from setup findings.",
279
+ "5. Separate errors that block launch from warnings and polish suggestions.",
280
+ "6. Propose exact MCP tool calls needed to fix issues; execute only if the organizer asked for implementation.",
201
281
  "",
202
282
  focus ? `Focus: ${focus}` : "Focus: full setup readiness.",
203
283
  ].join("\n")));
package/dist/server.js CHANGED
@@ -23,7 +23,7 @@ if (process.argv.includes("--help")) {
23
23
  }
24
24
  const server = new McpServer({
25
25
  name: "oko-mcp-server",
26
- version: "0.5.2",
26
+ version: "0.5.4",
27
27
  }, {
28
28
  instructions: OKO_MCP_INSTRUCTIONS,
29
29
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okostream/mcp",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "description": "MCP server for managing OKO Stream webinars as an organizer.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",