Skip to main content
Glama
TheArmagan

vrchat-mcp

by TheArmagan

vrchat-mcp

VRChat API 用の MCP サーバー。OpenAPI 仕様の 297 の操作すべてをビルド時に生成し、単一のエンドポイントではできないこと(2要素ログイン、ファイルアップロード、画像表示、イベントパイプライン)のための手書きツールも備えています。

stdio 上でローカルに実行され、Claude Code または Claude Desktop のサブプロセスとして動作します。明示的に許可するまで読み取り専用です。

Bun、公式 MCP TypeScript SDK v2、および公式 vrchat JavaScript SDK 上に構築されています。ツールは VRChat OpenAPI 仕様 から生成され、コミットされているため、サーフェスは上流に追従し、陳腐化しません。

チートシート

bun install && bun link                # `vrchat-mcp` is now on PATH
cp .env.example .env                   # fill in username, password, contact
claude mcp add vrchat -- vrchat-mcp

最小限の .env:

VRCHAT_USERNAME=you
VRCHAT_PASSWORD=hunter2
VRCHAT_CONTACT=you@your-domain.tld     # must be real, VRChat 403s generic agents

やりたいこと

これを行う

作成と編集を有効にする

VRCHAT_MCP_ALLOW_WRITES=1

削除とモデレーションを有効にする

VRCHAT_MCP_ALLOW_DESTRUCTIVE_WRITES=1 を追加

残高の消費を有効にする

VRCHAT_MCP_ALLOW_PURCHASES=1 を追加

ストアフロントツールのみ公開

VRCHAT_MCP_TAGS=store

すべて公開

VRCHAT_MCP_TAGS=everything

ツールが欠けている理由を調べる

vrchat_authStatus を呼ぶ

巨大なペイロードがコンテキストを消費するのを防ぐ

任意のツールで _responseKeys: ["id","name"]

画像を見る

imageUrl を指定した vrchat_getImage

画像をアップロードする

パス、または { data, mimeType } を指定した vrchat__uploadImage

新しいネットワークでログインが詰まった場合の修正

メールで送られたリンクを開き、次に vrchat_retryLogin

ツール名はその由来を示します。アンダースコア2つは仕様から生成されたことを意味し(vrchat__getCurrentUser)、その名前は VRChat 自身のドキュメントで検索可能です。アンダースコア1つはこのサーバーが書いたことを意味します(vrchat_authStatus)。

手書きツールの全リスト:

ツール

機能

vrchat_authStatus

ログイン状態、レートリミッター、どのツールグループがどの環境変数で隠されているか

vrchat_submitTwoFactorCode

ユーザーが読み上げたコードで待機中のログインに応答する

vrchat_retryLogin

新しいネットワークのメールリンクが開かれた後にログインを再開する

vrchat_logout

保存されたセッションをクリアする

vrchat_getImage

VRChat の画像をダウンロードし、表示可能な画像として返す

vrchat_uploadFile

画像以外のファイルに対して VRChat の4段階アップロードを実行する

vrchat_setProductImage

画像をアップロードし、ストア商品に添付する

vrchat_eventsRecent

カーソル以降のイベント

vrchat_eventsWait

次の一致するイベントまでブロックする

vrchat_eventsSearch

保存されたイベント履歴の全文検索

vrchat_eventsStatus

ソケット状態とタイプ別の保持状況

最後の4つは VRCHAT_MCP_WEBSOCKET=1 の場合のみ表示されます。

Related MCP server: Portals MCP

インストール

bun linkvrchat-mcp 実行可能ファイルを PATH に配置するため、下流の何もチェックアウトの場所を知る必要がありません。

bun install
bun link          # from the repo root

名前で登録:

claude mcp add vrchat -- vrchat-mcp

または Claude Desktop では、claude_desktop_config.json に:

{
  "mcpServers": {
    "vrchat": {
      "command": "vrchat-mcp"
    }
  }
}

これが設定のすべてです。認証情報はリポジトリの .env から取得されるため、ここで繰り返す必要はありませんが、env ブロックに置いたものは優先されます。コマンドは bun unlink で削除します。

PATH に何も置きたくない場合は、エントリファイルを絶対パスで指定してください。サーバーは任意の作業ディレクトリから起動されるため、相対パスでは機能しません。

claude mcp add vrchat -- bun run /abs/path/to/vrchat-mcp/src/index.ts

連絡先の要件

VRChat は一般的な User-Agent を 403 で拒否します。VRCHAT_CONTACT は SDK がすべてのリクエスト(API と WebSocket の両方)で送信する説明的な User-Agent に入り、実質必須です。

値は実際のものでなければなりません。SDK は @example.com を含む連絡先を拒否するため、明らかなプレースホルダーは確実に失敗する値です。サーバーはそれを最初のツール呼び出しで設定エラーとして報告し、不可解な 403 として表面化させません。

設定

3つのレイヤー、優先度の高い順。プロジェクトはあなたの認証情報を繰り返すことなく独自のオプションを設定できます。

  1. 実際の環境変数(MCP クライアントの env ブロックを含む)

  2. コマンドが実行されるディレクトリの .env(Bun が自動的に読み込む)

  3. リポジトリルートの .env

したがって、すでに設定した認証情報を使用してストアフロントツールのみを必要とするプロジェクトは、その隣に1行必要です:

# ~/my-project/.env
VRCHAT_MCP_TAGS=store

変数

デフォルト

効果

VRCHAT_USERNAME

なし

アカウントのユーザー名またはメール

VRCHAT_PASSWORD

なし

アカウントのパスワード

VRCHAT_TOTP_SECRET

なし

Base32 の TOTP シークレット。設定するとログインはプロンプトを表示しません

VRCHAT_CONTACT

なし

User-Agent 内の連絡先文字列。実質必須

VRCHAT_MCP_TAGS

すべて

登録するタグ。フィルタなしの場合は everything

VRCHAT_MCP_ALLOW_WRITES

オフ

作成と編集

VRCHAT_MCP_ALLOW_DESTRUCTIVE_WRITES

オフ

削除とモデレーション。書き込みゲートも必要

VRCHAT_MCP_ALLOW_PURCHASES

オフ

残高の消費。書き込みゲートも必要

VRCHAT_MCP_ALLOW_ADMIN

オフ

管理者操作。書き込みゲートとは独立

VRCHAT_MCP_RPS

20

1秒あたりのリクエスト数。0 は 20 にフォールバック、オフはありません

VRCHAT_MCP_MAX_WAIT_MS

30000

呼び出しがリミッターの後ろで諦めるまで待つ時間

VRCHAT_MCP_WEBSOCKET

オフ

イベントパイプラインを開き、イベントツールを登録する

VRCHAT_MCP_WS_EVENTS

低ノイズセット

購読するイベントタイプ。デフォルトを置き換え、拡張はしない

VRCHAT_MCP_HISTORY

1000

タイプごとに保持するイベント数。タイプ別の上書き: 1000,friend-location:200

VRCHAT_MCP_HISTORY_MAX_AGE

30d

年齢の上限。0 で無効。ms s m h d w を受け付けます

VRCHAT_MCP_DB

プロジェクト .vrchat-mcp/events.db

イベントデータベースのパス

VRCHAT_MCP_SESSION

プロジェクト .vrchat-mcp/session.json

セッションファイルのパス

VRCHAT_MCP_PROXY

なし

API および WebSocket トラフィック用の HTTP または HTTPS プロキシ

VRCHAT_MCP_2FA_TIMEOUT_MS

300000

待機中のログインがコードを待つ時間

VRCHAT_LIVE_TESTS

オフ

ライブテストスイートにオプトイン

ブール値は 1 または true を大文字小文字を問わず受け付けます。

状態の保存場所

状態はプロジェクトごとにあります。プロジェクト内でサーバーを実行すると、そのセッションとイベント履歴はそのプロジェクトの .vrchat-mcp/ に保存されます。プロジェクトルートは、作業ディレクトリから .gitpackage.jsondeno.jsonpyproject.tomlgo.mod を探して上に移動することで見つかるため、サブディレクトリから起動しても同じ状態に到達し、1レベル下に2番目のセッションを置き去りにすることはありません。

ディレクトリはバージョン管理から自分自身を隠します: vrchat-mcp は作成時に内部に * を含む .gitignore を書き込むため、認証情報であるセッションファイルは、ホストプロジェクトがルールを必要とせずに保護されます。

したがって、各プロジェクトは個別にログインし、新しいプロジェクトでの最初の呼び出しで 2FA コードを求められる場合があります。1つのログインをどこでも共有するには、すべてのインストールを同じファイルに向けてください:

VRCHAT_MCP_SESSION=/abs/path/to/shared/session.json

安全ゲート

サーバーは読み取り専用で起動します。297 の操作のうち 150 がデフォルトで登録されます。書き込み、削除、消費、モデレーションを行うものは、要求するまで表示されません。

クラス

対象

必要なもの

read

すべての GET

なし

getCurrentUser, searchWorlds

write

POST / PUT / PATCH

ALLOW_WRITES

createInstance, updateWorld, updateProduct

destructive

すべての DELETE、およびオーバーライドリスト

ALLOW_WRITESALLOW_DESTRUCTIVE_WRITES

deleteProduct, banGroupMember, kickGroupMember, closeInstance

money

購入、および Tilia/KYC/支払いパス

ALLOW_WRITESALLOW_PURCHASES

purchaseProductListing, getEconomyPayouts, getUserTiliaKyc

admin

管理者およびアカウントライフサイクル

ALLOW_ADMIN

deleteUser, registerUserAccount, モデレーションレポート

破壊的操作とマネーは書き込みの上に重なるため、書き込みを有効にすると作成と編集の能力だけが与えられ、削除や消費は決してできません。管理者は独立しており、何によっても暗示されません。エージェントに自分のコンテンツを編集させることは、決してアカウントを削除させることにもなってはなりません。

オプトインする内容:

  • ALLOW_WRITES はエージェントがあなたが所有するものを作成・変更できるようにします。元に戻せますが、ほとんど手動です。

  • ALLOW_DESTRUCTIVE_WRITES は元に戻せない呼び出しを追加します。削除、禁止、キック、インスタンスのクローズ、ユーザー永続データの消去。

  • ALLOW_PURCHASES はエージェントが実際の残高を消費できるようにします。purchaseProductListing はライブ取引です。ツールリストが不完全に見えたからといってこれを設定しないでください。

  • ALLOW_ADMINdeleteUser などを公開します。これらのほとんどは通常のアカウントでは 403 になりますが、deleteUser は決して事故であってはならないものです。

ゲートされた操作はどちらにせよ生成テーブルに残るため、カバレッジは仕様と 1:1 のままであり、拒否リストは diff で確認できます。MCP アノテーション(readOnlyHintdestructiveHint)も設定されるため、それらを表示するクライアントはプロンプトを表示できます。

どのツールが欠けていますか?

ゲートされたツールは単に存在しないことになり、「このサーバーはそうするなと言われていた」ではなく「VRChat はこれをできない」と読まれてしまいます。この間違いは実際に起きています。あるエージェントは、書き込みツールが存在し単にフラグの背後にあったにもかかわらず、エコノミー API を読み取り専用と報告しました。

vrchat_authStatus がこのギャップを埋めます。すべてのタグとセーフティクラス、それぞれが保持する操作数、現在公開されている操作数、そして残りを公開するための正確な .env の変更を報告します。

{
  "availability": {
    "toolsRegistered": 12,
    "toolsHidden": 285,
    "tagFilter": ["store"],
    "kinds": { "write": { "enabled": false, "hidden": 88 } },
    "nextSteps": [
      "88 `write` operations are hidden. Ask the user to set VRCHAT_MCP_ALLOW_WRITES=1 ..."
    ]
  }
}

何かがサポートされていないと結論する前に、これを呼び出してください。

公開するツールの選択

VRCHAT_MCP_TAGS はタグを選択します。未設定の場合はすべてを登録し、everything はそれを明示的に示します。これは JSON 設定からキーを削除するよりも簡単です。all* も機能します。

VRCHAT_MCP_TAGS=everything          # all 297 operations
VRCHAT_MCP_TAGS=store               # just the storefront, 19 operations
VRCHAT_MCP_TAGS=store,users,worlds  # matches any of the three

仕様タグ: authentication, avatars, calendar, economy, favorites, files, friends, groups, instances, inventory, invite, jams, miscellaneous, notifications, playermoderation, prints, props, users, worlds。さらに、このサーバーが追加する store

何にも一致しないタグは、起動時に stderr で警告され、vrchat_authStatus によって報告されます。それがなければ、stores のようなタイプミスは生成ツールを一切登録せず、まるで壊れたサーバーのように見えます。

ログイン

ログインは遅延式です。起動時には何も認証しないため、tools/list は資格情報なしで機能し、サーバーは検査可能なままです。セッションを必要とする最初のツール呼び出しがログインをトリガーします。

VRCHAT_TOTP_SECRET が設定されていれば、それで全てです。プロンプトは一切表示されません。

それがなければ、VRChat はコードをメールで送信し、呼び出しはハングせずに待機状態で返ります。

vrchat__getCurrentUser
  -> Login paused: VRChat emailed a code. Ask the user for it, call
     vrchat_submitTwoFactorCode { requestId: 'a1b2c3d4', code: '……' },
     then retry the original call.

vrchat_submitTwoFactorCode でそれに応答し、再試行してください。セッションは永続するため、これはプロジェクトごとに一度だけ発生し、期限が切れるまで続きます。

新しいネットワークからのログイン

プロキシ、VPN、ISP を変更すると、二要素認証コードではないチェックがトリガーされます。この2つは実際の時間を無駄にするほどよく似ています。VRChat は次のいずれかで応答します。

401  It looks like you're logging in from somewhere new! Check your email for a message from VRChat.
429  Logging in from too many places? Check your email for verification link

どちらも同じ意味で、どちらも見た目通りのものではありません。メールには6桁のコードではなくリンクが含まれているため、vrchat_submitTwoFactorCode は役に立ちません。ログインは2ラウンドかかります。

  1. ツール呼び出しがこれらのメッセージのいずれかで失敗する

  2. ユーザーがメール内のリンクを開く

  3. vrchat_retryLogin を呼び出す。VRChat が実際のコードを送信するのはこの2回目の試行だけ

  4. ユーザーがコードを読み上げ、vrchat_submitTwoFactorCode を呼び出す

  5. 元のツールを再試行する

429 はレート制限ステータスをまとった認証チャレンジであるため、ローカルのリミッターはそれを無視します。待っても解消されず、余分な試行ごとにアカウントの限られたセッションスロットを1つ消費します。それがそもそも 429 を生み出しているのです。失敗したログインは30秒間キャッシュされるため、ツール呼び出しのバーストがログイン試行のバーストになることはありません。vrchat_retryLogin はそのキャッシュをクリアします。なぜなら、その時点でユーザーは失敗が待っていたことを実行済みだからです。

ログイン中の並列呼び出し

エージェントはツールを一度に並列展開します。コールドスタート時には、それらはすべて未認証のクライアントに到達します。1つの呼び出しがログインを実行します。他の呼び出しは最大3秒待機し、ブロックせずに login_pending を返します。そのため、遅いログインはすべてのツール呼び出しではなく1つのツール呼び出しを停止させ、コードで待機するログインは複数のプロンプトではなく1つのプロンプトを発生させます。

_responseKeys

すべてのツールは _responseKeys を受け取り、すべてのツールはデフォルトで未加工のアップストリームペイロードを返します。サーバー側でのキュレーションはありません。手選びのフィールドリストは何が重要かを推測することになり、他のフィールドを必要とする人にとっては間違っており、変化する仕様に対して297の操作のためにメンテナンスしなければならないからです。エージェントはこの呼び出しで何を望むかを知っています。それを明示すべきです。

World オブジェクトはおよそ4 KBです。絞り込むと通常は半分以上に減ります。

パターン

選択内容

["*"]

ペイロード全体をバイト単位で

["id","name"]

それらのトップレベルフィールド

["author.displayName"]

ネストされたパス

["*.id"]

トップレベル配列の全要素から id

["items.*.name"]

items の全要素からそのフィールド

["unityPackages.*.**"]

各要素の下にあるすべて

["!description"]

除外し、["*"] と組み合わせる

射影は形状を保ちます。オブジェクトはネストされたままで、配列は順序と長さを維持するため、ある呼び出しで学習したパスは次の呼び出しでも機能します。

発見は射影よりも重要です。エージェントは存在を知らないキーを要求できません。また、黙って空の結果を返すと、この設計は絞り込みよりも悪くなります。そのため、何も一致しないパスは _unmatched として返され、実際にそこにあったものを列挙する _availableKeys が併記されます。配列要素のキーは *.id*.name のように命名され、これは _responseKeys エントリとして機能する形式です。

["*"] は入力を参照で返すため、未加工のパスが確実に無損失であり、何も隠されないことが証明できます。

画像の表示

vrchat_getImage は VRChat の画像をダウンロードし、画像ブロックとして返します。これにより、モデルは URL を報告する代わりに画像を見ることができます。

{ "name": "vrchat_getImage",
  "arguments": { "url": "https://api.vrchat.cloud/api/1/file/file_.../1/256" } }

ユーザー、ワールド、アバター、プリント、プロダクトの任意の imageUrl または thumbnailImageUrl を渡すか、fileId を渡してツールに URL を構築させます。savePath はバイトをディスクに書き込むこともできます。

可能であれば /256 または /512 で終わる URL を優先してください。画像は base64 として運ばれるため、フルサイズのテクスチャは多くのコンテキストを消費し、追加の詳細は得られません。4 MB を超えるものは拒否されます。本当に必要な場合は maxBytes を引き上げてください。

このツールは VRChat がホストする画像のみを取得し、セッションクッキーが送信されるのは api.vrchat.cloud だけです。セッションを保持したまま呼び出し元が指定した URL を取得するツールは、制約がない限りリクエストフォージェリのプリミティブです。また、CDN に送信されたクッキーは渡してしまったことになります。

ファイルのアップロード

ローカルファイルのパスを渡します。サーバーはあなたのマシン上で実行され、ファイル自体を読み取るため、ファイルの内容が会話に入ることはありません。2 MB の PNG を base64 としてインライン化すると、約2.7 MB のツール引数を消費し、呼び出し内の他のすべてを合わせたよりも多くなります。

ディスク上にファイルがない場合、たとえばエージェントが生成したばかりの画像の場合、同じ引数がバイトをインラインで受け取ります。

{ "file": { "data": "iVBORw0KGgo...", "mimeType": "image/png", "filename": "icon.png" } }

data: URI も文字列の位置で機能するため、"file": "data:image/png;base64,iVBORw0..." は同等です。filename は任意で、省略された場合は MIME タイプから生成されます。VRChat は名前を付けられないアップロードを拒否するからです。パスが存在する場合は常にパスを優先してください。インラインはファイル1バイトあたり約1.33バイトのツール引数を消費し、それは他のすべてと同じコンテキスト予算から出てきます。

8つの操作はファイルを直接受け取り、それぞれ1回の呼び出しです。

ツール

フィールド

用途

vrchat__uploadImage

file

アイコン、ギャラリー、絵文字、ステッカー、プロダクト画像(tag で選択)

vrchat__uploadPrint

image

プリント

vrchat__uploadIcon

file

プロフィールアイコン

vrchat__uploadGalleryImage

file

ギャラリー

vrchat__editPrint

image

プリントの画像の置き換え

vrchat__inviteUserWithPhoto

image

招待写真

vrchat__requestInviteWithPhoto

image

招待リクエスト

vrchat__respondInviteWithPhoto

image

招待レスポンス

{ "name": "vrchat__uploadImage",
  "arguments": { "file": "C:/Users/me/Pictures/icon.png", "tag": "icon" } }

結果は送信されたバイトと、それらがどの形式で届いたかを示します。これが、正しいファイルのアップロード成功と、間違ったファイルのアップロード成功を区別する唯一の方法です。

{ "uploaded": [
    { "field": "file", "name": "icon.png", "bytes": 48211, "type": "image/png", "source": "path" }
  ],
  "result": { "id": "file_...", "name": "icon.png" } }

その他のすべてについては、vrchat_uploadFile が VRChat の4段階のシーケンス(レコードの作成、プリサインド URL の要求、バイトの転送、完了)を実行し、完了したファイルレコードを返します。アセットバンドルや unity パッケージに使用してください。バイトはプレーンなリクエストで VRChat のストレージプロバイダーに直接送信されます。意図的に API クライアントを経由しません。そのクライアントは送信するすべてにセッションクッキーを添付し、ストレージホストは第三者だからです。

アップロードは書き込みなので、これらすべてに VRCHAT_MCP_ALLOW_WRITES=1 が必要です。ファイルは100 MB に制限され、空のファイルは VRChat に到達する前に拒否されます。そうしないと VRChat は壊れたレコードを保存することになります。vrchat_uploadFile が途中で失敗した場合、作成したファイルレコードを指定するため、vrchat__getFile で検査し、vrchat__deleteFile で削除できます。

ストアの運営

ストアフロントの管理は通常の書き込みであり、money 操作ではありません。プロダクトの作成、名前の変更、画像の変更、リスティングの公開または非公開: これらのいずれも支出や収入を伴わないため、VRCHAT_MCP_ALLOW_WRITES=1 だけが必要です。money ゲートは購入と決済プロセッサのためのものです。

VRCHAT_MCP_TAGS=store
VRCHAT_MCP_ALLOW_WRITES=1

プロダクト画像の設定は1回の呼び出しで完了します。

{ "name": "vrchat_setProductImage",
  "arguments": { "productId": "prod_...", "file": "/abs/path/cover.png" } }

これは tag: "product" でアップロードし、返されたファイル ID をプロダクトの imageId として添付します。手動では、tag: "product" または "listinggallery" を指定した vrchat__uploadImage を実行し、次に返された ID を指定して vrchat__updateProduct を実行します。

VRChat 自体が許可しないことが1つあります。リスティングは編集可能なのは active のみで、価格、タイトル、説明は作成後に変更できません。リスティングを削除して新しいものを作成してください。名前、説明、画像はプロダクト上にあり、vrchat__updateProduct を通じて編集できます。

ページネーション

1回の呼び出しにつき1ページです。ページネーション対応ツールはデフォルトで25件の結果を返し、続きに使う nextOffset をエコーバックします。内部的なページネーションループは意図的にありません。隠れた自動ページネーションは、エージェントには1回の呼び出しのように見える中で、リクエスト予算とコンテキストの大部分を消費するからです。

短いページは終わりを意味します。VRChat は合計数を報告しないため、それが唯一の信頼できるシグナルです。

WebSocket イベント

デフォルトではオフです。アイドル状態で常時接続のソケットはセッションスロットを消費するからです。VRCHAT_MCP_WEBSOCKET=1 を設定するとソケットが開き、4つの vrchat_events* ツールが登録されます。

VRCHAT_MCP_WS_EVENTS は購読するタイプを選択します。デフォルトの notificationnotification-v2economy-updatefriend-onlinefriend-offlineinstance-queue-ready のセットを拡張するのではなく置き換えます。

パイプラインのメッセージは二重にエンコードされています。content フィールドは文字列化された JSON であり、2回目のパースが必要です。ただし、see-notificationhide-notification は素の ID を運ぶため例外です。これらはすべて取り込み時に一度正規化されるため、ツールが JSON 内の JSON 文字列を渡すことは決してありません。SDK 自身のソケットはこれら2つのメッセージタイプを黙ってドロップします。このサーバーがそれを使わない理由の1つです。もう1つの理由は、プロキシを受け付けないことです。

保持はタイプごと

履歴は .vrchat-mcp/events.db の SQLite に保存され、イベント タイプ ごとに1000件を保持します。合計1000件ではありません。friend-location のような頻繁に発生するタイプは、economy-update のような稀で価値のあるタイプを追い出すことは決してありません。単一のグローバル上限では数分で追い出されてしまうでしょう。

VRCHAT_MCP_HISTORY=1000,friend-location:200,economy-update:5000
VRCHAT_MCP_HISTORY_MAX_AGE=7d

件数上限と並行して期間の上限も機能し、先に達した方が勝ちます。件数だけでは、まれにしか発生しないタイプが数か月前のイベントを現在のものとして保持し続けることになります。期間だけでは、バーストがデータベースを肥大化させる可能性があります。vrchat_eventsStatus は、タイプごとに現在どの制限が効いているかを報告するため、ウィンドウが黙ったままではなく判読可能です。

履歴は再起動後も残るため、vrchat_eventsSearch は離れている間に何が起こったかに答えることができます。ライブのみのバッファではそれはできません。

プロキシ

VRCHAT_MCP_PROXY は、オプションの user:pass@ 資格情報を使用して、トラフィックを HTTP または HTTPS プロキシ経由でルーティングします。

VRCHAT_MCP_PROXY=http://127.0.0.1:8080
VRCHAT_MCP_PROXY=https://user:pass@proxy.internal:8443

SOCKS はサポートされていません。Bun の fetch は socks5:// を完全に拒否するため、SOCKS URL は、中途半端に動作するのではなく、起動時にその制限を明示した設定エラーで失敗します。代わりに、その前にローカル HTTP プロキシを配置してください。

プロキシは API トラフィックと WebSocket トラフィックの両方をカバーします。この 2 つは異なるメカニズムを経由するため、片方しか正しく処理できない場合の障害モードは、プロキシされているように見えながら、イベントストリームで実際の IP を漏洩してしまうサーバーです。

プロキシに到達できない場合、呼び出しは明確なエラーで失敗します。サーバーが静かに直接接続へフォールバックすることは決してありません。IP 分離のためにこれを使用している人にとって、それは最悪の結果だからです。プロキシ URL には資格情報が埋め込まれている可能性があるため、ログに記録されることは決してありません。

開発

bun link                    # install the vrchat-mcp command on PATH
bun unlink                  # remove it
bun run generate            # regenerate tools from the latest upstream spec
bun run generate --offline  # regenerate from the committed snapshot, no network
bun test                    # offline suite
bun run test:live           # live suite, needs VRCHAT_LIVE_TESTS=1
bun run inspect             # MCP Inspector against this server
bun run typecheck           # tsc --noEmit

bun run generatevrchatapi/specificationmain ブランチで取得し、バンドルして、バンドルされたスペックと spec/VERSION.json (アップストリーム SHA、タイムスタンプ、コンテンツハッシュ) を、再生成された src/generated/operations.ts とともに書き出します。両方ともコミットされるため、再生成のたびに、スペックの変更と、それによって引き起こされたツールの変更という 2 つのレビュー可能な差分が生まれます。悪いアップストリームコミットは、依存を強いられるものではなく、元に戻せるものです。--offline は、ネットワークを一切使わずに、コミットされたスナップショットから出力をバイト単位で再現します。

src/generated/operations.ts は生成されたファイルです。手動で編集しないでください。

10 個の operationId には、VRChat SDK に対応するメソッドがありません。スペックの更新がクライアントライブラリより速いためです。これらは同じクライアント上の raw-request フォールバックを経由するため、Cookie、User-Agent、プロキシ、レート制限は引き続き適用され、1:1 のカバレッジは、静かに嘘になるのではなく、真実のまま維持されます。Codegen は実行のたびにそのリストを出力します。

stdout は JSON-RPC チャネルです。すべてのログは stderr に出力され、console.log が 1 つでも紛れ込むとプロトコルストリームが壊れます。

テスト

bun test はオフラインスイートです。codegen 出力、ゲーティング、フェイククロックに対するレートリミッター、履歴の保持と検索、プロジェクション、エラーマッピング、アップロードパスの処理をテストします。ネットワークなし、資格情報なし、アカウントなしです。これがデフォルトで実行されるものです。

bun run test:live は実際のアカウントを対象とし、VRCHAT_LIVE_TESTS=1 でオプトインした場合のみ実行され、それ以外の場合はスキップされます。このテストが自分自身に課すルールは次のとおりです:

  • 読み取りと、クリエイター所有の書き込みのみ。クライアントが構築される前の時点で、money または admin に分類されるものはすべて完全に拒否します。テストスイートがお金を使うことができてはなりません。

  • すべての書き込みは自分で後片付けを行い、タグが付けられるため、取り残されたアーティファクトもゲーム内で識別できます。

  • 本番環境と同じリミッターを経由し、小規模に保たれます。VRChat のスロットリングを発動させるような実行は、実行しないことよりも悪い結果になります。

  • アサーションは形状とステータスに対して行われ、変動するコンテンツに対しては決して行われません。フレンド数やワールドリストは実行のたびに変わります。

  • 可能な場合は専用アカウントを使用してください。資格情報は .env からのみ取得されます。

セキュリティ

  • .env.vrchat-mcp/ は gitignore されており、.vrchat-mcp/ は内部からも自分自身を無視するため、他のプロジェクト内でも隠れたままになります。

  • .vrchat-mcp/session.json は認証資格情報、つまり有効なセッション Cookie です。パスワードのように扱ってください。これを削除するか、vrchat_logout を呼び出すと、再ログインが強制されます。

  • 2FA コード、パスワード、TOTP シークレット、プロキシ URL は、stderr も含め、決してログに記録されません。

  • セッション Cookie は api.vrchat.cloud にのみ送信され、他のどこにも送信されません。VRChat のストレージプロバイダーへのアップロードと、その CDN からの画像取得は、意図的に認証済みクライアントをバイパスします。

  • エラーは、ステータス、VRChat 自身のメッセージ、実行可能なヒントを含む構造化された結果として返されます。生の例外やスタックトレースがトランスクリプトに到達することは決してありません。

  • stdio のみ、ローカルのみ。HTTP トランスポートなし、マルチユーザーの資格情報分離なし。このサーバーは、1 台のマシン上の 1 つのアカウント専用です。

プロジェクト構成

scripts/generate-tools.ts     # build-time codegen: spec -> src/generated/operations.ts
spec/openapi.bundled.json     # committed snapshot of the upstream spec
spec/VERSION.json             # upstream SHA + fetch timestamp + content hash
src/config.ts                 # the entire env surface, read once
src/types.ts                  # shared contracts
src/generated/operations.ts   # committed, generated, 297 entries, do not edit
src/vrchat/client.ts          # lazily-authed VRChat client, proxy, 2FA sniffing
src/vrchat/twofactor.ts       # pending-code broker
src/vrchat/ratelimit.ts       # token bucket + global 429 backoff
src/vrchat/events.ts          # websocket client + waiter registry
src/vrchat/history.ts         # bun:sqlite event store, per-type retention + FTS5 search
src/tools/auth.ts             # authStatus / submitTwoFactorCode / retryLogin / logout
src/tools/images.ts           # getImage
src/tools/upload.ts           # uploadFile / setProductImage
src/tools/events.ts           # eventsRecent / eventsWait / eventsSearch / eventsStatus
src/registry.ts               # gating, registration, the one shared handler
src/project.ts                # _responseKeys path projection
src/upload.ts                 # local path -> File, with size and type guards
src/errors.ts                 # HTTP status -> structured tool error with hint
src/index.ts                  # serveStdio entry point
tests/                        # offline suite; tests/live/ is the opt-in live suite
docs/PLAN.md                  # design document
PROGRESS.md                   # build status and verified SDK behaviour

ライセンス

LICENSE を参照してください。

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables remote control of Lovense toys through Claude using natural language commands. Supports vibration patterns, presets, and intensity control from any device via Cloudflare Workers.
    4
    Apache 2.0
  • A
    license
    Not graded
    quality
    Not graded
    maintenance
    Enables Claude to design and build interactive 3D games within the Portals virtual platform through direct API integration. It facilitates automated asset placement, interaction logic configuration, and quest management using natural language commands.
    4

View all related MCP servers

Related MCP Connectors

  • WHOOP recovery, strain, sleep and workouts in Claude via official WHOOP OAuth. Free, open source.

  • Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer

  • Garmin data in Claude & ChatGPT via the Garmin Health API. OAuth sign-in, no password sharing.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/TheArmagan/vrchat-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server