Emotion MCP
An MCP server that enables AI assistants to switch character portraits (2D images or VRM 3D models) based on emotion, with support for multiple transitions and real-time updates via WebSocket.
README
Emotion MCP
AIアシスタントが自分の感情に合わせて立ち絵を切り替えられるMCP (Model Context Protocol) サーバーです。
動作画面

管理画面

特徴
- 2D画像モード: 立ち絵画像をアップロードして表情を切り替え
- VRM 3Dモデルモード: VRoid/VRM形式の3Dモデルをブレンドシェイプで表情制御
- 多彩なトランジション: フェード、スライド、ズーム、シェイクなど6種類のエフェクト
- リアルタイム更新: WebSocketで即座に表情が切り替わる
- アイドルアニメーション: VRMモードではまばたき・呼吸の自動アニメーション
- 高速動作: Bunを使用した爆速起動・実行
アーキテクチャ
┌─────────────────┐
│ Claude Code │ AIが表情を選択
│ (AI Assistant) │ change_expression("embarrassed", "fade")
└────────┬────────┘
│ MCP Protocol (stdio)
┌────────▼────────┐
│ MCP Server │ ツール実装
│ (TypeScript) │ list_expressions, change_expression
└────────┬────────┘
│ HTTP API
┌────────▼────────┐
│ HTTP Server │ WebSocket経由でクライアントに通知
│ (Bun) │
└────┬───────┬────┘
│ │
┌────▼────┐ ┌▼─────────┐
│ Admin │ │ Viewer │ 2D画像 or VRM 3Dモデル
│ UI │ │ │ (Three.js + @pixiv/three-vrm)
└─────────┘ └──────────┘
セットアップ
1. 依存関係のインストール
bun install
2. MCPサーバーの設定
使用する環境に応じて、以下のいずれかの設定ファイルに追加してください。
Claude Code(CLI / VSCode拡張)
設定ファイル: ~/.claude.json
{
"mcpServers": {
"emotion-mcp": {
"command": "bun",
"args": ["run", "/absolute/path/to/emotion-mcp/src/server/index.ts"]
}
}
}
Claude Desktop
設定ファイルの場所:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"emotion-mcp": {
"command": "bun",
"args": ["run", "/absolute/path/to/emotion-mcp/src/server/index.ts"]
}
}
}
※ /absolute/path/to/emotion-mcp は実際のパスに置き換えてください
3. Claude Code / Claude Desktopの起動
設定を反映するため、Claude Code(VSCode)またはClaude Desktopを起動(または再起動)します。
MCPサーバーが起動すると:
- HTTPサーバーが自動的にポート3000で起動
- Viewerが自動的にブラウザで開く
手動でアクセスする場合は以下のURL:
- 管理UI: http://localhost:3000/admin
- Viewer: http://localhost:3000/viewer
Tips:
-
Viewerの自動オープンを無効化:
AUTO_OPEN_VIEWER=false -
ポート番号を変更:
{ "mcpServers": { "emotion-mcp": { "command": "bun", "args": ["run", "/absolute/path/to/emotion-mcp/src/server/index.ts"], "env": { "PORT": "8080" } } } }デフォルトは3000。変更した場合は
http://localhost:8080/adminでアクセス。
4. 立ち絵の登録
2D画像モード(デフォルト)
- http://localhost:3000/admin にアクセス
- モード切り替えが「2D 画像」になっていることを確認
- 画像をドラッグ&ドロップまたはクリックしてアップロード
- 表情名(英数字)と表示名を入力
- デフォルト表情を設定
VRM 3Dモデルモード
- http://localhost:3000/admin にアクセス
- モード切り替えで「VRM 3D」を選択
- VRMファイル(.vrm)をドラッグ&ドロップまたはクリックしてアップロード
- アップロード後、モデルから検出されたブレンドシェイプ一覧が表示される
- 「新規プリセット」ボタンでプリセットを作成
- プリセット名(AIが使用する名前)と表示名を入力
- 各ブレンドシェイプのスライダーで表情の重みを調整
- デフォルトプリセットを設定
使い方
管理UI
2Dモード:
- アップロード: ドラッグ&ドロップまたはクリックで画像を追加
- デフォルト設定: 初期表示する表情を選択
- 削除: 不要な表情を削除
VRMモード:
- モデルアップロード: .vrmファイルをアップロード
- プリセット作成: ブレンドシェイプのスライダーで表情を調整して保存
- プリセット編集/削除: 既存のプリセットを変更・削除
- デフォルト設定: 初期表示するプリセットを選択
AIから表情を変更
Claude Codeとの会話中に、AIが自動的に表情を変更します:
AI: べ、別にあんたのために説明したわけじゃないんだからね!
[change_expression("embarrassed", "quick-fade")]
2DモードでもVRMモードでも、MCPツールのインターフェースは同じです。管理UIで設定したモードに応じて、画像の切り替えまたはブレンドシェイプの変更が行われます。
利用可能なツール
list_expressions
登録されている表情の一覧を取得します。2Dモードでは画像表情、VRMモードではプリセット一覧を返します。
list_expressions()
change_expression
表情を変更します。
change_expression({
expression: "embarrassed", // 表情名(2D)またはプリセット名(VRM)
transition: "fade", // トランジション(省略可)
duration: 300 // 時間(ms、省略可)
})
利用可能なトランジション:
| トランジション | 説明 |
|---|---|
fade |
通常のフェード(デフォルト) |
quick-fade |
素早いフェード |
slide |
スライドイン |
zoom |
ズームイン |
shake |
シェイク(動揺) |
instant |
即座に切り替え |
get_current_expression
現在表示されている表情を取得します。
get_current_expression()
VRM 3Dモデルの詳細
対応フォーマット
- VRM 0.x(VRoid Studio旧バージョン等)
- VRM 1.0(VRoid Studio最新版等)
ブレンドシェイプ
VRMモデルに含まれるブレンドシェイプ(表情モーフ)を自動検出します。一般的なVRMモデルには以下のようなブレンドシェイプが含まれています:
happy,angry,sad,relaxed,surprised(基本表情)blink,blinkLeft,blinkRight(まばたき)aa,ih,ou,ee,oh(リップシンク)
アイドルアニメーション
VRMモードでは以下のアイドルアニメーションが自動で動作します:
- まばたき: 3〜7秒のランダム間隔で自然なまばたき
- 呼吸: 胸ボーンの微小なスケール変化による呼吸モーション(約4秒周期)
- 自然な立ちポーズ: Tポーズから腕を下ろした自然なポーズに自動変換
カメラ操作(マウス)
VRMモードのViewerでは、マウスでカメラを自由に操作できます:
| 操作 | 動作 |
|---|---|
| 左ドラッグ | カメラ回転 |
| 右ドラッグ | パン(平行移動) |
| ホイール | ズーム |
モデル読み込み時にカメラは顔の高さに自動調整されます。
技術スタック
- Three.js - 3Dレンダリング(CDN経由、ビルドステップ不要)
- @pixiv/three-vrm - VRMモデルの読み込みと制御
- Import Maps によるESモジュール読み込み
推奨される表情名
AIが理解しやすい表情名の例:
normal: 通常happy: 嬉しいsad: 悲しいangry: 怒りembarrassed: 照れsurprised: 驚きworried: 心配thinking: 考え中confident: 自信満々
トラブルシューティング
Viewerが自動で開かない
HTTPサーバー起動時に自動でViewerが開かない場合:
- 手動で http://localhost:3000/viewer を開く
- ブラウザが見つからないエラーが出る場合は、環境変数で無効化して手動で開く
WebSocketに接続できない
- HTTPサーバーが起動しているか確認
- ブラウザのコンソールでエラーを確認
- ポート3000が他のアプリケーションで使用されていないか確認
MCPツールが表示されない
- 設定ファイルのパスが正しいか確認
- Claude Code / Claude Desktopを再起動
- MCPサーバーのログを確認(stderr出力)
表情が切り替わらない
- Viewerページを開いているか確認
- WebSocketの接続状態を確認(右上の緑色のインジケーター)
- ブラウザのコンソールでエラーを確認
VRMモデルが表示されない
- .vrm ファイルが正しいVRM形式か確認
- ブラウザがWebGLに対応しているか確認
- ブラウザのコンソールでThree.jsのエラーを確認
- モデルファイルのサイズが大きすぎる場合は、VRoid Studioで最適化して再エクスポート
Windowsでの注意
初回起動時にWindowsファイアウォールのダイアログが表示される場合があります。HTTPサーバーがネットワークアクセスするために必要なので、許可してください。
開発
プロジェクト構造
emotion-mcp/
├── src/
│ ├── server/ # バックエンド
│ │ ├── index.ts # MCPサーバー
│ │ ├── http-server.ts # HTTPサーバー
│ │ └── storage.ts # データ永続化
│ ├── client/ # フロントエンド
│ │ ├── admin/ # 管理UI
│ │ └── viewer/ # 表示用クライアント
│ │ ├── app.js # メインアプリ(2D/VRMモード分岐)
│ │ └── vrm-renderer.js # VRM 3Dレンダラー
│ └── shared/ # 共通型定義
├── data/ # データディレクトリ
│ ├── config.json # 設定(モード、2D表情)
│ ├── vrm-config.json # VRM設定(プリセット)
│ ├── expressions/ # 2D立ち絵画像
│ └── vrm/ # VRMモデルファイル
└── package.json
スクリプト
# HTTPサーバー起動(開発用)
bun run dev:http
# MCPサーバー起動(テスト用)
bun run dev
# ビルド
bun run build
ライセンス
MIT
作者
Created with Claude Code & You
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.