# リソース

サーバーからデータとコンテンツをLLMsに公開します

リソースは、モデル コンテキスト プロトコル (MCP) のコア プリミティブであり、これによりサーバーは、クライアントが読み取り、対話のコンテキストとして使用できるデータとコンテンツを公開できます。

> リソースは**アプリケーション制御される**ように設計されています。つまり、クライアント アプリケーションはリソースの使用方法と使用時期を決定できます。MCP クライアントによって、リソースの処理方法が異なる場合があります。例:
> 
> - Claude Desktopは現在、ユーザーがリソースを使用する前に明示的に選択する必要があります。
> - 他のクライアントはヒューリスティックに基づいてリソースを自動的に選択するかもしれない
> - 一部の実装では、AIモデル自体がどのリソースを使用するかを決定できる場合もあります。
> 
> サーバー作成者は、リソース サポートを実装するときに、これらの相互作用パターンのいずれかを処理できるように準備する必要があります。データをモデルに自動的に公開するには、サーバー作成者は[Tools](https://modelcontextprotocol.io/docs/concepts/tools)などの**モデル制御**プリミティブを使用する必要があります。


## 概要

リソースは、MCPサーバーがクライアントに提供したいあらゆる種類のデータを表します。これには以下が含まれます：

- ファイルの内容
- データベースのレコード
- APIの応答
- ライブシステムデータ
- スクリーンショットや画像
- ログファイル
- その他

各リソースは一意のURIで識別され、テキストまたはバイナリデータを含むことができます。

## [リソースURI](https://modelcontextprotocol.io/docs/concepts/resources#resource-uris)

リソースは以下の形式に従ったURIを使用して識別されます：

```plaintext
[protocol]://[host]/[path]
```

例：

- `file:///home/user/documents/report.pdf`
- `postgres://database/customers/schema`
- `screen://localhost/display1`

プロトコルとパスの構造はMCPサーバーの実装によって定義されます。サーバーは独自のカスタムURIスキームを定義することができます。

## [リソースタイプ](https://modelcontextprotocol.io/docs/concepts/resources#resource-types)

リソースは2種類のコンテンツを含むことができます：

### [テキストリソース](https://modelcontextprotocol.io/docs/concepts/resources#text-resources)

テキストリソースはUTF-8でエンコードされたテキストデータを含みます。これらは以下に適しています：

- ソースコード
- 設定ファイル
- ログファイル
- JSON/XMLデータ
- プレーンテキスト

### [バイナリリソース](https://modelcontextprotocol.io/docs/concepts/resources#binary-resources)

バイナリリソースはbase64でエンコードされた生のバイナリデータを含みます。これらは以下に適しています：

- 画像
- PDF
- オーディオファイル
- ビデオファイル
- その他の非テキスト形式

## [リソース探索](https://modelcontextprotocol.io/docs/concepts/resources#resource-discovery)

クライアントは主に2つの方法で利用可能なリソースを探索できます：

### [直接リソース](https://modelcontextprotocol.io/docs/concepts/resources#direct-resources)

サーバーは`resources/list` APIを通じて具体的なリソースのリストを公開します。各リソースには以下が含まれます：

```typescript
{
  uri: string;           // リソースの一意の識別子
  name: string;          // 人間が読める名前
  description?: string;  // オプションの説明
  mimeType?: string;     // オプションのMIMEタイプ
}
```

### [リソーステンプレート](https://modelcontextprotocol.io/docs/concepts/resources#resource-templates)

動的リソースの場合、サーバーはクライアントが有効なリソースURIを構築するために使用できる[URIテンプレート](https://datatracker.ietf.org/doc/html/rfc6570)を公開できます：

```typescript
{
  uriTemplate: string;   // RFC 6570に従ったURIテンプレート
  name: string;          // このタイプの人間が読める名前
  description?: string;  // オプションの説明
  mimeType?: string;     // すべての一致するリソースのオプションのMIMEタイプ
}
```

## [リソースの読み取り](https://modelcontextprotocol.io/docs/concepts/resources#reading-resources)

リソースを読み取るために、クライアントはリソースURIを指定して`resources/read`リクエストを行います。

サーバーはリソースコンテンツのリストで応答します：

```typescript
{
  contents: [
    {
      uri: string;        // リソースのURI
      mimeType?: string;  // オプションのMIMEタイプ

      // 以下のいずれか：
      text?: string;      // テキストリソースの場合
      blob?: string;      // バイナリリソースの場合（base64エンコード）
    }
  ]
}
```

サーバーは1つの`resources/read`リクエストに対して複数のリソースを返すことがあります。例えば、ディレクトリを読み取る際にディレクトリ内のファイルリストを返すことができます。

## [リソースの更新](https://modelcontextprotocol.io/docs/concepts/resources#resource-updates)

MCPは2つのメカニズムを通じてリソースのリアルタイム更新をサポートします：

### [リストの変更](https://modelcontextprotocol.io/docs/concepts/resources#list-changes)

サーバーは`notifications/resources/list_changed`通知を通じて利用可能なリソースリストの変更をクライアントに通知できます。

### [コンテンツの変更](https://modelcontextprotocol.io/docs/concepts/resources#content-changes)

クライアントは特定のリソースの更新を購読できます：

1. クライアントがリソースURIを指定して`resources/subscribe`を送信
2. リソースが変更されたときにサーバーが`notifications/resources/updated`を送信
3. クライアントは`resources/read`で最新のコンテンツを取得可能
4. クライアントは`resources/unsubscribe`で購読を解除可能

## [実装例](https://modelcontextprotocol.io/docs/concepts/resources#example-implementation)

以下はMCPサーバーでリソースサポートを実装する簡単な例です：

- TypeScript
- Python

```typescript
const server = new Server({
  name: "example-server",
  version: "1.0.0"
}, {
  capabilities: {
    resources: {}
  }
});

// 利用可能なリソースのリスト
server.setRequestHandler(ListResourcesRequestSchema, async () => {
  return {
    resources: [
      {
        uri: "file:///logs/app.log",
        name: "Application Logs",
        mimeType: "text/plain"
      }
    ]
  };
});

// リソースコンテンツの読み取り
server.setRequestHandler(ReadResourceRequestSchema, async (request) => {
  const uri = request.params.uri;

  if (uri === "file:///logs/app.log") {
    const logContents = await readLogFile();
    return {
      contents: [
        {
          uri,
          mimeType: "text/plain",
          text: logContents
        }
      ]
    };
  }

  throw new Error("Resource not found");
});
```

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

リソースサポートを実装する際には：

1. 明確で説明的なリソース名とURIを使用する
2. LLMの理解を助けるために有用な説明を含める
3. 知っている場合は適切なMIMEタイプを設定する
4. 動的コンテンツのためにリソーステンプレートを実装する
5. 頻繁に変更されるリソースには購読を使用する
6. 明確なエラーメッセージでエラーを適切に処理する
7. 大規模なリソースリストにはページネーションを考慮する
8. 適切な場合はリソースコンテンツをキャッシュする
9. 処理前にURIを検証する
10. カスタムURIスキームを文書化する

## [セキュリティの考慮事項](https://modelcontextprotocol.io/docs/concepts/resources#security-considerations)

リソースを公開する際には：

- すべてのリソースURIを検証する
- 適切なアクセス制御を実装する
- ディレクトリトラバーサルを防ぐためにファイルパスをサニタイズする
- バイナリデータの取り扱いに注意する
- リソースの読み取りに対するレート制限を考慮する
- リソースアクセスを監査する
- 転送中の機密データを暗号化する
- MIMEタイプを検証する
- 長時間実行される読み取りに対してタイムアウトを実装する
- リソースのクリーンアップを適切に処理する

