MCP Resourcesとは?概要と使い方をわかりやすく解説

MCP Resources 概要 使い方
押さえておきたいポイント
  • MCP Resourcesはサーバー側とクライアント側で理解する
  • ローカル環境内のみで完結できる
  • 作成したサーバーをClaude Desktopと連携可能

MCP Resourcesは、LLMが外部データに安全かつ効率的にアクセスするための標準化された仕組みです。サーバーがクライアントに対して構造化された読み取り専用データを提供し、モデルが推論時に参照できるようにサポートしてくれます。

本記事ではMCP Resourcesの概要から役割について解説をします。MCPに対する理解が深まりますので、ぜひ最後までお読みください!

目次

MCP Resourcesとは

MCP ResourcesはModel Context Protocol(MCP)における基本要素の1つであり、サーバー側からLLMクライアントに対して読み取り専用のデータを提供します。

クライアントはMCPサーバーを介して、Resourcesとして公開された構造化データ(例えばファイル内容やログ、APIレスポンス、画像データなど)を取得し、それをモデルに提供することで、推論や応答生成時の参照コンテキストとして活用。

イメージとしては下記の画像のような流れです。取得したデータはクライアントがLLMに渡して推論に活用します。※1

MCP Resourcesについて理解する場合には、サーバー側とクライアント側で分けて考える必要がありますが、それについては後述します。

MCPとは?

そもそもMCPとは、さまざまなWebサービスやアプリなどの外部サービスを繋ぐための技術です。それぞれのサービスを連携するためには、各種サービスに応じた連携方法が必要でした。

しかし、それぞれの連携方法ではアクセスできないケースもあり、統一された技術が必要であり、MCPが開発されました。

よく例に挙げられるのが、「MCP=USB Cタイプ」と表現されます。

一昔前、iPhoneの充電ケーブルはライトニングケーブル、AndroidはMicro USBだったりと端末によって様々でした。しかし、USB Cタイプが登場したことにより、多くの端末がUSB Cに統一され、一本のケーブルで完結。このような汎用性の高さから、MCPはUSB Cタイプのようだと例えられています。

なお、MCPについて詳しく知りたい方は、下記の記事を合わせてご確認ください。

MCPサーバーとは?

MCPサーバーはLLMと各種データソースを接続するための仲介役です。

各種データソースはこれまでそれぞれの連携方法を取っていましたが、それを統一するのがMCPサーバー。本記事執筆時点(2025/04/29)でかなりの数のMCPサーバーが公開されていますので、ぜひGitHubも参考にしてください。

なお、MCPサーバーについて詳しく知りたい方は、下記の記事を合わせてご確認ください。

MCPツールとは?

MCPの基本構成3つ目のMCPツールは、実行可能な機能です。Toolsによって、LLMが外部データソースと連携をしてデータの更新やAPI操作、計算処理などを自律的に実行できるようになります。※2

主な特徴は下記の通りです。

スクロールできます
特徴説明
モデルによる操作ツールはサーバーからクライアントに公開され、LLMが自動的に呼び出せる。(ただし人間による許可確認を挟む設計も可能)
アクション指向単なるデータ提供(Resources)とは異なり、外部状態を変更する操作や計算処理を実行する。
名前とスキーマで管理各ツールは一意の名前を持ち、入力パラメータはJSONで定義される。
柔軟性簡単な加算ツールから、外部API連携、システム操作まで幅広く対応可能。
エラー処理設計ありMCP仕様に則り、ツール実行時のエラーも結果オブジェクト内で適切に返される。

Claude DesktopにおけるMCP Resourcesとは?

MCP Resourcesはサーバー側とクライアント側に分けることができます。本記事で説明しているのは、サーバー側の内容ですが、ここでクライアント側の説明もします。

クライアント側(つまりClaude Desktop)におけるMCP Resourcesとは、ファイルアップロードとそのコンテンツ処理に関連する機能。

また、クライアント側におけるリソースとは、ファイル内容やログ、APIレスポンス、画像データなどさまざまな種類のデータを含みます。データベースクエリのような動的データもリソースに含まれます。

そのため、ユーザーはClaude DesktopにリソースをアップロードすることでMCP Resourcesを使っているということになります。

MCP Resourcesの使い方

では実際にサーバー側としてMCP Resourcesを使っていきます。MCP Resourcesを使用するには、いくつか準備が必要です。

リソースの用意

MCP Resourcesを使う場合、クライアントが取得できるリソース(データ)を用意する必要があります。リソースは、PDFやテキストファイル、データベースレコード、ログファイルなどです。

また、リソースはサーバー上ではURIをもつ形で管理されます。

リソースエンドポイントの用意

リソースが準備できたら、MCPの仕様に則り、サーバーにエンドポイントを用意します。

エンドポイント役割
resources/listクライアントに提供可能なリソース一覧を返す
resources/readクライアントから指定されたリソースURIに対して内容を返す

上記以外で、動的リソースを使いたい場合には、URIテンプレートをリストとして公開することも可能。

エンドポイントの実装例はこちら。

from mcp.server import Server

from mcp import types

app = Server("example-server")

@app.list_resources()

async def list_resources() -> list[types.Resource]:

    return [

        types.Resource(

            uri="file:///home/user/report.txt",

            name="Annual Report 2024",

            mimeType="text/plain"

        )

    ]

@app.read_resource()

async def read_resource(uri: str) -> str:

    if uri == "file:///home/user/report.txt":

        with open("/home/user/report.txt", "r", encoding="utf-8") as f:

            return f.read()

    raise ValueError("Unsupported resource URI")

リソースの取得

リソースエンドポイントの用意まではサーバー側の話でした。今度はリソースを取得するため、クライアント側の話になります。

リソースを準備したら下記の流れでリソースを活用します。

  1. resources/listを呼び出して利用可能なリソースの確認
  2. 必要なリソースURIを選択
  3. resources/readリクエストを送信して内容を取得
  4. 取得したデータをモデルのコンテキストに挿入して推論を実施

MCP Resourcesのサーバー実装を検証

上記の使い方をもとにMCP Resourcesのサーバー実装を検証していきます。今回の実装では、「正しくリストアップ・取得できるか」を検証したいと思います。

GitHubのREAEDMEを参考にして進めます。

サーバー実装を検証するためには、2つのファイルが必要です。

  • サーバー側
  • クライアント側

まずはMCP Resourcesを使うために、mcpをインストール。

git clone https://github.com/modelcontextprotocol/python-sdk.git

cd python-sdk

pip install .

これでmcpのインストールは終了です。

次にサーバー側を実装します。今回の検証では、ローカル環境にあるフォルダの中身をリストアップ・取得してもらいます。

サーバー側のコードはこちら

from mcp.server.fastmcp import FastMCP

import os

mcp = FastMCP("local-file-server")

DIRECTORY = ""

# ファイルを読むリソース

@mcp.resource("file:///{filename}")

def read_file(filename: str) -> str:

    filepath = os.path.join(DIRECTORY, filename)

    if not os.path.isfile(filepath):

        raise FileNotFoundError(f"File {filename} not found.")

    with open(filepath, "r", encoding="utf-8") as f:

        return f.read()

# ファイル一覧を出すリソース

@mcp.resource("files://list")

def list_files() -> str:

    files = []

    for filename in os.listdir(DIRECTORY):

        filepath = os.path.join(DIRECTORY, filename)

        if os.path.isfile(filepath):

            files.append(filename)

    return "\n".join(files)

# サンプルテキストを返すリソース

@mcp.resource("test://sample")

def sample_text() -> str:

    return "これはサンプルテキストです。MCPが正常に動作しています。"

if __name__ == "__main__":

    print("Starting MCP server...")

    mcp.run()

起動しているのかわからなかったので「Starting MCP server…」を入れてます。

また、クライアント側でも適切に動いているのかを確認するためにサンプルテキストを返すリソースも加えています。

次にクライアント側です。

クライアント側のコードはこちら

import asyncio

from mcp import ClientSession, StdioServerParameters

from mcp.client.stdio import stdio_client

async def test_mcp_resources():

    server_params = StdioServerParameters(

        command="python",

        args=["mcp_Server.py"],

    )

    async with stdio_client(server_params) as (read, write):

        async with ClientSession(read, write) as session:

            await session.initialize()

            # リソース一覧を取得

            print("=== Resource List ===")

            resources_result = await session.list_resources()

            for resource in resources_result.resources:

                print(f"- {resource.name}")

            # テストリソースを読む

            print("\n=== Test Resource ===")

            response = await session.read_resource("test://sample")

            print("Response structure:")

            print(f"Type: {type(response)}")

            print(f"Value: {response}")

            if isinstance(response, tuple) and len(response) == 2:

                meta, contents = response

                print(f"\nMeta: {meta}")

                print(f"Contents type: {type(contents)}")

                if isinstance(contents, list):

                    print("\nContents list:")

                    for item in contents:

                        print(f"Item type: {type(item)}")

                        print(f"Item: {item}")

                        if hasattr(item, 'text'):

                            print(f"Text: {item.text}")

                        elif isinstance(item, dict) and 'text' in item:

                            print(f"Text: {item['text']}")

                        elif isinstance(item, str):

                            print(f"Text: {item}")

            # ファイル一覧を取得

            print("\n=== Files List ===")

            try:

                response = await session.read_resource("files://list")

                print(f"Files response: {response}")

                if isinstance(response, tuple) and len(response) == 2:

                    meta, contents = response

                    if isinstance(contents, list) and contents:

                        content_item = contents[0]

                        if hasattr(content_item, 'text'):

                            files_content = content_item.text

                        elif isinstance(content_item, dict) and 'text' in content_item:

                            files_content = content_item['text']

                        elif isinstance(content_item, str):

                            files_content = content_item

                        else:

                            files_content = str(content_item)

                        print("\nFiles in directory:")

                        for file in files_content.split('\n'):

                            print(f"- {file}")

            except Exception as e:

                print(f"Error processing files list: {type(e).__name__}: {e}")

if __name__ == "__main__":

    asyncio.run(test_mcp_resources())

あとはターミナル1でサーバー側を「python xxx.py」で起動して、Starting MCP server…と出力されたらターミナル2でクライアント側を「python ooo.py」で起動すればOKです。

出力結果はこちら

=== Resource List ===

Processing request of type ListResourcesRequest

- files://list

- test://sample

=== Test Resource ===

Processing request of type ReadResourceRequest

Response structure:

Type: <class 'mcp.types.ReadResourceResult'>

Value: meta=None contents=[TextResourceContents(uri=AnyUrl('test://sample'), mimeType='text/plain', text='これはサンプルテキストです。MCPが正常に動作しています。')]

=== Files List ===

Processing request of type ReadResourceRequest

Files response: meta=None contents=[TextResourceContents(uri=AnyUrl('files://list'), mimeType='text/plain', text='.DS_Store\napp.py\ntestapp.py')]

リストアップ・取得できていることが分かりますね。

また、今作成したサーバーをClaude Desktopで使うこともできます。

pip install "mcp[cli]"

もしくは

uv add "mcp[cli]"

上記のコマンドでMCPツールをインストールしておき、mcp install xxx.pyと入力して、以下のように出力されていれば、Claude Desktopに反映されます。

[04/30/25 01:49:16] INFO     Added server 'local-file-server' to Claude config                     claude.py:129

                    INFO     Successfully installed local-file-server in Claude app

Claude Desktopを立ち上げている状態の場合には、一度再起動をすると作成したサーバーが追加されています。

MCP Resourcesを活用してみよう!

クラウドにアップさせたくない情報などを扱う場合には、サーバーとクライアントのコードを活用してローカル環境で完結させることができます。

ぜひ本記事を参考にMCP Resourcesを使ってみてください!Claude Desktopと使い分けることで、さまざまなデータをLLMと一緒に考えることができるようになります。

サービス紹介資料

生成系AIの業務活用なら!

・生成系AIを活用したPoC開発

・生成系AIのコンサルティング

・システム間API連携

最後に

いかがだったでしょうか?

外部データ連携の標準化で、生成AIの運用効率と安全性を両立。MCP活用も視野に入れた導入戦略を検討しませんか?

株式会社WEELは、自社・業務特化の効果が出るAIプロダクト開発が強みです!

開発実績として、

・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント

などの開発実績がございます。

まずは、無料相談にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。

➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

生成AIを社内で活用していきたい方へ
無料相談

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、サービス紹介資料もご用意しておりますので、併せてご確認ください。

投稿者

  • 晋平大竹

    生成AIの登場に大きな衝撃を受けたWebライター。好きなAIツールは、ChatGPTとAdobeFirefly。AIがこれからの世界を良い方向に導いてくれると信じ、正しい&有益な情報を発信し続けています!

  • URLをコピーしました!
  • URLをコピーしました!
目次