opensheet
OpenSheet
Eine Datenbank-UI ohne Datenbank.
Ihre Tabellen sind einfache .jsonl-Dateien auf der Festplatte. Bearbeiten Sie eine Zelle — git diff zeigt eine Zeile.
Schließen Sie OpenSheet, und jq, DuckDB, Excel, pandas und Ihre KI-Agenten können weiterhin alles lesen.
Was ist das
Tabellenkalkulations-Datenbank-Tools müssen Ihre Zeilen irgendwo ablegen. Die üblichen Antworten sind eine Datenbank, die Sie auch betreiben müssen, eine Speicher-Engine, die mit der App geliefert wird, oder eine einzelne Binärdatei im eigenen Format der App. Alle drei funktionieren. Alle drei bedeuten, dass das Tool zwischen Ihnen und Ihren Daten sitzt.
OpenSheets Quelle der Wahrheit ist eine Textdatei, die Sie bereits lesen können. Ein Ordner ist eine Bibliothek,
jede .jsonl-Datei darin ist eine Tabelle, eine Zeile ist ein Datensatz. Es gibt keine Datenbank, kein Konto, keinen Server,
keine Synchronisierung. Löschen Sie OpenSheet und Ihre Daten bewegen sich keinen Millimeter.
$ cat my-library/campaigns.jsonl
{"id":"KS-001","project":"Modular Mechanical Keyboard","raised_usd":412870,"rating":5}
{"id":"KS-002","project":"Solar Camp Lantern","raised_usd":88250,"rating":4}
$ jq -r 'select(.rating == 5) | .project' my-library/campaigns.jsonl
Modular Mechanical KeyboardDas ist das gesamte Speicherformat. Die Tabellenkalkulations-UI ist eine Ansicht darauf, kein Wrapper darum.
Related MCP server: jsony-mcp
Schnellstart
Erfordert Python 3.9+. Kein pip install, kein Docker, kein Build-Schritt.
git clone https://github.com/newgepard/opensheet
cd opensheet
PYTHONPATH=src python3 -m opensheet ~/my-library/Es öffnet http://127.0.0.1:<freier Port> in Ihrem Browser. Richten Sie es auf einen Ordner mit .jsonl-Dateien, auf eine
einzelne .jsonl-Datei oder auf einen leeren Ordner, um von Grund auf zu beginnen.
macOS-Desktop-App — eine 860 KB native Shell (Swift + WKWebView, nutzt das System-WebKit):
bash shell/build.sh
open shell/build/OpenSheet.appDas Fidelity-Versprechen
Darauf ist alles andere aufgebaut, und es wird getestet statt nur behauptet.
1. Unberührte Zeilen werden byte-für-byte zurückgeschrieben. Bearbeiten Sie eine Zelle in einer Tabelle mit 10.000 Zeilen und
git diff zeigt genau eine geänderte Zeile. Zeilen, die Sie nicht berührt haben, werden nie neu serialisiert — nicht
neu sortiert, nicht neu formatiert, nicht neu maskiert.
2. Nicht-ASCII-Text wird nie maskiert. {"名前":"甲"} bleibt exakt so. Es wird nie zu
{"\u540d\u524d":"\u7532"}, was json.dumps standardmäßig tut und was eine Datei
in jedem Tool unlesbar macht, das kein JSON-Parser ist.
3. Spärliche Dateien bleiben spärlich. Wenn eine Zeile keinen Schlüssel hat, erfindet OpenSheet keinen für sie. Das Hinzufügen eines Felds zu einer Tabelle mit 50.000 vorhandenen Zeilen schreibt keine davon neu.
Undo ist als inverse Befehle aufgebaut, nicht als Snapshot-Rollback, speziell damit Versprechen 1 es übersteht:
Bearbeiten Sie eine Zelle, drücken Sie ⌘Z, speichern — git diff ist leer. Eine Snapshot-Wiederherstellung würde
auf dem Bildschirm korrekt aussehen, während sie stillschweigend jede berührte Zeile neu serialisiert.

Unterstützt wird dies durch einen Fingerabdruck-Check, der sich weigert, Änderungen zu überschreiben, die hinter OpenSheets
Rücken vorgenommen wurden; Schreibvorgänge laufen über eine temporäre Datei plus os.replace(), und jeder Speichervorgang
behält eine .bak-Datei neben einem Snapshot zum Öffnungszeitpunkt.
Funktionen
Ihre Daten sind eine Datei, die Ihnen gehört — einfaches
.jsonl, lesbar mitjq, DuckDB, pandas, Excel und gitAlles rückgängig machen —
⌘Z/⇧⌘Z; ein Stapel-Löschen wird zu einem einzigen Undo-Schritt zusammengefasst13 Feldtypen — Text, Zahl, Auswahl, Mehrfachauswahl, Datum, Kontrollkästchen, URL, Anhang, Formel, tabellenübergreifende Suche, Erstellt-/Aktualisiert-Zeit, Auto-Nummer. Zahlen werden als Fortschrittsbalken, Währung, Bewertungen oder Prozentsätze dargestellt ohne den gespeicherten Wert zu ändern
4 Ansichtstypen — Raster, Kanban, Galerie, plus Filter, Sortierungen, Gruppierung, Statistiken, Zeilenhöhe, eingefrorene Spalten und Spaltenreihenfolge pro Ansicht
10.000 Zeilen bleiben flüssig — virtuelles Scrollen; gemessen bei 57 ms zum Laden und 59 ms zum Speichern einer 7,5 MB großen Tabelle
Import und Export — hinein aus CSV, XLSX, JSON, SQLite und
.grist; hinaus nach CSV, XLSX, JSON, JSONL, Markdown und ParquetAnhänge bleiben lokal — Dateien landen in
<library>/assets/, die Zelle enthält einen relativen Pfad, nichts wird irgendwohin hochgeladen
Für Agenten gebaut, nicht mit KI dekoriert
Einen KI-Button zu einer Tabellenkalkulation hinzuzufügen ist ein Feature. Ein Speicherformat zu wählen, das ein Agent ohne
Adapter lesen und schreiben kann, ist eine Architektur. OpenSheet hat das Zweite getan, und alles andere folgt
daraus: Die Datei ist zeilenorientiert, sodass Anhängen >> ist, das Format ist Text, sodass grep funktioniert,
und der Schreiber ist singulär, sodass Byte-Fidelity gleichzeitigen Zugriff übersteht.
Ein MCP-Server läuft im selben Prozess wie der HTTP-Server und teilt sich eine Store-Instanz:
{
"mcpServers": {
"opensheet": {
"command": "python3",
"args": ["-m", "opensheet", "/path/to/libraries", "--mcp", "--mcp-root", "/path/to/libraries"],
"env": { "PYTHONPATH": "/path/to/opensheet/src" }
}
}
}Werkzeuge: list_libraries, list_tables, get_schema, query, upsert_rows.
upsert_rows gibt eine Quittung zurück — inserted / updated / unchanged-Zählungen plus die Primärschlüssel
für jede — und unterstützt dry_run. Zeilen, die mit dem identisch sind, was bereits auf der Festplatte liegt, zählen als unchanged,
und die Datei wird nicht angefasst.
Derselbe Prozess ist kein Implementierungsdetail. Byte-Fidelity hängt vom In-Process-Zustand ab: von welchen Bytes jede Zeile angekommen ist. Zwei Prozesse, die jeweils ihre eigene Kopie halten, würden jeweils schlussfolgern, dass die Schreibvorgänge des anderen "Änderungen" wären und die gesamte Datei beim nächsten Speichern neu serialisieren. Ein zweiter Prozess erkennt die Sperrdatei und leitet an den ersten weiter, sodass es immer genau einen Schreiber gibt.
Agenten können OpenSheet auch überspringen und direkt an die Datei anhängen. Die Regeln, die Fidelity intakt halten, wenn sie das tun, sind im Direct-Write-Leitfaden dokumentiert.
Architektur
graph TD
A["my-library/"] --> B["campaigns.jsonl<br/>source of truth"]
A --> C["suppliers.jsonl"]
A --> D[".opensheet/<br/>schema · views · links"]
B --> E["store.py<br/>row passthrough · atomic write"]
C --> E
E --> F["single process"]
F --> G["HTTP + browser UI"]
F --> H["MCP over stdio"]
G --> I["native macOS shell"].opensheet/ enthält Feldtypen, Spaltenbreiten, Ansichtsdefinitionen und tabellenübergreifende Verknüpfungen. Löschen Sie es und
Sie verlieren Formatierung, nicht Daten — Feldtypen fallen auf Inferenz zurück.
Warum es klein bleibt
Das Backend ist nur die Python-Standardbibliothek. Das Frontend ist einfaches JavaScript — kein Framework, kein Build-Schritt. Die macOS-Shell ist 184 KB Swift auf dem System-WebKit, kein gebündelter Browser.
DuckDB ist optional und schreibgeschützt und bedient das SQL-Panel und den Parquet-Export. Es nimmt nie an
Filtern, Sortieren oder Gruppieren teil, und es schreibt nie. Jeder Schreibvorgang läuft über store.py.
Kein Netzwerk, konstruktionsbedingt
Keine Telemetrie, keine Update-Checks, keine CDN-Assets, keine Online-Demo. Der Browser fordert nur Same-Origin
/api/*-Pfade an, der Server bindet nur an die IPv4-Loopback-Adresse, und die Desktop-Shell hält null eigene
TCP-Verbindungen. tests/test_offline.py erzwingt all dies.
Verifikation
bash tests/opensheet-全量验收-20260815.sh329 Tests: 188 JavaScript-Unit, 83 Python, 42 Browser-End-to-End (Playwright), 8 Fidelity-Round-Trip, 8 Bibliotheks-Round-Trip. Die Fidelity-Tests vergleichen Dateien byte-für-byte statt Feld-für-Feld — ein Test, der nur Werte prüfte, würde bestehen, während Versprechen 1 stillschweigend gebrochen wäre.
Browser-Tests benötigen npm install innerhalb von web/ für Playwrights Chromium.
Was OpenSheet nicht tun wird
Kommentare, Berechtigungen, Echtzeit-Zusammenarbeit, Automatisierungen, eine gehostete Version, eine Online-Demo. Jede davon benötigt ein Kontosystem oder eine öffentliche Adresse, was der ersten Design-Einschränkung widerspricht: Daten verlassen nie Ihren Rechner.
Dies ist eine bewusste Grenze, keine Roadmap-Lücke.
Status
Funktioniert und wird täglich genutzt, mit zwei rauen Kanten, die Sie kennen sollten, bevor Sie es ausprobieren:
Die UI ist derzeit nur auf Chinesisch. Code, Kommentare und Oberflächentexte sind alle auf Chinesisch. Eine englische Lokalisierung wurde noch nicht durchgeführt.
Nur macOS für die Desktop-Shell. Die Webversion läuft überall, wo Python läuft.
Mitwirken
Issues und PRs sind willkommen. Zwei Dinge, die Sie wissen sollten, bevor Sie die Speicherschicht anfassen:
Die Zeilen-Passthrough-Logik in
store.pyist das Produkt. Sie zu ändern bedeutet, die Fidelity- Tests grün zu halten, und diese vergleichen Bytes, nicht Felder.Code-Kommentare sind derzeit auf Chinesisch. Übersetzungshilfe ist sehr willkommen.
Lizenz
MIT — siehe LICENSE.
Available Tools
5 toolsget_schemaC
读取表字段 schema
| Name | Required | Description | Default |
|---|---|---|---|
| table | Yes | ||
| library | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The verb '读取' indicates a read-only, non-mutating operation, which is useful since siblings include upsert_rows. However, with no annotations, the description carries the full burden and does not disclose return format, permissions, or potential errors, so transparency is only partial.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no filler, and the core action is front-loaded. It is concise, though slightly under-specified, which is more a completeness issue than a structure problem.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no annotations, no output schema, and 0% parameter description coverage, the definition leaves the agent without enough context about how to supply library/table values or what the returned schema will look like. Sibling names hint at a workflow, but the description itself does not establish it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%: the input schema only gives parameter names and types. The description mentions '表字段' (table fields) but leaves 'library' unexplained, and provides no value formats or how to obtain valid inputs, so it does not compensate for the missing schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description '读取表字段 schema' clearly states a read operation on a table's field schema, with a specific resource and scope. It is distinguishable from siblings like query (data retrieval) and list_tables (table enumeration), though it does not name them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool instead of list_tables or query, and no exclusions or prerequisite steps are mentioned. The intended workflow (first list libraries/tables, then fetch schema) is only inferable from sibling names, not stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_librariesA
列出根目录内的 OpenSheet 库
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It clearly indicates a read-only listing operation scoped to the root directory, but it does not disclose details such as pagination, sorting, whether nested libraries are included, or what the response shape is. For a no-parameter list operation, this is adequate but minimal.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence that immediately communicates the action and scope. There is no filler or redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the zero-parameter schema and no output schema, the description is nearly sufficient: it names the action, resource, and scope. Minor gaps include no statement about non-recursive behavior or return format, but the tool is simple enough that these are not critical.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no schema burden to compensate for. The description appropriately focuses on output scope rather than parameter details, matching the baseline for parameterless tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('列出') and a specific resource ('根目录内的 OpenSheet 库'), clearly distinguishing this from siblings like list_tables, which lists tables rather than libraries. The scope 'root directory' adds useful precision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states what the tool does but gives no guidance on when to choose it over alternatives, nor any exclusions or prerequisites. An agent must infer from sibling names and the description that this is the tool for listing libraries, not tables or schemas.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tablesB
列出库里的 JSONL 表
| Name | Required | Description | Default |
|---|---|---|---|
| library | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears the full burden. The verb '列出' implies a read-only listing operation, but the description does not disclose output format, pagination, error behavior, or whether any library validation occurs. It is minimally transparent but not richly so.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no redundant words. The operation and scope are front-loaded, making it easy to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required parameter and no output schema, the description gives only minimal context. It does not explain what a 'JSONL 表' is exactly, what the agent should do with the returned list, or how to obtain a valid library value. The ambiguity around 'JSONL' and library selection leaves meaningful gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. The phrase '库里的' clarifies that the 'library' parameter identifies which library's tables are listed. However, it does not explain valid library identifier formats, whether values come from list_libraries, or how missing/invalid libraries are handled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the operation ('列出' / list) and the resource ('JSONL 表' / tables) scoped to a library. It is easily distinguished from siblings like list_libraries, though it does not explicitly name the sibling it differs from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus siblings such as get_schema, query, or list_libraries. The description only states what it does, not when it should be chosen or what prerequisite steps (like selecting a library) are needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
queryB
用只读 DuckDB SQL 查询表
| Name | Required | Description | Default |
|---|---|---|---|
| sql | Yes | ||
| table | Yes | ||
| library | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose the critical read-only trait, which is essential for an agent to know this tool will not mutate data. It says nothing about return shape, SQL restrictions beyond read-only, error behavior, or permission requirements, so transparency is partial rather than complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler. The key behavioral qualifier 'read-only' is front-loaded, and every word contributes meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three required parameters, zero schema descriptions, and no annotations, the description is too sparse. An agent still lacks clarity about the 'library' parameter, whether results are returned in a specific format, and what SQL constructs are allowed beyond the read-only restriction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and the description adds little to parameter meaning beyond what the parameter names already imply. 'sql' and 'table' are self-explanatory, but 'library' remains ambiguous and there is no guidance on how the three parameters relate or what format the SQL should follow.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action—querying tables via DuckDB SQL—and explicitly marks it as read-only, which distinguishes it from upsert_rows. It does not explicitly name sibling tools or contrast its scope with list/get_schema tools, so it is clear but not maximally differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The read-only qualifier implies this tool is for SELECT-style data retrieval and not for modifications, giving some usage direction. However, it does not explicitly state when to choose this over list_libraries, list_tables, or get_schema, leaving the routing mostly to inference from the tool name and siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upsert_rowsA
按指定主键批量新增或更新,走与 HTTP 相同的 Store 并发保护。返回回执:inserted / updated / unchanged 计数与各自的主键值列表。dry_run=true 只算回执不落盘。
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | ||
| rows | Yes | ||
| table | Yes | ||
| dry_run | No | 只返回将发生的变更,不写文件 | |
| library | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for behavior disclosure, and it delivers: it mentions Store concurrency protection, the exact receipt format (inserted/updated/unchanged counts and key lists), and the no-persistence behavior of dry_run=true. It does not cover error or validation behavior, but the most decision-relevant side effects are explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences cover the core operation, concurrency protection, return receipt, and dry-run behavior. The most essential verb and scope are front-loaded with no redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description compensates for the missing output schema by stating the receipt shape, and it covers the operation's key nuances. It lacks row-structure details and failure semantics, which would help for a 5-parameter mutation tool, but it is sufficiently complete for a competent agent to call the tool correctly in the common case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 20%, with only dry_run documented. The description adds meaning by identifying key as the primary key, rows as the batch payload, and clarifying dry_run semantics. However, it does not explain how rows should encode the key or what values library/table expect, leaving part of parameter construction to inference.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with '按指定主键批量新增或更新', a specific verb (upsert) and a clear resource (rows keyed by primary key). This immediately distinguishes it from the read-only and metadata sibling tools like query and list_tables, so an agent can tell what it does without needing more context.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description conveys that the tool is for batch insert-or-update operations by primary key and even highlights the dry_run inspection mode. However, it never explicitly contrasts it with alternatives such as query for reads or states when not to use it. The usage context is clear but the tool-selection guidance is only implied, not spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
get_schema - First observed
list_libraries - First observed
list_tables - First observed
query - First observed
upsert_rows
TDQS
Scored across 5 tools
Each tool maps to a distinct action and resource level: libraries, tables, schema, query, and upsert. There is no meaningful overlap, and the descriptions reinforce the boundaries clearly.
Most tool names follow a clear verb_noun snake_case pattern: list_libraries, list_tables, get_schema, upsert_rows. The single-word 'query' is a minor deviation, but the overall naming style remains uniform and predictable.
Five tools is well-scoped for an OpenSheet data access server. Each tool covers a necessary step in the workflow without redundancy or bloat.
The set covers the core workflow well: discovering libraries, listing tables, inspecting schema, querying data, and upserting rows. The main gap is the lack of any delete or schema-mutation capability, but that may be intentionally out of scope for this server.
Maintenance
Related MCP Connectors
Every spreadsheet is a table: Excel, CSV, Parquet and JSON as SQL tables for AI agents.
The all-in-one data stack for agents. Upload files, run SQL, evolve tables, and render charts.
Store, query, and update structured data from any AI agent
Push CSV, JSON, JSONL or Parquet from your agent and get a link a human can explore.
Related MCP Servers
- AlicenseAqualityCmaintenanceTurns a folder of CSV, Parquet, and JSON files into a single SQL-queryable source for AI agents, supporting JOINs across files with read-only sandboxed access.622 PyPI2MIT
- AlicenseAqualityDmaintenanceEnables AI assistants to read, write, query, and manage JSON data files with automatic ID and timestamp generation.614 npm1MIT
- AlicenseBqualityDmaintenanceEnables AI agents to interact with local SQLite databases with full CRUD, schema introspection, foreign key relations, generated columns, and multi-format import/export (CSV, JSON, XLSX) through natural language.269 npmMIT
- FlicenseNot gradedqualityCmaintenanceEnables AI agents to keep structured, typed records in SQLite sheets with stable row ids, versions, and per-write audit history, so data survives across sessions and multiple agents. Lookups are fuzzy with an explicit match status, writes are version-checked and dry-run by default, and sheets can be created, queried, searched, and analyzed through MCP tools.-