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. La configuration d’un serveur MCP est simple, et avec Cursor tu peux le faire rapidement. 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 façon structurée.
Ce tutoriel a pour but d’enseigner les fondamentaux 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 méthode la plus simple : un serveur qui s’exécute en local sur ton ordinateur via stdio (flux d’entrée/sortie standard). Ça évite des considérations de sécurité compliquées et nous permet de nous concentrer sur la logique MCP elle-même. L’un des cas d’usage les plus courants pour MCP est l’accès aux bases de données. Quand tu construis des dashboards, exécutes des analyses ou crées des migrations, il est souvent nécessaire d’interroger et d’inspecter une base de données. Notre serveur MCP Postgres prendra en charge deux capacités principales : exécuter des requêtes arbitraires et lister les schémas de tables. Même si ces deux tâches pourraient être réalisées en SQL « brut », MCP offre des fonctionnalités qui les rendent plus puissantes et plus utiles en général. Les outils permettent d’exposer des actions comme l’exécution de requêtes, tandis que les ressources nous permettent de partager un contexte standardisé, par exemple 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. [Espace réservé : illustration d’un serveur MCP avec outils et ressources]

Comment construire le serveur MCP

La première étape pour construire le serveur consiste à 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’entrée/sortie 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 des README respectifs. On les utilisera comme contexte pour construire le serveur Maintenant, on va définir le comportement souhaité 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 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
Avec ces trois composants 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, tu peux 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. Assure-toi que les requêtes s’exécutent bien et que les informations de schéma sont renvoyées correctement. Interface de MCP Inspector Quand tout est OK, connecte le serveur directement à Cursor et teste-le 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 te permet de requêter 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 de base de données 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 peuvent être mis en place
  • Observabilité : Les usages et les métriques de performance peuvent être suivis à l’échelle de l’équipe
Pour y parvenir, tu passerais la méthode de transport de stdio à HTTP. Même si on ne couvre pas toute la mise en place, 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 
Le résultat final est visible ici : pg-mcp-server