tubekit について
tubekitは、AIアシスタントからYouTubeチャンネルを管理するためのMCPサーバーです。公開、分析、クリエイター向け機能を備え、コンプライアンス確認、クォータ管理、冪等処理、監査記録を操作に組み込みます。
主な機能
- 01修正案付きコンプライアンス確認
- 02動画のアップロードとメタデータ管理
- 03チャンネル・動画分析レポート
- 04コメント確認とプレイリスト管理
- 05クォータ追跡と冪等なアップロード
- 06OAuthトークンの暗号化と監査ログ
活用シーン
- 01公開前の動画メタデータ確認
- 02再試行時の動画重複公開の防止
- 03チャンネル実績と動画傾向の確認
- 04コメントの仕分けとプレイリスト整理
MCP 対応
MCPクライアントからツールを呼び出し、YouTubeチャンネルのコンテンツ、分析データ、コメントを確認・公開・管理できます。状態を変更する呼び出しには、コンプライアンス、クォータ、監査の制御が適用されます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
uvx tubekit-mcpTUBEKIT_MASTER_KEY_PATHシークレットPath to the Fernet key that encrypts stored OAuth tokens at rest. The server refuses to start without one.TUBEKIT_OAUTH_CLIENT_SECRETS_PATHシークレットPath to your own Google Cloud OAuth client JSON. Required to refresh access tokens.TUBEKIT_STATE_DB_PATHSQLite file holding the audit log, quota ledger and channel state.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
tubekit-mcp
YouTube の公開、分析、クリエイターインサイトのための、コンプライアンスを考慮したModel Context Protocolサーバーです。チャンネルに変更を加える前に、すべての操作が審査され、使用量が計測され、監査されます。
tubekit-mcp は MCP サーバーです。MCP クライアント(Claude Desktop、Claude Code など)に接続すると、アシスタントがコンプライアンスチェック、クォータ管理、冪等性を備えたアップロード、状態を変更するすべての呼び出しに対する改ざん検知可能な監査ログとともに、あなたに代わって YouTube チャンネルの動画を公開・管理できます。FSL-1.1-MITライセンスのもと、商用・非商用を問わず自由に実行、セルフホストできます。各リリースは公開から2年後に通常の MIT ライセンスに移行します。
アーキテクチャ
単一のツール呼び出し(例:upload_video)は、コンプライアンスゲート、クォータ/冪等性台帳、OAuth の更新、YouTube API、改ざん検知可能な監査レコードを経由します。その際、純粋なコアはプロトコルの懸念から分離されており、この境界は AST フィットネステスト(tests/unit/services/test_no_fastmcp_imports.py)によって CI で強制されます。
flowchart LR
client["MCP client<br/>(Claude Desktop / Code)"]
subgraph edge["Protocol edge"]
transport["Transport<br/>stdio · HTTP + Bearer"]
tool["Tool wrapper"]
end
subgraph core["Pure core — no protocol imports (CI-enforced)"]
compliance{"Compliance<br/>gate"}
ledger["Quota +<br/>idempotency<br/>ledger"]
oauth["OAuth refresh<br/>(Fernet at rest)"]
end
upstream["YouTube<br/>Data / Analytics API"]
audit[("Tamper-evident<br/>hash-chained<br/>audit log")]
client --> transport --> tool --> compliance
compliance -->|pass| ledger --> oauth --> upstream
compliance -->|fail| suggestion["Suggestion →<br/>agent retries"]
tool -. audited .-> audit
ledger -. audited .-> audit
oauth -. audited .-> audit
これが必要な理由。 エージェントが実際の YouTube チャンネルを運用し始めています。そしてチャンネルは、失う可能性のある資産です。たった一度の誤った呼び出しで、ポリシーに違反する動画を公開したり、1日の API クォータを使い果たしたり(アップロードにはデフォルトの1日10,000ユニットのうち1,600ユニットが必要です)、再試行によって動画を二重に公開したりするおそれがあります。汎用の YouTube ラッパーはエージェントに生の API を渡しますが、
tubekitは、無人運用に必要なガードレールですべての呼び出しをラップします。公開前のコンプライアンスゲート、使用前のクォータ計上、冪等な再試行、保存時に暗号化される OAuth トークン(ログにはフィンガープリントのみを記録)、そしてエージェントが行ったすべての操作を記録する改ざん検知可能な監査チェーンを備えています。設計の詳しい理由はADR 0001をご覧ください。
使い方
前提条件
アシスタントがチャンネルを操作する前に、チャンネルごとに一度だけ次のものが必要です。
- YouTube Data API v3(
get_analyticsを使う場合は YouTube Analytics API も)を有効にした Google Cloud プロジェクト。 - OAuth クライアント(種類は Desktop app)を作成し、
client_secret.jsonとしてダウンロードしたもの。 - 同意を付与する Google アカウントに紐づく チャンネル。
OAuth の許可はここで一度だけ対話形式で行います。tubekit は取得した更新トークンを Fernet で暗号化して保存し、トークンを出力することはありません。Google Cloud Console を使ったことがない場合は、docs/runbooks/gcp-setup.mdをご覧ください。プロジェクト、API、同意画面、クライアントの種類に加え、後から戸惑うことの多い Google の2つのポリシー(テスト中のトークン有効期限、未監査プロジェクトにおける非公開固定のアップロード)まで、初期状態から一通り説明しています。同意フローについてはdocs/runbooks/oauth-bootstrap.mdをご覧ください。
インストール
PyPI からインストールする場合:
uv tool install tubekit-mcp # installs the tubekit / tubekit-mcp-* commands
実際にセットアップする場合は uvx ではなく uv tool install を使ってください。以下の一度限りの手順を終えた後も、tubekit CLI が使える状態にしておく必要があります。uvx tubekit-mcp は一時的な環境から stdio サーバーを実行します。これはセットアップ完了後に MCP クライアントの設定で指定するコマンドです。
サーバーはまだ起動しません。これは意図した動作です。 OAuth トークンを保存時に暗号化するマスターキーを勝手に生成せず、マスターキーがない状態での起動を拒否します。これを解決する2つのコマンドは、以下の初回セットアップに記載されています。
開発用にソースからインストールする場合:
git clone https://github.com/santiriera626/tubekit-mcp.git tubekit-mcp && cd tubekit-mcp
uv sync --all-extras # installs the tubekit / tubekit-mcp-* entry points
make db-upgrade # builds the state schema (wraps `tubekit db upgrade`;
# `tubekit db current` prints the applied revision)
(uv 自体は curl -LsSf https://astral.sh/uv/install.sh | sh でインストールできます。)
60 秒で試す — Google アカウントは不要です
コンプライアンスエンジンは完全にローカルで動作するため、Google Cloud に触れる前に、ゲートと自己修正用の Suggestion がどのように機能するかを確認できます。
cat > video.json <<'EOF'
{
"title": "Test Upload — Compliance Gate Demo",
"description": "Demo description for the compliance gate.",
"tags": ["demo", "test"],
"ai_disclosure": false,
"made_for_kids": null,
"category_id": "10"
}
EOF
uv run tubekit compliance test video.json
Compliance: PASSED (8 rules evaluated)
WARNING AI_DISCLOSURE_MISSING: AI disclosure flag is false; confirm this is the
channel owner's intended policy for AI-generated content.
suggestion: action=set field=metadata.ai_disclosure value=True
WARNING KIDS_FLAG_NOT_SET: made_for_kids is unset; set it explicitly to true or
false (this rule does not classify by content).
suggestion: action=set field=metadata.made_for_kids value=False
エラー重大度の違反(たとえば、タイトルが 126 文字の場合)があると、ゲートは終了コード 1 で失敗し、機械で適用可能な修正(suggestion: action=truncate field=metadata.title value=100)を提示します。これは、エージェントが拒否された upload_video から受け取り、再試行前に適用するものと同じ Suggestion です(ADR D8)。tubekit compliance list を実行するとルールカタログが出力され、tubekit compliance manifest を実行すると外部監査人向けにエクスポートされます。
AI エージェントでインストールする
上記のコマンドを自分で入力するのは避けたいですか?以下のブロックを Claude
Code(またはシェルアクセスが可能な任意のコーディングエージェント)に貼り付けると、クローン、インストール、サーバーの登録が自動で行われます。ここで説明した境界で処理が止まるため、Google アカウント、client_secret.json、OAuth の同意はいずれも不要です。
Install tubekit-mcp and register it as an MCP server. Stop and report if any step fails.
1. Clone the repo and enter it (install uv first if missing:
curl -LsSf https://astral.sh/uv/install.sh | sh):
git clone https://github.com/santiriera626/tubekit-mcp.git tubekit-mcp && cd tubekit-mcp
2. Install dependencies, apply the database migrations and create the Fernet
master key (the server refuses to start without one):
uv sync --all-extras
make db-upgrade
uv run tubekit auth init-master-key
(Idempotent: an existing key is reported and left untouched.)
3. Run the zero-credential compliance smoke check to confirm the install works:
cat > video.json <<'EOF'
{
"title": "Test Upload — Compliance Gate Demo",
"description": "Demo description for the compliance gate.",
"tags": ["demo", "test"],
"ai_disclosure": false,
"made_for_kids": null,
"category_id": "10"
}
EOF
uv run tubekit compliance test video.json
Expect "Compliance: PASSED (8 rules evaluated)" and exit code 0.
4. Register the server with Claude Code over stdio, using absolute paths:
claude mcp add tubekit \
-e TUBEKIT_STATE_DB_PATH="$(pwd)/state.db" \
-e TUBEKIT_MASTER_KEY_PATH="$HOME/.config/tubekit/master.key" \
-- "$(pwd)/.venv/bin/tubekit-mcp-stdio"
Do not run `tubekit auth setup-channel` or open any Google consent screen —
OAuth channel bootstrap is a separate, human-in-the-loop step documented in
docs/runbooks/oauth-bootstrap.md. Stop after step 4 and tell me to run that
myself.
登録後、MCP クライアントを再起動してください。これで tubekit.health() を呼び出し、すべてのツールカタログを一覧表示できるようになります。validate_compliance を含む、channel 引数を取るすべてのツールには、設定済みのチャンネルが必要です。つまり、One-time setup(docs/runbooks/oauth-bootstrap.md の OAuth 同意を含む)はご自身で完了する必要があります。コンプライアンスゲート自体は、ステップ 3 の tubekit compliance test を使って、チャンネルなしでテストできます。
初回のみのセットアップ
# 1. Create the Fernet master key used to encrypt stored tokens (mode 0600).
# Skip if the agent install above already created it.
tubekit auth init-master-key
# 2. Bootstrap a channel — opens a browser for the OAuth consent.
# The alias is positional; --channel-id, --gcp-project, --client-secrets
# and --scopes are all required (see docs/runbooks/oauth-bootstrap.md).
tubekit auth setup-channel mychannel \
--channel-id UCxxxxxxxxxxxxxxxxxxxxxx \
--gcp-project my-gcp-project \
--client-secrets ./client_secret.json \
--scopes youtube.upload,youtube.readonly
# …or, on a headless box (no browser), append --device-code:
tubekit auth setup-channel mychannel \
--channel-id UCxxxxxxxxxxxxxxxxxxxxxx \
--gcp-project my-gcp-project \
--client-secrets ./client_secret.json \
--scopes youtube.upload,youtube.readonly \
--device-code
# 3. Define the channel registry — setup-channel persists only the encrypted
# token; the registry is a TOML you write yourself. The table name is the
# alias. Full field reference: docs/runbooks/vps-deploy.md §5.
mkdir -p ~/.config/tubekit/channels
cat > ~/.config/tubekit/channels/mychannel.toml <<'EOF'
[mychannel]
channel_id = "UCxxxxxxxxxxxxxxxxxxxxxx"
gcp_project_id = "my-gcp-project"
oauth_scopes = [
"https://www.googleapis.com/auth/youtube.upload",
"https://www.googleapis.com/auth/youtube.readonly",
]
EOF
# 4. Verify — `show` prints one channel's status (token fingerprint only),
# `list` prints every configured alias
tubekit channels show mychannel --channels-dir ~/.config/tubekit/channels
tubekit channels list --channels-dir ~/.config/tubekit/channels
MCP クライアントに接続する(stdio)
ほとんどのクライアントは stdio 経由でサーバーを起動します。クライアントの MCP 設定に以下を追加してください(Claude Desktop の場合は claude_desktop_config.json)。
{
"mcpServers": {
"tubekit": {
"command": "tubekit-mcp-stdio",
"env": {
"TUBEKIT_STATE_DB_PATH": "/absolute/path/to/state.db",
"TUBEKIT_MASTER_KEY_PATH": "/absolute/path/to/master.key"
}
}
}
}
クライアントを再起動してください。アシスタントに以下のツールと tubekit.health() プローブが表示されます。たとえば、「./intro.mp4 を mychannel にアップロードして」 と頼むと、upload_video が呼び出され、コンプライアンスチェック、クォータの消費、OAuth の更新、監査行の書き込みがすべて透過的に行われます。
利用可能なツール
| ツール | 機能 | OAuth スコープ | 割り当て |
|---|---|---|---|
validate_compliance(channel, metadata, thumbnail_present=False) | メタデータに対してルールレジストリを実行し、ComplianceReport を返します。ローカルのみで処理し、YouTube への呼び出しはありません。 | — | 0 |
upload_video(channel, video_path, metadata, idempotency_key, privacy_status="private", notify_subscribers=False) | 内部のコンプライアンスゲートを通過した後、動画をアップロードします。idempotency_key による冪等性があります。 | youtube.upload | 1600 |
set_thumbnail(channel, video_id, thumbnail_path) | 既存の動画にサムネイルを設定します。 | youtube | 50 |
update_metadata(channel, video_id, patch) | タイトル、説明、タグ、プライバシー設定を部分更新します。更新後のメタデータはコンプライアンスゲートで確認されます。 | youtube | 50 |
get_video_status(channel, video_id) | 動画の処理状況とプライバシー設定を読み取ります。 | youtube.readonly | 1 |
get_analytics(channel, metrics, start_date, end_date, dimensions=None) | 指定期間のチャンネル単位の指標です。別枠のアナリティクス割り当てを使用します。 | yt-analytics.readonly | 1(アナリティクス) |
get_portfolio_report(channels=None, period="28d", start_date=None, end_date=None) | チャンネルごとに1行を表示します。期間の合計と前期間との差分(視聴回数、収益)、収益化されていないチャンネルの YPP の進捗を含みます。チャンネルごとのエラーは個別に処理されます。 | yt-analytics.readonly + youtube.readonly(収益には yt-analytics-monetary.readonly も必要) | 3/チャンネル(アナリティクス) |
get_channel_report(channel, period="28d", start_date=None, end_date=None, granularity="auto") | 単一チャンネルのヘルスレポートです。合計、推移系列、上位動画、トラフィックソース、ショート動画と長尺動画の内訳、収益または YPP の進捗、全期間のスナップショットを含みます。 | yt-analytics.readonly + youtube.readonly(収益には monetary も必要) | 7(アナリティクス) |
get_video_report(channel, video_id, period="lifetime", start_date=None, end_date=None, granularity="auto") | 動画ごとの詳細レポートです。視聴維持率の代理指標、トラフィックソース、収益化されている場合は収益を含みます。デフォルトでは、公開日から期間を開始します。 | yt-analytics.readonly + youtube.readonly(収益には monetary も必要) | 5(アナリティクス) |
list_my_videos(channel, page_size=50, page_token=None) | チャンネルのアップロード動画一覧をページごとに取得します。 | youtube.readonly | 1 |
get_comments_digest(channels=None, force_sync=False) | 全チャンネルを対象に、動画ごとのコメント数(未読/未返信/保留/スパム)を取得します。 | youtube.force-ssl | 4/チャンネル |
list_comments(channel, video_id=None, only="unread", search=None, order="time", page_size=20, page=1) | ローカルミラーからコメントの簡潔な一覧を取得します。 | youtube.force-ssl | 1 |
get_comment_thread(channel, comment_id) | 1つのスレッドを全文で取得します。省略されていないテキストとすべての返信が含まれます。 | youtube.force-ssl | 2 |
mark_comments_reviewed(channel, ids=None, video_id=None, all_unread=False, state="read") | ローカルのトリアージ状態を設定します。YouTube のデータは変更しません。 | — | 0 |
check_oauth(channel) | 割り当てを消費せずに OAuth の有効性を事前確認します。保存済みの認可情報を Google のトークンエンドポイントで更新し、oauth_ok と有効期限を報告します。割り当てを消費するツールの実行前に使用してください。 | — | 0 |
request_ingest_upload(channel, filename, size_bytes, sha256) | 1回限りのブローカー経由アップロード URL を発行します。これにより、リモートクライアントは複数 GB の動画を PUT でき、サーバーが取り込みます。ssh は不要です。メディアの取り込みを参照してください。 | — | 0 |
list_playlists(channel, page_size=50, page_token=None) | チャンネル自身の再生リスト(ID、タイトル、プライバシー設定、アイテム数)を取得します。 | youtube.readonly | 1 |
list_playlist_items(channel, playlist_id, page_size=50, page_token=None) | 1つの再生リストの動画を順番どおりに取得します。各 playlist_item_id を返します。これは削除や並べ替えに必要な識別子です。 | youtube.readonly | 1 |
create_playlist(channel, title, description="", privacy_status="private") | 再生リストを作成します。デフォルトは非公開です。公開する場合は明示的な操作が必要です。冪等ではありません。 | youtube | 50 |
update_playlist(channel, playlist_id, title=None, description=None, privacy_status=None) | タイトル、説明、プライバシー設定を更新します。省略されたフィールドは読み取って統合し、空欄にはしません。 | youtube | 50 |
add_to_playlist(channel, playlist_id, video_id, position=None) | 動画を追加します(末尾への追加、または position への挿入)。冪等ではありません。YouTube では重複が許可されています。 | youtube | 50 |
reorder_playlist_item(channel, playlist_id, playlist_item_id, video_id, position) | 項目を position に移動します(0 = 先頭)。 | youtube | 50 |
remove_from_playlist(channel, playlist_item_id) | 項目を1つ削除します。動画自体には影響しません。 | youtube | 50 |
プレイリストへの書き込みには、動画 ID だけではなく
playlist_item_idを指定します。同じ動画がリスト内に複数回表示される場合があるため、動画 ID だけでは YouTube 側で区別できません。list_playlist_itemsを 1 回呼び出して ID を取得し、再利用してください。サービス側で ID を解決しないのは、呼び出し元が要求していない割り当てを消費しないためです。プレイリストはコンプライアンスレジストリでチェックしません。同レジストリが評価するのは動画のメタデータ(サムネイル、カテゴリ、タグ、合成メディアの申告)ですが、プレイリストにはこれらがありません。また、
TITLE_TOO_LONGは、上限が 150 のリソースに動画用の上限(100)を適用してしまいます。代わりに、Google がプレイリストリソースについて文書化している内容を適用します。タイトルが空でないこと、有効なprivacyStatusであること、タイトルが 150 文字以下、説明が 5000 文字以下で、どちらにも<、>、U+2028 が含まれないことです。これらの制限は Data API のリファレンスではなく、YouTube ヘルプページに記載されています。Data API のリファレンスには記載がないため、当初は見落とされていました。
コメントツールを使うには、チャンネルの権限に
youtube.force-sslが含まれている必要があります(モデレーションステータスによるフィルタリングは所有者のみが可能です)。check_oauthで確認してください。含まれていない場合は、次のコマンドを実行して一度だけ再同意してください。tubekit auth setup-channel --scopes …,https://www.googleapis.com/auth/youtube.force-ssl
レポートツールが返す収益額はすべて、広告収益と YouTube Premium の推定収益のみです(メンバーシップ、Super Chat、Shopping はチャンネルレベルの API では公開されません)。データには約 2 日の遅延があり(period.revenue_complete_until)、翌月の 10 日頃に確定します。対象の Analytics API では、サムネイルのインプレッション数と CTR を取得できません。アドホックなクエリには引き続き get_analytics をご利用ください。
すべてのツールは ToolResult エンベロープ(ok と data、または文書化されたエラーコードのいずれかを持つ構造化された ToolError)を返します。コンプライアンス違反の場合、エラーにはアシスタントが適用して再試行できる Suggestion が含まれます。これは ADR D8 で説明している自己修正ループです。
HTTP トランスポート(マルチユーザー)
リモートまたはマルチテナントで利用する場合は、代わりに HTTP トランスポートを実行してください。クライアントごとに、特定のチャンネルとツールにスコープを限定したBearer API トークンが必要です。トークンごとのレート制限も任意で設定できます。
# Issue a token (the plain value is printed exactly once — store it now)
tubekit auth issue --name claude-prod --channels mychannel --tools "*" \
--rate-limit-per-min 30
# Serve over HTTP
tubekit-mcp-http --host 0.0.0.0 --port 8080
クライアントは Authorization: Bearer <token> を送信します。認証されていないリクエスト、スコープ外のリクエスト、またはレート制限に達したリクエストには、JSON-RPC エラー(-32001~-32006)が返されます。GET /healthz は稼働状態のペイロードを返します。チャンネルごとの詳細(エイリアス、OAuth の有効期限)が追加されるのは、有効な Bearer トークンが提示された場合のみです。また、詳細はそのトークンのチャンネルに限定されます。トークンは tubekit auth list | show | revoke | rotate で管理します。
VPS 上で一元的に実行する場合(1 台のサーバーに複数のプロジェクトが HTTPS で接続する場合)は、docs/runbooks/vps-deploy.md を参照してください。インフラチーム向けに作成された、自己完結型のステップごとのデプロイガイドです(systemd + Traefik + プロジェクトごとのトークン)。
メディアの取り込み(リモートの upload_video)
upload_video(video_path) はサーバーのファイルシステムからファイルを読み取ります。リモート環境では、クライアント側のローカルパスを解決することはできません。メディアをサーバーに転送する方法は 2 つあります。
ブローカー経由のアップロード(推奨、ssh 不要)。 エージェントが MCP 経由の HTTP で転送全体を調整します。request_ingest_upload を呼び出し、返された 1 回限りの URL にバイトデータを PUT し(同じ Bearer トークンを使用)、返されたサーバー側のパスを指定して upload_video を呼び出します。
# 1. request_ingest_upload(channel, filename="video.mp4", size_bytes, sha256)
# → { upload_url, curl, video_path: "/ingest/video.mp4" }
# 2. transfer the bytes (the returned curl recipe):
curl -fSs -T video.mp4 -H "Authorization: Bearer $TUBEKIT_TOKEN" "<upload_url>"
# 3. upload_video(channel="...", video_path="/ingest/video.mp4", ...)
サーバーはリクエストボディをステージング用の .part にストリーミングし、size_bytes と sha256 を検証してから、upload_video が読み取る前にアトミックに公開します。URL は TTL 付きの 1 回限りの、チャネルに紐づく機能です。転送が中断された場合は、HEAD と Content-Range を使用して再開できます。設計の根拠については、ADR 0002 を参照してください。TUBEKIT_INGEST_UPLOAD_URL_BASE の設定が必要です(設定されていない場合、ツールは precondition_failed を返します)。
rsync の慣例(代替手段、ssh が必要)。 別経路で転送してから、サーバー側のパスを指定してツールを呼び出します。
rsync -av --chmod=F644 video.mp4 <server>:/opt/tubekit-ingest/
# upload_video(channel="...", video_path="/ingest/video.mp4", ...)
TUBEKIT_INGEST_DIR にサーバー内の取り込みパス(例:/ingest)を設定してください。video_path を読み取れない場合、ツールは呼び出し元のエージェントにこの慣例を案内する suggestion を含む validation_error を返します。ボリュームのマウントと保持ポリシーについては、VPS 運用手順書のメディア取り込みセクションを参照してください。
環境変数
すべての設定には TUBEKIT_ のプレフィックスが付きます(.env.example を参照)。
| 変数 | デフォルト | 用途 |
|---|---|---|
TUBEKIT_STATE_DB_PATH | state.db | 監査テーブルと状態テーブルを保持する SQLite ファイル |
TUBEKIT_MASTER_KEY_PATH | ~/.config/tubekit/master.key | 保存された OAuth トークンを暗号化する Fernet キー |
TUBEKIT_OAUTH_CLIENT_SECRETS_PATH | 未設定 | client_secret.json(Google Cloud の機密クライアント)へのパス。実行時に必須 — google-auth はこれがないとアクセストークンを更新できないため、未設定の場合はすべてのチャンネルツールが失敗します |
TUBEKIT_TOKEN_BACKEND | sqlite_fernet | トークンストアのバックエンド(sqlite_fernet | in_memory) |
TUBEKIT_AUDIT_RETENTION_DAYS | 365 | 監査データの保持期間 |
TUBEKIT_OTLP_ENDPOINT | 未設定 | OTLP コレクターのエンドポイント。未設定の場合、テレメトリーは何もしません |
TUBEKIT_INGEST_DIR | 未設定 | サーバー側メディア取り込みディレクトリ。upload_video のパスエラーに表示されます。また、HTTP 呼び出し元に限り、video_path/thumbnail_path が解決される必要のある境界となります。未設定の場合、このような境界はありません。その場合、HTTP トークンはサーバーのファイルシステムへの読み取りアクセスと同等になります |
TUBEKIT_INGEST_UPLOAD_URL_BASE | 未設定 | 仲介アップロード用の公開オリジン。未設定の場合、request_ingest_upload は無効になります |
TUBEKIT_INGEST_UPLOAD_TTL_SECONDS | 3600 | 1 回限りの仲介アップロードトークンの有効期間 |
TUBEKIT_INGEST_MAX_BYTES | 21474836480 | 1 件の仲介アップロードの最大サイズ(20 GiB) |
TUBEKIT_INGEST_MAX_PENDING | 32 | 保留中アップロードトークンの同時数上限(ディスク枯渇防止) |
TUBEKIT_INGEST_PURGE_AFTER_UPLOAD | true | アップロードまたはサムネイルが確認されたら、取り込みディレクトリからソースファイルを削除します |
TUBEKIT_HTTP_KEEPALIVE_TIMEOUT | 5 | uvicorn のキープアライブ(秒)。長時間の SSE セッションでは値を大きくし、プロキシのアイドルタイムアウトと揃えてください |
TUBEKIT_HTTP_LIMIT_CONCURRENCY | 未設定 | uvicorn の最大同時接続数 |
TUBEKIT_HTTP_GRACEFUL_SHUTDOWN_TIMEOUT | 未設定 | uvicorn のグレースフルシャットダウンのタイムアウト(秒) |
TUBEKIT_HTTP_MAX_JSONRPC_BODY | 4194304 | 認証前に認証ゲートがバッファーする 1 件の JSON-RPC POST の最大バイト数(認証前 DoS 防止)。超過すると 413 が返されます |
TUBEKIT_HTTP_FORWARDED_ALLOW_IPS | 未設定 | X-Forwarded-* を uvicorn が信頼するリバースプロキシの IP/CIDR。未設定の場合、uvicorn は 127.0.0.1 のみを信頼するため、プロキシの背後ではすべての監査行にプロキシの IP が記録され、リクエストのスキームは http のままになります。ブリッジサブネットではなく、プロキシ独自の固定アドレスを使用してください。共有ネットワーク上のすべてのコンテナーがその CIDR 内に解決され、ヘッダーを偽装できるためです。* は絶対に指定しないでください(読み込み時に拒否されます)。指定すると、任意の呼び出し元が監査対象の IP を選べるようになります |
TUBEKIT_HTTP_SSE_RESUMABLE | false | MCP ストリーマブル HTTP の再開機能(インメモリーイベントストア)を有効にし、切断された SSE セッションを Last-Event-ID 経由で再開できるようにします |
TUBEKIT_HTTP_SSE_RETRY_INTERVAL_MS | 2000 | クライアントに通知する SSE 再接続のヒント(ミリ秒)。再開機能が有効な場合にのみ使用されます |
TUBEKIT_SQLITE_BUSY_TIMEOUT_MS | 5000 | SQLITE_BUSY が発生するまで SQLite の書き込みロックを待機する時間 |
TUBEKIT_LOG_LEVEL / TUBEKIT_LOG_FORMAT | INFO / json | ロギング |
state.dbとmaster.keyの両方を失うと、すべてのチャンネルを再度ブートストラップする必要があります。 両方を一緒にバックアップしてください。詳しくはdocs/runbooks/state-db-backup.mdを参照してください。
ホステッド版
Gatecast は tubekit のホステッド版です。同じ エンジンを実行し、お客様に代わって稼働状態を維持します。現在はローンチ前で、これまでのところウェイティングリストのみです。このリポジトリを使ったセルフホストは、今後も完全にサポートされます。
開発
uv sync --all-extras
make lint # ruff
make type # mypy --strict
make test # pytest unit suite
make cov # coverage report
make demo-stack-up を実行すると、5 つのダッシュボードがプロビジョニングされた Jaeger/Prometheus/Grafana の可観測性スタックが起動します(docker-compose.demo.yml、docs/grafana/)。
リポジトリの構成
docs/adr/ Architecture Decision Records (source of truth for design)
docs/grafana/ Provisioned Grafana dashboards + demo observability config
docs/runbooks/ Operational procedures (master key rotation, audit verify, …)
docs/ROADMAP.md Shipped, planned and under-exploration work
src/tubekit/ Library code (Alembic migrations ship in src/tubekit/migrations/)
tests/ Unit + integration suites
貢献とセキュリティ
- コントリビューションを歓迎します。ワークフローと品質基準については、
CONTRIBUTING.mdをご覧ください。 - セキュリティ上の脆弱性は、
SECURITY.mdに従って非公開で報告してください。 - リリース履歴は
CHANGELOG.mdに、ロードマップはdocs/ROADMAP.mdにあります。
ライセンス
FSL-1.1-MIT © 2026 sriera
Functional Source License を平易に説明すると、自由に読んだり、実行したり、変更したり、自分のチャンネル向けにセルフホストしたりできます。商用利用の有無は問いません。禁止されているのは、tubekit 自体を競合する製品またはサービスとして他者に提供することだけです。さらに、各リリースは公開から 2 年後に、自動かつ取り消し不能で、完全な MIT ライセンス になります。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。