[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M718JMS9PA2K1TJ9PSWRCNHC":3,"skill-same:01M718JMS9PA2K1TJ9PSWRCNHC":145},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":65,"commitSha":66,"skillDirectory":67,"forksCount":68,"repositoryHtmlUrl":69,"repositoryHomepageUrl":6,"ownerHtmlUrl":70,"ownerBlogUrl":71,"ownerDescription":6,"updatedAt":72,"install":73,"resources":86},"01M718JMS9PA2K1TJ9PSWRCNHC","zoom-rtms",null,"Reference skill for Zoom RTMS. Use after routing to a live-media workflow when processing real-time audio, video, chat, transcripts, screen share, or contact-center voice streams.","anthropics\u002Fknowledge-work-plugins","anthropics","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F76263028?v=4","01M697XGDPXJAVQ8391V2BCYTE","Anthropic","01M7188MPC48111TN566QNQE3X",35660,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"zoom rtms","zoom","rtms","real-time","for","websocket","live","screen","streaming","transcript","bot","workflow","when","false","streams","time","Audio","processing","Media","Video","2026-11-10 10:12:30",false,"---\nname: zoom-rtms\ndescription: Reference skill for Zoom RTMS. Use after routing to a live-media workflow when processing real-time audio, video, chat, transcripts, screen share, or contact-center voice streams.\nuser-invocable: false\ntriggers:\n  - \"real-time media\"\n  - \"rtms\"\n  - \"live audio stream\"\n  - \"live video stream\"\n  - \"meeting transcription\"\n  - \"raw audio\"\n  - \"raw video\"\n  - \"websocket media\"\n  - \"live transcript\"\n  - \"streaming audio\"\n  - \"streaming video\"\n  - \"meeting bot media\"\n  - \"contact center voice media\"\n  - \"participant video on\"\n  - \"participant video off\"\n  - \"single individual video stream\"\n---\n\n# Zoom Realtime Media Streams (RTMS)\n\nBackground reference for live Zoom media pipelines. Prefer `build-zoom-bot` first, then use this skill for stream types, capabilities, and RTMS-specific implementation constraints.\n\n# Zoom Realtime Media Streams (RTMS)\n\nExpert guidance for accessing live audio, video, transcript, chat, and screen share data from Zoom meetings, webinars, Video SDK sessions, and Zoom Contact Center Voice in real-time. RTMS uses a WebSocket-based protocol with open standards and does not require a meeting bot to capture the media plane.\n\n## Read This First (Critical)\n\nRTMS is primarily a **backend media ingestion service**.\n\n- Your backend receives and processes live media: **audio, video, screen share, chat, transcript**.\n- RTMS is not a frontend UI SDK by itself.\n- Processing is **event-triggered**: backend waits for RTMS start webhook events before stream handling begins.\n\nOptional architecture (common):\n\n- Add a **Zoom App SDK** frontend for in-client UI\u002Fcontrols.\n- Stream backend RTMS outputs to frontend via **WebSocket** (or SSE, gRPC, queue workers, etc.).\n\nUse RTMS for media\u002Fdata plane, and use frontend frameworks\u002FZoom Apps for presentation + user interactions.\n\n**Official Documentation**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002F\n**SDK Reference (JS)**: https:\u002F\u002Fzoom.github.io\u002Frtms\u002Fjs\u002F\n**SDK Reference (Python)**: https:\u002F\u002Fzoom.github.io\u002Frtms\u002Fpy\u002F\n**Sample Repository**: https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-samples\n\n## Quick Links\n\n**New to RTMS? Follow this path:**\n\n1. **[Connection Architecture](concepts\u002Fconnection-architecture.md)** - Two-phase WebSocket design\n2. **[SDK Quickstart](examples\u002Fsdk-quickstart.md)** - Fastest way to receive media (recommended)\n3. **[Manual WebSocket](examples\u002Fmanual-websocket.md)** - Full protocol control without SDK\n4. **[Media Types](references\u002Fmedia-types.md)** - Audio, video, transcript, chat, screen share\n\n**Complete Implementation:**\n- **[RTMS Bot](examples\u002Frtms-bot.md)** - End-to-end bot implementation guide\n\n**Reference:**\n- **[Lifecycle Flow](concepts\u002Flifecycle-flow.md)** - Complete webhook-to-streaming flow\n- **[Data Types](references\u002Fdata-types.md)** - All enums and constants\n- **[Webhooks](references\u002Fwebhooks.md)** - Event subscription details\n- **[Environment Variables](references\u002Fenvironment-variables.md)** - credential modes and runtime knobs\n- **[Quickstart Notes](references\u002Fquickstart.md)** - Secondary quickstart guide\n- **Integrated Index** - see the section below in this file\n\n**Having issues?**\n- Connection fails -> [Common Issues](troubleshooting\u002Fcommon-issues.md)\n- Duplicate connections -> [Webhook Gotchas](troubleshooting\u002Fcommon-issues.md#webhook-response-timing)\n- No audio\u002Fvideo -> [Media Configuration](references\u002Fmedia-types.md)\n- Start with preflight checks -> [5-Minute Runbook](RUNBOOK.md)\n\n## Supported Products\n\n| Product | Webhook Event | Payload ID | App Type |\n|---------|--------------|------------|----------|\n| **Meetings** | `meeting.rtms_started` \u002F `meeting.rtms_stopped` | `meeting_uuid` | General App |\n| **Webinars** | `webinar.rtms_started` \u002F `webinar.rtms_stopped` | `meeting_uuid` (same!) | General App |\n| **Video SDK** | `session.rtms_started` \u002F `session.rtms_stopped` | `session_id` | Video SDK App |\n| **Zoom Contact Center Voice** | Product-specific RTMS\u002FZCC Voice events | Product-specific stream\u002Fsession identifiers | Contact Center \u002F approved RTMS integration |\n\nOnce connected, the core signaling\u002Fmedia socket model is shared across products. Meetings, webinars, and Video SDK sessions use the familiar start\u002Fstop webhooks. Zoom Contact Center Voice adds its own RTMS\u002FZCC Voice event family and should be treated as the same transport model with product-specific event payloads.\n\n## RTMS Overview\n\nRTMS is a data pipeline that gives your app access to live media from Zoom meetings, webinars, and Video SDK sessions **without participant bots**. Instead of having automated clients join meetings, use RTMS to collect media data directly from Zoom's infrastructure.\n\n### What RTMS Provides\n\n| Media Type | Format | Use Cases |\n|------------|--------|-----------|\n| **Audio** | PCM (L16), G.711, G.722, Opus | Transcription, voice analysis, recording |\n| **Video** | H.264, JPG, PNG | Recording, AI vision, thumbnails, active participant selection |\n| **Screen Share** | H.264, JPG, PNG | Content capture, slide extraction |\n| **Transcript** | JSON text | Meeting notes, search, compliance |\n| **Chat** | JSON text | Archive, sentiment analysis |\n\n### March 2026 Protocol Changes\n\n- **Zoom Contact Center Voice support**: RTMS now covers Contact Center Voice audio and transcript scenarios.\n- **Transcript Language Identification control**: transcript media handshakes now support `src_language` and `enable_lid`. Default behavior is LID enabled. Set `enable_lid: false` to force a fixed language.\n- **Single individual video stream subscription**: RTMS can now stream one participant's camera feed at a time when `data_opt` is set to `VIDEO_SINGLE_INDIVIDUAL_STREAM`.\n- **Graceful client-initiated shutdown**: backends can send `STREAM_CLOSE_REQ` over the signaling socket and wait for `STREAM_CLOSE_RESP`.\n- **Media keep-alive tolerance increased**: media socket keep-alive timeout is now **65 seconds**, not 35.\n\n### Two Approaches\n\n| Approach | Best For | Complexity |\n|----------|----------|------------|\n| **SDK** (`@zoom\u002Frtms`) | Most use cases | Low - handles WebSocket complexity |\n| **Manual WebSocket** | Custom protocols, other languages | High - full protocol implementation |\n\n## Prerequisites\n\n- **Node.js 20.3.0+** (24 LTS recommended) for JavaScript SDK\n- **Python 3.10+** for Python SDK\n- Zoom General App (for meetings\u002Fwebinars) or Video SDK App (for Video SDK) with RTMS feature enabled\n- Webhook endpoint for RTMS events\n- Server to receive WebSocket streams\n\n> **Need RTMS access?** Post in [Zoom Developer Forum](https:\u002F\u002Fdevforum.zoom.us\u002F) requesting RTMS access with your use case.\n\n## Quick Start (SDK - Recommended)\n\n```javascript\nimport rtms from \"@zoom\u002Frtms\";\n\n\u002F\u002F All RTMS start\u002Fstop events across products\nconst RTMS_EVENTS = [\"meeting.rtms_started\", \"webinar.rtms_started\", \"session.rtms_started\"];\n\n\u002F\u002F Handle webhook events\nrtms.onWebhookEvent(({ event, payload }) => {\n  if (!RTMS_EVENTS.includes(event)) return;\n\n  const client = new rtms.Client();\n\n  client.onAudioData((data, timestamp, metadata) => {\n    console.log(`Audio from ${metadata.userName}: ${data.length} bytes`);\n  });\n\n  client.onTranscriptData((data, timestamp, metadata) => {\n    const text = data.toString('utf8');\n    console.log(`${metadata.userName}: ${text}`);\n  });\n\n  client.onJoinConfirm((reason) => {\n    console.log(`Joined session: ${reason}`);\n  });\n\n  \u002F\u002F SDK handles all WebSocket connections automatically\n  \u002F\u002F Accepts both meeting_uuid and session_id transparently\n  client.join(payload);\n});\n```\n\n## Quick Start (Manual WebSocket)\n\nFor full control or non-SDK languages, implement the two-phase WebSocket protocol:\n\n```javascript\nconst WebSocket = require('ws');\nconst crypto = require('crypto');\n\nconst RTMS_EVENTS = ['meeting.rtms_started', 'webinar.rtms_started', 'session.rtms_started'];\n\n\u002F\u002F 1. Generate signature\n\u002F\u002F For meetings\u002Fwebinars: uses meeting_uuid. For Video SDK: uses session_id.\nfunction generateSignature(clientId, idValue, streamId, clientSecret) {\n  const message = `${clientId},${idValue},${streamId}`;\n  return crypto.createHmac('sha256', clientSecret).update(message).digest('hex');\n}\n\n\u002F\u002F 2. Handle webhook\napp.post('\u002Fwebhook', (req, res) => {\n  res.status(200).send();  \u002F\u002F CRITICAL: Respond immediately!\n  \n  const { event, payload } = req.body;\n  if (RTMS_EVENTS.includes(event)) {\n    connectToRTMS(payload);\n  }\n});\n\n\u002F\u002F 3. Connect to signaling WebSocket\nfunction connectToRTMS(payload) {\n  const { server_urls, rtms_stream_id } = payload;\n  \u002F\u002F meeting_uuid for meetings\u002Fwebinars, session_id for Video SDK\n  const idValue = payload.meeting_uuid || payload.session_id;\n  const signature = generateSignature(CLIENT_ID, idValue, rtms_stream_id, CLIENT_SECRET);\n  \n  const signalingWs = new WebSocket(server_urls);\n  \n  signalingWs.on('open', () => {\n    signalingWs.send(JSON.stringify({\n      msg_type: 1,  \u002F\u002F Handshake request\n      protocol_version: 1,\n      meeting_uuid: idValue,\n      rtms_stream_id,\n      signature,\n      media_type: 9  \u002F\u002F AUDIO(1) | TRANSCRIPT(8)\n    }));\n  });\n  \n  \u002F\u002F ... handle responses, connect to media WebSocket\n}\n```\n\n**See**: [Manual WebSocket Guide](examples\u002Fmanual-websocket.md) for complete implementation.\n\n## Media Type Bitmask\n\nCombine types with bitwise OR:\n\n| Type | Value | Description |\n|------|-------|-------------|\n| Audio | 1 | PCM audio samples |\n| Video | 2 | H.264\u002FJPG video frames |\n| Screen Share | 4 | **Separate from video!** |\n| Transcript | 8 | Real-time speech-to-text |\n| Chat | 16 | In-meeting chat messages |\n| All | 32 | All media types |\n\n**Example**: Audio + Transcript = `1 | 8` = `9`\n\n## Critical Gotchas\n\n| Issue | Solution |\n|-------|----------|\n| **Only 1 connection allowed** | New connections kick out existing ones. Track active sessions! |\n| **Respond 200 immediately** | If webhook delays, Zoom retries creating duplicate connections |\n| **Heartbeat mandatory** | Respond to msg_type 12 with msg_type 13, or connection dies |\n| **Reconnection is YOUR job** | RTMS doesn't auto-reconnect. Media keep-alive tolerance is now about **65s**; signaling remains around **60s** |\n| **Transcript language drift** | Use `src_language` plus `enable_lid: false` when you want fixed-language transcription instead of automatic language switching |\n| **Single participant video only** | `VIDEO_SINGLE_INDIVIDUAL_STREAM` supports one participant at a time. A new `VIDEO_SUBSCRIPTION_REQ` overrides the previous selection |\n| **Graceful close is explicit now** | Use `STREAM_CLOSE_REQ` \u002F `STREAM_CLOSE_RESP` when your backend wants to terminate the stream cleanly |\n\n## Environment Variables\n\n### SDK Environment Variables\n\n```bash\n# Required - Authentication\nZM_RTMS_CLIENT=your_client_id          # Zoom OAuth Client ID\nZM_RTMS_SECRET=your_client_secret      # Zoom OAuth Client Secret\n\n# Optional - Webhook server\nZM_RTMS_PORT=8080                      # Default: 8080\nZM_RTMS_PATH=\u002Fwebhook                  # Default: \u002F\n\n# Optional - Logging\nZM_RTMS_LOG_LEVEL=info                 # error, warn, info, debug, trace\nZM_RTMS_LOG_FORMAT=progressive         # progressive or json\nZM_RTMS_LOG_ENABLED=true\n```\n\n### Manual Implementation Variables\n\n```bash\nZOOM_CLIENT_ID=your_client_id\nZOOM_CLIENT_SECRET=your_client_secret\nZOOM_SECRET_TOKEN=your_webhook_token   # For webhook validation\n```\n\n## Zoom App Setup\n\n### For Meetings and Webinars (General App)\n\n1. Go to [marketplace.zoom.us](https:\u002F\u002Fmarketplace.zoom.us) -> Develop -> Build App\n2. Choose **General App** -> **User-Managed**\n3. Features -> Access -> **Enable Event Subscription**\n4. Add Events -> Search \"rtms\" -> Select:\n   - `meeting.rtms_started`\n   - `meeting.rtms_stopped`\n   - `webinar.rtms_started` (if using webinars)\n   - `webinar.rtms_stopped` (if using webinars)\n5. Scopes -> Add Scopes -> Search \"rtms\" -> Add:\n   - `meeting:read:meeting_audio`\n   - `meeting:read:meeting_video`\n   - `meeting:read:meeting_transcript`\n   - `meeting:read:meeting_chat`\n   - `webinar:read:webinar_audio` (if using webinars)\n   - `webinar:read:webinar_video` (if using webinars)\n   - `webinar:read:webinar_transcript` (if using webinars)\n   - `webinar:read:webinar_chat` (if using webinars)\n\n### For Video SDK (Video SDK App)\n\n1. Go to [marketplace.zoom.us](https:\u002F\u002Fmarketplace.zoom.us) -> Develop -> Build App\n2. Choose **Video SDK App**\n3. Use your SDK Key and SDK Secret (not OAuth Client ID\u002FSecret)\n4. Add Events:\n   - `session.rtms_started`\n   - `session.rtms_stopped`\n\n## Sample Repositories\n\n### Official Samples\n\n| Repository | Description |\n|------------|-------------|\n| [rtms-samples](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-samples) | RTMSManager, boilerplates, AI samples |\n| [rtms-quickstart-js](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-quickstart-js) | JavaScript SDK quickstart |\n| [rtms-quickstart-py](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-quickstart-py) | Python SDK quickstart |\n| [rtms-sdk-cpp](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-sdk-cpp) | C++ SDK |\n| [zoom-rtms](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms) | Main SDK repository |\n\n### AI Integration Samples\n\n| Sample | Description |\n|--------|-------------|\n| [rtms-meeting-assistant-starter-kit](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-meeting-assistant-starter-kit) | AI meeting assistant with summaries |\n| [arlo-meeting-assistant](https:\u002F\u002Fgithub.com\u002Fzoom\u002Farlo-meeting-assistant) | Production meeting assistant with DB |\n| [videosdk-rtms-transcribe-audio](https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-rtms-transcribe-audio) | Whisper transcription |\n\n## Complete Documentation\n\n### Concepts\n- **[Connection Architecture](concepts\u002Fconnection-architecture.md)** - Two-phase WebSocket design\n- **[Lifecycle Flow](concepts\u002Flifecycle-flow.md)** - Webhook to streaming flow\n\n### Examples\n- **[SDK Quickstart](examples\u002Fsdk-quickstart.md)** - Using @zoom\u002Frtms SDK\n- **[Manual WebSocket](examples\u002Fmanual-websocket.md)** - Raw protocol implementation\n- **[RTMS Bot](examples\u002Frtms-bot.md)** - Complete bot implementation guide\n- **[AI Integration](examples\u002Fai-integration.md)** - Transcription and analysis patterns\n\n### References\n- **[Media Types](references\u002Fmedia-types.md)** - Audio, video, transcript, chat, screen share\n- **[Data Types](references\u002Fdata-types.md)** - All enums and constants\n- **[Connection](references\u002Fconnection.md)** - WebSocket protocol details\n- **[Webhooks](references\u002Fwebhooks.md)** - Event subscription\n\n### Troubleshooting\n- **[Common Issues](troubleshooting\u002Fcommon-issues.md)** - FAQ and solutions\n\n## Resources\n\n- **Official docs**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002F\n- **Data types**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002Fdata-types\u002F\n- **Media params**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002Fmedia-parameter-definition\u002F\n- **Developer forum**: https:\u002F\u002Fdevforum.zoom.us\u002F\n\n---\n\n**Need help?** Start with Integrated Index section below for complete navigation.\n\n---\n\n## Integrated Index\n\n_This section was migrated from `SKILL.md`._\n\nRTMS provides real-time access to live audio, video, transcript, chat, and screen share from Zoom meetings, webinars, and Video SDK sessions.\n\n## Critical Positioning\n\nTreat RTMS as a **backend service** for receiving and processing media streams.\n\n- Backend role: ingest audio\u002Fvideo\u002Fshare\u002Fchat\u002Ftranscript, run AI\u002Fanalytics, persist\u002Fforward data.\n- Optional frontend role: Zoom App SDK or web dashboard that consumes processed stream data from backend transport (WebSocket\u002FSSE\u002Fother).\n- Kickoff model: backend waits for RTMS start webhook events, then starts stream processing.\n\nDo not model RTMS as a frontend-only SDK.\n\n## Quick Start Path\n\n**If you're new to RTMS, follow this order:**\n\n1. **Run preflight checks first** -> [RUNBOOK.md](RUNBOOK.md)\n2. **Understand the architecture** -> [concepts\u002Fconnection-architecture.md](concepts\u002Fconnection-architecture.md)\n   - Two-phase WebSocket: Signaling + Media\n   - Why RTMS doesn't use bots\n\n3. **Choose your approach** -> SDK or Manual\n   - SDK (recommended): [examples\u002Fsdk-quickstart.md](examples\u002Fsdk-quickstart.md)\n   - Manual WebSocket: [examples\u002Fmanual-websocket.md](examples\u002Fmanual-websocket.md)\n\n4. **Understand the lifecycle** -> [concepts\u002Flifecycle-flow.md](concepts\u002Flifecycle-flow.md)\n   - Webhook -> Signaling -> Media -> Streaming\n\n5. **Configure media types** -> [references\u002Fmedia-types.md](references\u002Fmedia-types.md)\n   - Audio, video, transcript, chat, screen share\n\n6. **Troubleshoot issues** -> [troubleshooting\u002Fcommon-issues.md](troubleshooting\u002Fcommon-issues.md)\n   - Connection problems, duplicate webhooks, missing data\n\n---\n\n## Documentation Structure\n\n```\nrtms\u002F\n├── SKILL.md                           # Main skill overview\n├── SKILL.md                           # This file - navigation guide\n│\n├── concepts\u002F                          # Core architectural patterns\n│   ├── connection-architecture.md     # Two-phase WebSocket design\n│   └── lifecycle-flow.md              # Webhook to streaming flow\n│\n├── examples\u002F                          # Complete working code\n│   ├── sdk-quickstart.md              # Using @zoom\u002Frtms SDK\n│   ├── manual-websocket.md            # Raw protocol implementation\n│   ├── rtms-bot.md                    # Complete RTMS bot implementation\n│   └── ai-integration.md              # Transcription and analysis\n│\n├── references\u002F                        # Reference documentation\n│   ├── media-types.md                 # Audio, video, transcript, chat, share\n│   ├── data-types.md                  # All enums and constants\n│   ├── connection.md                  # WebSocket protocol details\n│   └── webhooks.md                    # Event subscription\n│\n└── troubleshooting\u002F                   # Problem solving guides\n    └── common-issues.md               # FAQ and solutions\n```\n\n---\n\n## By Use Case\n\n### I want to get meeting transcripts\n1. [SDK Quickstart](examples\u002Fsdk-quickstart.md) - Fastest approach\n2. [Media Types](references\u002Fmedia-types.md#transcript) - Transcript configuration\n3. [AI Integration](examples\u002Fai-integration.md) - Whisper, Deepgram, AssemblyAI\n\n### I want to record meetings\n1. [Media Types](references\u002Fmedia-types.md) - Audio + Video configuration\n2. [SDK Quickstart](examples\u002Fsdk-quickstart.md) - Receiving media\n3. [AI Integration](examples\u002Fai-integration.md#audio-recording) - Gap-filled recording\n\n### I want to build an AI meeting assistant\n1. [AI Integration](examples\u002Fai-integration.md) - Complete patterns\n2. [SDK Quickstart](examples\u002Fsdk-quickstart.md) - Media ingestion\n3. [Lifecycle Flow](concepts\u002Flifecycle-flow.md) - Event handling\n\n### I want to build a complete RTMS bot\n1. [RTMS Bot](examples\u002Frtms-bot.md) - **Complete implementation guide**\n2. [Lifecycle Flow](concepts\u002Flifecycle-flow.md) - Webhook to streaming flow\n3. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Two-phase design\n\n### I need full protocol control\n1. [Manual WebSocket](examples\u002Fmanual-websocket.md) - **START HERE**\n2. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Two-phase design\n3. [Data Types](references\u002Fdata-types.md) - All message types and enums\n4. [Connection](references\u002Fconnection.md) - Protocol details\n\n### I'm getting connection errors\n1. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Diagnostic checklist\n2. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Verify flow\n3. [Webhooks](references\u002Fwebhooks.md) - Validation and timing\n\n### I want to understand the architecture\n1. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Two-phase WebSocket\n2. [Lifecycle Flow](concepts\u002Flifecycle-flow.md) - Complete flow diagram\n3. [Data Types](references\u002Fdata-types.md) - Protocol constants\n\n---\n\n## By Product\n\n### I'm building for Zoom Meetings\n- Standard RTMS setup. Webhook event: `meeting.rtms_started`. Uses General App with OAuth.\n- Start with [SDK Quickstart](examples\u002Fsdk-quickstart.md) or [Manual WebSocket](examples\u002Fmanual-websocket.md).\n\n### I'm building for Zoom Webinars\n- Same as meetings, but webhook event is `webinar.rtms_started`. Payload still uses `meeting_uuid` (NOT `webinar_uuid`).\n- Add webinar scopes and event subscriptions. See [Webhooks](references\u002Fwebhooks.md).\n- Only **panelist** streams are confirmed available. Attendee streams may not be individual.\n\n### I'm building for Zoom Video SDK\n- Webhook event: `session.rtms_started`. Payload uses `session_id` (NOT `meeting_uuid`).\n- Requires a **Video SDK App** with SDK Key\u002FSecret (not OAuth Client ID\u002FSecret).\n- Once connected, the protocol is **identical** to meetings.\n- See [Webhooks](references\u002Fwebhooks.md) for payload details.\n\n---\n\n## Key Documents\n\n### 1. Connection Architecture (CRITICAL)\n**[concepts\u002Fconnection-architecture.md](concepts\u002Fconnection-architecture.md)**\n\nRTMS uses **two separate WebSocket connections**:\n- **Signaling WebSocket**: Authentication, control, heartbeats\n- **Media WebSocket**: Actual audio\u002Fvideo\u002Ftranscript data\n\n### 2. SDK vs Manual (DECISION POINT)\n**[examples\u002Fsdk-quickstart.md](examples\u002Fsdk-quickstart.md)** vs **[examples\u002Fmanual-websocket.md](examples\u002Fmanual-websocket.md)**\n\n| SDK | Manual |\n|-----|--------|\n| Handles WebSocket complexity | Full protocol control |\n| Automatic reconnection | DIY reconnection |\n| Less code | More code |\n| Best for most use cases | Best for custom requirements |\n\n### 3. Critical Gotchas (MOST COMMON ISSUES)\n**[troubleshooting\u002Fcommon-issues.md](troubleshooting\u002Fcommon-issues.md)**\n\n1. **Respond 200 immediately** - Delayed webhook responses cause duplicates\n2. **Only 1 connection per stream** - New connections kick out existing\n3. **Heartbeat required** - Must respond to keep-alive or connection dies\n4. **Track active sessions** - Prevent duplicate join attempts\n\n---\n\n## Key Learnings\n\n### Critical Discoveries:\n\n1. **Two-Phase WebSocket Design**\n   - Signaling: Control plane (handshake, heartbeat, start\u002Fstop)\n   - Media: Data plane (audio, video, transcript, chat, share)\n   - See: [Connection Architecture](concepts\u002Fconnection-architecture.md)\n\n2. **Webhook Response Timing**\n   - MUST respond 200 BEFORE any processing\n   - Delayed response -> Zoom retries -> duplicate connections\n   - See: [Common Issues](troubleshooting\u002Fcommon-issues.md#webhook-response-timing)\n\n3. **Heartbeat is Mandatory**\n   - Signaling: Receive msg_type 12, respond with msg_type 13\n   - Media: Same pattern\n   - Failure to respond = connection closed\n   - See: [Connection](references\u002Fconnection.md#heartbeat)\n\n4. **Signature Generation**\n   - Format: `HMAC-SHA256(clientSecret, \"clientId,meetingUuid,streamId\")`\n   - For Video SDK, use `session_id` in place of `meetingUuid`\n   - Webinars still use `meeting_uuid` (not `webinar_uuid`)\n   - Required for both signaling and media handshakes\n   - See: [Manual WebSocket](examples\u002Fmanual-websocket.md#signature-generation)\n\n5. **Media Types are Bitmasks**\n   - Audio=1, Video=2, Share=4, Transcript=8, Chat=16, All=32\n   - Combine with OR: Audio+Transcript = 1|8 = 9\n   - See: [Media Types](references\u002Fmedia-types.md)\n\n6. **Screen Share is SEPARATE from Video**\n   - Different msg_type (16 vs 15)\n   - Different media flag (4 vs 2)\n   - Must subscribe separately\n   - See: [Media Types](references\u002Fmedia-types.md#screen-share)\n\n---\n\n## Quick Reference\n\n### \"Connection fails\"\n-> [Common Issues](troubleshooting\u002Fcommon-issues.md)\n\n### \"Duplicate connections\"\n-> [Webhook timing](troubleshooting\u002Fcommon-issues.md#webhook-response-timing)\n\n### \"No audio\u002Fvideo data\"\n-> [Media Types](references\u002Fmedia-types.md) - Check configuration\n\n### \"How do I implement manually?\"\n-> [Manual WebSocket](examples\u002Fmanual-websocket.md)\n\n### \"What message types exist?\"\n-> [Data Types](references\u002Fdata-types.md)\n\n### \"How do I integrate AI?\"\n-> [AI Integration](examples\u002Fai-integration.md)\n\n---\n\n## Document Version\n\nBased on **Zoom RTMS SDK v1.x** and official documentation as of 2026.\n\n---\n\n**Happy coding!**\n\nRemember: Start with [SDK Quickstart](examples\u002Fsdk-quickstart.md) for the fastest path, or [Manual WebSocket](examples\u002Fmanual-websocket.md) if you need full control.\n","# Zoom Realtime Media Streams (RTMS)\n\nBackground reference for live Zoom media pipelines. Prefer `build-zoom-bot` first, then use this skill for stream types, capabilities, and RTMS-specific implementation constraints.\n\n# Zoom Realtime Media Streams (RTMS)\n\nExpert guidance for accessing live audio, video, transcript, chat, and screen share data from Zoom meetings, webinars, Video SDK sessions, and Zoom Contact Center Voice in real-time. RTMS uses a WebSocket-based protocol with open standards and does not require a meeting bot to capture the media plane.\n\n## Read This First (Critical)\n\nRTMS is primarily a **backend media ingestion service**.\n\n- Your backend receives and processes live media: **audio, video, screen share, chat, transcript**.\n- RTMS is not a frontend UI SDK by itself.\n- Processing is **event-triggered**: backend waits for RTMS start webhook events before stream handling begins.\n\nOptional architecture (common):\n\n- Add a **Zoom App SDK** frontend for in-client UI\u002Fcontrols.\n- Stream backend RTMS outputs to frontend via **WebSocket** (or SSE, gRPC, queue workers, etc.).\n\nUse RTMS for media\u002Fdata plane, and use frontend frameworks\u002FZoom Apps for presentation + user interactions.\n\n**Official Documentation**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002F\n**SDK Reference (JS)**: https:\u002F\u002Fzoom.github.io\u002Frtms\u002Fjs\u002F\n**SDK Reference (Python)**: https:\u002F\u002Fzoom.github.io\u002Frtms\u002Fpy\u002F\n**Sample Repository**: https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-samples\n\n## Quick Links\n\n**New to RTMS? Follow this path:**\n\n1. **[Connection Architecture](concepts\u002Fconnection-architecture.md)** - Two-phase WebSocket design\n2. **[SDK Quickstart](examples\u002Fsdk-quickstart.md)** - Fastest way to receive media (recommended)\n3. **[Manual WebSocket](examples\u002Fmanual-websocket.md)** - Full protocol control without SDK\n4. **[Media Types](references\u002Fmedia-types.md)** - Audio, video, transcript, chat, screen share\n\n**Complete Implementation:**\n- **[RTMS Bot](examples\u002Frtms-bot.md)** - End-to-end bot implementation guide\n\n**Reference:**\n- **[Lifecycle Flow](concepts\u002Flifecycle-flow.md)** - Complete webhook-to-streaming flow\n- **[Data Types](references\u002Fdata-types.md)** - All enums and constants\n- **[Webhooks](references\u002Fwebhooks.md)** - Event subscription details\n- **[Environment Variables](references\u002Fenvironment-variables.md)** - credential modes and runtime knobs\n- **[Quickstart Notes](references\u002Fquickstart.md)** - Secondary quickstart guide\n- **Integrated Index** - see the section below in this file\n\n**Having issues?**\n- Connection fails -> [Common Issues](troubleshooting\u002Fcommon-issues.md)\n- Duplicate connections -> [Webhook Gotchas](troubleshooting\u002Fcommon-issues.md#webhook-response-timing)\n- No audio\u002Fvideo -> [Media Configuration](references\u002Fmedia-types.md)\n- Start with preflight checks -> [5-Minute Runbook](RUNBOOK.md)\n\n## Supported Products\n\n| Product | Webhook Event | Payload ID | App Type |\n|---------|--------------|------------|----------|\n| **Meetings** | `meeting.rtms_started` \u002F `meeting.rtms_stopped` | `meeting_uuid` | General App |\n| **Webinars** | `webinar.rtms_started` \u002F `webinar.rtms_stopped` | `meeting_uuid` (same!) | General App |\n| **Video SDK** | `session.rtms_started` \u002F `session.rtms_stopped` | `session_id` | Video SDK App |\n| **Zoom Contact Center Voice** | Product-specific RTMS\u002FZCC Voice events | Product-specific stream\u002Fsession identifiers | Contact Center \u002F approved RTMS integration |\n\nOnce connected, the core signaling\u002Fmedia socket model is shared across products. Meetings, webinars, and Video SDK sessions use the familiar start\u002Fstop webhooks. Zoom Contact Center Voice adds its own RTMS\u002FZCC Voice event family and should be treated as the same transport model with product-specific event payloads.\n\n## RTMS Overview\n\nRTMS is a data pipeline that gives your app access to live media from Zoom meetings, webinars, and Video SDK sessions **without participant bots**. Instead of having automated clients join meetings, use RTMS to collect media data directly from Zoom's infrastructure.\n\n### What RTMS Provides\n\n| Media Type | Format | Use Cases |\n|------------|--------|-----------|\n| **Audio** | PCM (L16), G.711, G.722, Opus | Transcription, voice analysis, recording |\n| **Video** | H.264, JPG, PNG | Recording, AI vision, thumbnails, active participant selection |\n| **Screen Share** | H.264, JPG, PNG | Content capture, slide extraction |\n| **Transcript** | JSON text | Meeting notes, search, compliance |\n| **Chat** | JSON text | Archive, sentiment analysis |\n\n### March 2026 Protocol Changes\n\n- **Zoom Contact Center Voice support**: RTMS now covers Contact Center Voice audio and transcript scenarios.\n- **Transcript Language Identification control**: transcript media handshakes now support `src_language` and `enable_lid`. Default behavior is LID enabled. Set `enable_lid: false` to force a fixed language.\n- **Single individual video stream subscription**: RTMS can now stream one participant's camera feed at a time when `data_opt` is set to `VIDEO_SINGLE_INDIVIDUAL_STREAM`.\n- **Graceful client-initiated shutdown**: backends can send `STREAM_CLOSE_REQ` over the signaling socket and wait for `STREAM_CLOSE_RESP`.\n- **Media keep-alive tolerance increased**: media socket keep-alive timeout is now **65 seconds**, not 35.\n\n### Two Approaches\n\n| Approach | Best For | Complexity |\n|----------|----------|------------|\n| **SDK** (`@zoom\u002Frtms`) | Most use cases | Low - handles WebSocket complexity |\n| **Manual WebSocket** | Custom protocols, other languages | High - full protocol implementation |\n\n## Prerequisites\n\n- **Node.js 20.3.0+** (24 LTS recommended) for JavaScript SDK\n- **Python 3.10+** for Python SDK\n- Zoom General App (for meetings\u002Fwebinars) or Video SDK App (for Video SDK) with RTMS feature enabled\n- Webhook endpoint for RTMS events\n- Server to receive WebSocket streams\n\n> **Need RTMS access?** Post in [Zoom Developer Forum](https:\u002F\u002Fdevforum.zoom.us\u002F) requesting RTMS access with your use case.\n\n## Quick Start (SDK - Recommended)\n\n```javascript\nimport rtms from \"@zoom\u002Frtms\";\n\n\u002F\u002F All RTMS start\u002Fstop events across products\nconst RTMS_EVENTS = [\"meeting.rtms_started\", \"webinar.rtms_started\", \"session.rtms_started\"];\n\n\u002F\u002F Handle webhook events\nrtms.onWebhookEvent(({ event, payload }) => {\n  if (!RTMS_EVENTS.includes(event)) return;\n\n  const client = new rtms.Client();\n\n  client.onAudioData((data, timestamp, metadata) => {\n    console.log(`Audio from ${metadata.userName}: ${data.length} bytes`);\n  });\n\n  client.onTranscriptData((data, timestamp, metadata) => {\n    const text = data.toString('utf8');\n    console.log(`${metadata.userName}: ${text}`);\n  });\n\n  client.onJoinConfirm((reason) => {\n    console.log(`Joined session: ${reason}`);\n  });\n\n  \u002F\u002F SDK handles all WebSocket connections automatically\n  \u002F\u002F Accepts both meeting_uuid and session_id transparently\n  client.join(payload);\n});\n```\n\n## Quick Start (Manual WebSocket)\n\nFor full control or non-SDK languages, implement the two-phase WebSocket protocol:\n\n```javascript\nconst WebSocket = require('ws');\nconst crypto = require('crypto');\n\nconst RTMS_EVENTS = ['meeting.rtms_started', 'webinar.rtms_started', 'session.rtms_started'];\n\n\u002F\u002F 1. Generate signature\n\u002F\u002F For meetings\u002Fwebinars: uses meeting_uuid. For Video SDK: uses session_id.\nfunction generateSignature(clientId, idValue, streamId, clientSecret) {\n  const message = `${clientId},${idValue},${streamId}`;\n  return crypto.createHmac('sha256', clientSecret).update(message).digest('hex');\n}\n\n\u002F\u002F 2. Handle webhook\napp.post('\u002Fwebhook', (req, res) => {\n  res.status(200).send();  \u002F\u002F CRITICAL: Respond immediately!\n  \n  const { event, payload } = req.body;\n  if (RTMS_EVENTS.includes(event)) {\n    connectToRTMS(payload);\n  }\n});\n\n\u002F\u002F 3. Connect to signaling WebSocket\nfunction connectToRTMS(payload) {\n  const { server_urls, rtms_stream_id } = payload;\n  \u002F\u002F meeting_uuid for meetings\u002Fwebinars, session_id for Video SDK\n  const idValue = payload.meeting_uuid || payload.session_id;\n  const signature = generateSignature(CLIENT_ID, idValue, rtms_stream_id, CLIENT_SECRET);\n  \n  const signalingWs = new WebSocket(server_urls);\n  \n  signalingWs.on('open', () => {\n    signalingWs.send(JSON.stringify({\n      msg_type: 1,  \u002F\u002F Handshake request\n      protocol_version: 1,\n      meeting_uuid: idValue,\n      rtms_stream_id,\n      signature,\n      media_type: 9  \u002F\u002F AUDIO(1) | TRANSCRIPT(8)\n    }));\n  });\n  \n  \u002F\u002F ... handle responses, connect to media WebSocket\n}\n```\n\n**See**: [Manual WebSocket Guide](examples\u002Fmanual-websocket.md) for complete implementation.\n\n## Media Type Bitmask\n\nCombine types with bitwise OR:\n\n| Type | Value | Description |\n|------|-------|-------------|\n| Audio | 1 | PCM audio samples |\n| Video | 2 | H.264\u002FJPG video frames |\n| Screen Share | 4 | **Separate from video!** |\n| Transcript | 8 | Real-time speech-to-text |\n| Chat | 16 | In-meeting chat messages |\n| All | 32 | All media types |\n\n**Example**: Audio + Transcript = `1 | 8` = `9`\n\n## Critical Gotchas\n\n| Issue | Solution |\n|-------|----------|\n| **Only 1 connection allowed** | New connections kick out existing ones. Track active sessions! |\n| **Respond 200 immediately** | If webhook delays, Zoom retries creating duplicate connections |\n| **Heartbeat mandatory** | Respond to msg_type 12 with msg_type 13, or connection dies |\n| **Reconnection is YOUR job** | RTMS doesn't auto-reconnect. Media keep-alive tolerance is now about **65s**; signaling remains around **60s** |\n| **Transcript language drift** | Use `src_language` plus `enable_lid: false` when you want fixed-language transcription instead of automatic language switching |\n| **Single participant video only** | `VIDEO_SINGLE_INDIVIDUAL_STREAM` supports one participant at a time. A new `VIDEO_SUBSCRIPTION_REQ` overrides the previous selection |\n| **Graceful close is explicit now** | Use `STREAM_CLOSE_REQ` \u002F `STREAM_CLOSE_RESP` when your backend wants to terminate the stream cleanly |\n\n## Environment Variables\n\n### SDK Environment Variables\n\n```bash\n# Required - Authentication\nZM_RTMS_CLIENT=your_client_id          # Zoom OAuth Client ID\nZM_RTMS_SECRET=your_client_secret      # Zoom OAuth Client Secret\n\n# Optional - Webhook server\nZM_RTMS_PORT=8080                      # Default: 8080\nZM_RTMS_PATH=\u002Fwebhook                  # Default: \u002F\n\n# Optional - Logging\nZM_RTMS_LOG_LEVEL=info                 # error, warn, info, debug, trace\nZM_RTMS_LOG_FORMAT=progressive         # progressive or json\nZM_RTMS_LOG_ENABLED=true\n```\n\n### Manual Implementation Variables\n\n```bash\nZOOM_CLIENT_ID=your_client_id\nZOOM_CLIENT_SECRET=your_client_secret\nZOOM_SECRET_TOKEN=your_webhook_token   # For webhook validation\n```\n\n## Zoom App Setup\n\n### For Meetings and Webinars (General App)\n\n1. Go to [marketplace.zoom.us](https:\u002F\u002Fmarketplace.zoom.us) -> Develop -> Build App\n2. Choose **General App** -> **User-Managed**\n3. Features -> Access -> **Enable Event Subscription**\n4. Add Events -> Search \"rtms\" -> Select:\n   - `meeting.rtms_started`\n   - `meeting.rtms_stopped`\n   - `webinar.rtms_started` (if using webinars)\n   - `webinar.rtms_stopped` (if using webinars)\n5. Scopes -> Add Scopes -> Search \"rtms\" -> Add:\n   - `meeting:read:meeting_audio`\n   - `meeting:read:meeting_video`\n   - `meeting:read:meeting_transcript`\n   - `meeting:read:meeting_chat`\n   - `webinar:read:webinar_audio` (if using webinars)\n   - `webinar:read:webinar_video` (if using webinars)\n   - `webinar:read:webinar_transcript` (if using webinars)\n   - `webinar:read:webinar_chat` (if using webinars)\n\n### For Video SDK (Video SDK App)\n\n1. Go to [marketplace.zoom.us](https:\u002F\u002Fmarketplace.zoom.us) -> Develop -> Build App\n2. Choose **Video SDK App**\n3. Use your SDK Key and SDK Secret (not OAuth Client ID\u002FSecret)\n4. Add Events:\n   - `session.rtms_started`\n   - `session.rtms_stopped`\n\n## Sample Repositories\n\n### Official Samples\n\n| Repository | Description |\n|------------|-------------|\n| [rtms-samples](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-samples) | RTMSManager, boilerplates, AI samples |\n| [rtms-quickstart-js](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-quickstart-js) | JavaScript SDK quickstart |\n| [rtms-quickstart-py](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-quickstart-py) | Python SDK quickstart |\n| [rtms-sdk-cpp](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-sdk-cpp) | C++ SDK |\n| [zoom-rtms](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms) | Main SDK repository |\n\n### AI Integration Samples\n\n| Sample | Description |\n|--------|-------------|\n| [rtms-meeting-assistant-starter-kit](https:\u002F\u002Fgithub.com\u002Fzoom\u002Frtms-meeting-assistant-starter-kit) | AI meeting assistant with summaries |\n| [arlo-meeting-assistant](https:\u002F\u002Fgithub.com\u002Fzoom\u002Farlo-meeting-assistant) | Production meeting assistant with DB |\n| [videosdk-rtms-transcribe-audio](https:\u002F\u002Fgithub.com\u002Fzoom\u002Fvideosdk-rtms-transcribe-audio) | Whisper transcription |\n\n## Complete Documentation\n\n### Concepts\n- **[Connection Architecture](concepts\u002Fconnection-architecture.md)** - Two-phase WebSocket design\n- **[Lifecycle Flow](concepts\u002Flifecycle-flow.md)** - Webhook to streaming flow\n\n### Examples\n- **[SDK Quickstart](examples\u002Fsdk-quickstart.md)** - Using @zoom\u002Frtms SDK\n- **[Manual WebSocket](examples\u002Fmanual-websocket.md)** - Raw protocol implementation\n- **[RTMS Bot](examples\u002Frtms-bot.md)** - Complete bot implementation guide\n- **[AI Integration](examples\u002Fai-integration.md)** - Transcription and analysis patterns\n\n### References\n- **[Media Types](references\u002Fmedia-types.md)** - Audio, video, transcript, chat, screen share\n- **[Data Types](references\u002Fdata-types.md)** - All enums and constants\n- **[Connection](references\u002Fconnection.md)** - WebSocket protocol details\n- **[Webhooks](references\u002Fwebhooks.md)** - Event subscription\n\n### Troubleshooting\n- **[Common Issues](troubleshooting\u002Fcommon-issues.md)** - FAQ and solutions\n\n## Resources\n\n- **Official docs**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002F\n- **Data types**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002Fdata-types\u002F\n- **Media params**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Frtms\u002Fmedia-parameter-definition\u002F\n- **Developer forum**: https:\u002F\u002Fdevforum.zoom.us\u002F\n\n---\n\n**Need help?** Start with Integrated Index section below for complete navigation.\n\n---\n\n## Integrated Index\n\n_This section was migrated from `SKILL.md`._\n\nRTMS provides real-time access to live audio, video, transcript, chat, and screen share from Zoom meetings, webinars, and Video SDK sessions.\n\n## Critical Positioning\n\nTreat RTMS as a **backend service** for receiving and processing media streams.\n\n- Backend role: ingest audio\u002Fvideo\u002Fshare\u002Fchat\u002Ftranscript, run AI\u002Fanalytics, persist\u002Fforward data.\n- Optional frontend role: Zoom App SDK or web dashboard that consumes processed stream data from backend transport (WebSocket\u002FSSE\u002Fother).\n- Kickoff model: backend waits for RTMS start webhook events, then starts stream processing.\n\nDo not model RTMS as a frontend-only SDK.\n\n## Quick Start Path\n\n**If you're new to RTMS, follow this order:**\n\n1. **Run preflight checks first** -> [RUNBOOK.md](RUNBOOK.md)\n2. **Understand the architecture** -> [concepts\u002Fconnection-architecture.md](concepts\u002Fconnection-architecture.md)\n   - Two-phase WebSocket: Signaling + Media\n   - Why RTMS doesn't use bots\n\n3. **Choose your approach** -> SDK or Manual\n   - SDK (recommended): [examples\u002Fsdk-quickstart.md](examples\u002Fsdk-quickstart.md)\n   - Manual WebSocket: [examples\u002Fmanual-websocket.md](examples\u002Fmanual-websocket.md)\n\n4. **Understand the lifecycle** -> [concepts\u002Flifecycle-flow.md](concepts\u002Flifecycle-flow.md)\n   - Webhook -> Signaling -> Media -> Streaming\n\n5. **Configure media types** -> [references\u002Fmedia-types.md](references\u002Fmedia-types.md)\n   - Audio, video, transcript, chat, screen share\n\n6. **Troubleshoot issues** -> [troubleshooting\u002Fcommon-issues.md](troubleshooting\u002Fcommon-issues.md)\n   - Connection problems, duplicate webhooks, missing data\n\n---\n\n## Documentation Structure\n\n```\nrtms\u002F\n├── SKILL.md                           # Main skill overview\n├── SKILL.md                           # This file - navigation guide\n│\n├── concepts\u002F                          # Core architectural patterns\n│   ├── connection-architecture.md     # Two-phase WebSocket design\n│   └── lifecycle-flow.md              # Webhook to streaming flow\n│\n├── examples\u002F                          # Complete working code\n│   ├── sdk-quickstart.md              # Using @zoom\u002Frtms SDK\n│   ├── manual-websocket.md            # Raw protocol implementation\n│   ├── rtms-bot.md                    # Complete RTMS bot implementation\n│   └── ai-integration.md              # Transcription and analysis\n│\n├── references\u002F                        # Reference documentation\n│   ├── media-types.md                 # Audio, video, transcript, chat, share\n│   ├── data-types.md                  # All enums and constants\n│   ├── connection.md                  # WebSocket protocol details\n│   └── webhooks.md                    # Event subscription\n│\n└── troubleshooting\u002F                   # Problem solving guides\n    └── common-issues.md               # FAQ and solutions\n```\n\n---\n\n## By Use Case\n\n### I want to get meeting transcripts\n1. [SDK Quickstart](examples\u002Fsdk-quickstart.md) - Fastest approach\n2. [Media Types](references\u002Fmedia-types.md#transcript) - Transcript configuration\n3. [AI Integration](examples\u002Fai-integration.md) - Whisper, Deepgram, AssemblyAI\n\n### I want to record meetings\n1. [Media Types](references\u002Fmedia-types.md) - Audio + Video configuration\n2. [SDK Quickstart](examples\u002Fsdk-quickstart.md) - Receiving media\n3. [AI Integration](examples\u002Fai-integration.md#audio-recording) - Gap-filled recording\n\n### I want to build an AI meeting assistant\n1. [AI Integration](examples\u002Fai-integration.md) - Complete patterns\n2. [SDK Quickstart](examples\u002Fsdk-quickstart.md) - Media ingestion\n3. [Lifecycle Flow](concepts\u002Flifecycle-flow.md) - Event handling\n\n### I want to build a complete RTMS bot\n1. [RTMS Bot](examples\u002Frtms-bot.md) - **Complete implementation guide**\n2. [Lifecycle Flow](concepts\u002Flifecycle-flow.md) - Webhook to streaming flow\n3. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Two-phase design\n\n### I need full protocol control\n1. [Manual WebSocket](examples\u002Fmanual-websocket.md) - **START HERE**\n2. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Two-phase design\n3. [Data Types](references\u002Fdata-types.md) - All message types and enums\n4. [Connection](references\u002Fconnection.md) - Protocol details\n\n### I'm getting connection errors\n1. [Common Issues](troubleshooting\u002Fcommon-issues.md) - Diagnostic checklist\n2. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Verify flow\n3. [Webhooks](references\u002Fwebhooks.md) - Validation and timing\n\n### I want to understand the architecture\n1. [Connection Architecture](concepts\u002Fconnection-architecture.md) - Two-phase WebSocket\n2. [Lifecycle Flow](concepts\u002Flifecycle-flow.md) - Complete flow diagram\n3. [Data Types](references\u002Fdata-types.md) - Protocol constants\n\n---\n\n## By Product\n\n### I'm building for Zoom Meetings\n- Standard RTMS setup. Webhook event: `meeting.rtms_started`. Uses General App with OAuth.\n- Start with [SDK Quickstart](examples\u002Fsdk-quickstart.md) or [Manual WebSocket](examples\u002Fmanual-websocket.md).\n\n### I'm building for Zoom Webinars\n- Same as meetings, but webhook event is `webinar.rtms_started`. Payload still uses `meeting_uuid` (NOT `webinar_uuid`).\n- Add webinar scopes and event subscriptions. See [Webhooks](references\u002Fwebhooks.md).\n- Only **panelist** streams are confirmed available. Attendee streams may not be individual.\n\n### I'm building for Zoom Video SDK\n- Webhook event: `session.rtms_started`. Payload uses `session_id` (NOT `meeting_uuid`).\n- Requires a **Video SDK App** with SDK Key\u002FSecret (not OAuth Client ID\u002FSecret).\n- Once connected, the protocol is **identical** to meetings.\n- See [Webhooks](references\u002Fwebhooks.md) for payload details.\n\n---\n\n## Key Documents\n\n### 1. Connection Architecture (CRITICAL)\n**[concepts\u002Fconnection-architecture.md](concepts\u002Fconnection-architecture.md)**\n\nRTMS uses **two separate WebSocket connections**:\n- **Signaling WebSocket**: Authentication, control, heartbeats\n- **Media WebSocket**: Actual audio\u002Fvideo\u002Ftranscript data\n\n### 2. SDK vs Manual (DECISION POINT)\n**[examples\u002Fsdk-quickstart.md](examples\u002Fsdk-quickstart.md)** vs **[examples\u002Fmanual-websocket.md](examples\u002Fmanual-websocket.md)**\n\n| SDK | Manual |\n|-----|--------|\n| Handles WebSocket complexity | Full protocol control |\n| Automatic reconnection | DIY reconnection |\n| Less code | More code |\n| Best for most use cases | Best for custom requirements |\n\n### 3. Critical Gotchas (MOST COMMON ISSUES)\n**[troubleshooting\u002Fcommon-issues.md](troubleshooting\u002Fcommon-issues.md)**\n\n1. **Respond 200 immediately** - Delayed webhook responses cause duplicates\n2. **Only 1 connection per stream** - New connections kick out existing\n3. **Heartbeat required** - Must respond to keep-alive or connection dies\n4. **Track active sessions** - Prevent duplicate join attempts\n\n---\n\n## Key Learnings\n\n### Critical Discoveries:\n\n1. **Two-Phase WebSocket Design**\n   - Signaling: Control plane (handshake, heartbeat, start\u002Fstop)\n   - Media: Data plane (audio, video, transcript, chat, share)\n   - See: [Connection Architecture](concepts\u002Fconnection-architecture.md)\n\n2. **Webhook Response Timing**\n   - MUST respond 200 BEFORE any processing\n   - Delayed response -> Zoom retries -> duplicate connections\n   - See: [Common Issues](troubleshooting\u002Fcommon-issues.md#webhook-response-timing)\n\n3. **Heartbeat is Mandatory**\n   - Signaling: Receive msg_type 12, respond with msg_type 13\n   - Media: Same pattern\n   - Failure to respond = connection closed\n   - See: [Connection](references\u002Fconnection.md#heartbeat)\n\n4. **Signature Generation**\n   - Format: `HMAC-SHA256(clientSecret, \"clientId,meetingUuid,streamId\")`\n   - For Video SDK, use `session_id` in place of `meetingUuid`\n   - Webinars still use `meeting_uuid` (not `webinar_uuid`)\n   - Required for both signaling and media handshakes\n   - See: [Manual WebSocket](examples\u002Fmanual-websocket.md#signature-generation)\n\n5. **Media Types are Bitmasks**\n   - Audio=1, Video=2, Share=4, Transcript=8, Chat=16, All=32\n   - Combine with OR: Audio+Transcript = 1|8 = 9\n   - See: [Media Types](references\u002Fmedia-types.md)\n\n6. **Screen Share is SEPARATE from Video**\n   - Different msg_type (16 vs 15)\n   - Different media flag (4 vs 2)\n   - Must subscribe separately\n   - See: [Media Types](references\u002Fmedia-types.md#screen-share)\n\n---\n\n## Quick Reference\n\n### \"Connection fails\"\n-> [Common Issues](troubleshooting\u002Fcommon-issues.md)\n\n### \"Duplicate connections\"\n-> [Webhook timing](troubleshooting\u002Fcommon-issues.md#webhook-response-timing)\n\n### \"No audio\u002Fvideo data\"\n-> [Media Types](references\u002Fmedia-types.md) - Check configuration\n\n### \"How do I implement manually?\"\n-> [Manual WebSocket](examples\u002Fmanual-websocket.md)\n\n### \"What message types exist?\"\n-> [Data Types](references\u002Fdata-types.md)\n\n### \"How do I integrate AI?\"\n-> [AI Integration](examples\u002Fai-integration.md)\n\n---\n\n## Document Version\n\nBased on **Zoom RTMS SDK v1.x** and official documentation as of 2026.\n\n---\n\n**Happy coding!**\n\nRemember: Start with [SDK Quickstart](examples\u002Fsdk-quickstart.md) for the fastest path, or [Manual WebSocket](examples\u002Fmanual-websocket.md) if you need full control.\n",{"name":5,"triggers":49,"description":7,"user-invocable":45},[50,26,51,52,53,54,55,56,57,58,59,60,61,62,63,64],"real-time media","live audio stream","live video stream","meeting transcription","raw audio","raw video","websocket media","live transcript","streaming audio","streaming video","meeting bot media","contact center voice media","participant video on","participant video off","single individual video stream","main","e605d8ddbfb688da57dfaaceebd93f12a64ef1d3","partner-built\u002Fzoom-plugin\u002Fskills\u002Frtms",3944,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","https:\u002F\u002Fgithub.com\u002Fanthropics","https:\u002F\u002Fanthropic.com","2026-11-14 06:21:52",{"source":8,"skillName":5,"commands":74,"prompt":84,"zipAvailable":85},[75,78,81],{"tool":76,"command":77},"npx","npx skills add anthropics\u002Fknowledge-work-plugins --skill zoom-rtms",{"tool":79,"command":80},"bunx","bunx skills add anthropics\u002Fknowledge-work-plugins --skill zoom-rtms",{"tool":82,"command":83},"pnpm","pnpm dlx skills add anthropics\u002Fknowledge-work-plugins --skill zoom-rtms","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002FSKILL.md",true,[87,93,97,101,105,109,113,117,121,125,129,133,137,141],{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},"concepts\u002Fconnection-architecture.md","REFERENCE","参考文档",9285,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Fconcepts\u002Fconnection-architecture.md",{"path":94,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":95,"sourceHtmlUrl":96},"concepts\u002Flifecycle-flow.md",13789,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Fconcepts\u002Flifecycle-flow.md",{"path":98,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":99,"sourceHtmlUrl":100},"examples\u002Fai-integration.md",11681,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Fexamples\u002Fai-integration.md",{"path":102,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":103,"sourceHtmlUrl":104},"examples\u002Fmanual-websocket.md",17335,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Fexamples\u002Fmanual-websocket.md",{"path":106,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":107,"sourceHtmlUrl":108},"examples\u002Frtms-bot.md",26904,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Fexamples\u002Frtms-bot.md",{"path":110,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":111,"sourceHtmlUrl":112},"examples\u002Fsdk-quickstart.md",9538,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Fexamples\u002Fsdk-quickstart.md",{"path":114,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":115,"sourceHtmlUrl":116},"references\u002Fconnection.md",8226,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Freferences\u002Fconnection.md",{"path":118,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":119,"sourceHtmlUrl":120},"references\u002Fdata-types.md",13981,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Freferences\u002Fdata-types.md",{"path":122,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":123,"sourceHtmlUrl":124},"references\u002Fenvironment-variables.md",1303,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Freferences\u002Fenvironment-variables.md",{"path":126,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":127,"sourceHtmlUrl":128},"references\u002Fmedia-types.md",6103,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Freferences\u002Fmedia-types.md",{"path":130,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":131,"sourceHtmlUrl":132},"references\u002Fquickstart.md",6734,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Freferences\u002Fquickstart.md",{"path":134,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":135,"sourceHtmlUrl":136},"references\u002Fwebhooks.md",7624,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Freferences\u002Fwebhooks.md",{"path":138,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":139,"sourceHtmlUrl":140},"RUNBOOK.md",2677,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002FRUNBOOK.md",{"path":142,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":143,"sourceHtmlUrl":144},"troubleshooting\u002Fcommon-issues.md",10655,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Frtms\u002Ftroubleshooting\u002Fcommon-issues.md",[146,171,196,218,246,272],{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":44},"01M718Y97HCGW12Q53PSJDY03W","ticket-deflector","Reads a forwarded customer email or ticket, pulls order and refund status from a payments connector (PayPal, Square, or Stripe) or Shopify, account history from the CRM, and open tickets from a support desk (Zoho Desk), drafts a tone-matched reply in the owner's writing voice, and can issue a refund through the payments connector with explicit owner approval. With Shopify connected it also runs a proactive order-triage mode that surfaces orders needing attention — unfulfilled past the promised window, payment problems, pending refunds, stuck shipments — and drafts the next action for each before the customer has to ask. Use when the user says \"draft a response,\" \"answer this customer,\" \"where's my order,\" \"I want a refund,\" \"check my orders,\" or \"anything about to blow up.\"","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fticket-deflector\u002FSKILL.md",[],[153,154,155,156,157,158,159,36,35,160,161,162,163,164,165,166,167,168,169,170],"ticket","ticket deflector","mode","up","payments","open","writing","ask","Connector","text","mail","window","next","customer","support","crm","past","read",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":177,"publishedAt":44},"01M718Y55HFAN5705ME5VEDZ9K","tax-season-organizer","Prepares tax-season materials for the owner's accountant, not tax advice. US federal tax; a non-US business gets its closed-books packet instead. Two modes: (1) quarterly estimated tax from YTD net income in the ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books); (2) year-end 1099 prep, scanning the ledger, PayPal, and Stripe for contractors paid over USD 600 into a 1099-NEC list with missing W-9 flags.\nAny tax request routes first to \u002Ftax-prep, which confirms the books are closed and reconciled before running this skill. Use this skill directly only when the owner says the period's books are already closed: \"books are closed, now do the 1099s,\" \"run the quarterly estimate off the closed numbers,\" or \"just the contractor W-9 list.\"","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Ftax-season-organizer\u002FSKILL.md",[],[178,179,180,181,182,183,184,185,186,187,36,188,189,190,191,192,170,193,194,195],"tax season organizer","tax","us federal","which","netsuite","paid","end","usd","only","now","books","xero","scanning","run","request","flags","list","stripe",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":202,"publishedAt":44},"01M718Y13VVPHDD9NTDBVFJ2AZ","tax-prep","Prepares tax materials as a two-link chain — month-end-prep confirms the books are closed and reconciled first, then tax-season-organizer calculates the quarterly estimated payment or builds the year-end 1099-NEC list and accountant packet from those closed numbers. Requires a ledger (MYOB, NetSuite, QuickBooks, Xero, or Zoho Books); uses Gusto, PayPal, and Stripe when connected, else CSV upload. US federal tax math; a non-US business gets the closed-books packet. Prep material for a CPA, never tax advice, nothing filed. Trigger on \"quarterly taxes,\" \"estimated tax payment,\" \"how much should I set aside,\" \"1099s,\" \"1099-NEC,\" \"W-9s,\" \"year-end tax prep,\" \"get my books ready for my accountant,\" any phrasing that suggests a tax deadline is coming, or a question about net profit or YTD income that sounds like worry about a tax bill. An owner who says the period's books are already closed routes to tax-season-organizer directly.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Ftax-prep\u002FSKILL.md",[],[203,179,204,205,180,206,207,182,208,209,210,211,212,28,213,184,214,215,216,217],"tax prep","prep","SET","as","ready","never","zoho books","get","chain","profit","trigger","material","question","paypal","business",{"skillNo":219,"name":220,"nameZh":6,"description":221,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":222,"categories":223,"keywords":229,"publishedAt":44},"01M718XWTWQZ01GYSG9T8RW8TW","speed-to-lead","Makes sure no inbound lead goes unanswered. Watches web forms, the shared inbox, and the CRM for new inquiries, qualifies each one against the owner's criteria, drafts a reply in the owner's voice with real meeting times for the owner to approve and send, routes anything hot to a human right away, and logs the whole thing to the CRM. Never sends on its own. Built to run on a schedule so overnight inquiries are drafted and sorted by morning, and works from forwarded or pasted inquiries when no connector is available. Use this whenever the owner is worried about inbound leads or response time — including phrasings like \"leads are going cold,\" \"did anyone answer that inquiry,\" \"I keep missing form submissions,\" \"nothing falls through the cracks,\" \"handle my inbound,\" \"respond to this lead,\" or \"we lose people because nobody gets back fast enough.\" Reach for it for a single unanswered inquiry as readily as for a standing setup.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fspeed-to-lead\u002FSKILL.md",[224],{"categoryNo":225,"categoryName":226,"taxonomyType":227,"taxonomyTypeDesc":228},"01JBSEEDCAT000000000000034","行政与办公人员","PROFESSION","适用职业",[230,231,232,233,234,235,208,39,236,237,238,239,240,241,36,242,243,161,244,245],"speed to lead","lead","speed","shared","back","cold","inbox","send","respond","new","web forms","people","schedule","logs","sure","human",{"skillNo":247,"name":248,"nameZh":6,"description":249,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":250,"categories":251,"keywords":255,"publishedAt":44},"01M718XQYMN1KY3TPS33967FK0","social-content-engine","Runs the owner's content operation as a standing thing rather than a one-off: keeps a rolling posting calendar, learns the owner's voice, generates on-brand Canva graphics, writes captions that sound like them, repurposes one asset into every channel format, and stages posts for approval instead of publishing on its own. Pulls product photos and prices from Shopify when connected; with no connectors, drafts the calendar and asset briefs for manual posting. Use this whenever the owner talks about posting, content, or social — including \"I need to post more,\" \"we've gone quiet on Instagram,\" \"what should we post this month,\" \"make the content,\" \"give me a month of posts,\" \"write this in my voice,\" \"repurpose this,\" or \"set up our content calendar.\" Reach for it for a single post as readily as for a full quarter. One handoff: a finished, approved campaign brief goes to canva-creator; this skill owns the standing operation.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fsocial-content-engine\u002FSKILL.md",[252],{"categoryNo":253,"categoryName":254,"taxonomyType":227,"taxonomyTypeDesc":228},"01JBSEEDCAT000000000000036","内容创作者",[256,257,258,259,260,261,205,262,263,264,265,156,266,36,267,268,269,170,270,271],"social","social content engine","engine","content engine","social content","content","brief","posts","Captions","prices","campaign","me","product","calendar","write","drafts",{"skillNo":273,"name":274,"nameZh":6,"description":275,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":276,"categories":277,"keywords":278,"publishedAt":44},"01M718XMPJVH0EVRVP998BVZPC","smb-router","The front door to the Small Business plugin. Listens to what the owner needs right now — vague or specific — and routes them to the best skill or slash command for the moment. Also serves as a guide: explains what's available, suggests what to try next, and adapts recommendations based on stored business context. Trigger whenever the owner asks \"what can you do,\" \"help me with my business,\" \"what should I focus on,\" \"I don't know where to start,\" or any open-ended business request that doesn't clearly match a single skill.","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Fblob\u002Fmain\u002Fsmall-business\u002Fskills\u002Fsmb-router\u002FSKILL.md",[],[279,280,281,206,282,28,213,283,158,284,187,217,285,286,287,288,289,267,290,165],"router","smb","smb router","do","front","single","you","vague","can","with","plugin","focus"]