Skip to main content
Glama
moneyan9

rakuten-rms-mcp-remote

by moneyan9
README.md
# rakuten-rms-mcp-remote

[`rakuten-rms-mcp`](https://github.com/moneyan9/rakuten-rms-mcp) の **Remote MCP ホスト**です。

- Transport: **Streamable HTTP**(`/mcp`)
- Auth: **OAuth 2.1 + PKCE**(共有パスコード)および任意の **静的 Bearer**
- ツール実装はコアパッケージを依存として利用(このリポに RMS ロジックは置きません)

Claude.ai / ChatGPT などの「URL を貼る」系クライアント向けです。Cursor のローカル stdio はコア側を使ってください。

---

## 必要条件

- Node.js 20+
- RMS の `serviceSecret` / `licenseKey`
- 次のどちらか(または両方)
  - `RMS_MCP_OAUTH_PASSCODE` … OAuth 認可画面の共有パスコード
  - `RMS_MCP_API_KEY` … `Authorization: Bearer …` を直接書けるクライアント用

---

## セットアップ

```bash
git clone https://github.com/moneyan9/rakuten-rms-mcp-remote.git
cd rakuten-rms-mcp-remote
cp .env.example .env   # 値を編集
npm install
npm run build
npm start
```

ローカルではコア未公開でも動くように、必要なら `package.json` の依存を一時的に:

```json
"rakuten-rms-mcp": "file:../rakuten-rms-mcp"
```

に差し替えて `npm install` してください。

---

## エンドポイント

| Path | 説明 |
|------|------|
| `GET /health` | 存活確認 |
| `GET /.well-known/oauth-authorization-server` | OAuth AS メタデータ |
| `GET /.well-known/oauth-protected-resource` | Protected Resource メタデータ |
| `GET /.well-known/oauth-protected-resource/mcp` | 同上(RFC 9728 path-aware) |
| `POST /oauth/register` | Dynamic Client Registration |
| `GET/POST /oauth/authorize` | パスコード入力 → auth code |
| `POST /oauth/token` | code → access token(PKCE) |
| `ALL /mcp` | MCP Streamable HTTP(**Bearer 必須**・SDK `requireBearerAuth`) |

---

## ChatGPT / Claude への接続

1. このサーバを HTTPS で公開(Railway / Render / Fly など)
2. `ALLOWED_HOSTS` に公開ホスト名を入れる(例: `my-app.up.railway.app`)
3. ChatGPT: Developer Mode → カスタムコネクタに `https://…/mcp` を追加(OAuth)
4. Claude.ai: Connectors → カスタムコネクタに同様に追加
5. 認可画面で `RMS_MCP_OAUTH_PASSCODE` を入力

ヘッダを書けるクライアント(一部の MCP クライアント)向け:

```json
{
  "mcpServers": {
    "rakuten-rms": {
      "url": "https://YOUR_HOST/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_RMS_MCP_API_KEY"
      }
    }
  }
}
```

---

## 環境変数

| 変数 | 必須 | 説明 |
|------|------|------|
| `RMS_SERVICE_SECRET` | はい | RMS serviceSecret |
| `RMS_LICENSE_KEY` | はい | RMS licenseKey |
| `RMS_SHOP_ID` | 任意 | 問い合わせ返信時 |
| `PORT` | 任意 | デフォルト `8000` |
| `ALLOWED_HOSTS` | 推奨 | カンマ区切りホスト名(公開時必須級) |
| `RMS_MCP_OAUTH_PASSCODE` | OAuth 時 | 共有パスコード |
| `RMS_MCP_API_KEY` | 任意 | 静的 Bearer |
| `RMS_MCP_OAUTH_STORE_PATH` | 任意 | トークン永続化パス |

**注意:** 現状は **1 プロセス = 1 店舗の RMS 鍵**(サーバ env)です。個人事業主ごとの鍵分離はまだありません。

---

## Vercel

Express アプリとしてデプロイします(`src/app.ts` の default export)。

1. このリポを Vercel に Import(または `npx vercel`)
2. Environment Variables に少なくとも次を設定
   - `RMS_SERVICE_SECRET` / `RMS_LICENSE_KEY`
   - `RMS_MCP_OAUTH_PASSCODE`(自分で決めた共有パスコード)
3. Deploy 後の MCP URL: `https://<project>.vercel.app/mcp`
4. ChatGPT カスタムコネクタにその URL を追加し、認可画面でパスコードを入力

`ALLOWED_HOSTS` は任意(未設定でも `VERCEL_URL` 系を自動許可)。カスタムドメイン利用時は本番ホスト名を追加してください。

OAuth トークンはサーバレス上では原則 `/tmp`(インスタンス内)。コールドスタートで消えることがあるので、再認可が必要になる場合があります。

---

## 開発

```bash
npm run typecheck
npm test
npm run build
```

---

## License

MIT