PrismPoster Creator Tools について
PrismPoster Creator Toolsは、動画・ソーシャルメディア制作者向けのTypeScriptユーティリティ集で、ローカルMCPサーバーも含みます。出典付きのプラットフォーム安全領域データに加え、字幕、エンコード、アスペクト比、メタデータの処理機能を備えています。
主な機能
- 01アスペクト比とクロップ案の計算
- 02出典付きの画面サイズと安全領域の検索
- 03字幕の解析・変換・タイミング調整
- 04ビットレート・ファイルサイズ・タイムコードの計算
- 05パレット抽出と画像メタデータの読み取り
- 06C2PAとAI由来の表示の検出
活用シーン
- 01SNS向け動画フレームの準備
- 02字幕ファイルの変換やタイミング調整
- 03ファイルサイズ上限に合わせたビットレート推定
- 04アップロードメディアの来歴情報の確認
MCP 対応
ゼロランタイム依存のstdio MCPサーバーを含み、プラットフォームの寸法と安全領域、アスペクト比のクロップ、ビットレート、字幕変換の読み取り専用ツールを提供します。計算はネットワーク接続なしでローカル実行されます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://www.prismposter.com/api/mcpclaude mcp add --transport http com-prismposter-creator-tools https://www.prismposter.com/api/mcp{"mcpServers":{"com-prismposter-creator-tools":{"type":"http","url":"https://www.prismposter.com/api/mcp"}}}Cursor で開く{"servers":{"com-prismposter-creator-tools":{"type":"http","url":"https://www.prismposter.com/api/mcp"}}}VS Code で開く{"mcpServers":{"com-prismposter-creator-tools":{"type":"http","url":"https://www.prismposter.com/api/mcp"}}}{"mcpServers":{"com-prismposter-creator-tools":{"serverUrl":"https://www.prismposter.com/api/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
詳細
creator-tools
動画・ソーシャルクリエイター向けの依存関係ゼロの TypeScript ユーティリティです。アスペクト比の計算、タップテンポ、字幕の解析と変換、出典付きの安全領域を備えたプラットフォーム別フレームサイズ、エンコード計算、カラーパレットの抽出、GIF エンコード、画像メタデータ、C2PA / AI プロベナンスの検出に対応しています。
ランタイム依存関係はありません。ネットワークへの呼び出しもありません。ブラウザー、Node、ワーカーで動作します。返される数値はどれも手計算で確認できるものです。また、プラットフォームが数値を公開していない場合は、作り上げずにその旨を示します。
npm install @prismposter/creator-tools
このライブラリを作った理由
こうした計算のほとんどは、互いを引用するブログ記事に散在しており、引用されている数値の多くが驚くほど間違っています。このライブラリを作るきっかけとなったのは、**ウェブ上にある「TikTok の安全領域」のピクセル表は、すべて作り物だということです。**TikTok が公開しているのはオーバーレイのテンプレートであり、固定のインセットではありません。隠れる領域は、フレームの寸法、キャプションの長さ、実行中の広告フォーマットによって変わります。正しい定数は存在しないため、このライブラリはもっともらしい数値を提供するのではなく、null を返してその理由を説明します。
このルールに、パッケージ全体が従っています。
- **導出される数値は、実際に導出しています。**幅 1080 の 9:16 フレームの高さが 1920 なのは、比率からそうなるためです。
social-sizesのすべてのサイズは、テストスイートで宣言された比率との一致を検証しています。 - **引用する数値には出典を明記します。**すべての安全領域に、参照元のファーストパーティーページへのリンクがあります。
safeAreaSourceUrl(placement)はその URL を返します。 - **不明であることも値の一つであり、空欄ではありません。**情報を公開していないプラットフォームは、理由を付けた明示的な
kind: 'unpublished'を返します。
モジュール
aspect-ratio
エンコード前のフレーム向けの比率計算です。16:9 と同様に、2.39:1 のような整数にならない映画のアスペクト比にも対応しています。
import {
simplifyRatio, cropToRatio, padToRatio, alignToBlock,
} from '@prismposter/creator-tools/aspect-ratio';
simplifyRatio({ width: 1920, height: 1080 }); // { w: 16, h: 9 }
cropToRatio({ width: 1920, height: 1080 }, { w: 9, h: 16 });
// { result: { width: 608, height: 1080 },
// removed: { top: 0, right: 656, bottom: 0, left: 656 },
// areaKept: 0.3167 }
// Codecs want even dimensions; H.264 chroma subsampling makes an odd
// width an encoder error or a silent rescale.
alignToBlock({ width: 1081, height: 607 }); // { width: 1082, height: 608 }
alignToBlock({ width: 1080, height: 1920 }, 16); // { width: 1088, height: 1920 }
奇数のクロップ余りは、常に下端または右端に割り当てられます。これは任意の選択ですが、一貫しています。呼び出しごとに異なる方法で分割すると、クリップをまとめて処理した際に、各クリップが互いに 1 ピクセルずれてしまう可能性があります。
social-sizes
プラットフォーム別のフレームと安全領域を、出典とともに提供します。
import {
getPlacement, frameSize, safeAreaPx, safeAreaBox, safeAreaSourceUrl,
} from '@prismposter/creator-tools/social-sizes';
const reels = getPlacement('instagram-reels')!;
frameSize(reels); // { width: 1080, height: 1920 }
safeAreaPx(reels); // { top: 269, bottom: 672, left: 65, right: 65 }
safeAreaBox(reels); // { width: 950, height: 979 }
safeAreaSourceUrl(reels); // Meta's Reels ads-guide page
const tiktok = getPlacement('tiktok-video')!;
safeAreaPx(tiktok); // null — and that is the correct answer
tiktok.safeArea.reason; // explains why no fixed table can be right
Meta は Reels と Stories の領域を、**上部 14%、下部 35%、左右それぞれ 6%**としています。1080×1920 のフレームでは、269 / 672 / 65 px です。下部が 3 分の 1 というのは誤記ではありません。
safeAreaPx が null を返すのには意味があります。「このプラットフォームは固定の安全領域を公開していません」とユーザーに伝えてください。ゼロに置き換えたり、別のプラットフォームの数値を借用したりしないでください。
subtitles
SRT、WebVTT、ASS/SSA の解析、変換、タイミング編集に対応しています。形式間で直接変換するのではなく、すべてを共通の Cue 形式に通します。そうしなければ、6 つの形式には 30 通りのコンバーターが必要になり、それぞれの場所で丸め規則が気付かないうちに異なる可能性があります。
import { convert, parse, shift, scale, deoverlap }
from '@prismposter/creator-tools/subtitles';
const { output, warnings } = convert(srtText, 'vtt');
// Fix subtitles authored against a different frame rate.
scale(parse(srtText).cues, 23.976 / 25);
// Nudge everything 500ms later; cues pushed before zero clamp to zero.
shift(cues, 500);
// Clip overlaps so only one cue is ever on screen.
deoverlap(cues);
解析は寛容に行われます。形式が不正なブロックは警告を出してスキップするため、ファイル内の残り 899 個のキューが失われることはありません。UTF-8 BOM と CRLF の行末に対応しています。VTT の NOTE / STYLE ブロックとインラインタグ(<v Roger>、<i>)は除去されます。ASS のオーバーライドブロック({\an8})も同様です。
ASS はセンチ秒単位で保存するため、ASS に変換して元に戻すと 10 ms 未満の精度は失われます。後から気付くことがないよう、convert() はその点を warnings で知らせます。
tempo
タップテンポと、編集タイムラインに必要な拍の計算に対応しています。
import { estimateTempo, beatMs, noteMs, beatGrid, snapToBeat }
from '@prismposter/creator-tools/tempo';
estimateTempo(tapTimestamps);
// { bpm: 128.02, taps: 16, spreadMs: 8.4, discarded: 1 }
beatMs(120); // 500
noteMs(120, 'quarter', { triplet: true }); // 333.333
beatGrid(120, 10_000); // [0, 500, 1000, … 10000]
snapToBeat(480, 120); // { timeMs: 500, deltaMs: 20 }
推定には、末尾のウィンドウ内の中央値を使用し、平均値は使用しません。タップ列には、平均値では適切に扱いにくい失敗要因が 2 つあります。ユーザーが拍をつかむまで最初のタップが遅れることと、タップを 1 回逃すと、実際の周期のおよそ 2 倍の間隔が生じることです。平均値は不正な間隔が許容範囲内に残るほど引きずられてしまうため、外れ値の判定には中央値を使います。
spreadMs は、結果の信頼度を示します。約 20 ms 未満なら安定したタップで、60 ms を超える場合は推定値の確度が低いことを意味します。beatGrid は累積加算せず、インデックスから各位置を計算するため、長いシーケンスでもずれません。
encoding
ファイルサイズ、ビットレート、タイムコード、フレーム数です。
import { fileSizeBytes, targetBitrateKbps, bitsPerPixel, toDropFrame }
from '@prismposter/creator-tools/encoding';
fileSizeBytes(60, 8_000); // 60_000_000 bytes
targetBitrateKbps(120, 50_000_000); // kbps to hit a 50 MB cap
bitsPerPixel(1920, 1080, 30, 8_000); // 0.1286
toDropFrame(1_800, 29.97); // '00:01:00;02'
単位の規則をここで一度だけ説明します。ビットレートは10進数(1 Mbps = 1,000,000 bits/s。すべてのエンコーダーやプラットフォームの仕様で使われる単位です)、ファイルサイズは2進数(1 MiB = 1,048,576 bytes。すべての OS が報告する単位です)です。この2つを混同すると、オンライン計算ツールの結果が約5%ずれます。formatBytesBinary と formatBytesDecimal は別々の関数なので、どちらを使うかは常に明示されます。
ドロップフレームのタイムコードが省略するのは番号であり、フレームではありません。10分ごとの区切りを除き、各分の開始時に番号00と01が省略されます。これによって29.97のタイムコードは実時間に一致しますが、ノンドロップでは1時間あたり約3.6秒ずれていきます。
palette
メディアンカットによる色量子化と、出力された色の上にテキストを配置するためのコントラスト計算です。
import { extractPalette, toHex, readableTextOn } from '@prismposter/creator-tools/palette';
const swatches = extractPalette(pixels, 5); // pixels: { r, g, b }[]
swatches.map(toHex); // ['#1b2430', '#3f6d8e', ...]
readableTextOn(swatches[0]); // { onColour: 'black' | 'white', ratio: 8.7 }
ボックスの分割位置には、画素数の中央値ではなく、主要な軸に沿った最大の色差を選びます。教科書どおりの中央値で分割すると、各ボックスの画素数は均等になりますが、写真ではまさにそれが問題です。広く平坦な空の領域が何度も細分化される一方、デザイナーが実際に求める小さく鮮やかなアクセントカラーは隣の色に平均化され、消えてしまいます。色差の位置で分割すれば、その色を保てます。
元画像の固有色数が指定されたスロット数より少ない場合、出力される色見本も少なくなります。似た色で結果を埋めれば、画像について偽りを伝えるパレットになってしまいます。
provenance
このファイルに来歴情報はあるでしょうか。また、アセットが AI 生成だと記載されているでしょうか。
import { inspectProvenance } from '@prismposter/creator-tools/provenance';
inspectProvenance(bytes);
// { hasC2paManifest: true, hasIptcSourceType: true, hasProvenance: true,
// declaresAiGenerated: true, declaresCapture: false,
// digitalSourceTypes: ['.../digitalsourcetype/trainedAlgorithmicMedia'],
// assertionLabels: ['c2pa.actions.v2', 'c2pa.claim.v2'],
// manifestOffset: 41, signatureVerified: false }
現在流通しているマーキングは2種類ありますが、頻繁に混同されています。
- C2PA マニフェスト――JUMBF ボックス内に格納された、暗号署名付きのコンテンツ認証情報です。
- IPTC デジタルソースタイプ――署名のないプレーンな XMP/EXIF 文字列で、誰でも
exiftoolで書き込めます。
ファイルには、どちらか一方、両方、またはどちらも含まれない場合があります。これらはまったく異なる重みを持つため、別々に報告されます。また、「AI 検出器」に関する記事の多くは、2つ目を1つ目であるかのように扱っています。
**署名の検証は行いません。**意図的に、signatureVerified は常に false です。マニフェストの有効性を証明するには、完全な C2PA 信頼リストと証明書チェーンの検証が必要です。そのためのツールが c2patool と c2pa-node であり、信頼性が問題となる場合はこれらを使うべきです。この機能が答えるのは、それらを使うには大げさであり、ネイティブバイナリを同梱できないサーバーレスランタイムでは実行できないことも多い、より簡単な問いです。*認証情報は存在するか、そして何を主張しているか?*アップロードキューを振り分け、確認する価値のあるファイルだけを本格的な検証ツールに回す場合に必要なのは、この確認です。
**マニフェストが存在しても、信頼できるとは限りません。**自己署名証明書を使えば、嘘も含めて誰でも何でも署名できます。
image-metadata
ファイル自身が何を伝えているかを読み取り、さらに重要なこととして、何も伝えていない場合にそれを把握します。
import { readImageMetadata, isStripped } from '@prismposter/creator-tools/image-metadata';
const meta = readImageMetadata(bytes);
meta.format; // 'jpeg' | 'png' | 'webp' | 'gif' | ...
meta.fields; // parsed EXIF / XMP / text fields
isStripped(meta);
多くのプラットフォームはアップロード時にメタデータを削除するため、メタデータのない画像は疑わしいものではなく、通常の状態です。isStripped を使えば、空のテーブルをユーザーに見せる代わりに、そのことを伝えられます。
gif
グローバルパレット、LZW、サブブロックなど、すべてを備えたアニメーション GIF エンコーダーです。
import { encodeGif, buildGlobalPalette, indexFrame } from '@prismposter/creator-tools/gif';
const palette = buildGlobalPalette(frames, 256);
const bytes = encodeGif({ width, height, palette, frames });
GIF は256色に対応し、すべてのフレームで1つのグローバルパレットを使うため、量子化器のほうがエンコーダーよりも重要です。そのため、独自の量子化器を持たず、palette と同じメディアンカットを使用します。
mcp(Model Context Protocol サーバー)
@prismposter/creator-tools には、依存関係がゼロの MCP stdio サーバーが含まれており、AI
アシスタント(Claude Desktop、Cursor、Windsurf、Cline)は、ピクセル寸法を幻覚で補うことなく、
検証済みのプラットフォームのセーフエリア、アスペクト比に応じたクロップ、ビットレート、字幕変換を
照会できます。
claude_desktop_config.json または .cursor/mcp.json に追加します。
{
"mcpServers": {
"prismposter-creator-tools": {
"command": "npx",
"args": ["-y", "@prismposter/creator-tools"]
}
}
}
公開されている MCP ツール(すべて読み取り専用で、出力スキーマを備えた純粋なローカル計算です):
get_social_media_placement— 1 つの配置のフレームサイズ、ピクセル単位のセーフエリアの余白、使用可能な領域、公式ドキュメントの URL(instagram-reels、youtube-shorts、tiktok-videoなど)、およびソースサイズに応じたクロップ/レターボックスのプランlist_social_media_placements— すべての配置、または 1 つのプラットフォームの配置を一覧表示して、閲覧や比較に利用できますcheck_safe_area— キャプション、ロゴ、ボタンの領域が配置のセーフエリア内に収まるか、また各辺から何ピクセルはみ出すかを確認します。TikTok では理由とともにunknownを返しますcalculate_aspect_ratio— 任意の比率を約分し、コーデックブロックに合わせ、任意の目標比率に対する中央クロップ/レターボックスのプランを計算しますestimate_video_bitrate— エンコード後のファイルサイズ(バイト、MiB、MB)、サイズ上限に収まるビットレート、ピクセルあたりのビット密度を推定しますconvert_subtitles— フォーマットを検出し、タイミングをずらしながら SRT、WebVTT、ASS/SSA の間で変換しますestimate_tempo— タップ時刻から BPM を算出するか、既知の BPM から拍と小節の長さを計算します
不正な呼び出しは MCP ツールエラー(isError: true)を返し、修正方法を示すメッセージが含まれます。
たとえば、不明な配置 ID に対して有効な ID を提示します。
ホスト版は https://www.prismposter.com/api/mcp で利用できます(Streamable HTTP、インストール不要)。
prismposter.com のより大規模な配置データセットから回答します(サイトで使われている camelCase の ID も受け付けます)。ビットレートツールでは videoKbps と targetCapMb を受け付け、SRT と WebVTT のみを変換し、get_prismposter_capabilities ツールを追加しています。
どちらも、公式 MCP Registry に com.prismposter/creator-tools として掲載されています。
設計ルール
- 純粋関数であり、副作用や I/O はありません。 すべて同期的かつ決定論的です。
- 無効な入力には
nullを返し、例外はスローしません。 これらの関数はテキスト入力の背後にあり、入力途中の値は例外的ではなく、通常の状態です。 - 丸めは境界で一度だけ行います。 エンコーダーが必要とするため、サイズは整数のピクセル単位になります。
nullは「答えが存在しない」ことを意味し、常にゼロと区別できます。- 型が間違っている場合は例外をスローします。 ルール 2 は、ユーザーが入力しうる値についてのものです。バイトを読み取る関数に文字列を渡されたとき、呼び出し元の意図を推測してよいという意味ではありません。
開発
npm install
npm test # 173 tests
npm run typecheck
npm run build
貢献を歓迎します。CONTRIBUTING.md をご覧ください。新しい定数には公式ソースが必要で、新しい関数には、その関数がなければ失敗するテストが必要です。
同じ数学を、ブラウザツールとして
各モジュールは、無料で利用できる prismposter.com/tools のツールを支えています。アカウント登録も、アップロードも、メールアドレスも不要です。関数ではなく答えが欲しい場合は、こちらからどうぞ:
| アスペクト比計算機 | BPMタッパー | 字幕コンバーター |
| ソーシャルメディアのサイズ | Instagram投稿サイズ | 動画計算機 |
| カラーパレット抽出ツール | 画像メタデータビューアー | 動画からGIFへ |
| 動画フレーム抽出ツール | 動画用画像トリミング | ボーカルリムーバー |
| バズ動画リメイク | ショットリストのテンプレート | 歌詞ジェネレーター |
| 動画ビットレート計算機 | SRT字幕クリーナー | YouTubeサムネイルプレビューアー |
メンテナンス担当
PrismPoster はAIコンテンツ制作ワークスペースです。画像、動画、リメイク、キャラクター、音楽の各スタジオで、プロジェクト、アセットライブラリ、最後まで仕上げられるタイムラインを共有します。
このライブラリは、その製品の地味な部分です。各スタジオの基盤となる算術処理を、真に再利用できること、そして字幕パーサーが競争上の優位性にはならないことから、切り出しました。provenance が存在する理由は、逆の意味で同じです。メディア製品にAIの開示を組み込むにあたって、C2PAツールが手薄な分野を把握する必要があり、依存関係のない存在確認がずっと不足していたからです。
ライセンス
MIT © PrismLabs OÜ
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。