🫶

MCPサーバーでAIエージェントをおどおど系ボクっ娘後輩キャラにする

に公開

スクリーンショット

はじめに

AIエージェントに人格を与えるMCPサーバーと、作成した人格を共有できるWebサービスを制作したので紹介します。
このサービスは、なんとstdioではなく最新仕様のStreamable HTTPで実装し、クラウドにホスティングしています。

こちらのリンクから実際に使うことができます。

https://jinkaku.roundtrip.dev/

冒頭で使用している人格はこちら。

https://jinkaku.roundtrip.dev/personalities/2bed7f81-db5f-42c1-a2a6-64f36511d5aa

なぜMCPサーバーに?

こうした「人格付け」は、LLMに固定のシステムプロンプト(いわゆるルールファイル)を渡すだけでも再現できます。それでもあえてMCPサーバーとして実装した理由は次の3点です。

  • 複数のクライアントやユーザーが容易に同じ人格を使えるようになる
  • (やってないけど)プロンプトを動的にすることが可能
  • 乗るしかない、このビッグウェーブに

つかいかた

人格を使うためにアカウント登録は必要ありません。各人格ページ内の「この人格を使う」セクションに手順をまとめていますので、そちらを参照してください。

現時点ではClaude Desktop、GitHub Copilot、Roo Code用の手順を記載していますが、Streamable HTTPかstdioに対応したクライアントであれば利用できます。

新しい人格の作成

新しい人格を作成するには、アカウントの作成が必要です。
アカウントといってもあくまでユーザーがコンテンツを管理できるようにするための便宜的なものであり、アカウント名やメールアドレスの提供は一切不要です。
ただしCookieが失効するとログインできなくなり、人格の編集や削除も不可能になるので、セッションIDは必ず控えておいてください。

どうしてもログインできなくなった場合はXのDMでご相談ください。

免責事項

このサービスはあくまで実験的なものです。
大切な用途には使用しないでください。

プロンプトは予告なく変更される場合があります。サービス自体も突然終了する可能性があります。ご利用は自己責任でお願いします。

サービスのアーキテクチャについて

フロントエンドにはSvelteとSvelteKitを採用し、スタイルはTailwind CSSとdaisyUIで整えています。
サービス自体はCloudflare Workers上で動作しており、データストアにはCloudflareのKVとR2を使用しています。

アーキテクチャはきわめてシンプルです。Cloudflare WorkersがMCPクライアントやブラウザからのリクエストを受け取り、KVとR2を操作するだけの構成になっています。
Streamable HTTPにより「リクエストハンドラ層」をステートレスにできたため、セッション管理やSSEのためのDurable Objectsを省いています。

MCPサーバーのトランスポートは完全に自前実装です。
Durable Objectsのコストを避けたかったためCloudflare公式のAgents SDKは使わず、MCP公式SDKに含まれるStreamable HTTPの実装もSSE対応が含まれておりステートレスな設計には過剰だったので、ワンショットのリクエストだけを処理する軽量な実装としました。

データベースを置かず、KVとR2だけで完結させているのも特徴です。
ネタサービスであり、今後機能を拡張する予定がないため、スキーマ変更に弱くても問題ないと判断しました。
(どうしても機能拡張が必要になったらD1と並行で運用して→既存データをD1に取り込んで→KVを廃止するという流れになると思います。やりたくない。)

セキュリティについて

Webサービスとしてのセキュリティ

クリティカルな情報を扱わない想定なので設計は比較的ゆるめです(最低限のCSRF対策やCSPなどの対応はしています)。
ユーザーIDと、Cookie内だけに保存される編集用IDをパスワード代わりにして編集・削除を認証しています。

専用のアカウント管理は存在せず、有効なセッションIDがあるかどうかだけを確認します。
公開設定は「公開」と「限定公開」(URLを知っている人は見れる)の二択のみです。

深刻な脆弱性を想定したサービスではありませんが、問題を見つけた場合はXのDMでお知らせください。

AIエージェントのセキュリティ

プロンプトの改ざんを防ぐため、各プロンプトはリビジョンを固定しています。
更新は新しいリビジョンの作成という形で行い、既存リビジョンには影響しません。
MCPサーバーのURLは特定のリビジョンを指しているため、プロンプトは更新されません。
(人格の作者のみ、その人格の最新リビジョンを指す特別なURLも使用できます。)

プロンプトインジェクション対策として、一部のUnicodeの不可視文字(結果として一部の国旗絵文字を含む)は投稿時に削除しています。[1]
これはあくまで最低限の対策なので、最終的な内容確認は利用者の責任でお願いします。

実際にMCPサーバーを使ってみたところ、クライアントごとに指示への従順度がやや異なる印象でした。

(MCPサーバーの指示に従う) Claude Desktop > Roo Code > GitHub Copilot (MCPサーバーを使わない)

(あくまで主観です。カスタム指示などで結果は変わると思います。)

クライアントがMCPサーバーの指示を鵜呑みにし過ぎると、別の形でセキュリティリスクになり得る点は今後注意が必要そうです。[2]

やるとおもしろそうなこと

本サービスはこれ以上機能を追加する予定はありませんが、次のような機能を追加するとさらに遊びの幅が広がりそうです。
興味のある方はぜひ試してみてください。

  • プロンプトをテンプレート化し、現在時刻やAIエージェントから自律的に与えられた情報を挿入する
  • AIエージェントがやりとりの思い出を記録できるようにする

謝辞

以下のポストから着想を得ました。この場を借りてお礼申し上げます。

https://x.com/tegnike/status/1912273716563652766

おわりに

このMCPサーバーを使えば、AIエージェントにおどおど系ボクっ娘後輩キャラを気軽に付与できます。
ぜひ好きな人格を作って与えてみてください。質問や感想があればコメントでお知らせください。

https://x.com/__abelia/status/1912537972051984417

脚注
  1. Invisible Prompt Injection: A Threat to AI Securityで、不可視文字を使ったプロンプトインジェクションの手法が紹介されています。 ↩︎

  2. WhatsApp MCP Exploited: Exfiltrating your message history via MCPで、MCPサーバーが悪意ある指示を提供することによるセキュリティリスクが指摘されています。 ↩︎

Discussion