
Ghost : une base de données pour notre époque ?
J’ai produit l’autre jour, ce qui, je pense, pourrait être parfait pour les cas d’utilisation liés à l’IA. Fantômede ghost.build, se décrit comme « la première base de données conçue pour les agents ».
Ghost est une plate-forme de base de données Postgres « axée sur l’agent » qui permet aux développeurs et aux agents d’IA de créer, de créer, d’inspecter, d’interroger, de manipuler et de supprimer facilement des bases de données entières.
Son utilisation est également totalement gratuite.
Les développeurs qui l’ont construit avaient une idée simple : si les agents doivent créer des logiciels, tester des migrations, inspecter des schémas, exécuter SQL et expérimenter des données, ils ont alors besoin de bases de données aussi jetables et programmables que des bacs à sable de code. C’est là que Ghost s’inscrit.
Lorsque vous créez une base de données Ghost ou créez des bases de données existantes, ces bases de données résident sur l’infrastructure Cloud de Ghost, et non sur votre système local. Ghost est particulièrement utile pour les tests, le prototypage, les flux de travail d’agent, les bases de données de succursales, les expériences de migration et les environnements de bases de données jetables.
Les bases de données gérées traditionnelles sont conçues autour d’une infrastructure de production à long terme. Vous créez une instance, configurez la mise en réseau, gérez les informations d’identification, connectez les applications, puis traitez la base de données comme quelque chose de précieux et de fragile. Ghost conserve la puissance de Postgres, mais ajoute un flux de travail qui semble beaucoup plus proche du développement agentique moderne : créez une base de données à la demande, créez-la lorsque vous avez besoin d’une copie isolée, exécutez SQL dessus, inspectez le schéma, essayez différentes configurations de table et jetez-la lorsque vous avez terminé.
Cela rend Ghost particulièrement bien adapté aux outils d’IA comme Codex et Claude Code. Ces outils peuvent raisonner sur le code, écrire des migrations, déboguer des requêtes, générer des données de départ, inspecter les journaux et utiliser les outils MCP. Le serveur MCP intégré de Ghost offre des capacités de gestion directe de la base de données au Codex, plutôt que de forcer l’agent à s’appuyer sur des instructions vagues, des chaînes de connexion copiées ou un travail manuel sur le tableau de bord.
Dans le reste de cet article, je vais vous expliquer comment installer Ghost sur votre système local. Nous examinerons ensuite quatre exemples concrets d’utilisation de Ghost avec l’agent Codex et sa propre CLI.
NB : je n’ai aucune affiliation ou association avec la société ou l’équipe derrière Ghost ou le produit Ghost lui-même.
Conditions préalables
Je suppose que l’un des agents de codage pris en charge par Ghost est déjà installé sur votre système. Ceux-ci incluent :
Claude Code
Codex
Cursor
Gemini CLI
Google Antigravity
Kiro CLI
VS Code
Windsurf
Vous aurez également besoin d’un compte GitHub, auquel vous devrez accorder l’accès à Ghost lors de la connexion.
Installation de Ghost
Sous Linux, WSL sous Windows ou macOS, vous pouvez utiliser la commande curl suivante.
$ curl -fsSL https://install.ghost.build | sh
Si, comme moi, vous êtes sous Windows, vous pouvez utiliser cette commande depuis un terminal PowerShell.
PS C:\Users\thoma> irm https://install.ghost.build/install.ps1 | iex
Alors cours,
PS C:\Users\thoma> ghost login
Opening browser for authentication...
Found space: nj5scy2orp
Successfully logged in as [email protected]
Un écran comme celui-ci vous sera présenté. Autorisez Ghost à continuer.

Une fois que vous êtes correctement connecté, la prochaine chose à faire est de mettre le serveur Ghost MCP à la disposition de votre agent de codage préféré. Dans mon cas, j’utilise Codex.
Tapez ce qui suit dans la ligne de commande et choisissez votre agent dans la liste affichée.
PS C:\Users\thoma> ghost mcp install
Select an MCP client to configure:
1. Claude Code
> 2. Codex
3. Cursor
4. Gemini CLI
5. Google Antigravity
6. Kiro CLI
7. VS Code
8. Windsurf
Typing: 2
Successfully installed Ghost MCP server configuration for codex
Configuration file: C:\Users\thoma\.codex\config.toml
Next steps:
1. Restart codex to load the new configuration
2. The Ghost MCP server will be available as 'ghost'
PS C:\Users\thoma>
Vérifiez que votre configuration est OK
- Tapez ce qui suit pour vérifier que Ghost MCP est correctement installé.
PS C:\Users\thoma> ghost mcp list
TYPE NAME
prompt design-postgis-tables
prompt design-postgres-tables
prompt find-hypertable-candidates
prompt migrate-postgres-tables-to-hypertables
prompt pgvector-semantic-search
prompt postgres
prompt postgres-hybrid-text-search
prompt setup-timescaledb-hypertables
tool ghost_connect
tool ghost_create
tool ghost_create_dedicated
tool ghost_delete
tool ghost_feedback
tool ghost_fork
tool ghost_fork_dedicated
tool ghost_list
tool ghost_login
tool ghost_logs
tool ghost_password
tool ghost_pause
tool ghost_rename
tool ghost_resume
tool ghost_schema
tool ghost_sql
tool ghost_status
tool search_docs
tool view_skill
Vérifiez que votre agent peut utiliser le serveur Ghost MCP. Vous devriez voir une sortie similaire à celle-ci (pour le Codex).
PS C:\Users\thoma> codex mcp list
Name Command Args Env Cwd Status Auth
ghost C:\Users\thoma\AppData\Local\Programs\Ghost\ghost.exe mcp start - - enabled Unsupported
En supposant que tout va bien, nous pouvons passer à d’autres exemples d’utilisation de Ghost via sa CLI et d’agents via son serveur MCP.
Exemple 1 — Création d’une base de données de données de ventes
Ouvrez votre agent de codage et saisissez-y ce qui suit.
Codex> Create a ghost database called sales_data that stores 10,000 dummy sales
records. In the database, create whichever tables are suitable for such
data. Do not include any indexes, primary or foreign keys for now.
J’ai reçu cette sortie du Codex.
Worked for 1m 32s
Created a fresh Ghost database named sales_data.
It contains 10,000 dummy sales order records and supporting tables:
customers 1,000
products 150
sales_reps 30
sales_orders 10,000
sales_order_items 30,000
Per your instruction, I did not create any:
primary keys
foreign keys
indexes
Verification confirmed there are no primary key constraints, no foreign key
constraints, and no indexes on the sales tables.
Comme vous pouvez le constater, sur mon système, cela a pris un peu plus d’une minute et demie, ce qui est une statistique assez impressionnante pour ce qui a été accompli.
Exemple 2 — Utilisation de Ghost CLI
Maintenant que nous disposons d’une base de données avec laquelle jouer, essayons quelques-unes des commandes Ghost CLI. Notez que ces commandes n’auront normalement pas besoin d’être utilisées puisque nous pouvons faire tout ce que je m’apprête à vous montrer via le Codex et le Ghost MCP, mais il est utile de savoir comment faire dans tous les cas.
PS C:\Users\thoma> ghost list
ID NAME STATUS STORAGE
sip3qcs40a sales_data running 211MiB
- Voir les tables et la structure de la base de données
PS C:\Users\thoma> ghost schema sales_data
DATABASE: sales_data (sip3qcs40a)
TABLE: customers
customer_id BIGINT GENERATED ALWAYS AS IDENTITY
customer_name TEXT NOT NULL
email TEXT NOT NULL
country_code TEXT NOT NULL CHECK ((length(country_code) = 2))
segment TEXT NOT NULL CHECK ((segment = ANY (ARRAY['consumer'::text, 'small_business'::text, 'enterprise'::text])))
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
TABLE: products
product_id BIGINT GENERATED ALWAYS AS IDENTITY
sku TEXT NOT NULL
product_name TEXT NOT NULL
category TEXT NOT NULL CHECK ((category = ANY (ARRAY['software'::text, 'hardware'::text, 'services'::text, 'training'::text, 'support'::text])))
base_price NUMERIC(10,2) NOT NULL CHECK ((base_price > (0)::numeric))
active BOOLEAN NOT NULL DEFAULT true
TABLE: sales_order_items
sales_order_item_id BIGINT GENERATED ALWAYS AS IDENTITY
sales_order_id BIGINT NOT NULL
product_id BIGINT NOT NULL
quantity INTEGER NOT NULL CHECK (((quantity >= 1) AND (quantity <= 6)))
unit_price NUMERIC(10,2) NOT NULL CHECK ((unit_price > (0)::numeric))
discount_amount NUMERIC(10,2) NOT NULL DEFAULT 0 CHECK ((discount_amount >= (0)::numeric))
line_total NUMERIC(12,2) NOT NULL CHECK ((line_total >= (0)::numeric))
TABLE: sales_orders
sales_order_id BIGINT GENERATED ALWAYS AS IDENTITY
customer_id BIGINT NOT NULL
sales_rep_id BIGINT NOT NULL
order_status TEXT NOT NULL CHECK ((order_status = ANY (ARRAY['pending'::text, 'completed'::text, 'shipped'::text, 'cancelled'::text, 'refunded'::text])))
ordered_at TIMESTAMP WITH TIME ZONE NOT NULL
payment_method TEXT NOT NULL CHECK ((payment_method = ANY (ARRAY['card'::text, 'bank_transfer'::text, 'paypal'::text, 'invoice'::text])))
currency_code TEXT NOT NULL DEFAULT 'USD'::text CHECK ((currency_code = 'USD'::text))
subtotal_amount NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((subtotal_amount >= (0)::numeric))
tax_amount NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((tax_amount >= (0)::numeric))
shipping_amount NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((shipping_amount >= (0)::numeric))
total_amount NUMERIC(12,2) NOT NULL DEFAULT 0 CHECK ((total_amount >= (0)::numeric))
TABLE: sales_reps
sales_rep_id BIGINT GENERATED ALWAYS AS IDENTITY
rep_name TEXT NOT NULL
region TEXT NOT NULL CHECK ((region = ANY (ARRAY['north_america'::text, 'europe'::text, 'asia_pacific'::text, 'latin_america'::text])))
hired_at DATE NOT NULL
VIEW: pg_buffercache
bufferid INTEGER
relfilenode OID
reltablespace OID
reldatabase OID
relforknumber SMALLINT
relblocknumber BIGINT
isdirty BOOLEAN
usagecount SMALLINT
pinning_backends INTEGER
VIEW: pg_buffercache_numa
bufferid INTEGER
os_page_num BIGINT
numa_node INTEGER
- Sélectionnez quelques données dans la table sales_order
PS C:\Users\thoma> ghost sql sales_data "SELECT * FROM sales_orders LIMIT 10;"
sales_order_id │ customer_id │ sales_rep_id │ order_status │ ordered_at │ payment_method │ currency_code │ subtotal_amount │ tax_amount │ shipping_amount │ total_amount
────────────────┼─────────────┼──────────────┼──────────────┼───────────────────────────────┼────────────────┼───────────────┼─────────────────┼────────────┼─────────────────┼──────────────
1 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1796.88 │ 143.75 │ 0.00 │ 1940.63
2 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1622.63 │ 129.81 │ 0.00 │ 1752.44
3 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1867.25 │ 149.38 │ 0.00 │ 2016.63
4 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 606.02 │ 48.48 │ 0.00 │ 654.50
5 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1450.11 │ 116.01 │ 0.00 │ 1566.12
6 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1227.85 │ 98.23 │ 0.00 │ 1326.08
7 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 7086.55 │ 566.92 │ 0.00 │ 7653.47
8 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 696.92 │ 55.75 │ 0.00 │ 752.67
9 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1063.73 │ 85.10 │ 0.00 │ 1148.83
10 │ 8 │ 9 │ completed │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 2489.06 │ 199.12 │ 0.00 │ 2688.18
(10 rows)
- Vous craignez que votre agent détruise votre base de données ? Facile, configurez simplement votre système en lecture seule
PS C:\Users\thoma> ghost config set read_only true
Now in Codex,
Codex> delete from sales_order_items where sales_order_item_id = 12
Worked for 5s
The DELETE was blocked, as expected:
ERROR: cannot execute DELETE in a read-only transaction (SQLSTATE 25006)
Il existe tout un tas de commandes utiles que vous pouvez utiliser avec la CLI fantôme. Pour une liste complète, tapez fantôme – aide dans votre ligne de commande.
Mais, comme je l’ai déjà dit, l’une des principales raisons d’utiliser Ghost est que nous pouvons manipuler des bases de données à l’aide de notre agent IA. Voyons cela en action.
Exemple 3 — Utilisation du Ghost MCP avec notre agent.
Nous avons déjà vu dans l’exemple 1 à quel point il était rapide et facile de créer une base de données à l’aide du Codex, mais montrons à quel point il est facile d’expérimenter des bases de données à l’aide d’un agent.
- Ajoutez 500 000 enregistrements à la table sales_order_items
Codex> Add 500,000 dummy sales order records to the sales_order_items table
Added 500,000 dummy rows to sales_data.sales_order_items.
Final counts:
sales_orders 10,000
products 150
sales_order_items 530,000
I also recalculated the 10,000 order totals from the expanded line-item table.
Totals now:
Subtotal sum: 1,530,141,808.73
Tax sum: 124,981,128.08
Total sales: 1,639,903,892.69
Avg order value: 163,990.39
Confirmed the tables still have 0 indexes.
- Sélectionnez quelques données dans la table sales_order_id
Codex> Retrieve the sales_order_items record for
sales_order_items_id = 519932 and tell me how long it took to retrieve
Record found:
sales_order_item_id: 519932
sales_order_id: 9932
product_id: 15
quantity: 3
unit_price: 91.47
discount_amount: 0.00
line_total: 274.41
Timing:
Database execution time: 25.833 ms
Ghost MCP end-to-end time: 146.733 ms
Because there are no indexes, Postgres used a sequential scan and filtered through 529,999 rows to find the record.
- Passons maintenant à quelques réglages de performances
Codex> Fork 3 duplicate sales-data databases in parallel, naming them
sales_data-1, etc.... Using differering strategies in each fork, tune the
database so that the above query runs more quickly. Output your results in
an ascii table with database name, tuning strategy and database execution time.
I'll create three forks concurrently, then apply a different lookup strategy
to each fork: a plain btree index, a covering btree index, and a physically
clustered table plus index. Then I'll measure the same EXPLAIN ANALYZE
execution time on each.
Used Ghost
Only the source sales_data exists, so there are no fork-name collisions.
I'm launching the three fork/tune/measure workers now; each worker waits only
for its own fork before tuning it.
Worked for 2m 40s
Created and tuned three forked databases in parallel.
Baseline on untuned sales_data was previously 25.833 ms with a sequential scan.
+--------------+---------------------------------------------------------------+--------------------------+
| Database | Tuning strategy | Database execution time |
+--------------+---------------------------------------------------------------+--------------------------+
| sales_data-1 | Btree index on sales_order_item_id | 0.131 ms |
| sales_data-2 | Covering btree index including all projected query columns | 0.143 ms |
| sales_data-3 | Hash index on sales_order_item_id for equality lookup | 0.158 ms |
+--------------+---------------------------------------------------------------+--------------------------+
Best result: sales_data-1 with a standard btree index at 0.131 ms.
Comme vous pouvez le constater, l’accélération après l’application du réglage a été assez significative, comme on pouvait s’y attendre. Même ainsi, une amélioration de 200 fois du temps d’exécution des requêtes n’est pas trop mal.
Exemple 4 — Création d’une application de tableau de bord pour notre base de données
Cet exemple montre à quel point il est facile de mélanger une application créée avec des agents de codage avec une base de données créée avec des agents de codage.
Codex> Use your performance tuning findings to upgrade the sales_data
database. Then construct a dashboard using javascript and HTML for the
database. The dashboard should be dynamic. I want to be able to filter on data
and the dashboard should only show data that is inside the database.
I'll turn this into a small live dashboard app: an Express backend with
read-only Postgres queries, and a browser UI that fetches filtered data
from /api/dashboard. I'll keep the database URL in an environment file
rather than putting credentials in the HTML.
Ran 3 commands
The workspace already has pg; I'll add express and dotenv, then fetch a
read-only Ghost connection string for the app.
Ran 1 command, used Ghost
I'll avoid putting the database password into the HTML. The server will get a
read-only connection from the Ghost CLI at startup if DATABASE_URL is not
set, and all browser requests will go through parameterized API endpoints.
Ran & 'C:\Users\thoma\AppData\Local\Programs\Ghost\ghost.exe' connect --read-only sales_data
The read-only Ghost connection string works and includes sslmode=require
plus Ghost's protected read-only option. I'm adding the backend and replacing
the HTML with a live API-driven dashboard.
The backend API is in place. I'm replacing the dashboard HTML with a
frontend that calls /api/options and /api/dashboard whenever filters change.
Created 1 file
The live frontend and backend are written. I'm starting the server now and
checking the API endpoints before I hand you the URL.
The server is now running on port 5101. I'm verifying the browser HTML and a
filtered API call against the live database.
Worked for 7m 28s
Done. The dashboard is now a live browser app backed by the Ghost sales_data
database.
Run/open it here:
http://localhost:5101/sales_dashboard.html
What changed:
Added server.js with an Express API.
Updated sales_dashboard.html so filters call the API and redraw charts/tables.
Updated package.json with npm start.
The backend gets a Ghost read-only connection via ghost connect --read-only sales_data.
Browser JavaScript never sees the database password.
Lorsque j’ai cliqué sur le lien HTML, j’ai obtenu un tableau de bord dynamique qui répondait avec précision aux différentes valeurs de filtre.

Résumé
J’espère vous avoir montré suffisamment de capacités de la base de données de Ghost pour vous donner envie d’en savoir plus sur ce produit utile.
La facilité et la rapidité avec lesquelles il est possible de créer, détruire, copier et manipuler des bases de données Postgres à l’aide de cet outil sont remarquables.
Mon aspect préféré de Ghost est la facilité avec laquelle il est possible d’exécuter des scénarios de simulation avec de vraies bases de données. Besoin de nouvelles copies d’une base de données existante pour essayer des choses ? C’est un jeu d’enfant. Vous pouvez découper et modifier des index et des clés primaires, ou créer des vues matérialisées, simplement en décrivant ce que vous voulez dans un anglais simple à l’aide de vos outils de codage agent préférés, avec un recours à une CLI si vous en avez vraiment besoin.
Comme je l’ai montré dans mon dernier exemple, étant donné que Ghost fonctionne très bien avec les outils de codage agent, il est assez simple de demander à ces agents de créer du code qui s’intègre bien aux bases de données Ghost pour produire des applications utiles telles que des tableaux de bord et d’autres types d’applications SaaS.
Désormais, même si vous souhaiterez peut-être faire une pause avant de stocker des données de production sur Ghost, il s’agit d’une excellente plate-forme pour les preuves de concept et l’expérimentation générale. Et, une fois que vous disposez d’une structure de base de données qui vous convient, la réplication sur votre base de données de production devrait être simple.
Pour plus d’informations sur l’utilisation de Ghost et une documentation complète, veuillez visiter la page d’accueil officielle ci-dessous.



