Introduction

Les serveurs MCP te permettent de connecter des sources de données personnalisées et de les rendre disponibles dans Cursor. C’est particulièrement utile quand tu as besoin de contexte provenant de navigateurs, de bases de données ou de journaux système et d’erreurs. Configurer un serveur MCP est simple, et avec Cursor ça se fait vite. Dans ce guide, on va voir comment créer un serveur MCP pour Postgres. L’objectif est de permettre à Cursor d’exécuter des requêtes SQL directement sur une base Postgres et d’exposer les schémas de tables de manière structurée.
Ce tutoriel est conçu pour t’apprendre les bases de la création de serveurs MCP.

Qu’est-ce qu’un serveur MCP ?

Un serveur MCP est un processus qui communique avec Cursor et donne accès à des données ou actions externes. Il peut être implémenté de plusieurs façons, mais ici on va utiliser la plus simple : un serveur qui s’exécute en local sur ton ordinateur via stdio (flux standard d’entrée/sortie). Ça évite des problématiques de sécurité complexes et nous permet de nous concentrer sur la logique MCP elle-même. L’un des cas d’usage les plus courants de MCP, c’est l’accès aux bases de données. Quand tu construis des dashboards, que tu lances des analyses ou que tu crées des migrations, il est souvent nécessaire d’interroger et d’inspecter une base. Notre serveur MCP Postgres prendra en charge deux fonctions principales : exécuter des requêtes arbitraires et lister les schémas de tables. Même si ces deux tâches pourraient être faites en SQL pur, MCP apporte des fonctionnalités qui les rendent plus puissantes et plus utiles au sens large. Les outils offrent un moyen d’exposer des actions comme l’exécution de requêtes, tandis que les ressources permettent de partager un contexte standardisé comme des informations de schéma. Plus loin dans ce guide, on verra aussi les prompts, qui permettent des workflows plus avancés. Sous le capot, on s’appuiera sur le package npm postgres pour exécuter des instructions SQL sur la base de données. Le SDK MCP jouera le rôle de wrapper autour de ces appels, ce qui nous permet d’intégrer les fonctionnalités Postgres de façon fluide dans Cursor.

Comment créer le serveur MCP

La première étape pour créer le serveur, c’est de configurer un nouveau projet. On va commencer par créer un nouveau dossier et initialiser un projet Bun
> mkdir postgres-mcp-server
> Bun init
À partir de là, on sélectionne le projet Blank. Une fois le boilerplate en place, on doit installer les dépendances requises. zod est nécessaire pour définir des schémas d’E/S dans le SDK MCP
bun add postgres @modelcontextprotocol/sdk zod
Ensuite, on va sur les dépôts de chacune des bibliothèques et on récupère le lien vers le contenu brut de chaque README. On va les utiliser comme contexte pour construire le serveur Maintenant, on va définir le comportement attendu du serveur. Pour ça, on crée un spec.md et on écrit les objectifs de haut niveau
# 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
Comme tu peux le voir, c’est une spec assez légère. N’hésite pas à ajouter plus de détails si besoin. Avec les liens README, on va construire le prompt final
Read the following and follow @spec.md to understand what we want. All necessary dependencies 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
Avec ces trois éléments en place (la spécification, la documentation du SDK MCP et la documentation de la bibliothèque Postgres), on peut utiliser Cursor pour générer l’ossature de l’implémentation du serveur. Cursor va nous aider à assembler les pièces, en générant le code qui connecte le SDK MCP à Postgres. Après quelques allers-retours dans les prompts, on a maintenant une première version du serveur MCP qui tourne. Pour l’essayer, on peut utiliser le MCP Inspector
npx @modelcontextprotocol/inspector bun run index.ts

Tester le serveur MCP

Une fois l’implémentation initiale terminée, on peut la tester avec MCP Inspector. L’inspecteur permet de voir ce que le serveur expose et de vérifier que les outils et les ressources se comportent comme prévu. On doit confirmer que les requêtes peuvent être exécutées et que les informations de schéma sont renvoyées correctement. Interface de MCP Inspector Quand tout est en ordre, on peut connecter le serveur à Cursor et le tester dans un environnement réel. À ce stade, Cursor pourra utiliser le serveur MCP Postgres comme s’il s’agissait d’une fonctionnalité intégrée, ce qui nous permet d’interroger et d’inspecter la base de données directement.

Prochaines étapes

Exécuter le serveur MCP localement via stdio est un excellent point de départ, mais les équipes ont souvent besoin d’un accès partagé à la même base de données via leur serveur MCP. Dans ces cas, déployer le serveur MCP en tant que service HTTP centralisé devient nécessaire. Un serveur MCP déployé offre plusieurs avantages par rapport aux instances stdio individuelles :
  • Accès partagé à la base de données : plusieurs membres de l’équipe peuvent interroger la même instance via Cursor
  • Configuration centralisée : les mises à jour de schéma et les changements d’autorisations sont gérés en un seul endroit
  • Sécurité renforcée : authentification, limitation de débit et contrôles d’accès appropriés peuvent être mis en place
  • Observabilité : les habitudes d’utilisation et les métriques de performance peuvent être suivies à l’échelle de l’équipe
Pour y parvenir, tu passerais du transport stdio à HTTP. Même si on ne couvre pas toute la configuration, voici un bon prompt de départ que tu peux donner à 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 
Les résultats finaux sont visibles ici : pg-mcp-server