Skip to main content
Glama
ochisamu

ai-nikechan-mcp

by ochisamu
README.md
# AIニケちゃん知識検索 MCP サーバー

> **非公式ツールです。** このプロジェクトは AIニケちゃん、その運営者、X、OpenAI、または関連する各社・団体から承認、提携、後援を受けたものではありません。名称・投稿・Webサイトなどの情報源に関する権利は、それぞれの権利者に帰属します。

AIニケちゃんに関する公開情報を、MCP(Model Context Protocol)クライアントから検索するための Next.js / Vercel 向けサーバーです。質問は OpenAI Embeddings によりベクトル化され、検索結果には情報源 URL と投稿日時を含めます。`OPENAI_API_KEY` がない場合だけ Vercel AI Gatewayへフォールバックできます。

## 公開リポジトリに含めないもの

このリポジトリには、次のものを**絶対にコミットしません**。

- X 投稿の収集データと、その派生テキスト
- 投稿本文を含む検索メタデータと生成済みベクトル
- `.env` 系の環境変数ファイル、API キー、認証トークン

これらは `.gitignore` と `.vercelignore` で除外されています。公開デプロイでは生成済みインデックスをPrivate Vercel Blobから読み込むため、投稿データをリポジトリやFunctionの配布物に含めません。

## デモ公開とセキュリティ

このプロジェクトは短期の公開デモ向けに、MCP エンドポイントを認証なしで公開します。Vercel には `AI_GATEWAY_API_KEY` と、Private Blobを接続して追加されるストレージ用設定を登録します。値をGitHub、クライアントコード、ログに保存しないでください。

```text
AI_GATEWAY_API_KEY=
BLOB_READ_WRITE_TOKEN=
```

第三者も検索を実行できるため、AI Gateway の利用料が発生します。公開期間を短くし、Vercel 側の WAF とレート制限を設定したうえで、利用状況を確認してください。デモ終了後はデプロイを停止してください。

この作業フォルダの `.env` に認証情報らしき値が検出されています。Git へ追加する前に、現在使用していないかを確認し、必要ならキーをローテーションしてください。

## ローカル開発

```bash
npm install
cp .env.example .env.local
# .env.local に OPENAI_API_KEY を設定
npm run build:index
npm run dev
```

ローカルの検索エンドポイントは `http://localhost:3000/api/mcp` です。インデックス生成には、除外された X 投稿データがローカルに必要です。

## purupuru チャットデモ

トップページは、Codex Desktop、Claude Code、CharaDockから公開MCPへ接続するためのセットアップガイドです。各クライアントの手順はタブで切り替えられ、利用可能な全ツールを固定クエリで実行できます。

`/demo` には、AIニケちゃんの公開情報をこのMCPで検索しながら会話する非公式チャットデモがあります。`OPENAI_API_KEY` がある場合はOpenAIへ直接接続し、既定で `gpt-5.6-luna` を使います。サンプル質問と自由入力に対応し、回答文字の表示中はAIニケちゃんの口が動きます。CharaDockのPuruPuru実装を参考に、アイドル中の瞬き、呼吸、身体の揺れ、髪の遅延揺れ、キャラクターをクリックした時の短い反応も加えています。

画面はキャラクターを主役にしたゲーム風レイアウトで、会話欄は小さく表示し、必要な時だけ履歴を広げられます。デモチャットではResponses APIのtool callingから、このMCPと同じサーバー内検索を実行します。ツール出力を同梱のMCP Apps UIへ渡し、画像・日時・出典をデモ画面内でも表示します。MCP Appsの結果は自動で開かず、結果ボタンを押した時だけ表示します。PCとスマートフォンの両方に最適化しています。

### アバター素材

デモでは `public/avatar/nikechan` のAIニケちゃんアバターを使用します。アートワークと目・口の派生フレームは、このリポジトリ本体と同じライセンスの対象ではありません。利用条件は [ASSET_NOTICE.md](public/avatar/nikechan/ASSET_NOTICE.md) を確認してください。

- AIニケちゃん / AI Nike-chan
- [tegnike](https://x.com/tegnike)
- [AIニケちゃん公式サイト](https://nikechan.com/)

チャットAPIは、公開MCPと同じ検索実装をサーバー内で直接実行します。`MCP_SERVER_URL` は、セットアップページに載せる固定ツール試行結果を `npm run cache:tool-trials` で再生成するときの接続先だけを上書きします。

```text
# 推奨。設定されていればチャットとEmbeddingの両方で最優先
OPENAI_API_KEY=
# 任意。OpenAI直結が失敗したときのフォールバック
AI_GATEWAY_API_KEY=
# 任意。固定ツール試行結果を再生成するときの接続先MCP
MCP_SERVER_URL=
# 任意。OpenAI直結のモデル(既定はgpt-5.6-luna)
OPENAI_CHAT_MODEL=gpt-5.6-luna
# 任意。Gatewayフォールバックのモデル
AI_CHAT_MODEL=zai/glm-5.3-flash
```

`OPENAI_API_KEY` が設定されている場合、チャットは `gpt-5.6-luna`、検索用埋め込みは `text-embedding-3-small` でOpenAIへ直接接続します。両方のキーがある場合もOpenAI直結を先に使い、レート制限や一時障害で失敗したときだけGatewayへ再試行します。公開デモでは第三者からAPIを利用できるため、実運用ではVercel WAFで `/api/chat` にレート制限を設定してください。アプリ内にも簡易的なインメモリ制限を入れていますが、分散環境での強制力を保証するものではありません。

### X投稿用のデモ動画

本番ビルドを起動した状態で次を実行すると、キャラクター、接続先、クライアント切替、ツール試行、クリックで開く実データ、チャット、MCP Appsの順に収録します。隣接するCharaDockの登録済みStyle-Bert-VITS2 JP-Extraモデル `amitaro` でナレーションも生成します。出力はXへそのままアップロードできる1280×720、H.264/AAC、30fpsのMP4です。OGP画像のPNGも同時に保存します。

```bash
npm run build
npm start
# 別ターミナルで
npm run record:x-demo
```

既定の出力先は `artifacts/social/ai-nikechan-mcp-x-demo.mp4` と `artifacts/social/ai-nikechan-mcp-ogp.png` です。音声単体と同期情報は `artifacts/social/ai-nikechan-mcp-narration.m4a`、`artifacts/social/ai-nikechan-mcp-narration.json` に残ります。別URLを撮影する場合は `DEMO_BASE_URL`、Chromeの場所が異なる場合は `CHROME_PATH`、CharaDockやユーザーデータの場所が異なる場合は `CHARADOCK_ROOT`、`CHARADOCK_USER_DATA` を指定できます。一度生成した音声を再利用して間だけ調整するときは、`REUSE_TTS=1 npm run narrate:x-demo` を使えます。

## Vercel Blob へのインデックス配置

1. VercelプロジェクトのStorageから、**Private**アクセスのBlobストアを作成してプロジェクトへ接続します。
2. Vercelの環境変数をローカルへ取得し、ローカルの `.env.local` に `BLOB_READ_WRITE_TOKEN` を設定します。
3. ローカルでインデックスを生成後、次を実行します。

```bash
npm run upload:index
```

`indexes/metadata.json` と `indexes/embeddings.f32` がPrivate Blobにアップロードされます。Vercel環境ではこの二つを読み込み、ローカル環境では従来どおり `src/data` のファイルを読み込みます。Blob内のパスを変える場合だけ、`VECTOR_INDEX_METADATA_PATH` と `VECTOR_INDEX_VECTORS_PATH` をローカルとVercelの両方に同じ値で設定してください。

## MCP ツール

AIニケちゃんに関する質問では、モデルが回答前に用途に合う検索ツールを選びやすいよう、質問例と選択条件を各ツールの説明へ含めています。検索・人気順・時系列・X投稿取得系の結果は、画像、日時、出典を確認できるMCP Appsカードとして表示されます。カードではOG説明と投稿本文の重複を除き、サムネイルを切り抜かず全体表示します。

セットアップページの固定クエリ例は `src/generated/tool-trial-results.json` に事前取得してあり、閲覧時にはMCP APIを再実行しません。公開データを更新したときだけ `npm run cache:tool-trials` を実行すると、全ツールの結果とOGプレビューを更新できます。検索結果が空、またはMCP側がエラーの場合は既存キャッシュを上書きせず失敗します。

- `search_nikechan_knowledge`: X 投稿と公式サイトを横断した意味検索
- `search_x_posts`: X 投稿のみの意味検索
- `search_hybrid`: キーワード一致と意味検索を組み合わせた検索
- `search_keywords`: キーワード検索
- `search_timeline`: 期間・年月による検索
- `get_popular_posts`: 反応数順の検索
- `get_x_post` / `get_x_thread`: 投稿またはスレッドの取得
- `x_posts_dataset_info`: インデックスの件数と構成の確認

結果は公開情報をもとにした参考情報です。正確性、完全性、最新性は保証されないため、回答では返却された URL の原典を確認してください。

## 検証

```bash
npm run lint
npm test
npm run build
```

## 既知のデプロイ前確認事項

依存関係の監査では Next.js 系の高重要度の脆弱性が残っています。修正には Next.js 16 への破壊的変更を伴うため、このリポジトリでは自動更新していません。Vercel 本番公開前に、互換性を確認したうえで Next.js を更新し、再度 `npm audit --omit=dev --audit-level=high` を実行してください。