# サンプリング

サーバーに LLM からの補完をリクエストさせる

Sampling は、サーバーがクライアントを通じて LLM の補完をリクエストできる強力な MCP 機能であり、セキュリティとプライバシーを維持しながら、高度なエージェント的な動作を可能にします。

この MCP の機能は、Claude Desktop クライアントではまだサポートされていません。

## [Sampling の仕組み](https://modelcontextprotocol.io/docs/concepts/sampling#how-sampling-works)

Sampling の流れは以下の通りです。

1. サーバーが `sampling/createMessage` リクエストをクライアントに送信
2. クライアントがリクエストを確認し、変更可能
3. クライアントが LLM からサンプリング
4. クライアントが補完を確認
5. クライアントが結果をサーバーに返す

このヒューマン・イン・ザ・ループ設計により、ユーザーは LLM が何を見て何を生成するかを常に制御できます。

## [メッセージ形式](https://modelcontextprotocol.io/docs/concepts/sampling#message-format)

Sampling リクエストは、標準化されたメッセージ形式を使用します。

```typescript
{
  messages: [
    {
      role: "user" | "assistant",
      content: {
        type: "text" | "image",

        // For text:
        text?: string,

        // For images:
        data?: string,             // base64 encoded
        mimeType?: string
      }
    }
  ],
  modelPreferences?: {
    hints?: [{
      name?: string                // Suggested model name/family
    }],
    costPriority?: number,         // 0-1, importance of minimizing cost
    speedPriority?: number,        // 0-1, importance of low latency
    intelligencePriority?: number  // 0-1, importance of capabilities
  },
  systemPrompt?: string,
  includeContext?: "none" | "thisServer" | "allServers",
  temperature?: number,
  maxTokens: number,
  stopSequences?: string[],
  metadata?: Record<string, unknown>
}
```

## [リクエストパラメータ](https://modelcontextprotocol.io/docs/concepts/sampling#request-parameters)

### [メッセージ](https://modelcontextprotocol.io/docs/concepts/sampling#messages)

`messages` 配列には、LLM に送信する会話履歴が含まれています。 各メッセージには以下が含まれます。

- `role`: "user" または "assistant" のいずれか

- ```
  content
  ```

  : メッセージの内容。以下が可能です。

  - `text` フィールドを持つテキストコンテンツ
  - `data` (base64) および `mimeType` フィールドを持つ画像コンテンツ

### [モデルの設定](https://modelcontextprotocol.io/docs/concepts/sampling#model-preferences)

`modelPreferences` オブジェクトを使用すると、サーバーはモデル選択の優先順位を指定できます。

- `hints`: クライアントが適切なモデルを選択するために使用できるモデル名の提案の配列:
  - `name`: 完全または部分的なモデル名に一致する文字列 (例: "claude-3", "sonnet")
  - クライアントは、ヒントを異なるプロバイダーの同等のモデルにマッピングできます
  - 複数のヒントは優先順位で評価されます
- 優先度値 (0-1 に正規化):
  - `costPriority`: コストを最小限に抑える重要度
  - `speedPriority`: 低レイテンシー応答の重要度
  - `intelligencePriority`: 高度なモデル機能の重要度

クライアントは、これらの優先順位と利用可能なモデルに基づいて、最終的なモデル選択を行います。

### [システムプロンプト](https://modelcontextprotocol.io/docs/concepts/sampling#system-prompt)

オプションの `systemPrompt` フィールドを使用すると、サーバーは特定のシステムプロンプトをリクエストできます。 クライアントはこれを変更または無視する可能性があります。

### [コンテキストの包含](https://modelcontextprotocol.io/docs/concepts/sampling#context-inclusion)

`includeContext` パラメータは、含める MCP コンテキストを指定します。

- `"none"`: 追加のコンテキストなし
- `"thisServer"`: リクエスト元のサーバーからのコンテキストを含める
- `"allServers"`: 接続されているすべての MCP サーバーからのコンテキストを含める

クライアントは、実際に含まれるコンテキストを制御します。

### [サンプリングパラメータ](https://modelcontextprotocol.io/docs/concepts/sampling#sampling-parameters)

以下を使用して、LLM Sampling を微調整します。

- `temperature`: ランダム性を制御 (0.0 ～ 1.0)
- `maxTokens`: 生成する最大トークン数
- `stopSequences`: 生成を停止するシーケンスの配列
- `metadata`: 追加のプロバイダー固有のパラメータ

## [応答フォーマット](https://modelcontextprotocol.io/docs/concepts/sampling#response-format)

クライアントは補完結果を返します。

```typescript
{
  model: string,  // Name of the model used
  stopReason?: "endTurn" | "stopSequence" | "maxTokens" | string,
  role: "user" | "assistant",
  content: {
    type: "text" | "image",
    text?: string,
    data?: string,
    mimeType?: string
  }
}
```

## [リクエスト例](https://modelcontextprotocol.io/docs/concepts/sampling#example-request)

クライアントからの Sampling をリクエストする例を次に示します。

```json
{
  "method": "sampling/createMessage",
  "params": {
    "messages": [
      {
        "role": "user",
        "content": {
          "type": "text",
          "text": "What files are in the current directory?"
        }
      }
    ],
    "systemPrompt": "You are a helpful file system assistant.",
    "includeContext": "thisServer",
    "maxTokens": 100
  }
}
```

## [ベストプラクティス](https://modelcontextprotocol.io/docs/concepts/sampling#best-practices)

Sampling を実装する場合:

1. 常に明確で構造化されたプロンプトを提供する
2. テキストと画像の両方のコンテンツを適切に処理する
3. 妥当なトークン制限を設定する
4. `includeContext` を通じて関連するコンテキストを含める
5. 使用する前に応答を検証する
6. エラーを適切に処理する
7. Sampling リクエストのレート制限を検討する
8. 予想される Sampling の動作を文書化する
9. さまざまなモデルパラメータでテストする
10. Sampling のコストを監視する

## [人間が関与する制御](https://modelcontextprotocol.io/docs/concepts/sampling#human-in-the-loop-controls)

Sampling は、人間の監視を念頭に置いて設計されています。

### [プロンプトについて](https://modelcontextprotocol.io/docs/concepts/sampling#for-prompts)

- クライアントは、提案されたプロンプトをユーザーに表示する必要があります
- ユーザーは、プロンプトを変更または拒否できる必要があります
- システムプロンプトは、フィルタリングまたは変更できます
- コンテキストの包含は、クライアントによって制御されます

### [補完について](https://modelcontextprotocol.io/docs/concepts/sampling#for-completions)

- クライアントは、補完をユーザーに表示する必要があります
- ユーザーは、補完を変更または拒否できる必要があります
- クライアントは、補完をフィルタリングまたは変更できます
- ユーザーは、使用するモデルを制御します

## [セキュリティに関する考慮事項](https://modelcontextprotocol.io/docs/concepts/sampling#security-considerations)

Sampling を実装する場合:

- すべてのメッセージコンテンツを検証する
- 機密情報をサニタイズする
- 適切なレート制限を実装する
- Sampling の使用状況を監視する
- 転送中のデータを暗号化する
- ユーザーデータのプライバシーを処理する
- Sampling リクエストを監査する
- コストエクスポージャーを制御する
- タイムアウトを実装する
- モデルエラーを適切に処理する

## [一般的なパターン](https://modelcontextprotocol.io/docs/concepts/sampling#common-patterns)

### [エージェントワークフロー](https://modelcontextprotocol.io/docs/concepts/sampling#agentic-workflows)

Sampling は、次のようなエージェントパターンを可能にします。

- リソースの読み取りと分析
- コンテキストに基づく意思決定
- 構造化データの生成
- 複数ステップのタスクの処理
- インタラクティブな支援の提供

### [コンテキスト管理](https://modelcontextprotocol.io/docs/concepts/sampling#context-management)

コンテキストに関するベストプラクティス:

- 最小限必要なコンテキストをリクエストする
- コンテキストを明確に構造化する
- コンテキストサイズの制限を処理する
- 必要に応じてコンテキストを更新する
- 古いコンテキストをクリーンアップする

### [エラー処理](https://modelcontextprotocol.io/docs/concepts/sampling#error-handling)

堅牢なエラー処理は、次のことを行う必要があります。

- Sampling の失敗をキャッチする
- タイムアウトエラーを処理する
- レート制限を管理する
- 応答を検証する
- フォールバック動作を提供する
- エラーを適切にログに記録する

## [制限事項](https://modelcontextprotocol.io/docs/concepts/sampling#limitations)

次の制限事項に注意してください。

- Sampling はクライアントの機能に依存します
- ユーザーは Sampling の動作を制御します
- コンテキストサイズには制限があります
- レート制限が適用される場合があります
- コストを考慮する必要があります
- モデルの可用性は異なります
- 応答時間は異なります
- すべてのコンテンツタイプがサポートされているわけではありません
