Введение

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

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

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

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

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

- Allow defining DATABASE_URL through MCP env configuration
- Query postgres data through tool
  - By default, make it readonly
  - Allow write ops by setting ENV `DANGEROUSLY_ALLOW_WRITE_OPS=true|1`
- Access tables as `resources`
- Use Zod for schema definitions
Как видишь, это довольно лёгкая спецификация. Смело добавляй больше деталей по мере необходимости. Вместе со ссылками на README соберём финальный промпт
Read the following and follow @spec.md to understand what we want. All necesary dependeies are installed
- @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
  • Централизованная конфигурация: Обновления схем и изменения прав управляются в одном месте
  • Повышенная безопасность: Можно внедрить корректную аутентификацию, rate limiting и контроль доступа
  • Наблюдаемость: По всей команде можно отслеживать характер использования и метрики производительности
Чтобы этого добиться, переключи транспорт с stdio на HTTP. Мы не будем разбирать всю настройку, но вот хороший стартовый промпт, который ты можешь дать Cursor
Based on the existing MCP server, create a new file that implements the HTTP protocol.

Move shared logic to mcp-core, and name each transport implementation by name (mcp-server-stdio, mcp-server-http)

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