zoom-meeting-sdk-web-component-view
Zoom Meeting SDK Web - Component View. Embeddable Zoom meeting components with Promise-based API for flexible integration. Ideal for React/Vue/Angular apps and custom layouts. Uses ZoomMtgEmbedded with async/await patterns and embeddable UI containers.
下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o zoom-meeting-sdk-web-component-view.zip https://jpskill.com/download/22693.zip && unzip -o zoom-meeting-sdk-web-component-view.zip && rm zoom-meeting-sdk-web-component-view.zip
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/22693.zip -OutFile "$d\zoom-meeting-sdk-web-component-view.zip"; Expand-Archive "$d\zoom-meeting-sdk-web-component-view.zip" -DestinationPath $d -Force; ri "$d\zoom-meeting-sdk-web-component-view.zip"
完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。
💾 手動でダウンロードしたい(コマンドが難しい人向け)
- 1. 下の青いボタンを押して
zoom-meeting-sdk-web-component-view.zipをダウンロード - 2. ZIPファイルをダブルクリックで解凍 →
zoom-meeting-sdk-web-component-viewフォルダができる - 3. そのフォルダを
C:\Users\あなたの名前\.claude\skills\(Win)または~/.claude/skills/(Mac)へ移動 - 4. Claude Code を再起動
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-18
- 取得日時
- 2026-05-18
- 同梱ファイル
- 2
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Zoom Meeting SDK Web - Component View
あらゆるWebアプリケーションに柔軟に統合できる、埋め込み可能なZoomミーティングコンポーネントです。Component Viewは、PromiseベースのAPIとカスタマイズ可能なUIを提供します。
これは、実際のZoomミーティングの周りにカスタムUIを構築するための正しいWebスキルです。 ユーザーがミーティング以外のカスタムセッション製品を構築している場合を除き、Video SDKにルーティングしないでください。
概要
Component Viewは、ZoomMtgEmbedded.createClient()を使用して、特定のコンテナ要素内に埋め込み可能なミーティングコンポーネントを作成します。
| 側面 | 詳細 |
|---|---|
| APIオブジェクト | ZoomMtgEmbedded.createClient() (インスタンス) |
| APIスタイル | Promiseベース (async/await) |
| UI | 任意のコンテナに埋め込み可能 |
| パスワードパラメータ | password (小文字) |
| イベント | on()/off() |
| 最適用途 | カスタムレイアウト、React/Vue/Angularアプリ |
インストール
NPM
npm install @zoom/meetingsdk --save
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';
CDN
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react-dom.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux-thunk.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/lodash.min.js"></script>
<script src="https://source.zoom.us/zoom-meeting-embedded-{VERSION}.min.js"></script>
完全な初期化フロー
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';
// Step 1: クライアントインスタンスを作成します(一度だけ行い、レンダリングごとに繰り返さないでください!)
const client = ZoomMtgEmbedded.createClient();
async function joinMeeting() {
try {
// Step 2: コンテナ要素を取得します
const meetingSDKElement = document.getElementById('meetingSDKElement');
// Step 3: クライアントを初期化します
await client.init({
zoomAppRoot: meetingSDKElement,
language: 'en-US',
debug: true,
patchJsMedia: true,
leaveOnPageUnload: true,
});
// Step 4: ミーティングに参加します
await client.join({
signature: signature,
sdkKey: sdkKey,
meetingNumber: meetingNumber,
userName: userName,
password: password, // 小文字です!
userEmail: userEmail,
});
console.log('Joined successfully!');
} catch (error) {
console.error('Failed to join:', error);
}
}
client.init() - すべてのオプション
必須
| パラメータ | 型 | 説明 |
|---|---|---|
zoomAppRoot |
HTMLElement |
ミーティングUIのコンテナ要素 |
表示
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
language |
string |
'en-US' |
UI言語 |
debug |
boolean |
false |
デバッグログを有効にする |
メディア
| パラメータ | 型 | デフォルト | 説明 |
|---|---|---|---|
patchJsMedia |
boolean |
false |
メディアの修正を自動適用する |
leaveOnPageUnload |
boolean |
false |
ページアンロード時にクリーンアップする |
enableHD |
boolean |
true |
720pビデオを有効にする |
enableFullHD |
boolean |
false |
1080pビデオを有効にする |
カスタマイズ
| パラメータ | 型 | 説明 |
|---|---|---|
customize |
object |
UIカスタマイズオプション |
webEndpoint |
string |
ZFGの場合: 'www.zoomgov.com' |
assetPath |
string |
AVライブラリのカスタムパス |
Customizeオブジェクト
await client.init({
zoomAppRoot: element,
customize: {
// 表示されるミーティング情報
meetingInfo: [
'topic',
'host',
'mn',
'pwd',
'telPwd',
'invite',
'participant',
'dc',
'enctype'
],
// ビデオのカスタマイズ
video: {
isResizable: true,
viewSizes: {
default: {
width: 1000,
height: 600
},
ribbon: {
width: 300,
height: 700
}
},
popper: {
disableDraggable: false
}
},
// カスタムツールバーボタン
toolbar: {
buttons: [
{
text: 'Custom Button',
className: 'custom-btn',
onClick: () => {
console.log('Custom button clicked');
}
}
]
},
// アクティブスピーカーインジケーター
activeSpaker: {
strokeColor: '#00FF00'
}
}
});
client.join() - すべてのオプション
必須
| パラメータ | 型 | 説明 |
|---|---|---|
signature |
string |
バックエンドからのSDK JWT |
sdkKey |
string |
SDK Key / Client ID |
meetingNumber |
string \| number |
ミーティング番号 |
userName |
string |
表示名 |
認証
| パラメータ | 型 | 必須となる場合 | 説明 |
|---|---|---|---|
password |
string |
設定されている場合 | ミーティングパスワード (小文字です!) |
zak |
string |
ホストとして開始する場合 | ホストのZAKトークン |
tk |
string |
登録 | 登録者トークン |
userEmail |
string |
ウェビナー | ユーザーメール |
イベントリスナー
構文
// 購読
client.on('event-name', callback);
// 購読解除
client.off('event-name', callback);
接続イベント
client.on('connection-change', (payload) => {
// payload.state: 'Connecting', 'Connected', 'Reconnecting', 'Closed'
console.log('Connection state:', payload.state);
if (payload.state === 'Closed') {
console.log('Reason:', payload.reason);
}
});
ユーザーイベント
client.on('user-added', (payload) => {
// 参加したユーザーの配列
console.log('Users added:', payload);
payload.forEach(user => {
console.log('User ID:', user.oderId);
console.log('Name:', user.displayName);
});
});
client.on('user-removed', (payload) => {
// 退室したユーザーの配列
console.log('Users removed:', payload);
});
client.on('user-updated', (payload) => {
// pが更新されたユーザーの配列 📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Zoom Meeting SDK Web - Component View
Embeddable Zoom meeting components for flexible integration into any web application. Component View provides Promise-based APIs and customizable UI.
This is the correct web skill for a custom UI around a real Zoom meeting. Do not route to Video SDK unless the user is building a non-meeting custom session product.
Overview
Component View uses ZoomMtgEmbedded.createClient() to create embeddable meeting components within a specific container element.
| Aspect | Details |
|---|---|
| API Object | ZoomMtgEmbedded.createClient() (instance) |
| API Style | Promise-based (async/await) |
| UI | Embeddable in any container |
| Password param | password (lowercase) |
| Events | on()/off() |
| Best For | Custom layouts, React/Vue/Angular apps |
Installation
NPM
npm install @zoom/meetingsdk --save
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';
CDN
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/react-dom.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/redux-thunk.min.js"></script>
<script src="https://source.zoom.us/{VERSION}/lib/vendor/lodash.min.js"></script>
<script src="https://source.zoom.us/zoom-meeting-embedded-{VERSION}.min.js"></script>
Complete Initialization Flow
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';
// Step 1: Create client instance (do once, not on every render!)
const client = ZoomMtgEmbedded.createClient();
async function joinMeeting() {
try {
// Step 2: Get container element
const meetingSDKElement = document.getElementById('meetingSDKElement');
// Step 3: Initialize client
await client.init({
zoomAppRoot: meetingSDKElement,
language: 'en-US',
debug: true,
patchJsMedia: true,
leaveOnPageUnload: true,
});
// Step 4: Join meeting
await client.join({
signature: signature,
sdkKey: sdkKey,
meetingNumber: meetingNumber,
userName: userName,
password: password, // lowercase!
userEmail: userEmail,
});
console.log('Joined successfully!');
} catch (error) {
console.error('Failed to join:', error);
}
}
client.init() - All Options
Required
| Parameter | Type | Description |
|---|---|---|
zoomAppRoot |
HTMLElement |
Container element for meeting UI |
Display
| Parameter | Type | Default | Description |
|---|---|---|---|
language |
string |
'en-US' |
UI language |
debug |
boolean |
false |
Enable debug logging |
Media
| Parameter | Type | Default | Description |
|---|---|---|---|
patchJsMedia |
boolean |
false |
Auto-apply media fixes |
leaveOnPageUnload |
boolean |
false |
Cleanup on page unload |
enableHD |
boolean |
true |
Enable 720p video |
enableFullHD |
boolean |
false |
Enable 1080p video |
Customization
| Parameter | Type | Description |
|---|---|---|
customize |
object |
UI customization options |
webEndpoint |
string |
For ZFG: 'www.zoomgov.com' |
assetPath |
string |
Custom path for AV libraries |
Customize Object
await client.init({
zoomAppRoot: element,
customize: {
// Meeting info displayed
meetingInfo: [
'topic',
'host',
'mn',
'pwd',
'telPwd',
'invite',
'participant',
'dc',
'enctype'
],
// Video customization
video: {
isResizable: true,
viewSizes: {
default: {
width: 1000,
height: 600
},
ribbon: {
width: 300,
height: 700
}
},
popper: {
disableDraggable: false
}
},
// Custom toolbar buttons
toolbar: {
buttons: [
{
text: 'Custom Button',
className: 'custom-btn',
onClick: () => {
console.log('Custom button clicked');
}
}
]
},
// Active speaker indicator
activeSpaker: {
strokeColor: '#00FF00'
}
}
});
client.join() - All Options
Required
| Parameter | Type | Description |
|---|---|---|
signature |
string |
SDK JWT from backend |
sdkKey |
string |
SDK Key / Client ID |
meetingNumber |
string \| number |
Meeting number |
userName |
string |
Display name |
Authentication
| Parameter | Type | When Required | Description |
|---|---|---|---|
password |
string |
If set | Meeting password (lowercase!) |
zak |
string |
Starting as host | Host's ZAK token |
tk |
string |
Registration | Registrant token |
userEmail |
string |
Webinars | User email |
Event Listeners
Syntax
// Subscribe
client.on('event-name', callback);
// Unsubscribe
client.off('event-name', callback);
Connection Events
client.on('connection-change', (payload) => {
// payload.state: 'Connecting', 'Connected', 'Reconnecting', 'Closed'
console.log('Connection state:', payload.state);
if (payload.state === 'Closed') {
console.log('Reason:', payload.reason);
}
});
User Events
client.on('user-added', (payload) => {
// Array of users who joined
console.log('Users added:', payload);
payload.forEach(user => {
console.log('User ID:', user.oderId);
console.log('Name:', user.displayName);
});
});
client.on('user-removed', (payload) => {
// Array of users who left
console.log('Users removed:', payload);
});
client.on('user-updated', (payload) => {
// Array of users whose properties changed
console.log('Users updated:', payload);
});
Audio Events
client.on('active-speaker', (payload) => {
// Current active speaker
console.log('Active speaker:', payload);
});
client.on('audio-statistic-data-change', (payload) => {
console.log('Audio stats:', payload);
});
Video Events
client.on('video-active-change', (payload) => {
// Video state changed
console.log('Video active:', payload);
});
client.on('video-statistic-data-change', (payload) => {
console.log('Video stats:', payload);
});
Share Events
client.on('active-share-change', (payload) => {
console.log('Share status:', payload);
});
client.on('share-statistic-data-change', (payload) => {
console.log('Share stats:', payload);
});
Chat Events
client.on('chat-on-message', (payload) => {
console.log('Chat message:', payload);
});
Recording Events
client.on('recording-change', (payload) => {
console.log('Recording status:', payload);
});
Media Device Events
client.on('media-sdk-change', (payload) => {
console.log('Media SDK:', payload);
});
client.on('device-change', () => {
console.log('Device changed');
});
Common Methods
User Information
// Get current user
const currentUser = client.getCurrentUser();
console.log('Current user:', currentUser);
// Get all participants
const participants = client.getParticipantsList();
console.log('Participants:', participants);
// Check if user is host
const isHost = client.isHost();
Audio Control
// Mute/unmute self
await client.mute(true); // mute
await client.mute(false); // unmute
// Mute/unmute specific user (host only)
await client.muteAudio(userId, true);
// Mute all (host only)
await client.muteAllAudio(true);
Video Control
// Start/stop video
await client.startVideo();
await client.stopVideo();
// Mute/unmute user's video (host only)
await client.muteVideo(userId, true);
Meeting Control
// Leave meeting
client.leaveMeeting();
// End meeting (host only)
client.endMeeting();
Screen Share
// Start screen share
await client.startShareScreen();
// Stop screen share
await client.stopShareScreen();
Recording
// Start recording (cloud)
await client.startCloudRecording();
// Stop recording
await client.stopCloudRecording();
Virtual Background
// Check support
const isSupported = await client.isSupportVirtualBackground();
// Set virtual background
await client.setVirtualBackground(imageUrl);
// Remove virtual background
await client.removeVirtualBackground();
Rename
// Rename user
await client.rename(userId, 'New Name');
React Integration
Basic Pattern
import { useEffect, useRef, useState, useCallback } from 'react';
import ZoomMtgEmbedded from '@zoom/meetingsdk/embedded';
type ZoomClient = ReturnType<typeof ZoomMtgEmbedded.createClient>;
function ZoomMeeting({ meetingNumber, password, userName }: Props) {
const clientRef = useRef<ZoomClient | null>(null);
const containerRef = useRef<HTMLDivElement>(null);
const [isJoined, setIsJoined] = useState(false);
const [error, setError] = useState<string | null>(null);
// Create client once
useEffect(() => {
if (!clientRef.current) {
clientRef.current = ZoomMtgEmbedded.createClient();
}
}, []);
const joinMeeting = useCallback(async () => {
if (!clientRef.current || !containerRef.current) return;
try {
// Get signature from backend
const { signature, sdkKey } = await fetchSignature(meetingNumber);
await clientRef.current.init({
zoomAppRoot: containerRef.current,
language: 'en-US',
patchJsMedia: true,
leaveOnPageUnload: true,
});
await clientRef.current.join({
signature,
sdkKey,
meetingNumber,
password,
userName,
});
setIsJoined(true);
} catch (err) {
setError(err instanceof Error ? err.message : 'Failed to join');
}
}, [meetingNumber, password, userName]);
return (
<div>
<div
ref={containerRef}
style={{ width: '100%', height: '500px' }}
/>
{!isJoined && (
<button onClick={joinMeeting}>Join Meeting</button>
)}
{error && <div className="error">{error}</div>}
</div>
);
}
Event Handling in React
useEffect(() => {
if (!clientRef.current) return;
const handleConnectionChange = (payload: any) => {
if (payload.state === 'Connected') {
setIsJoined(true);
} else if (payload.state === 'Closed') {
setIsJoined(false);
}
};
const handleUserAdded = (payload: any) => {
console.log('Users joined:', payload);
};
clientRef.current.on('connection-change', handleConnectionChange);
clientRef.current.on('user-added', handleUserAdded);
return () => {
clientRef.current?.off('connection-change', handleConnectionChange);
clientRef.current?.off('user-added', handleUserAdded);
};
}, []);
Positioning and Resizing
Initial Size
await client.init({
zoomAppRoot: element,
customize: {
video: {
viewSizes: {
default: { width: 1000, height: 600 }
}
}
}
});
Dynamic Resizing
The container element size determines the meeting UI size. To resize:
// Just resize the container
document.getElementById('meetingSDKElement').style.width = '1200px';
document.getElementById('meetingSDKElement').style.height = '800px';
Making it Resizable
customize: {
video: {
isResizable: true
}
}
Supported Features
Component View supports core meeting functionality. Some features from Client View may not be available.
| Feature | Supported |
|---|---|
| Audio/Video | ✅ |
| Screen Share | ✅ |
| Chat | ✅ |
| Virtual Background | ✅ |
| Breakout Rooms | ✅ |
| Cloud Recording | ✅ |
| Closed Captions | ✅ |
| Live Transcription | ✅ |
| Waiting Room | ✅ |
| Gallery View | ✅ |
| Reactions | ✅ |
| Raise Hand | ✅ |
Contact Zoom Developer Support to request additional features.
Error Handling
try {
await client.join({
// ... options
});
} catch (error) {
// error.reason contains error code
// error.message contains description
switch (error.reason) {
case 'WRONG_MEETING_PASSWORD':
console.error('Incorrect password');
break;
case 'MEETING_NOT_START':
console.error('Meeting has not started');
break;
case 'INVALID_PARAMETERS':
console.error('Invalid join parameters');
break;
default:
console.error('Join failed:', error.message);
}
}
Comparison with Client View
| Feature | Component View | Client View |
|---|---|---|
| API Style | Promises | Callbacks |
| Password param | password |
passWord |
| Container | Custom element | Auto #zmmtg-root |
| UI | Embeddable | Full-page |
| Preloading | Not needed | preLoadWasm() |
| Language | Init option | i18n.load() |
| Events | on()/off() |
inMeetingServiceListener() |
Resources
- Main Web SDK Skill
- Reference Index
- Error Codes
- Common Issues
- SharedArrayBuffer Setup
- Official API Reference
Operations
- RUNBOOK.md - 5-minute preflight and debugging checklist.
同梱ファイル
※ ZIPに含まれるファイル一覧。`SKILL.md` 本体に加え、参考資料・サンプル・スクリプトが入っている場合があります。
- 📄 SKILL.md (14,428 bytes)
- 📎 references/README.md (477 bytes)