MCP App Store
by KeenEthics

Overview

Quillm is where the work of your agents accumulates. Ask for a dashboard, a tracker, a decision doc or a calculator and it lands at one address your team opens like a doc, with no AI account needed. The numbers live in datasets, separate from the page, so keeping a page current is a single update: "add this week's numbers" adds rows and the page, and every doc that reads the same data, shows them at once. Agents that run on a schedule fill the same datasets every morning, and Quillm flags a dataset as stale when a run is missed. Every save is test-rendered before readers see it, a broken update never replaces a working page, every revision is kept, and every change is signed by the agent that made it.

Tools

check_view

ChatGPT
Test-renders a view in a real headless browser, reviews it, and reports render errors, console errors, which datasets it loaded, and what a reader would still be missing. The review sends a screenshot and the page's text to OpenAI, unless the workspace turned checks off. Set screenshot=true to also get an image so you can judge the layout yourself. create_view and update_view already run this automatically; use this tool when you want the screenshot, after changing a dataset, or to confirm the review is clean before you tell the user it is done.

create_dataset

ChatGPT
Creates a named table that views read with useDataset(name). Define typed columns and a key: the column(s) that uniquely identify a row (e.g. ["month"], or ["date","campaign"]). The key makes updates idempotent: pushing a row with an existing key updates it instead of duplicating it. You can pass initial rows in the same call. Prefer tidy, raw-ish data (one row per month/day/entity with numeric columns) over pre-aggregated text; views compute totals and deltas themselves. Check get_workspace first: if a dataset with this data already exists, add to it with upsert_rows.

create_view

ChatGPT
Creates a new view: a live page at a stable URL in the user's dashboard app. source is ONE file of React (JSX/TSX) that default-exports a component and reads its data with useDataset("dataset_name") from "quillm". Do not embed data in the source; create the dataset first (create_dataset), then the view. Pass the brief: the user's request in their words, and what you asked them and what they answered. If the request does not say who reads the page, what for, and which number matters most, ask the user first; when the brief is thin, the response suggests the questions to ask. Decide the questions next: what the user asked for is the scope, and a small request gets a small page. The view is compiled, test-rendered in a real browser and reviewed immediately: the response tells you whether it rendered, lists errors, and lists what a reader would still be missing, so read it and fix problems with update_view. The checks use two outside services unless the workspace turned them off: TypeSafe reads the brief, and OpenAI reads a screenshot and the page's text. Call get_guide first for the template and available libraries. Check get_workspace first: if a suitable view already exists, use update_view instead.

delete_dataset

ChatGPT
Permanently deletes a dataset and all its rows. Refuses if any view still reads it, unless force=true. Only do this when the user asked for it.

delete_rows

ChatGPT
Deletes rows from a dataset by key, e.g. keys: [{"month": "2026-01"}], or every row with all=true (use before re-loading a dataset from scratch).

delete_view

ChatGPT
Permanently removes a view from the user's workspace. Only do this when the user asked for it.

get_guide

ChatGPT
Returns the complete how-to for Quillm: the view code contract, a working template, the libraries you can import, styling rules, and dataset conventions. Read this once per session before you call create_view or update_view. It is short.

get_view

ChatGPT
Returns one view in full: metadata, agent notes, revision history, the schema of every dataset it reads, and its React source code. Always call this before update_view so your edits match the current source exactly.

get_workspace

ChatGPT
START HERE. Returns everything that exists in the user's Quillm workspace in one compact overview: every view (slug, purpose, datasets it reads, URL, who last changed it), every dataset (columns, key, row count, freshness), workspace notes left by agents, and recent changes. Call this at the start of every task so you extend what exists instead of duplicating it.

open_page

ChatGPT
Shows the user a page inside the chat, live, with today's data, in apps that display pages (ChatGPT); elsewhere it returns the page's link. Call it once, last, when you have finished creating or changing a page or its data (after the review is clean), and when the user asks to see, open or show a page. create_view, update_view and upsert_rows show nothing in the chat themselves. Without a slug, lists every page.

query_dataset

ChatGPT
Reads rows from a dataset so you can inspect or analyse what is stored (e.g. to see the latest month before adding the next one). Supports simple filters, ordering and paging. The response includes the total row count.

report_feedback

ChatGPT
Files a note for Quillm's maintainer that Quillm itself fell short, so it can be improved. The note goes to Quillm's maintainer, a person outside the user's workspace, so include nothing private from the user's data. Call it when: you could not do what the user asked because Quillm lacks a capability; you had to use a workaround (if you changed a column type, reshaped data, or dropped something the user asked for to get past an error, that is a workaround); an error message or the guide was confusing or wrong; or a library/feature you needed is missing. One call per distinct problem, filed as soon as you recognise it (before asking the user a follow-up question, not at the end: the conversation may never get there). Still finish the task as well as you can and tell the user about the limitation. Do NOT use it for problems with the user's data or request, for your own coding mistakes that the render check caught, or for praise.

share_view

ChatGPT
Changes who can open a page: "collection" (people with access to its collection, the default), "workspace" (everyone in the workspace) or "link" (anyone with the link, no account needed, read-only; embeddable in Notion or a wiki). Use it when the user asks you to share a page or to give them a link to send. Returns the link. Only when the user asked: a link makes the page and the data it shows readable by whoever has it.

update_dataset

ChatGPT
Changes a dataset's schema or metadata: add columns, remove columns, fix a column's description or type (update_columns), change the description or update cadence. Keep descriptions true: when you start storing a new category or scenario, update the column description that lists them. Existing rows keep their values; new columns are null until you upsert values. The key cannot be changed; create a new dataset for that.

update_view

ChatGPT
Changes an existing view's code or metadata. Pass expected_revision (the revision get_view showed you) so you never overwrite a change another agent made in the meantime. Prefer edits (exact string replacements, like a find-and-replace; each old_string must match the current source exactly and be unique) for targeted changes such as adding a chart. Use source only for a full rewrite, or restore_revision to roll back. Every call creates a new revision, is test-rendered and reviewed; a revision that fails its render check is NOT published (readers keep the last working one) and your next edits apply to it. The review sends a screenshot and the page's text to OpenAI, unless the workspace turned checks off. When a follow-up request replaces an earlier approach (a better burn figure, a new default), replace the old blocks instead of keeping both: revisions make removal safe. Call get_view first to get the current source. To change only the numbers a view shows, do NOT use this tool: use upsert_rows on the dataset.

upsert_rows

ChatGPT
Adds or updates rows in a dataset. This is how you "add new data" or "correct a number": every view reading the dataset shows the change immediately, with no view edit needed. Rows are matched on the dataset's key columns: a new key inserts, an existing key is merged (only the columns you send are overwritten). Safe to re-run. Values must match the column types (number columns take JSON numbers, not strings like "$1,200"; date columns take ISO strings like "2026-03-01" or "2026-03"). Unknown or not applicable is null, never "" or 0. It writes only to this Quillm workspace and calls no other service.

write_notes

ChatGPT
Saves durable notes for future agents (including yourself in a later session, with no memory of this one). Use it to record what is NOT obvious from the code: where the data comes from and how to refresh it (queries, API calls, file paths), definitions ("MRR excludes one-off invoices"), and user preferences ("Kev wants EUR, weekly granularity"). Notes attach to a view, a dataset, or the whole workspace, and are shown in get_workspace / get_view. Replaces the previous notes for that target, so include what should be kept.

Capabilities

WritesInteractive

Example Prompts

Click any prompt to copy it.

Similar Apps