Ресурсы

Чему научитесь

Видео 9:45 и текст урока

К концу урока вы сможете:

Видео и текст урока.

Смотреть урок на Skilljar Defining resources · 9:45

Ресурсы (resources) в MCP-серверах позволяют отдавать данные клиентам — похоже на обработчики GET-запросов в обычном HTTP-сервере. Они идеальны там, где нужно получить информацию, а не выполнить действие.

Ресурсы на примере

Допустим, вы хотите сделать упоминание документов: пользователь пишет @имя_документа, чтобы сослаться на файл. Для этого нужны две операции:

Символ @ в поле чата открывает список документов — deposition.md, spec.md и другие, у каждого пометка Resource.
Ввод «@» открывает список документов, каждый помечен как «Resource».

Когда пользователь вводит @, нужно показать доступные документы. Когда он отправляет сообщение с упоминанием, вы автоматически подставляете содержимое документа в промпт, который уходит Claude.

Ввод @ показывает документы вроде design.md; упоминание подставляет содержимое report.pdf.
Упоминание документа подставляет его содержимое (здесь — report.pdf) в промпт.

Как работают ресурсы

Ресурсы работают по схеме «запрос — ответ». Клиент отправляет ReadResourceRequest с URI, а MCP-сервер отвечает данными. URI служит адресом нужного ресурса.

Один MCP-сервер с двумя определениями ресурсов, list_docs и fetch_doc, показанными в коде ниже.
MCP-сервер с двумя ресурсами: list_docs и fetch_doc.

Типы ресурсов

Ресурсы бывают двух типов:

Код декораторов: прямой ресурс без параметров в URI и шаблонный ресурс с doc_id.
Прямой ресурс (URI без параметров) и шаблонный (с {doc_id}).

Для шаблонных ресурсов Python SDK автоматически разбирает параметры из URI и передаёт их в функцию как именованные аргументы.

Реализация ресурсов

Ресурсы описываются декоратором @mcp.resource(). Вот оба типа:

Прямой ресурс (список документов)

@mcp.resource(
    "docs://documents",
    mime_type="application/json"
)
def list_docs() -> list[str]:
    return list(docs.keys())

Шаблонный ресурс (получение документа)

@mcp.resource(
    "docs://documents/{doc_id}",
    mime_type="text/plain"
)
def fetch_doc(doc_id: str) -> str:
    if doc_id not in docs:
        raise ValueError(f"Doc with id {doc_id} not found")
    return docs[doc_id]

MIME-типы

Ресурсы могут возвращать данные любого типа — строки, JSON, двоичные данные и т. д. Параметр mime_type подсказывает клиенту, что за данные вы возвращаете:

Python MCP SDK автоматически сериализует возвращаемые значения. Вручную преобразовывать в строки JSON не нужно.

Проверка ресурсов

Ресурсы можно проверить в MCP Inspector. Запустите сервер:

uv run mcp dev mcp_server.py

Затем подключитесь к инспектору в браузере. Вы увидите:

Вкладка Resources в MCP Inspector: docs://documents в разделе Resources, раздел Resource Templates пуст.
Вкладка Resources: прямой ресурс docs://documents и раздел Resource Templates.

Нажмите на любой ресурс, чтобы проверить его и увидеть точную структуру ответа, которую получит клиент.

Чтение docs://documents в инспекторе возвращает JSON-список имён файлов вроде deposition.md и plan.md.
Чтение docs://documents возвращает JSON-список имён файлов.

Главное

Ресурсы — чистый способ сделать данные доступными MCP-клиентам: упоминания документов, просмотр файлов и любые сценарии, где нужно получить информацию с сервера.

Дальше

Следующий урок — чтение ресурсов на стороне клиента.

Оригинал урока: Defining resources.