# 独自のクライアント

> 任意の MCP クライアントを Streamable HTTP で Nodaro に接続します。OAuth サーバーを検出し、クライアントか開発者アプリを登録して、PKCE でログインします。

Source: https://nodaro.ai/ja/docs/mcp/connect/custom-client

**独自のクライアント**でも、Streamable HTTP で標準の MCP 通信を行い、OAuth でログインできれば、Nodaro に接続できます。クライアントの接続先を `https://mcp.nodaro.ai/mcp` にし、OAuth サーバーを検出させ、クライアントを登録して、ユーザーに同意画面を通ってもらいます。このページでは、エンドポイント、登録のルール、トークンの有効期間を説明します。

## クライアントに必要なもの
- **Streamable HTTP での MCP**：接続先は `https://mcp.nodaro.ai/mcp` です。
- **PKCE を使った OAuth 2.0 の認可コードフロー**：コードチャレンジの方式は、`S256` だけを受け付けます。
- **OAuth のディスカバリー**：保護されたリソースのメタデータ（RFC 9728）と、認可サーバーのメタデータ（RFC 8414）を使います。
- **クライアントの登録**：動的クライアント登録（Dynamic Client Registration、RFC 7591）を使うか、開発者アプリとして一度だけ登録します。

## エンドポイント
| 項目 | 場所 |
| --- | --- |
| MCP エンドポイント | `https://mcp.nodaro.ai/mcp` |
| 保護されたリソースのメタデータ | `https://mcp.nodaro.ai/.well-known/oauth-protected-resource` |
| 認可サーバーのメタデータ | `https://app.nodaro.ai/.well-known/oauth-authorization-server` |
| 動的クライアント登録 | `POST https://app.nodaro.ai/v1/oauth/register` |
| トークンの交換 | `POST https://app.nodaro.ai/v1/oauth/token` |
| トークンの取り消し | `POST https://app.nodaro.ai/v1/oauth/revoke` |

どちらのメタデータドキュメントも、`app.nodaro.ai` と `mcp.nodaro.ai` の両方のホストで提供されています。各ドキュメントは、`/.well-known/oauth-protected-resource/mcp` のように、末尾に `/mcp` を付けた形式でも提供されています。一部のクライアントが、この形式を最初に確認するためです。認可サーバーのメタデータには、認可、トークン、登録、取り消しの各エンドポイント、レスポンスタイプ `code`、グラント `authorization_code`、`S256` の PKCE、`client_secret_post` 認証、サポートするスコープが示されています。

## 接続の流れ
### 認可サーバーを検出する
MCP ホストから、保護されたリソースのメタデータを読み取ります。このメタデータは、リソース `https://mcp.nodaro.ai/mcp` を、その認可サーバー `https://app.nodaro.ai` に結び付けています。次に、認可サーバーのメタデータを読み取って、各エンドポイントを取得します。

### クライアントを登録する
`client_name` とリダイレクト URI を、登録エンドポイントに送ります。Nodaro は、`ndr_dcr_` で始まる `client_id` と、`client_secret` を返します。このエンドポイントが受け付けるのは、1 つの IP アドレスから 1 分あたり 10 リクエストまでです。

### ユーザーを同意画面に送る
`client_id`、`redirect_uri`、`response_type=code`、`scope` のリスト、ランダムな `state`、PKCE の `code_challenge` と `code_challenge_method=S256` を付けて、ブラウザーで認可エンドポイントを開きます。ユーザーがログインし、権限を確認して、**許可**をクリックします。

### コードを交換する
Nodaro は、`code` と、あなたが送った `state` を付けて、`redirect_uri` にリダイレクトします。`state` を確認してから、`code_verifier` を使って、トークンエンドポイントでコードを交換します。コードは 1 回だけ使え、発行から 10 分で期限切れになります。

### MCP エンドポイントを呼び出す
`https://mcp.nodaro.ai/mcp` へのすべてのリクエストで、`ndr_app_` で始まるアクセストークンを `Authorization: Bearer <token>` として送ります。ツールの一覧は、`tools/list` で取得します。

## 登録できるクライアント名
デフォルトでは、動的クライアント登録が受け付けるのは、既知のクライアント名だけです。対象は、Claude、Claude Code、Cursor、Cline、Continue、Goose、ChatGPT、OpenAI、Lovable、Gemini、Gemini CLI、Codex、MCP Inspector、mcp-inspector です。それ以外の名前のクライアントには、`403 client_not_allowed` が返されます。

クライアントの名前がこれ以外の場合は、代わりに開発者アプリとして一度だけ登録します。

1. [app.nodaro.ai/settings/developer-apps](https://app.nodaro.ai/settings/developer-apps) を開き、**アプリを作成**をクリックします。
2. 名前、リダイレクト URI、クライアントが要求できるスコープを入力します。
3. `client_id` と `client_secret` をコピーします。シークレットが表示されるのは 1 回だけです。シークレットに有効期限はなく、アプリのページで再発行できます。

1 つのアカウントで手動登録できる開発者アプリは、最大 5 個です。自身を登録したクライアントも同じ一覧に表示されますが、この上限には含まれません。

自分の Nodaro インスタンスでは、管理者が `MCP_DYNAMIC_REGISTRATION`（デフォルトの `allowlist`、`open`、`off` のいずれか）と `MCP_DCR_ALLOWLIST` で登録を制御します。`open` モードでは、クライアント名とリダイレクト URI の 1 つの組み合わせが 24 時間に保持できる未使用の登録は、最大 5 件です。それを超えると、`429 too_many_open_registrations` が返されます。`off` モードでは、登録すると `403 dcr_disabled` が返されます。[セルフホスティング環境での MCP](https://nodaro.ai/docs/self-hosting/mcp) を参照してください。

## トークン
- **有効期間**：アクセストークンの有効期間は 90 日です。リフレッシュトークンはありません。呼び出しが `401` を返したら、ユーザーにもう一度同意画面を通ってもらいます。
- **取り消し**：クライアントは、取り消しエンドポイントでトークンを取り消せます。このエンドポイントは、常に `200` を返します。ユーザーも、**設定 › 接続済みアプリ**（[app.nodaro.ai/settings/connected-apps](https://app.nodaro.ai/settings/connected-apps)）で、あなたのクライアントのアクセスを取り消せます。取り消すと、そのユーザーに対してクライアントに発行されたすべてのトークンがすぐに無効になり、次の呼び出しは `401` を返します。
- **同意画面**：動的に登録されたクライアントは名前を自分で決めているため、同意画面では、Nodaro がその名前を検証していないことがユーザーに警告されます。

同じ OAuth サーバーが、REST API にも使われています。詳しくは[開発者向け OAuth](https://nodaro.ai/docs/developers/oauth) を参照してください。

## ツールの結果を扱う
- **ジョブ**：生成ツールはジョブを開始し、すぐにその ID を返します。ジョブが `completed` か `failed` になるまで、5〜10 秒ごとに `get_job` をポーリングするか、`wait_for_job` を呼び出します。[ジョブツール](https://nodaro.ai/docs/mcp/tools/jobs)を参照してください。
- **構造化コンテンツ**：多くのツールは、テキストの応答と並べて、データを `structuredContent` として返します。たとえば、`get_job` のジョブエンベロープがそうです。コードでは、この構造化データを読み取ってください。
- **カードへの対応は必須ではありません**。MCP Apps を表示できるホストでは、ジョブの進行状況やアップロードピッカーなど、操作できるカードが表示されます。カードを表示できないクライアントは、同じ結果をテキストと構造化データとして読み取ります。
- **タスク**：MCP の `tasks` API に対応したクライアントは、その API を通じてジョブの進行状況を受け取ります。
- **表示されないツール**：ユーザーがスコープを許可していないツールは、`tools/list` に含まれません。見つからないツールを探す前に、許可されたスコープを確認してください。

## よくある間違い
- **`https://app.nodaro.ai/mcp` を使う**：このアドレスは Web ページです。このアドレスに `POST` すると、エラーコード `wrong_mcp_host` とともに `405` が返されます。このエラーには、正しい URL が示されています。
- **`https://api.nodaro.ai/mcp` を使う**：このドメインは存在しません。
- **末尾にスラッシュを付ける**：`https://mcp.nodaro.ai/mcp` を、正確にそのまま使ってください。

## 参考資料
- [Model Context Protocol の仕様](https://modelcontextprotocol.io/specification)
- [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)

## Frequently asked questions

### Nodaro MCP サーバーは、どのトランスポートを使いますか？

https://mcp.nodaro.ai/mcp での Streamable HTTP です。ログインには PKCE 付きの OAuth 2.0 を使い、クライアントは Dynamic Client Registration（動的クライアント登録）で自身を登録できます。

### 登録が client_not_allowed で失敗するのはなぜですか？

動的登録は既知のクライアント名しか受け付けず、あなたのクライアントの名前がその一覧にないためです。代わりに Nodaro の設定で開発者アプリを登録し、そのクライアント ID とシークレットを使ってください。

### Nodaro MCP サーバーのアクセストークンの有効期間はどれくらいですか？

90 日です。リフレッシュトークンはないため、90 日が過ぎたらユーザーはもう一度ログインします。期限前でも、クライアントはトークンを取り消せます。また、ユーザーは「設定 › 接続済みアプリ」で、クライアントのアクセスを取り消せます。

### MCP Inspector で Nodaro MCP サーバーをテストできますか？

はい。MCP Inspector は動的に登録できるクライアント名の 1 つなので、接続、ログイン、ツールの一覧表示ができます。
