Skip to main content
Glama
tarakomasu

Japanese Character Counter MCP Server

by tarakomasu
README.md
# 日本語文字数カウント MCP サーバー

Web版ChatGPTの「新しいコネクター」から接続できるMCPサーバーです。日本語テキストの文字数(グラフェム単位)を正確にカウントするツール `countJapaneseChars` を提供します。

## 機能

- **countJapaneseChars**: 日本語テキストの文字数(グラフェム単位)を正確にカウント
  - `Intl.Segmenter` を使用してグラフェムクラスターを正確にカウント
  - サロゲートペアや結合文字を適切に処理

## 技術スタック

- Next.js 16 (App Router)
- TypeScript
- @modelcontextprotocol/sdk
- Intl.Segmenter (グラフェムカウント用)

## セットアップ

### 依存関係のインストール

```bash
npm install
```

### 開発サーバーの起動

```bash
npm run dev
```

開発サーバーは `http://localhost:3000` で起動します。

MCPサーバーのエンドポイントは `http://localhost:3000/api/mcp` です。

## 使用方法

### Web版ChatGPTの「新しいコネクター」から接続

1. ChatGPTの設定で「新しいコネクター」を開く
2. エンドポイントURLを入力: `http://localhost:3000/api/mcp` (開発環境) または `https://your-domain.com/api/mcp` (本番環境)
3. 接続を確立

### APIエンドポイント

- **POST** `/api/mcp`: MCPリクエストを処理
- **GET** `/api/mcp`: SSEストリーム(現在はJSONレスポンスモードを使用)
- **DELETE** `/api/mcp`: セッション終了
- **OPTIONS** `/api/mcp`: CORSプリフライト

### ツールの使用例

`countJapaneseChars` ツールを呼び出すと、以下のようなレスポンスが返されます:

```json
{
  "content": [
    {
      "type": "text",
      "text": "文字数: 9"
    }
  ],
  "structuredContent": {
    "count": 9,
    "text": "こんにちは、世界!"
  }
}
```

## デプロイ

### Vercelへのデプロイ(推奨)

#### 1. Vercelアカウントの準備

[Vercel](https://vercel.com/)にサインアップまたはログインします。

#### 2. プロジェクトのデプロイ

```bash
# Vercel CLIをインストール(初回のみ)
npm install -g vercel

# プロジェクトディレクトリでデプロイ
vercel

# 本番環境へデプロイ
vercel --prod
```

または、GitHubと連携して自動デプロイ:

1. GitHubにプロジェクトをプッシュ
2. Vercelダッシュボードで「Import Project」をクリック
3. GitHubリポジトリを選択
4. デプロイ設定を確認(デフォルトで問題なし)
5. 「Deploy」をクリック

#### 3. デプロイ後の確認

デプロイ後、提供されたURLの `/api/mcp` エンドポイントがMCPサーバーとして機能します。

例: `https://your-project.vercel.app/api/mcp`

#### 4. Web版ChatGPTとの接続

1. ChatGPTの設定を開く
2. 「新しいコネクター」を選択
3. エンドポイントURLを入力: `https://your-project.vercel.app/api/mcp`
4. 接続を確立

### その他のデプロイ先

#### Netlify

```bash
# Netlify CLIをインストール
npm install -g netlify-cli

# デプロイ
netlify deploy --prod
```

#### Railway

1. [Railway](https://railway.app/)にサインアップ
2. 「New Project」→「Deploy from GitHub repo」
3. ビルドコマンド: `npm run build`
4. 開始コマンド: `npm start`

### 環境変数

現在、環境変数の設定は不要です。本番環境でセッション管理を改善する場合は、Redisなどの外部ストレージを使用することを推奨します。

#### Redis統合(オプション)

本番環境で複数インスタンスを使用する場合、Redisでセッション管理を行うことを推奨:

```bash
npm install ioredis
```

`app/api/mcp/route.ts` でRedisを使用するようにコードを修正してください。

## 実装の詳細

### コード構造(モジュール分割)

```
app/api/mcp/
├── route.ts                        # HTTPエンドポイントハンドラー
│                                   # POST, GET, DELETE, OPTIONSメソッド
│                                   # セッション管理
│
├── lib/
│   ├── helpers.ts                  # ヘルパー関数
│   │                               # - Next.js ⇔ Node.js 変換
│   │                               # - CORS設定
│   │
│   └── mcp-server.ts              # MCPサーバーセットアップ
│                                   # - サーバーインスタンス作成
│                                   # - ツール登録
│
└── tools/
    └── countJapaneseChars.ts      # 文字数カウントツール
                                    # - グラフェムカウント実装
                                    # - ツール設定とハンドラー
```

各ファイルには**超詳細なコメント**が付いており、以下を説明:
- なぜそのコードが必要か
- どのように動作するか
- 注意点や代替案
- 具体的な使用例

### 主要機能

- **グラフェムカウント**: `Intl.Segmenter` を使用して、人が1文字と捉える単位(グラフェム)を正確にカウント
  - フォールバック機能付き: `Intl.Segmenter`が利用できない環境でも動作
- **セッション管理**: メモリ内でセッションを管理(本番環境ではRedis等の使用を推奨)
- **CORS**: Web版ChatGPTからの接続を許可するため、適切なCORSヘッダーを設定
  - `Authorization`ヘッダーにも対応(将来の認証機能に備える)

### プロダクション品質の特徴

1. **ランタイム指定**: `runtime = "nodejs"` でNode.js APIを確実に使用
2. **堅牢な初期化**: `isInitializeRequest`を検出して無条件で新規セッションを作成
3. **エラーハンドリング**: すべてのエンドポイントで適切なエラーレスポンスを返却
4. **ヘルスチェック**: GET エンドポイントでセッション状態を確認可能
5. **クリーンなセッション削除**: DELETE で不要な処理を行わずシンプルに削除
6. **モジュール分割**: 責務ごとにファイルを分割、保守性と可読性を向上

## ライセンス

MIT