{"apiVersion":"v1","directorySlug":"yaks-mcp-8128d4e24c","title":"yaks.app","description":"Build a yaks app by asking Claude or ChatGPT. Your assistant builds it, and yaks.app keeps it online. Save things, invite friends, and open it on any phone.","pageUrl":"https://www.mcpbundles.com/skills/yaks-mcp-8128d4e24c","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://yaks.fyi/mcp","hostedMcpUrl":null,"toolCount":63,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"fyi.yaks/yaks-mcp-8128d4e24c","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"graph_query","description":"Find stored records (entities) by filtering on their named groups of fields (components) and their properties. Returns bundles: JSON objects with entity: {eid} and the record’s component objects. A bundle carries the components the query names, by a filter on one ('.recipe', '.doc.title~=cake') or by asking for one without filtering on it ('?doc'), and no other: name each component you will read, or add * for all of them. A query that names no component ('.entity.eid=T-12', a bare search word) a","inputSchema":{"type":"object","required":["space","app","q"],"properties":{"q":{"type":"string"},"app":{"type":"string"},"limit":{"type":"number"},"space":{"type":"string"},"filters":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"title":"Query entities","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"graph_query","displayName":"Query entities"},{"name":"graph_show","description":"Read one or more stored records (entities) by their unique string id (eid), each returned whole as its own bundle: a JSON object with entity: {eid} and every named group of fields (component) it has. When a bundle shows doc.body, $was.doc.body carries its SHA-256 read token; pass it back on a graph_apply bundle to refuse a concurrent body change (yak graph show prints was:). Only the entities asked for come back; what references one is a query of its own, graph_query with .refs=<id>, and a relat","inputSchema":{"type":"object","required":["space","app","ids"],"properties":{"app":{"type":"string"},"ids":{"ref":"entity","type":"array","items":{"type":"string"}},"space":{"type":"string"}},"additionalProperties":false},"title":"Show entities","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"graph_show","displayName":"Show entities"},{"name":"graph_schema","description":"Read this store’s vocabulary (schema): each component is a named group of fields attached to an entity, a stored record; its properties are those fields. Returns markdown to read and, as structured content, one JSON Schema document with each component’s entry under $defs, the same shape as a vocab.json. It answers at one of three levels of detail. With no arguments: the index, every component with its meaning and each property’s type. With component (one name or several): that component in full,","inputSchema":{"type":"object","required":["space","app"],"properties":{"app":{"type":"string"},"kind":{"type":"string"},"space":{"type":"string"},"component":{"anyOf":[{"type":"string"},{"type":"array","items":{"type":"string"}}]}},"additionalProperties":false},"title":"Read the schema","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"graph_schema","displayName":"Read the schema"},{"name":"search","description":"Search indexed text by words and, where an embedding index is configured, by meaning. Results are ranked compact bundles: entity gives the id; query-only hit gives the title, kind, excerpt and source (text, meaning or both). In a text excerpt, \\u0001 and \\u0002 mark the start and end of matched words. Use graph_show to read an entity whole. Documentation: https://yaks.app/docs/querying.","inputSchema":{"type":"object","required":["space","app","words"],"properties":{"app":{"type":"string"},"limit":{"type":"number"},"space":{"type":"string"},"words":{"type":"string","search":true}},"additionalProperties":false},"title":"Search text","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search","displayName":"Search text"},{"name":"space_new","description":"Create another space, a group of apps sharing an address and membership, at <slug>.yaks.fyi, with the signed-in person as its owner. Signing in already gave them one; this makes a second. Pass a slug (the short name in the URL) and optionally a display title. Returns the space name, entity id and URL. Other tools infer the space when only one fits; specify space when more than one could match.","inputSchema":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string"}},"additionalProperties":false},"title":"Create a space","logicalName":"space_new","displayName":"Create a space","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"space_set","description":"Change a space's name or move it to another address. The title is its name; the slug is its address, so changing the slug moves the space to <new>.yaks.fyi. Every app in it moves with it, files and data included, and each app keeps its own path under the new address. The old address keeps working: it redirects to the new one, path included, so an existing link still opens the same page, and email to <old>.<app>@yaks.fyi still arrives. The old address also stays reserved: nobody else can take it,","inputSchema":{"type":"object","properties":{"slug":{"type":"string"},"space":{"type":"string"},"forget":{"type":"string"}},"additionalProperties":false},"title":"Rename or move a space","logicalName":"space_set","displayName":"Rename or move a space","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"space_delete","description":"Delete a space: it goes to the trash for 30 days. Every app in it stops answering, its address stops serving and its apps disappear from your tools, but nothing is erased, the address is held, and space_restore brings the whole space back within those 30 days. After that the platform erases it: the apps, everything they saved, their files, any domain attached to them, and the address becomes available again. This tool cannot delete the space itself: it emails the space's owner a confirmation lin","inputSchema":{"type":"object","required":["space"],"properties":{"space":{"type":"string"},"forever":{"type":"boolean"}},"additionalProperties":false},"title":"Delete a space","logicalName":"space_delete","displayName":"Delete a space","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"space_restore","description":"Bring back a space that was deleted. Every app in it serves again at the address it always had, its tools and pages come back, and everything it saved is exactly as it was; nothing is touched while a space sits in the trash. Works within 30 days of the delete being confirmed; after that the space has been erased and there is nothing to bring back. Unlike space_delete, restoring needs no confirmation email. The caller must still be the space owner. Pass the deleted space's slug; returns its resto","inputSchema":{"type":"object","required":["space"],"properties":{"space":{"type":"string"}},"additionalProperties":false},"title":"Restore a deleted space","logicalName":"space_restore","displayName":"Restore a deleted space","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"space_sell","description":"Connect this space to Stripe so its apps can take payments. Requires the Plus plan and the space owner. The tool returns a link where the person finishes setting up with Stripe (their name, their bank account, whatever Stripe asks); all of that happens at Stripe, and yaks.app never sees or holds any of it. They are the merchant: the charge, the money, the name on the customer's statement, and any refunds and disputes are theirs. Nobody can sell until the person has finished at Stripe, and callin","inputSchema":{"type":"object","properties":{"space":{"type":"string"},"disconnect":{"type":"boolean"}},"additionalProperties":false},"title":"Connect Stripe to a space","logicalName":"space_sell","displayName":"Connect Stripe to a space","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_new","description":"Create a new app, served at <space>.yaks.fyi/<slug>/. Pass its slug and optionally a display title. Creating it does not choose a front page for the space; the owner can do that with app_set(home: true). app_files writes its files and app_deploy releases a version. Pass access when the app is for other people too: 'open' if anyone with the link should be able to write to it (vote, add a line, sign up), and 'private' if only the person and whoever they invite (member_add) should see it at all. Th","inputSchema":{"type":"object","required":["slug","title"],"properties":{"slug":{"type":"string"},"space":{"type":"string"},"access":{"type":"string"}},"additionalProperties":false},"title":"Create an app","logicalName":"app_new","displayName":"Create an app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_files","description":"Write the app's files (index.html and any css, js or images beside it), or list, read or delete them. files: [{path, content}, …] writes a whole app in one call, with op left out; path and content write one file, and base64 in place of content writes one that is not text (an image, the .wasm a worker.js imports). Edits stay private until app_deploy releases them with the app's vocabulary and worker; released files serve at <space>.yaks.fyi/<app>/<path>, index.html for the directory. An app's dat","inputSchema":{"type":"object","required":["app"],"properties":{"at":{"type":"string"},"op":{"type":"string"},"app":{"type":"string"},"sha":{"type":"string"},"url":{"type":"string"},"find":{"type":"string"},"path":{"type":"string"},"files":{"type":"array","items":{"type":"object"}},"space":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"replace":{"type":"string"}},"additionalProperties":false},"title":"Read or write app files","logicalName":"app_files","displayName":"Read or write app files","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sandbox_shell","description":"Run one command in this space's build sandbox, a Linux container for what a browser cannot do alone: compile to WebAssembly, run a generator, minify an asset. html, css and js need none of it. Installed: Rust 1.98.1 with wasm32-unknown-unknown, wasm-bindgen 0.2.128 and wasm-opt 132; Python 3.13.15 with pip; Go 1.27.1; Zig 0.16.0, also the C and C++ compiler (`zig cc -target wasm32-freestanding -nostdlib -Wl,--no-entry` makes a module a browser loads with no glue code, -target wasm32-wasi one a W","inputSchema":{"type":"object","required":["command"],"properties":{"space":{"type":"string"},"command":{"type":"string"},"timeout":{"type":"number"}},"additionalProperties":false},"title":"Run a build command","logicalName":"sandbox_shell","displayName":"Run a build command","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sandbox_wait","description":"Wait for a command sandbox_shell left running in this space's build sandbox, by the process id its answer gave. Returns the exit code and the last 40 lines of output, stdout then stderr, or says it is still running when timeout milliseconds pass (default 60000). Waiting keeps the sandbox awake, metered by the second as with sandbox_shell. Documentation: https://yaks.fyi/docs/code.","inputSchema":{"type":"object","required":["process"],"properties":{"space":{"type":"string"},"process":{"type":"string"},"timeout":{"type":"number"}},"additionalProperties":false},"title":"Wait for a build command","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"sandbox_wait","displayName":"Wait for a build command"},{"name":"sandbox_stop","description":"Stop a command sandbox_shell left running in this space's build sandbox, by the process id its answer gave, and return its exit code. Waking the sandbox is metered by the second, as with sandbox_shell. Nothing to undo: what it already wrote to the sandbox stays, and sandbox_shell runs it again. Documentation: https://yaks.fyi/docs/code.","inputSchema":{"type":"object","required":["process"],"properties":{"grace":{"type":"number"},"space":{"type":"string"},"process":{"type":"string"}},"additionalProperties":false},"title":"Stop a build command","logicalName":"sandbox_stop","displayName":"Stop a build command","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sandbox_read","description":"Read one file out of this space's build sandbox: a generated source, a build log, whatever the last command left behind. Waking the sandbox is metered by the second, as with sandbox_shell. Pass a path relative to /workspace. Returns file text, truncated after 8,000 characters; sandbox_shell can inspect a large or binary file with a command. Documentation: https://yaks.fyi/docs/code.","inputSchema":{"type":"object","required":["path"],"properties":{"path":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Read a build file","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"sandbox_read","displayName":"Read a build file"},{"name":"sandbox_write","description":"Write one file inside this space's build sandbox: a Cargo.toml, a src/lib.rs, whatever the build needs. These are not the app's files: nothing here is served, and files are temporary, not durable app storage. app_files stages what app_deploy will serve; sandbox_ship copies a built artifact from the sandbox into the app. Waking the sandbox is metered by the second, as with sandbox_shell. Pass a sandbox path and nonempty text; this overwrites that path without file history and returns the path wri","inputSchema":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string"},"space":{"type":"string"},"content":{"type":"string"}},"additionalProperties":false},"title":"Write a build file","logicalName":"sandbox_write","displayName":"Write a build file","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"sandbox_ship","description":"Copy what the build produced into the app's draft: name the files in the sandbox (pkg/*.wasm, pkg/*.js) and each is written beside index.html under its own filename, as if app_files had written it. The app keeps the artifact independently of the temporary sandbox. This call does not itself destroy the sandbox. Binary files are copied as bytes, so a .wasm arrives intact. Waking the sandbox is metered by the second, as with sandbox_shell. To undo: these are written through app_files, so each keeps","inputSchema":{"type":"object","required":["app","paths"],"properties":{"app":{"type":"string"},"paths":{"type":"array","items":{"type":"string"}},"space":{"type":"string"}},"additionalProperties":false},"title":"Copy build output into the app","logicalName":"sandbox_ship","displayName":"Copy build output into the app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_deploy","description":"Release the app's staged files as a version: files, vocabulary and worker begin serving together, and error reports name this version. Send base as the live version the files were made on (app_files returns version). When base is behind, the answer names the files this draft would remove or replace and keeps it unreleased; after reviewing them, repeat with the same base and confirm: true. Leaving base out releases as usual. reload: required marks a contract change open pages must reload to use;","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"base":{"type":"number"},"space":{"type":"string"},"reload":{"type":"string"},"confirm":{"type":"boolean"}},"additionalProperties":false},"title":"Release a version","logicalName":"app_deploy","displayName":"Release a version","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_load","description":"Write a data file the app already contains into the app's store, now. path is a file (data/cities.json) or a folder, loading every *.json and *.csv under it. A JSON file holds a list of bundles, as seed.json and graph_apply take: [{\"entity\": {\"eid\": \"$a\"}, \"doc\": {\"title\": \"…\"}}]. For a CSV, `as` names the component a row becomes: as: \"city\" with headers name,country writes city{name, country} per row, converted to the types vocab.json declares (an object or array cell is JSON); `title` and `bod","inputSchema":{"type":"object","required":["app","path"],"properties":{"as":{"type":"string"},"app":{"type":"string"},"map":{"type":"object"},"part":{"type":"number"},"path":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Load a data file into the store","logicalName":"store_load","displayName":"Load a data file into the store","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_versions","description":"List the newest 20 kept deploys, newest first, their dates and file changes, which version is live, and recorded pointer moves (from, to, when, by whom and through which session). All deploys are kept; the total is reported, and any kept version can be selected by app_rollback. Documentation: https://yaks.fyi/docs/errors.","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"List app versions","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"app_versions","displayName":"List app versions"},{"name":"app_rollback","description":"Move the live pointer to a kept version without minting a new version. Its files, vocabulary, commands and worker become live together, and the move is recorded. Leave version out for the deploy before the live one, or name any kept version from app_versions, including a newer one to undo a rollback. Existing data rows are not restored or deleted. Returns the version now live, URL and changed files. Documentation: https://yaks.fyi/docs/errors.","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"},"version":{"type":"number"}},"additionalProperties":false},"title":"Roll back to an earlier version","logicalName":"app_rollback","displayName":"Roll back to an earlier version","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_restore","description":"Put everything the app has saved back to how it was at a moment: the whole store, every row of it, as of that time. For a write that went wrong: a bad import, rows deleted by mistake, a change that turned out to be wrong. Cloudflare keeps the last 30 days of the store, so any moment in those 30 days can be restored; at is that moment, as a timestamp (2026-09-06T14:20:00Z). Called with no at, it reports the oldest moment still available and every restore already made. It is reversible: where the","inputSchema":{"type":"object","required":["app"],"properties":{"at":{"type":"string"},"app":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Restore the store to a point in time","logicalName":"store_restore","displayName":"Restore the store to a point in time","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_trace","description":"Platform-admin only. Record the next N requests to an app's Store into its space's tracker. next is 0..100; optional rate sets ordinary-request sampling probability from 0 to 1. Threshold traces are retained above 10,000 rows read or written. The setting lasts for this Store incarnation; eviction clears it. The reply says whether queue delivery is available. This does not make synthetic app requests.","inputSchema":{"type":"object","required":["app","next"],"properties":{"app":{"type":"string"},"next":{"type":"number"},"rate":{"type":"number"},"space":{"type":"string"}},"additionalProperties":false},"title":"Record the next Store requests","logicalName":"store_trace","displayName":"Record the next Store requests","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_inspect","description":"Show bounded table row counts and index names for an app's store. Name eid for bounded physical identity, tombstone and component-table presence, without component values. Name seq to dry-run one held write and report phase durations and bundle count. Only the space owner can inspect it. The dry run rolls back every graph batch; this tool never retries or applies the write.","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"eid":{"type":"string"},"seq":{"type":"number"},"space":{"type":"string"}},"additionalProperties":false},"title":"Inspect store size and dry-run cost","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"store_inspect","displayName":"Inspect store size and dry-run cost"},{"name":"store_writes","description":"List writes the named app's store still holds, including interrupted writes that a storage reset stopped. Name seq to inspect one write's original body and final outcome. Set recent to list the newest 100 writes, including applied writes, with a kernel flag but never request headers. Only the space owner can inspect these private writes. Nothing is retried.","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"seq":{"type":"number"},"space":{"type":"string"},"recent":{"type":"boolean"}},"additionalProperties":false},"title":"Inspect kept store writes","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"store_writes","displayName":"Inspect kept store writes"},{"name":"store_retry","description":"Explicitly retry one interrupted or unreviewed write by its seq, after inspecting its body and fixing the cause of interruption. Only the space owner can retry. The store keeps the original body, idempotency key, and full final outcome together with the graph batch. A reset may interrupt it again.","inputSchema":{"type":"object","required":["app","seq"],"properties":{"app":{"type":"string"},"seq":{"type":"number"},"space":{"type":"string"}},"additionalProperties":false},"title":"Retry an interrupted store write","logicalName":"store_retry","displayName":"Retry an interrupted store write","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_set","description":"Rename an app, move it to another address, or change who may use it. The title is its name; the slug is its address, so a new slug moves the app, files and data included, to <space>.yaks.fyi/<new>/, and the old address redirects there. access is app_new's choice: 'public' (the default: anyone reads, members with write permission change data), 'open' (everyone with the link writes) or 'private' (members only). home makes this app the space's front page, what <space>.yaks.fyi/ opens; no app is the","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"home":{"type":"boolean"},"slug":{"type":"string"},"first":{"type":"array","items":{"type":"string"}},"space":{"type":"string"},"access":{"type":"string"},"forget":{"type":"string"},"gallery":{"type":"boolean"},"sandboxed":{"type":"boolean"},"screenshot":{"type":"string"},"theme_color":{"type":"string"},"background_color":{"type":"string"}},"additionalProperties":false},"title":"Rename, move or reshare an app","logicalName":"app_set","displayName":"Rename, move or reshare an app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_delete","description":"Delete an app: it goes to the trash for 30 days. Its address stops answering, its tools and pages disappear from your tools, and it stops being the front page, but its files, everything it saved and its slug are all kept, and app_restore brings the whole app back within those 30 days. After that the platform erases it for good. app_files op: delete removes one file, and app_set moves an app rather than replacing it. A platform admin may trash any app. Only the space owner may use forever: true,","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"},"forever":{"type":"boolean"}},"additionalProperties":false},"title":"Delete an app","logicalName":"app_delete","displayName":"Delete an app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_restore","description":"Bring back an app that was deleted. It serves again at the address it always had, its tools and pages come back, and everything it saved is exactly as it was; nothing is touched while an app sits in the trash. A platform admin may restore any app. Works within 30 days of app_delete; after that it has been erased and there is nothing to bring back. app_list shows what is in the trash and how long each app has left. Pass the deleted app slug (and its space if needed to find it). Returns its restor","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Restore a deleted app","logicalName":"app_restore","displayName":"Restore a deleted app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_errors","description":"List unarchived error reports for the named app: what a page threw in someone's browser, what a request threw on the server, and what the platform reported. Each is a stored record with its own id in the tracker; ids from older app-store reports keep answering. New ones are also appended, once, to the next reply from a tool that changes something; a read-only tool leaves them unseen. `fixed` archives the ids it names, which removes them from this list and from replies; `seen` archives without li","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"seen":{"type":"array","items":{"type":"string"}},"fixed":{"type":"array","items":{"type":"string"}},"space":{"type":"string"}},"additionalProperties":false},"title":"List open errors","logicalName":"app_errors","displayName":"List open errors","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_list","description":"What the person already has here: every app in every space of theirs, with its address, the email address it sends and receives at, the version it is at, how many errors are still open in it, which app is the space's front page, and what the month has cost against what the space is allowed. Deleted apps are listed under Trash with the days each has left, until app_restore brings it back or the 30 days run out. Documentation: https://yaks.fyi/docs.","inputSchema":{"type":"object","properties":{"space":{"type":"string"}},"additionalProperties":false},"title":"List the person's apps","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"app_list","displayName":"List the person's apps"},{"name":"commands","description":"The commands yaks apps declare, with the arguments each one accepts. An app's own commands (the ones its vocab.json declares, and the two every component it holds gets, such as add_recipe and find_recipe) are listed here rather than in this tool list, which is the same for everybody. command runs one of them. Omit app to list all reachable apps, or pass an app slug (space/app if ambiguous). The result groups commands by app and says whether each reads or writes. Documentation: https://yaks.fyi/d","inputSchema":{"type":"object","properties":{"app":{"type":"string"}},"additionalProperties":false},"title":"List app commands","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"commands","displayName":"List app commands"},{"name":"command","description":"Run one of an app's own commands: name it and pass its arguments as args, exactly as commands lists them. app is only needed when two apps here declare the same command name. The command runs through the app's ordinary API endpoints as the person calling it, so it can do what they could do on the page and never more. To undo whatever it wrote: store_restore, to the moment just before it ran. Returns the command result from the app. Its description in commands says what it does; restoring data ca","inputSchema":{"type":"object","required":["name"],"properties":{"app":{"type":"string"},"args":{"type":"object"},"name":{"type":"string"}},"additionalProperties":false},"title":"Run an app command","logicalName":"command","displayName":"Run an app command","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"domain_attach","description":"Serve a domain the person already owns, example.com instead of yourname.yaks.fyi. Name an app and that app answers at the root of the domain; leave app out and the whole space answers there, exactly as it does at <space>.yaks.fyi: the front page at /, every app at /<app>/. A space and each of its apps can have their own domain at the same time. The tool registers the hostname here and returns the DNS record the person has to add where their domain is managed, in the response text: type, name, va","inputSchema":{"type":"object","required":["hostname"],"properties":{"app":{"type":"string"},"space":{"type":"string"},"hostname":{"type":"string"}},"additionalProperties":false},"title":"Attach a custom domain","logicalName":"domain_attach","displayName":"Attach a custom domain","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"domain_status","description":"How far a domain has come, and what it points at: the space, or one of its apps. Whether the DNS record has arrived, whether Cloudflare has accepted the hostname, and whether the certificate is issued, each reported specifically enough to tell the person what is still waiting on them. It is read from Cloudflare, not from what was last recorded here. Leave hostname out to check every domain in the space. After domain_attach, the record, the hostname and the certificate arrive over a few minutes;","inputSchema":{"type":"object","properties":{"space":{"type":"string"},"hostname":{"type":"string"}},"additionalProperties":false},"title":"Check a domain","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"domain_status","displayName":"Check a domain"},{"name":"domain_detach","description":"Stop serving at a domain, whether it served a space or one app. The hostname is released back to Cloudflare and what it served is untouched: it still answers at its <space>.yaks.fyi address, and its data and files are not involved. The person's DNS record is theirs to remove wherever their domain is managed; until they do, it points at nothing. Only the space owner may detach. To undo: domain_attach with the same hostname, which starts the certificate again. Returns the detached hostname, the or","inputSchema":{"type":"object","required":["hostname"],"properties":{"space":{"type":"string"},"hostname":{"type":"string"}},"additionalProperties":false},"title":"Detach a custom domain","logicalName":"domain_detach","displayName":"Detach a custom domain","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_publish","description":"Publish this app so anyone in any other space can install it by name. Someone else then calls app_install and gets their own copy: their own store, their own address, their own data from the first byte, pinned to the version you published; nothing is shared but the code. The name is platform-wide, so it is the app's slug unless that is taken, and a taken name is refused. Publishing again publishes whatever is deployed now under the name it already has; a name is claimed once, and only an explici","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"name":{"type":"string"},"about":{"type":"string"},"space":{"type":"string"},"gallery":{"type":"boolean"}},"additionalProperties":false},"title":"Publish an app for others to install","logicalName":"app_publish","displayName":"Publish an app for others to install","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_unpublish","description":"Stop offering the app for install. It stays exactly as it is, and so does every copy anyone installed, since their data is theirs, but nobody new can install it, and the name is free again. It leaves the gallery at the same moment, if it was on it. Only the space owner may unpublish. To undo: app_publish, which publishes it again under the same name unless somebody else has taken it meanwhile. Returns a confirmation, including whether its gallery listing or submission was removed. Documentation:","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Unpublish an app","logicalName":"app_unpublish","displayName":"Unpublish an app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_published","description":"What other people have published here, newest first: the name to install by, what the app is, and which space it came from. app_install gives them their own copy of one, with their own data. Pass words to list only the apps whose name, title or description contain them; the match also includes the printed origin and version details. It needs no account: a published app is offered to everybody. The listing includes each source space and app slug, not a guarantee that the source app's own pages ar","inputSchema":{"type":"object","properties":{"words":{"type":"string"}},"additionalProperties":false},"title":"List published apps","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"app_published","displayName":"List published apps"},{"name":"app_install","description":"Take an app somebody published (app_published lists them) and make the person their own copy of it: their own address, their own data store, their own everything from the first byte. Nothing is shared but the code, so what they save is theirs alone and the publisher never sees it. The copy is pinned to the version it was installed from; the publisher's next version does not arrive on its own, and app_update moves the copy forward while keeping their data. Pass the published name and optionally a","inputSchema":{"type":"object","required":["name"],"properties":{"as":{"type":"string"},"name":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Install a published app","logicalName":"app_install","displayName":"Install a published app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"app_update","description":"Move an installed app to whatever version its publisher offers now. The person's data stays: every row they saved is theirs and is not touched. Only the code is replaced, so anything you wrote into the copy yourself is replaced too. A vocab.json schema that only added properties is applied to their store; one that would retype a property their rows were written under is refused, and nothing moves. It reports what changed. To undo: app_rollback, since the update goes out as a version like any oth","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Update an installed app","logicalName":"app_update","displayName":"Update an installed app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"member_add","description":"Invite someone by email address: an editor writes, a viewer only reads, and a space owner may also invite. Name the app and that one app is all they get, its page and its data (how a player joins one game, or a household one list); leave it out and they join the space, reaching every app in it. They are mailed an invitation, and nothing is theirs until they accept with its one click, signed in with that address. note puts the person's own line or two at the top of that email, quoted as theirs (\"","inputSchema":{"type":"object","required":["email"],"properties":{"app":{"type":"string"},"name":{"type":"string"},"note":{"type":"string"},"role":{"type":"string"},"email":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Invite someone","logicalName":"member_add","displayName":"Invite someone","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"member_remove","description":"Remove a membership, or withdraw an invitation not yet accepted: pass an app slug to revoke its app-specific invitation, or omit app to revoke space-wide membership. Independent app invitations and space-wide membership do not revoke each other. Either way the person keeps their sign-in. Only the space owner may remove, and the last owner cannot be removed, since a space with no owner is one nobody can ever open again. To undo: member_add with the same address, which puts them back where they we","inputSchema":{"type":"object","required":["email"],"properties":{"app":{"type":"string"},"email":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Remove someone","logicalName":"member_remove","displayName":"Remove someone","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"grant","description":"A short-lived token that signs the `yak` CLI in as this person: the same identity and exactly the same access they have here, never more. For working from a terminal, or a script that reaches their apps; the response is the one line to paste. A script sends the token as `authorization: Bearer <token>` to an app's own endpoints, so a dataset already in your own environment goes into a store by POSTing it as NDJSON to the app's ./api/apply, never typed into a tool call (https://yaks.fyi/docs/store","inputSchema":{"type":"object","properties":{"hours":{"type":"number"},"space":{"type":"string"},"revoke":{"type":"string"}},"additionalProperties":false},"title":"Create a CLI token","logicalName":"grant","displayName":"Create a CLI token","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"feedback","description":"Send feedback about yaks.app itself: this connector, its tools, its documentation, the way an app is built or served. A bug, a rough edge, a step that took three tries, a confusing answer, a wish, a feature idea, a thing that went well. Not for the app being built for the person: an error inside their own app is listed by app_errors. A report carries what the person said, in their words, and what was tried and what happened; who they are, their space, the app if named, and the versions are attac","inputSchema":{"type":"object","required":["text"],"properties":{"app":{"type":"string"},"text":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Send feedback about yaks.app","logicalName":"feedback","displayName":"Send feedback about yaks.app","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"guide","description":"The guide, read here instead of fetched from the web. With no page: the overview, which says what an app is, how its pages read and write its store, and has a paragraph on every feature there is. It is the map. With a page: the whole of one subject. The pages are store (reading and writing from a page), querying (the filter grammar, with examples), components (the platform's components, and your own), entities (one entity across two apps), wakes (a row that records when to come back, and what ha","inputSchema":{"type":"object","properties":{"page":{"type":"string"}},"additionalProperties":false},"title":"Read the guide","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"guide","displayName":"Read the guide"},{"name":"about","description":"What yaks.app is and what gets made here, in a paragraph: what works signed out, what signing in adds, and where to sign in. Signed in, it also reports who you are signed in as, how (a browser, a connector, a CLI token) and until when, the tools this connector is listing right now, and every app you can reach: its address, what it holds, the notes it keeps and whatever the person has said in that space. Signed out it reads nothing about anybody: the same answer for everyone.","inputSchema":{"type":"object","additionalProperties":false},"title":"What yaks.app is","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"about","displayName":"What yaks.app is"},{"name":"gallery_search","description":"Find an app somebody has already made and shown at https://yaks.fyi/gallery: a recipe box, a sign-up sheet, a tracker. Pass the words the person used. Each result includes the command that gives them their own copy of it, at their own address with their own data. It works signed out too: the gallery is public. Documentation: https://yaks.fyi/docs/sharing.","inputSchema":{"type":"object","properties":{"limit":{"type":"number"},"words":{"type":"string"}},"additionalProperties":false},"title":"Search the gallery","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"gallery_search","displayName":"Search the gallery"},{"name":"app_stats","description":"Return page-view counts for an app: the total over the last 30 days by default, and counts by page, referring site and country. These count page loads, not distinct people. Pass days for a different window, up to 90 days; if analytics is not configured, returns that fact instead. Aggregate counts and nothing else: no visitor is identified, no address and no session is kept, so this can never say who someone was or what one person did. Only the app's own members may ask. Documentation: https://ya","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"days":{"type":"number"},"space":{"type":"string"}},"additionalProperties":false},"title":"App traffic","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"app_stats","displayName":"App traffic"},{"name":"connection_attach","description":"Give an app access to one connected connection its space already owns. Only the space's owner may do this. The app starts members-only, receives a sentinel rather than the credential, and keeps any binding it already asked for. Find the connection id with store_connection_list. No key or token passes through this tool or its answer. Documentation: https://yaks.fyi/docs/code.","inputSchema":{"type":"object","required":["app","connection"],"properties":{"app":{"type":"string"},"space":{"type":"string"},"connection":{"type":"string"}},"additionalProperties":false},"title":"Let an app use an existing connection","logicalName":"connection_attach","displayName":"Let an app use an existing connection","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_memory_save","description":"Save what somebody said, in their own words, as a memory. Words the graph already holds are marked where they are, never copied: pass on to name the entity holding them (a session entry, a comment, a doc), or pass said with feedback naming who said them, and the earliest entity that person wrote holding those words verbatim is marked. Words it cannot place become a new entity, the sentence itself and never your summary of it. A mark never edits the words, and nothing needs approving. context is","inputSchema":{"type":"object","required":[],"properties":{"id":{"type":"string"},"on":{"type":"string"},"was":{"type":"string"},"said":{"type":"string"},"about":{"type":"string"},"scope":{"type":"string"},"space":{"type":"string"},"context":{"type":"string"},"feedback":{"type":"string"}},"additionalProperties":false},"title":"Save a memory","logicalName":"store_memory_save","displayName":"Save a memory","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_memory_recall","description":"Find saved memories by what they are about. Where the server has a vector index, said ranks them by meaning, closest first, whether or not they share its words; without one, said selects the memories containing all its words, newest first. near is an entity id or name whose meaning ranks the results instead, and said then selects by its words. With neither said nor near, returns the newest memories. Results are bundles (JSON objects with entity ids and component fields), each whole: the words wh","inputSchema":{"type":"object","required":[],"properties":{"ids":{"type":"array","items":{"type":"string"}},"near":{"type":"string"},"said":{"type":"string"},"limit":{"type":"number"},"scope":{"type":"string"},"space":{"type":"string"},"feedback":{"type":"boolean"}},"additionalProperties":false},"title":"Recall memories","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"store_memory_recall","displayName":"Recall memories"},{"name":"store_connection_need","description":"Say that an app needs an outside service: an integration by name, and the scopes it asks for. It makes a connection with no credential, owned by a space or a person, which shows them what to connect; no key or token ever passes through this tool. For a service with no built integration, name it and give the hosts its key may be sent to, and a custom integration is made for it. With each, every person who uses the app connects their own instead, and the owner connects nothing. An app that already","inputSchema":{"type":"object","required":["app","owner","integration"],"properties":{"app":{"type":"string"},"each":{"type":"boolean"},"hosts":{"type":"array","items":{"type":"string"}},"owner":{"type":"string"},"space":{"type":"string"},"direct":{"type":"boolean"},"scopes":{"type":"array","items":{"type":"string"}},"binding":{"type":"string"},"integration":{"type":"string"}},"additionalProperties":false},"title":"Say an app needs a connection","logicalName":"store_connection_need","displayName":"Say an app needs a connection","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_connection_list","description":"The connections a space or a person owns, each with its integration, account, scopes and status (needed, connected or broken), and the links from each app that uses one. A handle is shown where a credential is kept; the credential itself never is. Returns bundles: JSON objects with entity ids and component fields.","inputSchema":{"type":"object","required":["owner"],"properties":{"owner":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"List connections","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"store_connection_list","displayName":"List connections"},{"name":"mail_show","description":"Return one mail message in full: its headers, its body, and one-line summaries of the rest of its thread, with this message marked. The text is returned in content.body alongside the opened mark. Reading marks the caller's subscription to the thread opened, which is why this tool writes where graph_show only reads.","inputSchema":{"type":"object","required":["letter","app"],"properties":{"app":{"type":"string"},"space":{"type":"string"},"letter":{"type":"string"}},"additionalProperties":false},"title":"Read a mail message","logicalName":"mail_show","displayName":"Read a mail message","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mail_reply","description":"Write a reply threaded on one message and request that it be sent. It is addressed to the other side of the original (the sender of a received message, or the recipient of one you sent) from the address the original used, with the subject prefixed `Re:`. Replying to a received message archives the caller's subscription to its thread: a thread you have answered is not waiting on you. The configured sender delivers it; a graph with no sender configured records the reply and never sends it. Returns","inputSchema":{"type":"object","required":["letter","body","app"],"properties":{"app":{"type":"string"},"body":{"type":"string"},"space":{"type":"string"},"letter":{"type":"string"}},"additionalProperties":false},"title":"Reply to a mail message","logicalName":"mail_reply","displayName":"Reply to a mail message","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_mail_send","description":"Create a mail message and request that it be sent. It sends from an address this graph holds, through the graph’s own sender, and never from a person’s own mail account: asked to email someone with nothing here named, use whatever mail tool the person has connected. `to` is an email address or the id of an entity in this graph; an address nobody in the graph has becomes a new `email` entity, so the address book grows as mail is sent. `from` defaults to the email address of the entity it is `abou","inputSchema":{"type":"object","required":["to","subject","body","app"],"properties":{"to":{"type":"string"},"app":{"type":"string"},"body":{"type":"string"},"from":{"type":"string"},"about":{"type":"string"},"space":{"type":"string"},"subject":{"type":"string"}},"additionalProperties":false},"title":"Send a mail message","logicalName":"store_mail_send","displayName":"Send a mail message","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mail_check","description":"Check that every received mail message has a sender. Also reports incomplete configuration for a sender this server has configured. A message with a Message-ID but no `from` can never be answered, since a reply has no address to go to. Takes no arguments. Returns a report in content.body, with warning or failure findings when present; it does not repair the records or configuration.","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"space":{"type":"string"}},"additionalProperties":false},"title":"Check the mail","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"mail_check","displayName":"Check the mail"},{"name":"store_builder_build","description":"Build bindings with new or changed inputs, independent of floor and staged. Current outputs are untouched unless --rebuild redoes every selected binding, or --outdated redoes bindings under an older definition. Both combine with --only and --limit. Alternate provider, model, template or native input creates a shadow variant.","inputSchema":{"type":"object","required":["builder","app"],"properties":{"app":{"type":"string"},"only":{"type":"array","items":{"type":"string"}},"input":{"type":"object"},"limit":{"type":"integer","minimum":1},"model":{"type":"string"},"space":{"type":"string"},"builder":{"type":"string"},"rebuild":{"type":"boolean"},"outdated":{"type":"boolean"},"provider":{"type":"string"},"template":{"type":"string"}},"additionalProperties":false},"title":"Build now","logicalName":"store_builder_build","displayName":"Build now","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_builder_supply","description":"Answer one binding's slot with an existing artifact, spending nothing. The binding is current until its own inputs change. A staged builder accepts supply; an archived builder does not.","inputSchema":{"type":"object","required":["builder","for","slot","artifact","app"],"properties":{"app":{"type":"string"},"for":{"type":"string"},"args":{"type":"object"},"slot":{"type":"string","minLength":1},"space":{"type":"string"},"builder":{"type":"string"},"artifact":{"type":"string"}},"additionalProperties":false},"title":"Supply an existing artifact","logicalName":"store_builder_supply","displayName":"Supply an existing artifact","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"store_builder_choose","description":"Make one retained output the take in use for its build and slot, without a call or spending. Other slots stay chosen as they are.","inputSchema":{"type":"object","required":["output","app"],"properties":{"app":{"type":"string"},"space":{"type":"string"},"output":{"type":"string"}},"additionalProperties":false},"title":"Choose an output take","logicalName":"store_builder_choose","displayName":"Choose an output take","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"mail_list","description":"List an app's email records as bundles: JSON objects with entity ids, message text, mail headers and delivery fields when present. Sent mail may later carry delivered{at} or bounced{at, reason}; an absent outcome is not confirmation of delivery. These are the emails an app received at its yaks.app address (<space>.<app>@yaks.fyi), not a person's own mailbox: a question about mail with no app named is about their own mail account, which whatever mail tool they have connected answers. direction se","inputSchema":{"type":"object","required":["app"],"properties":{"app":{"type":"string"},"limit":{"type":"number"},"space":{"type":"string"},"direction":{"enum":["received","sent","all"],"type":"string"}},"additionalProperties":false},"title":"List an app's email","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"mail_list","displayName":"List an app's email"}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=yaks-app&config=eyJ1cmwiOiAiaHR0cHM6Ly95YWtzLmZ5aS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22yaks-app%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fyaks.fyi%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22yaks-app%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fyaks.fyi%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=yaks.app&connectorUrl=https%3A%2F%2Fyaks.fyi%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"yaks-app\" --url \"https://yaks.fyi/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/yaks-mcp-8128d4e24c","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/yaks-mcp-8128d4e24c/tools/{tool}","mcpServerUrl":"https://yaks.fyi/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/yaks-mcp-8128d4e24c?live=1"}