Build, deploy and share small full-stack team apps from your AI chat. No account needed to start.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Runs one query, mutation or action of a deployed app and returns its result and the log lines it wrote, so you can test what you deployed. It runs as the connected person (as: "me", the default), never as anyone else; as: "guest" runs it as a guest visitor and only works on public apps. On a preview deployed without an account every call runs as one guest. Mutations and actions change real data. Only for apps the person owns or administers.
Which kind of handler name is.
Handler name as declared in server/index.ts.
Who the handler sees in ctx.auth. Default "me".
The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use.
Arguments: an array of positional values, or one object for handlers that take an object (tool handlers). Default: no arguments.
The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only.
The server marks this tool as destructive. Running it may delete or overwrite data on the server or in any account you connected with your headers.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http fuast https://fuast.com/mcp
Runs one query, mutation or action of a deployed app and returns its result and the log lines it wrote, so you can test what you deployed. It runs as the connected person (as: "me", the default), never as anyone else; as: "guest" runs it as a guest visitor and only works on public apps. On a preview deployed without an account every call runs as one guest. Mutations and actions change real data. Only for apps the person owns or administers.
| Argument | Type | Description |
|---|---|---|
| as | string | Who the handler sees in ctx.auth. Default "me". |
| app | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| args | any | Arguments: an array of positional values, or one object for handlers that take an object (tool handlers). Default: no arguments. |
| kind* | string | Which kind of handler name is. |
| name* | string | Handler name as declared in server/index.ts. |
| edit_token | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
{
"type": "object",
"required": [
"kind",
"name"
],
"properties": {
"as": {
"enum": [
"me",
"guest"
],
"type": "string",
"description": "Who the handler sees in ctx.auth. Default \"me\"."
},
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"args": {
"anyOf": [
{
"type": "array"
},
{
"type": "object"
}
],
"description": "Arguments: an array of positional values, or one object for handlers that take an object (tool handlers). Default: no arguments."
},
"kind": {
"enum": [
"query",
"mutation",
"action"
],
"type": "string",
"description": "Which kind of handler name is."
},
"name": {
"type": "string",
"maxLength": 128,
"minLength": 1,
"description": "Handler name as declared in server/index.ts."
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
}
},
"additionalProperties": false
}Builds the files, type checks them and loads the server in a sandbox, without deploying anything. Returns ok with the queries, mutations, tables and tools the app declares, or ok false with diagnostics that carry file, line and message. Call it before deploy_app and fix every diagnostic.
| Argument | Type | Description |
|---|---|---|
| files* | object | The whole app as {"relative/path": "file content"}. server/index.ts and client/index.tsx are required. Text files only (.ts .tsx .js .jsx .mjs .json .md .svg .txt .css .html). |
{
"type": "object",
"required": [
"files"
],
"properties": {
"files": {
"type": "object",
"description": "The whole app as {\"relative/path\": \"file content\"}. server/index.ts and client/index.tsx are required. Text files only (.ts .tsx .js .jsx .mjs .json .md .svg .txt .css .html).",
"minProperties": 1,
"additionalProperties": {
"type": "string"
}
}
},
"additionalProperties": false
}Deletes an app and everything in it: its data, stored files, deploys, schedules and custom domains. This cannot be undone. Only the app's owner can do it, and confirm must repeat the app's slug. Do this only when the person explicitly asks for the app to be deleted.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| confirm* | string | The app's slug again, to confirm. |
{
"type": "object",
"required": [
"app",
"confirm"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"confirm": {
"type": "string",
"maxLength": 63,
"description": "The app's slug again, to confirm."
}
},
"additionalProperties": false
}Deploys the files and returns the app's URL. With a connected fuast account it creates a new private app in the person's workspace, or updates the app named in app. Without an account it deploys a temporary preview and returns preview_url, claim_url and edit_token: give the person claim_url so they can make the app theirs, and pass edit_token to later calls to keep working on it. Send every file each time; use update_app_files to change a few. A failed build returns diagnostics with file and line and deploys nothing.
| Argument | Type | Description |
|---|---|---|
| app | string | Slug of an existing app in the connected account to update. Leave out to create a new app. |
| name | string | Name of a new app. Its address is derived from it. Ignored when updating an app. |
| files* | object | The whole app as {"relative/path": "file content"}. server/index.ts and client/index.tsx are required. Text files only (.ts .tsx .js .jsx .mjs .json .md .svg .txt .css .html). |
| edit_token | string | To update a preview that was deployed without an account: the edit_token that deploy returned. |
| delete_tables | array | Only when a deploy was refused because the new schema drops tables that hold rows: repeat each table with the exact row count from that error to confirm deleting it. |
Read one docs page as markdown (page), or search every page for words (search). With neither, lists the pages. Useful pages: capsule-api (every server and client API), database, auth, limits, storage, schedules, email, teams, examples/todo.
| Argument | Type | Description |
|---|---|---|
| page | string | Page name from the list, for example "capsule-api" or "examples/todo". |
| search | string | Words to find. Returns matching lines with their page and line number. |
{
"type": "object",
"required": [],
"properties": {
"page": {
"type": "string",
"maxLength": 100,
"description": "Page name from the list, for example \"capsule-api\" or \"examples/todo\"."
},
"search": {
"type": "string",
"maxLength": 200,
"description": "Words to find. Returns matching lines with their page and line number."
}
},
"additionalProperties": false
}Call this first. Returns how to build, check, deploy and share a fuast app with these tools, and the rules a fuast app must follow (file layout, server and client APIs, database, auth, UI). fuast apps are small full-stack TypeScript apps called capsules: server/index.ts and client/index.tsx, no npm packages.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Returns one app: URL, status, sharing, handlers, recent deploys with their ids (for rollback_app), today's usage and limits, and the names (never the values) of its env vars.
| Argument | Type | Description |
|---|---|---|
| app | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| edit_token | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
{
"type": "object",
"required": [],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
}
},
"additionalProperties": false
}Returns the source of the app's live deploy as {path: content}, with the deploy id to pass to update_app_files as expected_deploy_id. Large apps return the file list only: ask again with paths for the files you need. Secrets (.env files, env values) are never returned.
| Argument | Type | Description |
|---|---|---|
| app | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| paths | array | Only return these files. Leave out for every file. |
| edit_token | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
{
"type": "object",
"required": [],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"paths": {
"type": "array",
"items": {
"type": "string",
"maxLength": 512
},
"maxItems": 200,
"description": "Only return these files. Leave out for every file."
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
}
},
"additionalProperties": false
}For a preview that deploy_app deployed without an account: returns the claim link to give to the person, the preview link, and when the preview is deleted if nobody claims it. Opening the claim link and signing in makes the app theirs.
| Argument | Type | Description |
|---|---|---|
| edit_token* | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
{
"type": "object",
"required": [
"edit_token"
],
"properties": {
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
}
},
"additionalProperties": false
}Returns recent log entries of an app, oldest first: what its handlers wrote with ctx.log, handler errors with stack traces, and platform events such as deploys. Pass the returned cursor as since to read only newer entries.
| Argument | Type | Description |
|---|---|---|
| app | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| level | string | Lowest level to return. Default info. |
| limit | integer | Most entries to return. Default 50. |
| since | integer | Cursor from an earlier call: only entries after it. |
| edit_token | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
{
"type": "object",
"required": [],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"level": {
"enum": [
"info",
"warn",
"error"
],
"type": "string",
"description": "Lowest level to return. Default info."
},
"limit": {
"type": "integer",
"maximum": 200,
"minimum": 1,
"description": "Most entries to return. Default 50."
},
"since": {
"type": "integer",
"minimum": 0,
"description": "Cursor from an earlier call: only entries after it."
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
}
},
"additionalProperties": false
}Returns the source files of one starter template as {path: content}: a complete app that passes check_app and can be sent to deploy_app as is. Change the files to build what the person asked for.
| Argument | Type | Description |
|---|---|---|
| id* | string | Template id from list_templates, for example todo. |
| name | string | Name for the new app. Sets the app's title and its letter icon. |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"maxLength": 41,
"description": "Template id from list_templates, for example todo."
},
"name": {
"type": "string",
"maxLength": 120,
"description": "Name for the new app. Sets the app's title and its letter icon."
}
},
"additionalProperties": false
}Reads one thing about a deployed app. manifest: handlers, schema, indexes, endpoints, read metrics. tables: each table with its fields and row count. rows: rows of one table (give table; at most 100 per call, continue with cursor). usage: today's counters and limits. schedules: cron schedules and their last runs. jobs: scheduled jobs. Only the app's owner and workspace admins can inspect.
| Argument | Type | Description |
|---|---|---|
| app | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| what* | string | What to read. |
| limit | integer | For rows and jobs: most items to return. Default 25. |
| table | string | For rows: the table name. |
| cursor | string | For rows: next_cursor from the previous page. |
| edit_token | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
{
"type": "object",
"required": [
"what"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"what": {
"enum": [
"manifest",
"tables",
"rows",
"usage",
"schedules",
"jobs"
],
"type": "string",
"description": "What to read."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "For rows and jobs: most items to return. Default 25."
},
"table": {
"type": "string",
"maxLength": 128,
"description": "For rows: the table name."
},
"cursor": {
"type": "string",
"maxLength": 2000,
"description": "For rows: next_cursor from the previous page."
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
}
},
"additionalProperties": false
}Lists the fuast apps the connected account can use: its own, its workspace's, and apps shared with it, with URL, sharing mode and whether the account can manage each one.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Lists the working starter apps a new fuast app can begin from, with what each one demonstrates. Get a template's files with get_template.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}Makes an earlier deploy of the app live again. deploy_id comes from get_app; without it, the most recent earlier deploy that is ready. The app's data stays as it is; if that deploy's schema cannot hold the current data, nothing changes.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| deploy_id | string | The deploy to make live. Default: the previous ready deploy. |
{
"type": "object",
"required": [
"app"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"deploy_id": {
"type": "string",
"maxLength": 80,
"description": "The deploy to make live. Default: the previous ready deploy."
}
},
"additionalProperties": false
}Sets or removes environment variables of an app (read in handlers as ctx.env.NAME). They take effect at once, without a deploy. Values are write-only: no tool returns them, only the names.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| set | object | Variables to set, as {"NAME": "value"}. |
| unset | array | Names to remove. |
{
"type": "object",
"required": [
"app"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"set": {
"type": "object",
"description": "Variables to set, as {\"NAME\": \"value\"}.",
"maxProperties": 50,
"additionalProperties": {
"type": "string",
"maxLength": 32768
}
},
"unset": {
"type": "array",
"items": {
"type": "string",
"maxLength": 128
},
"maxItems": 50,
"description": "Names to remove."
}
},
"additionalProperties": false
}Changes who can open an app. visibility: private (the owner and invited people), workspace (everyone at the owner's company), or public (anyone with the link, guests included). invite adds people by email and sends each an email; remove takes people off the list. Do this only when the person asks for it. Returns the resulting sharing.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| invite | array | Email addresses to give access to. |
| remove | array | Email addresses to take off the access list. |
| visibility | string | New sharing mode. Leave out to keep the current one. |
{
"type": "object",
"required": [
"app"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"invite": {
"type": "array",
"items": {
"type": "string",
"maxLength": 254
},
"maxItems": 50,
"description": "Email addresses to give access to."
},
"remove": {
"type": "array",
"items": {
"type": "string",
"maxLength": 254
},
"maxItems": 200,
"description": "Email addresses to take off the access list."
},
"visibility": {
"enum": [
"private",
"workspace",
"public"
],
"type": "string",
"description": "New sharing mode. Leave out to keep the current one."
}
},
"additionalProperties": false
}Redeploys the app with a few files changed: files maps each path to its new content, or to null to delete it. Every other file stays as it is. expected_deploy_id must be the app's live deploy (from get_app_source or the last deploy result); if someone deployed in between, nothing changes and you are told to read the source again. Builds and type checks like deploy_app.
| Argument | Type | Description |
|---|---|---|
| app | string | The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use. |
| files* | object | Changes as {"path": "new content"} to write a file, {"path": null} to delete it. |
| edit_token | string | The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only. |
| delete_tables | array | Only when a deploy was refused because the new schema drops tables that hold rows: repeat each table with the exact row count from that error to confirm deleting it. |
| expected_deploy_id* | string | The deploy id your change is based on. |
{
"type": "object",
"required": [
"files",
"expected_deploy_id"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "The app's slug: the first label of its address (my-app for https://my-app.fuast.com). list_apps shows the slugs you can use."
},
"files": {
"type": "object",
"description": "Changes as {\"path\": \"new content\"} to write a file, {\"path\": null} to delete it.",
"minProperties": 1,
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "The edit_token deploy_app returned when it deployed a preview without an account. It is a secret: keep it in this conversation only."
},
"delete_tables": {
"type": "array",
"items": {
"type": "object",
"required": [
"table",
"row_count"
],
"properties": {
"table": {
"type": "string"
},
"row_count": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
},
"maxItems": 100,
"description": "Only when a deploy was refused because the new schema drops tables that hold rows: repeat each table with the exact row count from that error to confirm deleting it."
},
"expected_deploy_id": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "The deploy id your change is based on."
}
},
"additionalProperties": false
}Returns the fuast account this connection acts as: email, workspace, role, and what the connection may do. If no account is connected yet, calling it starts sign-in: call it when the person has a fuast account or wants apps deployed into their own workspace instead of as a temporary preview.
No arguments.
{
"type": "object",
"required": [],
"properties": {},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 12, 2026.
{
"type": "object",
"required": [
"files"
],
"properties": {
"app": {
"type": "string",
"maxLength": 63,
"minLength": 1,
"description": "Slug of an existing app in the connected account to update. Leave out to create a new app."
},
"name": {
"type": "string",
"maxLength": 120,
"description": "Name of a new app. Its address is derived from it. Ignored when updating an app."
},
"files": {
"type": "object",
"description": "The whole app as {\"relative/path\": \"file content\"}. server/index.ts and client/index.tsx are required. Text files only (.ts .tsx .js .jsx .mjs .json .md .svg .txt .css .html).",
"minProperties": 1,
"additionalProperties": {
"type": "string"
}
},
"edit_token": {
"type": "string",
"maxLength": 200,
"minLength": 8,
"description": "To update a preview that was deployed without an account: the edit_token that deploy returned."
},
"delete_tables": {
"type": "array",
"items": {
"type": "object",
"required": [
"table",
"row_count"
],
"properties": {
"table": {
"type": "string"
},
"row_count": {
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false
},
"maxItems": 100,
"description": "Only when a deploy was refused because the new schema drops tables that hold rows: repeat each table with the exact row count from that error to confirm deleting it."
}
},
"additionalProperties": false
}