Ich habe neulich ein Produkt entwickelt, das meiner Meinung nach perfekt für KI-bezogene Anwendungsfälle geeignet sein könnte. Geistvon ghost.construct, beschreibt sich selbst als „die erste Datenbank, die für Agenten erstellt wurde“.
Ghost ist eine „Agent-First“-Postgres-Datenbankplattform, mit der Entwickler und KI-Agenten problemlos ganze Datenbanken erstellen, forken, prüfen, abfragen, manipulieren und löschen können.
Es gibt auch ein sehr großzügiges kostenloses Nutzungskontingent.
Die Entwickler, die es entwickelt haben, hatten eine einfache Idee: Wenn Agenten Software program erstellen, Migrationen testen, Schemata prüfen, SQL ausführen und mit Daten experimentieren wollen, dann brauchen sie Datenbanken, die ebenso verfügbar und programmierbar sind wie Code-Sandboxen. Da passt Ghost hinein.
Wenn Sie eine Ghost-Datenbank erstellen oder bestehende aufteilen, befinden sich diese Datenbanken in der Cloud-Infrastruktur von Ghost und nicht auf Ihrem lokalen System. Ghost ist besonders nützlich für Checks, Prototyping, Agenten-Workflows, Zweigstellendatenbanken, Migrationsexperimente und Einweg-Datenbankumgebungen.
Herkömmliche verwaltete Datenbanken basieren auf einer langlebigen Produktionsinfrastruktur. Sie erstellen eine Instanz, konfigurieren das Netzwerk, verwalten Anmeldeinformationen, verbinden Anwendungen und behandeln die Datenbank dann als etwas Wertvolles und Zerbrechliches. Ghost behält die Leistungsfähigkeit von Postgres bei, fügt aber einen Workflow hinzu, der der modernen Agentenentwicklung viel näher kommt: Erstellen Sie eine Datenbank bei Bedarf, forken Sie sie, wenn Sie eine isolierte Kopie benötigen, führen Sie SQL dafür aus, überprüfen Sie das Schema, probieren Sie verschiedene Tabellenkonfigurationen aus und werfen Sie sie weg, wenn Sie fertig sind.
Dadurch eignet sich Ghost besonders intestine für KI-Instruments wie Codex und Claude Code. Diese Instruments können über Code nachdenken, Migrationen schreiben, Abfragen debuggen, Seed-Daten generieren, Protokolle überprüfen und MCP-Instruments verwenden. Der integrierte MCP-Server von Ghost bietet Codex direkte Datenbankverwaltungsfunktionen, anstatt den Agenten dazu zu zwingen, sich auf vage Anweisungen, kopierte Verbindungszeichenfolgen oder manuelle Dashboard-Arbeiten zu verlassen.
Im Relaxation dieses Artikels erkläre ich Ihnen, wie Sie Ghost auf Ihrem lokalen System installieren. Anschließend schauen wir uns vier konkrete Beispiele für die Verwendung von Ghost mit dem Codex-Agenten und seiner eigenen CLI an.
Bitte beachten Sie, dass ich weder mit dem Unternehmen oder Workforce hinter Ghost noch mit dem Ghost-Produkt selbst verbunden bin.
Voraussetzungen
Ich gehe davon aus, dass auf Ihrem System bereits einer der von Ghost unterstützten Codierungsagenten installiert ist. Dazu gehören:
Claude Code
Codex
Cursor
Gemini CLI
Google Antigravity
Kiro CLI
VS Code
Windsurf
Sie benötigen außerdem ein GitHub-Konto, dem Sie Ghost beim Anmelden Zugriff gewähren müssen.
Ghost installieren
Unter Linux, WSL unter Home windows oder macOS können Sie den folgenden Curl-Befehl verwenden.
$ curl -fsSL https://set up.ghost.construct | sh
Wenn Sie wie ich Home windows verwenden, können Sie diesen Befehl von einem PowerShell-Terminal aus verwenden.
PS C:Usersthoma> irm https://set up.ghost.construct/set up.ps1 | iex
Dann lauf,
PS C:Usersthoma> ghost login
Opening browser for authentication...
Discovered house: nj5scy2orp
Efficiently logged in as (electronic mail protected)
Ihnen wird ein Bildschirm wie dieser angezeigt. Autorisieren Sie Ghost, fortzufahren.

Nachdem Sie sich korrekt angemeldet haben, sollten Sie als Nächstes den Ghost MCP-Server Ihrem bevorzugten Programmieragenten zur Verfügung stellen. In meinem Fall verwende ich Codex.
Geben Sie Folgendes in die Befehlszeile ein und wählen Sie Ihren Agenten aus der angezeigten Liste aus.
PS C:Usersthoma> ghost mcp set up
Choose an MCP consumer 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
Efficiently put in Ghost MCP server configuration for codex
Configuration file: C:Usersthoma.codexconfig.toml
Subsequent steps:
1. Restart codex to load the brand new configuration
2. The Ghost MCP server can be accessible as 'ghost'
PS C:Usersthoma>
Überprüfen Sie, ob Ihr Setup in Ordnung ist
- Geben Sie Folgendes ein, um zu überprüfen, ob der Ghost MCP korrekt installiert ist.
PS C:Usersthoma> ghost mcp listing
TYPE NAME
immediate design-postgis-tables
immediate design-postgres-tables
immediate find-hypertable-candidates
immediate migrate-postgres-tables-to-hypertables
immediate pgvector-semantic-search
immediate postgres
immediate postgres-hybrid-text-search
immediate setup-timescaledb-hypertables
software ghost_connect
software ghost_create
software ghost_create_dedicated
software ghost_delete
software ghost_feedback
software ghost_fork
software ghost_fork_dedicated
software ghost_list
software ghost_login
software ghost_logs
software ghost_password
software ghost_pause
software ghost_rename
software ghost_resume
software ghost_schema
software ghost_sql
software ghost_status
software search_docs
software view_skill
Überprüfen Sie, ob Ihr Agent den Ghost MCP-Server verwenden kann. Sie sollten eine ähnliche Ausgabe sehen (für Codex).
PS C:Usersthoma> codex mcp listing
Title Command Args Env Cwd Standing Auth
ghost C:UsersthomaAppDataLocalProgramsGhostghost.exe mcp begin - - enabled Unsupported
Vorausgesetzt, alles ist in Ordnung, können wir mit weiteren Beispielen für die Verwendung von Ghost über seine CLI und Agenten über seinen MCP-Server fortfahren.
Beispiel 1 – Erstellen einer Verkaufsdatendatenbank
Öffnen Sie Ihren Codierungsagenten und geben Sie Folgendes ein.
Codex> Create a ghost database known as sales_data that shops 10,000 dummy gross sales
data. Within the database, create whichever tables are appropriate for such
information. Don't embody any indexes, main or international keys for now.
Ich habe diese Ausgabe von Codex erhalten.
Labored for 1m 32s
Created a contemporary Ghost database named sales_data.
It accommodates 10,000 dummy gross sales order data and supporting tables:
clients 1,000
merchandise 150
sales_reps 30
sales_orders 10,000
sales_order_items 30,000
Per your instruction, I didn't create any:
main keys
international keys
indexes
Verification confirmed there aren't any main key constraints, no international key
constraints, and no indexes on the gross sales tables.
Wie Sie sehen, dauerte dies auf meinem System etwas mehr als eineinhalb Minuten, was eine ziemlich beeindruckende Statistik für das ist, was erreicht wurde.
Beispiel 2 – Verwendung der Ghost-CLI
Nachdem wir nun eine Datenbank zum Spielen haben, probieren wir einige der Ghost-CLI-Befehle aus. Beachten Sie, dass diese Befehle normalerweise nicht verwendet werden müssen, da wir alles, was ich Ihnen gleich zeigen werde, über Codex und das Ghost MCP tun können, aber es ist auf jeden Fall nützlich zu wissen, wie.
PS C:Usersthoma> ghost listing
ID NAME STATUS STORAGE
sip3qcs40a sales_data operating 211MiB
- Sehen Sie sich die Datenbanktabellen und die Struktur an
PS C:Usersthoma> ghost schema sales_data
DATABASE: sales_data (sip3qcs40a)
TABLE: clients
customer_id BIGINT GENERATED ALWAYS AS IDENTITY
customer_name TEXT NOT NULL
electronic mail TEXT NOT NULL
country_code TEXT NOT NULL CHECK ((size(country_code) = 2))
section TEXT NOT NULL CHECK ((section = ANY (ARRAY('shopper'::textual content, 'small_business'::textual content, 'enterprise'::textual content))))
created_at TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
TABLE: merchandise
product_id BIGINT GENERATED ALWAYS AS IDENTITY
sku TEXT NOT NULL
product_name TEXT NOT NULL
class TEXT NOT NULL CHECK ((class = ANY (ARRAY('software program'::textual content, '{hardware}'::textual content, 'companies'::textual content, 'coaching'::textual content, 'assist'::textual content))))
base_price NUMERIC(10,2) NOT NULL CHECK ((base_price > (0)::numeric))
lively 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
amount INTEGER NOT NULL CHECK (((amount >= 1) AND (amount <= 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'::textual content, 'accomplished'::textual content, 'shipped'::textual content, 'cancelled'::textual content, 'refunded'::textual content))))
ordered_at TIMESTAMP WITH TIME ZONE NOT NULL
payment_method TEXT NOT NULL CHECK ((payment_method = ANY (ARRAY('card'::textual content, 'bank_transfer'::textual content, 'paypal'::textual content, 'bill'::textual content))))
currency_code TEXT NOT NULL DEFAULT 'USD'::textual content CHECK ((currency_code = 'USD'::textual content))
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
area TEXT NOT NULL CHECK ((area = ANY (ARRAY('north_america'::textual content, 'europe'::textual content, 'asia_pacific'::textual content, 'latin_america'::textual content))))
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
- Wählen Sie einige Daten aus der Tabelle sales_order aus
PS C:Usersthoma> 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 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1796.88 │ 143.75 │ 0.00 │ 1940.63
2 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1622.63 │ 129.81 │ 0.00 │ 1752.44
3 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1867.25 │ 149.38 │ 0.00 │ 2016.63
4 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 606.02 │ 48.48 │ 0.00 │ 654.50
5 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1450.11 │ 116.01 │ 0.00 │ 1566.12
6 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1227.85 │ 98.23 │ 0.00 │ 1326.08
7 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 7086.55 │ 566.92 │ 0.00 │ 7653.47
8 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 696.92 │ 55.75 │ 0.00 │ 752.67
9 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 1063.73 │ 85.10 │ 0.00 │ 1148.83
10 │ 8 │ 9 │ accomplished │ 2024-05-21 05:08:34.332998+00 │ paypal │ USD │ 2489.06 │ 199.12 │ 0.00 │ 2688.18
(10 rows)
- Befürchten Sie, dass Ihr Agent Ihre Datenbank zerstört? Ganz einfach: Stellen Sie Ihr System einfach auf schreibgeschützt ein
PS C:Usersthoma> ghost config set read_only true
Now in Codex,
Codex> delete from sales_order_items the place sales_order_item_id = 12
Labored for 5s
The DELETE was blocked, as anticipated:
ERROR: can not execute DELETE in a read-only transaction (SQLSTATE 25006)
Es gibt eine ganze Reihe nützlicher Befehle, die Sie mit der Ghost-CLI verwenden können. Für eine vollständige Liste geben Sie ein Geist – Hilfe in Ihre Befehlszeile.
Aber wie ich bereits sagte, ist einer der Hauptgründe für die Verwendung von Ghost, dass wir Datenbanken mithilfe unseres KI-Agenten manipulieren können. Sehen wir uns das in Aktion an.
Beispiel 3 – Verwendung des Ghost MCP mit unserem Agenten.
Wir haben bereits in Beispiel 1 gesehen, wie schnell und einfach es warfare, mit Codex eine Datenbank zu erstellen, aber zeigen wir, wie einfach es ist, mit Datenbanken mithilfe eines Agenten zu experimentieren.
- Fügen Sie 500.000 Datensätze zur Tabelle sales_order_items hinzu
Codex> Add 500,000 dummy gross sales order data to the sales_order_items desk
Added 500,000 dummy rows to sales_data.sales_order_items.
Ultimate counts:
sales_orders 10,000
merchandise 150
sales_order_items 530,000
I additionally recalculated the ten,000 order totals from the expanded line-item desk.
Totals now:
Subtotal sum: 1,530,141,808.73
Tax sum: 124,981,128.08
Complete gross sales: 1,639,903,892.69
Avg order worth: 163,990.39
Confirmed the tables nonetheless have 0 indexes.
- Wählen Sie einige Daten aus der Tabelle sales_order_id aus
Codex> Retrieve the sales_order_items report for
sales_order_items_id = 519932 and inform me how lengthy it took to retrieve
Report discovered:
sales_order_item_id: 519932
sales_order_id: 9932
product_id: 15
amount: 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
As a result of there aren't any indexes, Postgres used a sequential scan and filtered via 529,999 rows to seek out the report.
- Nun zur Leistungsoptimierung
Codex> Fork 3 duplicate sales-data databases in parallel, naming them
sales_data-1, and many others.... Utilizing differering methods in every fork, tune the
database in order that the above question runs extra rapidly. Output your leads to
an ascii desk with database identify, tuning technique and database execution time.
I am going to create three forks concurrently, then apply a distinct lookup technique
to every fork: a plain btree index, a masking btree index, and a bodily
clustered desk plus index. Then I am going to measure the identical EXPLAIN ANALYZE
execution time on every.
Used Ghost
Solely the supply sales_data exists, so there aren't any fork-name collisions.
I am launching the three fork/tune/measure staff now; every employee waits solely
for its personal fork earlier than tuning it.
Labored for 2m 40s
Created and tuned three forked databases in parallel.
Baseline on untuned sales_data was beforehand 25.833 ms with a sequential scan.
+--------------+---------------------------------------------------------------+--------------------------+
| Database | Tuning technique | Database execution time |
+--------------+---------------------------------------------------------------+--------------------------+
| sales_data-1 | Btree index on sales_order_item_id | 0.131 ms |
| sales_data-2 | Masking btree index together with all projected question columns | 0.143 ms |
| sales_data-3 | Hash index on sales_order_item_id for equality lookup | 0.158 ms |
+--------------+---------------------------------------------------------------+--------------------------+
Finest end result: sales_data-1 with a typical btree index at 0.131 ms.
Wie Sie sehen können, warfare die Beschleunigung nach der Optimierung erwartungsgemäß ziemlich erheblich. Dennoch ist eine Verbesserung der Abfragelaufzeit um den Faktor 200 nicht allzu schlecht.
Beispiel 4 – Erstellen einer Dashboard-App für unsere Datenbank
Dieses Beispiel zeigt, wie einfach es ist, eine mit Codierungsagenten erstellte App mit einer mit Codierungsagenten erstellten Datenbank zu kombinieren.
Codex> Use your efficiency tuning findings to improve the sales_data
database. Then assemble a dashboard utilizing javascript and HTML for the
database. The dashboard needs to be dynamic. I need to have the ability to filter on information
and the dashboard ought to solely present information that's contained in the database.
I am going to flip this right into a small reside dashboard app: an Categorical backend with
read-only Postgres queries, and a browser UI that fetches filtered information
from /api/dashboard. I am going to maintain the database URL in an atmosphere file
reasonably than placing credentials within the HTML.
Ran 3 instructions
The workspace already has pg; I am going to add specific and dotenv, then fetch a
read-only Ghost connection string for the app.
Ran 1 command, used Ghost
I am going to keep away from placing the database password into the HTML. The server will get a
read-only connection from the Ghost CLI at startup if DATABASE_URL will not be
set, and all browser requests will undergo parameterized API endpoints.
Ran & 'C:UsersthomaAppDataLocalProgramsGhostghost.exe' join --read-only sales_data
The read-only Ghost connection string works and consists of sslmode=require
plus Ghost's protected read-only choice. I am including the backend and changing
the HTML with a reside API-driven dashboard.
The backend API is in place. I am changing the dashboard HTML with a
frontend that calls /api/choices and /api/dashboard each time filters change.
Created 1 file
The reside frontend and backend are written. I am beginning the server now and
checking the API endpoints earlier than I hand you the URL.
The server is now operating on port 5101. I am verifying the browser HTML and a
filtered API name towards the reside database.
Labored for 7m 28s
Executed. The dashboard is now a reside browser app backed by the Ghost sales_data
database.
Run/open it right here:
http://localhost:5101/sales_dashboard.html
What modified:
Added server.js with an Categorical API.
Up to date sales_dashboard.html so filters name the API and redraw charts/tables.
Up to date package deal.json with npm begin.
The backend will get a Ghost read-only connection by way of ghost join --read-only sales_data.
Browser JavaScript by no means sees the database password.
Als ich auf den HTML-Hyperlink klickte, erhielt ich ein dynamisches Dashboard, das genau auf verschiedene Filterwerte reagierte.

Zusammenfassung
Hoffentlich habe ich Ihnen genug von den Funktionen der Ghost-Datenbank gezeigt, um Ihren Appetit zu wecken, mehr über dieses nützliche Produkt zu erfahren.
Bemerkenswert ist die Leichtigkeit und Geschwindigkeit, mit der sich mit diesem Device Postgres-Datenbanken erstellen, zerstören, kopieren und bearbeiten lassen.
Was mir an Ghost am besten gefällt, ist die einfache Ausführung von Was-wäre-wenn-Szenarien mit echten Datenbanken. Benötigen Sie zum Ausprobieren neue Kopien einer vorhandenen Datenbank? Es ist ein Kinderspiel. Sie können Indizes und Primärschlüssel zerlegen und ändern oder materialisierte Ansichten erstellen, indem Sie einfach in einfachem Englisch beschreiben, was Sie wollen, und zwar mit Ihren bevorzugten Agenten-Codierungstools, mit einem Fallback auf eine CLI, wenn Sie es wirklich brauchen.
Wie ich in meinem letzten Beispiel gezeigt habe, ist es aufgrund der guten Zusammenarbeit von Ghost mit Agenten-Codierungstools ziemlich einfach, diese Agenten Code erstellen zu lassen, der sich intestine in Ghost-Datenbanken integrieren lässt, um nützliche Apps wie Dashboards und andere Arten von SaaS-Anwendungen zu erstellen.
Obwohl Sie vielleicht eine Pause einlegen möchten, bevor Sie Produktionsdaten auf Ghost speichern, ist es eine großartige Plattform für Proofs of Idea und allgemeine Experimente. Und sobald Sie eine Datenbankstruktur haben, mit der Sie mit Ghost zufrieden sind, sollte die Replikation dieser Struktur in Ihrer Produktionsdatenbank problemlos sein.
Weitere Informationen zur Verwendung von Ghost und eine vollständige Dokumentation finden Sie auf der offiziellen Homepage unten.
