Перейти к основному содержанию

Введение

Серверы MCP позволяют подключать собственные источники данных и делать их доступными внутри Cursor. Это особенно полезно, когда нужен контекст из браузеров, баз данных или системных и ошибокных логов. Настроить сервер MCP несложно, и в Cursor это делается быстро. В этом руководстве мы разберём, как создать сервер MCP для Postgres. Наша цель — дать Cursor возможность выполнять SQL‑запросы напрямую к базе данных Postgres и предоставлять схемы таблиц в структурированном виде.
Этот материал предназначен для изучения основ разработки серверов MCP.

Что такое MCP‑сервер?

MCP‑сервер — это процесс, который взаимодействует с Cursor и предоставляет доступ к внешним данным и действиям. Его можно реализовать по‑разному, но здесь мы используем самый простой вариант: сервер, который запускается локально на твоём компьютере через stdio (стандартные потоки ввода/вывода). Это позволяет избежать сложных вопросов безопасности и сосредоточиться на логике MCP. Один из самых распространённых сценариев для MCP — доступ к базе данных. При создании дашбордов, запуске аналитики или подготовке миграций часто нужно выполнять запросы и изучать базу данных. Наш Postgres MCP‑сервер будет поддерживать две ключевые возможности: выполнение произвольных запросов и вывод схем таблиц. Хотя обе эти задачи можно решить на чистом SQL, MCP предлагает возможности, которые делают их мощнее и универсальнее. Инструменты позволяют предоставлять действия, такие как выполнение запросов, а ресурсы — делиться стандартизированным контекстом, например сведениями о схемах. Позже в этом гайде мы также рассмотрим промпты, которые позволяют строить более продвинутые рабочие процессы. Под капотом мы будем использовать пакет postgres из npm для выполнения SQL‑операторов по базе данных. MCP SDK будет служить обёрткой вокруг этих вызовов, позволяя бесшовно интегрировать функциональность Postgres в Cursor.

Как собрать MCP‑сервер

Первый шаг в сборке сервера — настроить новый проект. Начнём с создания новой папки и инициализации проекта Bun
> mkdir postgres-mcp-server
> Bun init
Отсюда выберем проект Blank. Как только настроен наш боилерплейт, нужно установить необходимые зависимости. zod потребуется для определения схем ввода/вывода в MCP SDK
bun add postgres @modelcontextprotocol/sdk zod
Отсюда перейдём в репозитории каждой из библиотек и возьмём ссылки на «сырое» содержимое соответствующих README-файлов. Мы будем использовать их как контекст при разработке сервера Теперь определим, как должен вести себя сервер. Для этого создадим spec.md и опишем цели на высоком уровне
# Спецификация

- Разрешить задавать DATABASE_URL через конфигурацию переменных окружения MCP
- Выполнять запросы к данным Postgres через инструмент
  - По умолчанию доступ только для чтения
  - Разрешить операции записи, установив переменную окружения `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Обращаться к таблицам как к `resources`
- Использовать Zod для определения схем
Как видишь, это довольно лёгкая спецификация. Не стесняйся добавить больше деталей по необходимости. Вместе с ссылками из README мы соберём финальный промпт.
Прочитай следующее и следуй @spec.md, чтобы понять, что нам нужно. Все необходимые зависимости установлены
- @https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md
- @https://raw.githubusercontent.com/porsager/postgres/refs/heads/master/README.md
Имея эти три компонента (спецификацию, документацию по MCP SDK и документацию библиотеки Postgres), можно использовать Cursor, чтобы сгенерировать каркас серверной реализации. Cursor поможет связать всё воедино, сгенерировав код, который соединяет MCP SDK с Postgres. После пары итераций подсказок у нас есть первая версия MCP‑сервера. Чтобы попробовать её, можно использовать MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

Тестирование MCP-сервера

Когда первоначальная реализация готова, можно протестировать её с помощью MCP Inspector. Инспектор позволяет увидеть, что именно сервер предоставляет, и убедиться, что инструменты и ресурсы работают как ожидается. Нужно проверить, что запросы выполняются, а информация о схеме возвращается корректно. Интерфейс MCP Inspector Если всё в порядке, подключи сервер к самому Cursor и протестируй его в реальной среде. На этом этапе Cursor сможет использовать Postgres MCP-сервер как встроенную возможность, позволяя напрямую выполнять запросы и исследовать базу данных.

Что дальше

Запуск MCP-сервера локально через stdio — отличный старт, но командам часто нужен общий доступ к одной и той же базе данных через свой MCP-сервер. В таких случаях имеет смысл развернуть MCP-сервер как централизованный HTTP‑сервис. Развёрнутый MCP-сервер даёт несколько преимуществ по сравнению с отдельными экземплярами stdio:
  • Общий доступ к базе данных: несколько участников команды могут обращаться к одной и той же инстансу базы данных через Cursor
  • Централизованная конфигурация: обновления схемы и изменения прав управляются в одном месте
  • Усиленная безопасность: можно внедрить корректную аутентификацию, ограничение частоты запросов и контроль доступа
  • Наблюдаемость: по всей команде можно отслеживать паттерны использования и метрики производительности
Чтобы этого добиться, переключи транспорт с stdio на HTTP. Мы не будем разбирать всю настройку, вот хороший стартовый промпт, который можно дать Cursor
На основе существующего MCP-сервера создай новый файл, который реализует протокол HTTP.

Вынеси общую логику в mcp-core и дай каждой реализации транспорта осмысленное имя (mcp-server-stdio, mcp-server-http).

@https://raw.githubusercontent.com/modelcontextprotocol/typescript-sdk/refs/heads/main/README.md 
Окончательные результаты можно посмотреть здесь: pg-mcp-server
I