Введение

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

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

MCP‑сервер — это процесс, который взаимодействует с Cursor и предоставляет доступ к внешним данным или действиям. Его можно реализовать по-разному, но здесь мы используем самый простой подход: сервер, который запускается локально на твоём компьютере через stdio (стандартные потоки ввода/вывода). Это позволяет избежать сложных вопросов безопасности и сосредоточиться на логике MCP. Один из самых распространённых сценариев для MCP — доступ к базе данных. При создании дашбордов, запуске аналитики или подготовке миграций часто нужно выполнять запросы и исследовать базу. Наш Postgres MCP‑сервер будет поддерживать две ключевые возможности: выполнение произвольных запросов и вывод списка схем таблиц. Хотя обе эти задачи можно решить на чистом SQL, MCP предлагает функции, которые делают их мощнее и универсальнее. Инструменты (tools) дают способ предоставлять действия, например выполнение запросов, а ресурсы (resources) позволяют делиться стандартизированным контекстом, например информацией о схемах. Позже в этом руководстве мы также рассмотрим подсказки (prompts), которые открывают более продвинутые рабочие процессы. Под капотом мы будем использовать пакет 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 и распишем цели верхнего уровня
# 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