Create, build and deploy projects, roll back with checkpoints, connect custom domains, and search…
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
MisarDev API key. Format: Bearer mdk_… — create one at https://misar.dev/settings/api-keys
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.
Archive (archived=true) or un-archive (archived=false) a project. Archiving hides it from the active list without deleting anything; it is fully reversible.
Project UUID (from list_projects)
true to archive, false to bring it back
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Archive (archived=true) or un-archive (archived=false) a project. Archiving hides it from the active list without deleting anything; it is fully reversible.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
| archived* | boolean | true to archive, false to bring it back |
{
"type": "object",
"required": [
"id",
"archived"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
},
"archived": {
"type": "boolean",
"description": "true to archive, false to bring it back"
}
}
}Cancel the build currently running on a project. Work the build had not yet saved is discarded.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Check whether a subdomain label is free for this project and, if not, get suggestions. The project's own current subdomain reads as available.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
| subdomain* | string | Label to check, e.g. 'my-app' |
{
"type": "object",
"required": [
"id",
"subdomain"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
},
"subdomain": {
"type": "string",
"description": "Label to check, e.g. 'my-app'"
}
}
}Delete every embedding for a project. Code search returns nothing until the project is indexed again. Project files are not touched.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project UUID |
{
"type": "object",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"description": "Project UUID"
}
}
}Create a new API key. The raw key is returned ONCE — hand it to the user and never repeat or store it. Every MisarDev key has full API access; keys expire (default 90 days, max 365).
| Argument | Type | Description |
|---|---|---|
| name* | string | Key label (1–80 chars) |
| ip_allowlist | array | Optional IPs/CIDRs allowed to use the key |
| expires_in_days | number | Days until expiry (1–365, default 90) |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Key label (1–80 chars)"
},
"ip_allowlist": {
"type": "array",
"items": {
"type": "string"
},
"description": "Optional IPs/CIDRs allowed to use the key"
},
"expires_in_days": {
"type": "number",
"description": "Days until expiry (1–365, default 90)"
}
}
}Run a one-shot, non-streaming chat completion on MisarDev's OpenAI-compatible model API. model='misar-online' grounds the answer in the web with citations; omit model for the default coding model. Spends model credits.
| Argument | Type | Description |
|---|---|---|
| model | string | Model id; 'misar-online' or 'misar-search' for web-grounded answers |
| messages* | array | OpenAI-style messages: [{ role: 'system'|'user'|'assistant', content: string }] |
| max_tokens | number | Maximum tokens to generate |
| temperature | number | Sampling temperature |
{
"type": "object",
"required": [
"messages"
],
"properties": {
"model": {
"type": "string",
"description": "Model id; 'misar-online' or 'misar-search' for web-grounded answers"
},
"messages": {
"type": "array",
"items": {
"type": "object",
"required": [
"role",
"content"
],
"properties": {
"role": {
"enum": [
"system",
"user",
"assistant"
],
"type": "string"
},
"content": {
"type": "string"
}
}
},
"minItems": 1,
"description": "OpenAI-style messages: [{ role: 'system'|'user'|'assistant', content: string }]"
},
"max_tokens": {
"type": "number",
"description": "Maximum tokens to generate"
},
"temperature": {
"type": "number",
"description": "Sampling temperature"
}
}
}Create a new, empty project (optionally seeded with a file map). Counts against the plan's project quota. To start from a starter instead, use use_template.
| Argument | Type | Description |
|---|---|---|
| name* | string | Project name (max 100 chars) |
| files | object | Initial file map: keys are relative file paths, values are file contents |
| settings | object | Project settings (e.g. framework, styling) |
| description | string | Optional project description |
{
"type": "object",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Project name (max 100 chars)"
},
"files": {
"type": "object",
"description": "Initial file map: keys are relative file paths, values are file contents"
},
"settings": {
"type": "object",
"description": "Project settings (e.g. framework, styling)"
},
"description": {
"type": "string",
"description": "Optional project description"
}
}
}Delete one checkpoint from a project's version history. It can no longer be restored afterwards, and the last remaining checkpoint cannot be deleted. Confirm with the user first.
| Argument | Type | Description |
|---|---|---|
| checkpoint_id* | string | Checkpoint ID (from list_checkpoints) |
{
"type": "object",
"required": [
"checkpoint_id"
],
"properties": {
"checkpoint_id": {
"type": "string",
"description": "Checkpoint ID (from list_checkpoints)"
}
}
}Move a project to the trash. It disappears from every list and route immediately; restore_project brings it back during the retention window. Confirm with the user first — anything published from it stops being editable.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Publish a project to the public internet on the MisarDev runtime (optionally at a chosen subdomain). The site becomes reachable by anyone. Confirm with the user before calling, check the address first with check_subdomain, and follow with get_deployment_status. Counts against the plan's deploy quota.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
| subdomain | string | Subdomain label to publish at (e.g. 'my-app'); omit to keep the current one |
| public_gallery | boolean | List the published app in the public showcase (omit to leave unchanged) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
},
"subdomain": {
"type": "string",
"description": "Subdomain label to publish at (e.g. 'my-app'); omit to keep the current one"
},
"public_gallery": {
"type": "boolean",
"description": "List the published app in the public showcase (omit to leave unchanged)"
}
}
}Copy a project (files and settings) into a new project you own, named after the original. Counts against the plan's project quota. Any member with read access may duplicate.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Get whether a project currently has a build running and its latest build state. Poll this rather than assuming a build finished.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Get embedding statistics for a project — how many files and chunks are indexed and when.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Project UUID |
{
"type": "object",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"description": "Project UUID"
}
}
}Get a project's custom domain, its status, the DNS record the user must set, and whether DNS already resolves to the platform (TLS is issued automatically once it does).
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Get a project's current deployment: whether it is live, its URL, subdomain and custom-domain state. Call after deploy_project to confirm the site is actually up before telling anyone it is.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Get one project by ID — name, description, settings, visibility, version and deployment fields. Read this before update_project so you change the current version, not a stale copy.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Show a full-stack project's database backend: whether one is provisioned, its schema name, table count and connection state.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Get a project's file tree with file contents. Use this to read code before answering questions about it or proposing an update_project change.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Read a project's knowledge — the standing notes (product context, conventions, constraints) the AI builder reads on every change.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Get the account's subscription: plan, status, current period end and whether it cancels at period end.
No arguments.
{
"type": "object",
"properties": {}
}Get one template by ID — its description, stack and the files it would create.
| Argument | Type | Description |
|---|---|---|
| id* | string | Template ID (from list_templates) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Template ID (from list_templates)"
}
}
}Get detailed usage for the account. format=quick returns a lightweight summary, format=dashboard the full dashboard data; analytics=true adds a per-day breakdown over `days` (default 30). For plan limits at a glance, use upgrade.
| Argument | Type | Description |
|---|---|---|
| days | number | Look-back window in days (default 30) |
| format | string | Response format — omit for the default summary |
| analytics | boolean | Include the detailed analytics breakdown (default false) |
{
"type": "object",
"properties": {
"days": {
"type": "number",
"description": "Look-back window in days (default 30)"
},
"format": {
"enum": [
"quick",
"dashboard"
],
"type": "string",
"description": "Response format — omit for the default summary"
},
"analytics": {
"type": "boolean",
"description": "Include the detailed analytics breakdown (default false)"
}
}
}Import a published Misar artifact page into a project as imported/ARTIFACT_ID.html. The url must be exactly https://misar.ai/code/artifact/ARTIFACT_ID; anything else is refused before any fetch.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
| url* | string | Artifact URL: https://misar.ai/code/artifact/ARTIFACT_ID |
{
"type": "object",
"required": [
"id",
"url"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
},
"url": {
"type": "string",
"description": "Artifact URL: https://misar.ai/code/artifact/ARTIFACT_ID"
}
}
}Index a project's files for semantic code search (RAG). Pass the files to index as a path → content map; re-indexing a path replaces it. Metered — a paid-plan feature.
| Argument | Type | Description |
|---|---|---|
| files* | object | File map to index: keys are file paths, values are file contents |
| project_id* | string | Project UUID |
{
"type": "object",
"required": [
"project_id",
"files"
],
"properties": {
"files": {
"type": "object",
"description": "File map to index: keys are file paths, values are file contents"
},
"project_id": {
"type": "string",
"description": "Project UUID"
}
}
}List your API keys — name, prefix, created/expiry dates and IP allowlist. Never returns the secret.
No arguments.
{
"type": "object",
"properties": {}
}List your own audit trail — API-key, deployment and billing events where you were the actor, newest first. Needs a plan that includes audit logs; otherwise it returns an upgrade message.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Default 50 |
| action | string | Only events with this action |
| offset | integer | Default 0 |
| category | string | Only events in this category |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Default 50"
},
"action": {
"type": "string",
"description": "Only events with this action"
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Default 0"
},
"category": {
"type": "string",
"description": "Only events in this category"
}
}
}List your recent AI builds across all projects, newest first, with status, model and the project each belongs to.
| Argument | Type | Description |
|---|---|---|
| limit | number | Max rows to return (default 20) |
{
"type": "object",
"properties": {
"limit": {
"type": "number",
"description": "Max rows to return (default 20)"
}
}
}List a project's saved checkpoints (up to 100, newest first) with label, changed paths and timestamp. Checkpoints are the project's version history — use one to undo a bad change.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}List the connectors available on MisarDev and whether each is enabled for you, with its category, status and dashboard path.
No arguments.
{
"type": "object",
"properties": {}
}List your notifications (build finished, deploy failed, invitations…), newest first, with the unread count. Pass `before` (an ISO timestamp from the last row) to page back; unread_only=true returns just the count.
| Argument | Type | Description |
|---|---|---|
| before | string | ISO timestamp — return notifications older than this |
| unread_only | boolean | Return only { unreadCount } |
{
"type": "object",
"properties": {
"before": {
"type": "string",
"description": "ISO timestamp — return notifications older than this"
},
"unread_only": {
"type": "boolean",
"description": "Return only { unreadCount }"
}
}
}List MisarDev's plans with prices, limits and features — what each upgrade would unlock.
No arguments.
{
"type": "object",
"properties": {}
}List the projects you own or can access, newest first, with cursor pagination. view=active (default) hides archived and trashed projects; pass view=archived or view=trash to see those.
| Argument | Type | Description |
|---|---|---|
| view | string | Which lifecycle view to list (default active) |
| limit | number | Results per page (default 20, max 100) |
| cursor | string | Project ID to start after (from the previous page) |
{
"type": "object",
"properties": {
"view": {
"enum": [
"active",
"archived",
"trash"
],
"type": "string",
"description": "Which lifecycle view to list (default active)"
},
"limit": {
"type": "number",
"description": "Results per page (default 20, max 100)"
},
"cursor": {
"type": "string",
"description": "Project ID to start after (from the previous page)"
}
}
}List the starter templates a new project can begin from, with their IDs, names and categories. Pick one here before calling use_template.
No arguments.
{
"type": "object",
"properties": {}
}Look up a domain's public registration data (RDAP): whether it is registered, its registrar and key dates. Useful before suggesting a custom domain.
| Argument | Type | Description |
|---|---|---|
| domain* | string | Domain name, e.g. example.com |
{
"type": "object",
"required": [
"domain"
],
"properties": {
"domain": {
"type": "string",
"description": "Domain name, e.g. example.com"
}
}
}Mark one notification as read (use mark_notifications_read for all of them).
| Argument | Type | Description |
|---|---|---|
| id* | string | Notification ID (from list_notifications) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Notification ID (from list_notifications)"
}
}
}Mark every notification as read, clearing the unread badge. Nothing is deleted.
No arguments.
{
"type": "object",
"properties": {}
}Provision the database backend for a full-stack project: its own isolated schema, protected by row-level security. Safe to repeat — an already-provisioned project reports its existing backend.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Detach a project's custom domain and remove its route. The domain stops serving the app immediately; the default subdomain keeps working. Confirm with the user first.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
}
}
}Give a checkpoint a human-readable label (1–80 characters) so it is easy to find later.
| Argument | Type | Description |
|---|---|---|
| label* | string | New label, 1–80 characters |
| checkpoint_id* | string | Checkpoint ID (from list_checkpoints) |
{
"type": "object",
"required": [
"checkpoint_id",
"label"
],
"properties": {
"label": {
"type": "string",
"description": "New label, 1–80 characters"
},
"checkpoint_id": {
"type": "string",
"description": "Checkpoint ID (from list_checkpoints)"
}
}
}Restore a project's files to a checkpoint. The current state is snapshotted first, so the restore itself can be undone — but it does overwrite the working files, so confirm with the user. A published site does not change until you deploy again.
| Argument | Type | Description |
|---|---|---|
| checkpoint_id* | string | Checkpoint ID (from list_checkpoints) |
{
"type": "object",
"required": [
"checkpoint_id"
],
"properties": {
"checkpoint_id": {
"type": "string",
"description": "Checkpoint ID (from list_checkpoints)"
}
}
}Restore a project from the trash. A project that was archived before it was trashed returns to the archive, not to the active list.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Revoke an API key by ID. It is deleted permanently and anything still using it fails immediately. Confirm with the user first, and never revoke the key this session is using without saying so.
| Argument | Type | Description |
|---|---|---|
| id* | string | API key ID (from list_api_keys) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "API key ID (from list_api_keys)"
}
}
}Semantic search inside an indexed project's code. Answer only from the snippets it returns and cite their file paths; if get_code_index_stats shows nothing indexed, index first.
| Argument | Type | Description |
|---|---|---|
| query* | string | Natural-language search query |
| project_id* | string | Project UUID |
{
"type": "object",
"required": [
"project_id",
"query"
],
"properties": {
"query": {
"type": "string",
"description": "Natural-language search query"
},
"project_id": {
"type": "string",
"description": "Project UUID"
}
}
}Search across your projects and the public catalogue (templates, skills, the published gallery) by name and description. Does NOT search inside project files — use search_project_code for that. A source that could not be reached is reported as unavailable, never as zero results.
| Argument | Type | Description |
|---|---|---|
| limit | number | Rows across all sources (default 20, max 50) |
| query* | string | Search term (very short terms return an empty answer) |
| types | string | Comma-separated subset of project,template,skill,gallery (default: all) |
{
"type": "object",
"required": [
"query"
],
"properties": {
"limit": {
"type": "number",
"description": "Rows across all sources (default 20, max 50)"
},
"query": {
"type": "string",
"description": "Search term (very short terms return an empty answer)"
},
"types": {
"type": "string",
"description": "Comma-separated subset of project,template,skill,gallery (default: all)"
}
}
}Attach a domain the user owns to a published project and provision routing/TLS. Paid plans only (the API answers with an upgrade offer otherwise). Returns the DNS record to set — the domain only serves once that record is live.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
| domain* | string | Domain to attach, e.g. app.example.com |
{
"type": "object",
"required": [
"id",
"domain"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
},
"domain": {
"type": "string",
"description": "Domain to attach, e.g. app.example.com"
}
}
}Enable or disable a connector by slug (from list_connectors). Reversible.
| Argument | Type | Description |
|---|---|---|
| slug* | string | Connector slug (from list_connectors) |
| enabled* | boolean | true to enable, false to disable |
{
"type": "object",
"required": [
"slug",
"enabled"
],
"properties": {
"slug": {
"type": "string",
"description": "Connector slug (from list_connectors)"
},
"enabled": {
"type": "boolean",
"description": "true to enable, false to disable"
}
}
}Take a published site offline. Its public URL stops serving immediately. This is not a rollback — to go back to an earlier version, restore_checkpoint and deploy again. Confirm with the user first.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
}
}
}Update a project's name, description, files, settings or visibility. Files passed here REPLACE the matching paths. Pass the `version` you read with get_project to avoid overwriting someone else's newer edit (the API answers 409 on a conflict).
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID (from list_projects) |
| name | string | New project name |
| files | object | File map to write: path → content |
| version | number | Version read from get_project, for conflict detection |
| settings | object | Updated settings |
| is_public | boolean | Make the project public (true) or private (false) |
| description | string | New description |
{
"type": "object",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID (from list_projects)"
},
"name": {
"type": "string",
"description": "New project name"
},
"files": {
"type": "object",
"description": "File map to write: path → content"
},
"version": {
"type": "number",
"description": "Version read from get_project, for conflict detection"
},
"settings": {
"type": "object",
"description": "Updated settings"
},
"is_public": {
"type": "boolean",
"description": "Make the project public (true) or private (false)"
},
"description": {
"type": "string",
"description": "New description"
}
}
}Replace a project's knowledge (up to 20,000 characters) — the standing notes the AI builder reads on every change. This replaces the whole text, so read it with get_project_knowledge first and send the edited version.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
| content* | string | The full knowledge text |
{
"type": "object",
"required": [
"id",
"content"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
},
"content": {
"type": "string",
"maxLength": 20000,
"description": "The full knowledge text"
}
}
}Move a project to a new <subdomain>.misar.app address (check it first with check_subdomain). If the app is published, the live site moves immediately and the OLD address stops working — get the user's explicit approval. If it is not published yet, this just reserves the name for the next deploy.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
| subdomain* | string | New subdomain, without .misar.app |
{
"type": "object",
"required": [
"id",
"subdomain"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
},
"subdomain": {
"type": "string",
"description": "New subdomain, without .misar.app"
}
}
}Show the current MisarDev plan, how much of each quota (builds, edits, projects) is left this period, and the link to compare plans and upgrade. Call it any time — not only after hitting a limit. Reads only: it never changes the plan or takes payment. On a local install, open=true also opens the pricing page in the user's browser.
| Argument | Type | Description |
|---|---|---|
| open | boolean | Local installs only: also open the pricing page in the browser. The hosted server returns the link instead. |
{
"type": "object",
"properties": {
"open": {
"type": "boolean",
"description": "Local installs only: also open the pricing page in the browser. The hosted server returns the link instead."
}
}
}Create a new project from a template. Returns the new project; counts against the plan's project quota.
| Argument | Type | Description |
|---|---|---|
| id* | string | Template ID (from list_templates) |
| name* | string | Name for the new project |
{
"type": "object",
"required": [
"id",
"name"
],
"properties": {
"id": {
"type": "string",
"description": "Template ID (from list_templates)"
},
"name": {
"type": "string",
"description": "Name for the new project"
}
}
}Answer a question from the live web with citations (MisarDev's grounded search). Returns the answer, url_citation annotations and the ranked sources. Spends model credits; quote only what the sources support.
| Argument | Type | Description |
|---|---|---|
| query* | string | The question or search query |
| search_context_size | string | How much web context to gather (default medium) |
{
"type": "object",
"required": [
"query"
],
"properties": {
"query": {
"type": "string",
"description": "The question or search query"
},
"search_context_size": {
"enum": [
"low",
"medium",
"high"
],
"type": "string",
"description": "How much web context to gather (default medium)"
}
}
}Create, update or delete files in a project (1–100 per call, each up to 1 MB; paths are relative, no `..`). Other files are left as they are. Overwrites and deletes are applied to the working files immediately — confirm with the user, and use list_checkpoints/restore_checkpoint to undo. Pass `version` (from get_project) to refuse the write if anything changed since you read it. The published site does not change until you deploy again.
| Argument | Type | Description |
|---|---|---|
| id* | string | Project UUID |
| files* | array | Files to write |
| version | integer | Optional: the project version you last read |
{
"type": "object",
"required": [
"id",
"files"
],
"properties": {
"id": {
"type": "string",
"description": "Project UUID"
},
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"path",
"content"
],
"properties": {
"path": {
"type": "string",
"description": "Relative path, e.g. src/App.tsx"
},
"action": {
"enum": [
"create",
"update",
"delete"
],
"type": "string",
"description": "Default update"
},
"content": {
"type": "string",
"description": "Full file contents (send \"\" for a delete)"
},
"language": {
"type": "string",
"description": "Optional language hint, e.g. typescript"
}
}
},
"maxItems": 100,
"minItems": 1,
"description": "Files to write"
},
"version": {
"type": "integer",
"minimum": 0,
"description": "Optional: the project version you last read"
}
}
}