Hosted MCP for creating, checking, deploying, and hosting static sites for AI agents.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Optional to start. Call bootstrap(email) for an nv_ key, then Bearer nv_… for authenticated tools (checkout / mpp_upgrade need verified email).
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.
Accept an invite token (from email or invite_project_member in local/dev). Unverified invitees must pass otp. Returns a project-scoped nv_ key once — never email it. Collaborating uses this project_id; create_project still bills the caller.
Invite token from the invitation email (or invite_project_member in local/dev).
Email OTP required when the invitee is not yet verified. Optional if already verified.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 25, 2026.
Accept an invite token (from email or invite_project_member in local/dev). Unverified invitees must pass otp. Returns a project-scoped nv_ key once — never email it. Collaborating uses this project_id; create_project still bills the caller.
| Argument | Type | Description |
|---|---|---|
| otp | string | Email OTP required when the invitee is not yet verified. Optional if already verified. |
| token* | string | Invite token from the invitation email (or invite_project_member in local/dev). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"token"
],
"properties": {
"otp": {
"type": "string",
"description": "Email OTP required when the invitee is not yet verified. Optional if already verified."
},
"token": {
"type": "string",
"description": "Invite token from the invitation email (or invite_project_member in local/dev)."
}
},
"additionalProperties": false
}Stripe Customer Portal URL for an existing subscriber (manage/cancel). Not first-time subscribe — use checkout or mpp_upgrade for that.
| Argument | Type | Description |
|---|---|---|
| return_url | string | Browser URL after leaving the Stripe portal. Optional. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"return_url": {
"type": "string",
"format": "uri",
"description": "Browser URL after leaving the Stripe portal. Optional."
}
},
"additionalProperties": false
}Create an account + nv_ API key from an email. No Bearer key required. Unverified trial still publishes; OTP/verify_email is AFTER the live URL. Returns apiKey immediately — do not wait for OTP. If the human message includes a Signup attribution object, pass it as attribution unchanged.
| Argument | Type | Description |
|---|---|---|
| email* | string | Account email. Receives the OTP after the first live URL. |
| attribution | object | First-touch fields from the novence.ai page that sent the human here. Pass through unchanged. Do not invent values. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Account email. Receives the OTP after the first live URL."
},
"attribution": {
"type": "object",
"properties": {
"term": {
"type": "string"
},
"gclid": {
"type": "string"
},
"medium": {
"type": "string"
},
"source": {
"type": "string"
},
"content": {
"type": "string"
},
"landing": {
"type": "string"
},
"campaign": {
"type": "string"
},
"referrer": {
"type": "string"
},
"gaClientId": {
"type": "string"
},
"gaSessionId": {
"type": "string"
}
},
"description": "First-touch fields from the novence.ai page that sent the human here. Pass through unchanged. Do not invent values.",
"additionalProperties": false
}
},
"additionalProperties": false
}Return a Stripe Checkout URL for Pro ($29) or Scale. Requires nv_ + verified email. Use after a 2nd project or a 402 — never after the first live URL.
| Argument | Type | Description |
|---|---|---|
| plan | string | Paid plan to subscribe. Defaults to pro. |
| cancel_url | string | Browser return URL if the customer cancels Checkout. Optional. |
| success_url | string | Browser return URL after successful payment. Optional. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"plan": {
"enum": [
"pro",
"scale"
],
"type": "string",
"default": "pro",
"description": "Paid plan to subscribe. Defaults to pro."
},
"cancel_url": {
"type": "string",
"format": "uri",
"description": "Browser return URL if the customer cancels Checkout. Optional."
},
"success_url": {
"type": "string",
"format": "uri",
"description": "Browser return URL after successful payment. Optional."
}
},
"additionalProperties": false
}Attach a custom domain. For site domains, enables apex+www. Default primary=www. Required DNS: CNAME www → fallback.novence.ai. Then do exactly one apex option: ALIAS/ANAME/CNAME-flattening @ → fallback.novence.ai, or registrar URL-redirect @ → https://www.{domain}/. Pass primary=apex only when the apex must serve (ALIAS required; URL-redirect would loop).
| Argument | Type | Description |
|---|---|---|
| primary | string | Which host is canonical. Default www. |
| hostname* | string | Custom hostname (e.g. example.com or www.example.com). |
| redirect | boolean | If true, redirect the non-primary host to the primary. Default true. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"hostname"
],
"properties": {
"primary": {
"enum": [
"www",
"apex"
],
"type": "string",
"description": "Which host is canonical. Default www."
},
"hostname": {
"type": "string",
"description": "Custom hostname (e.g. example.com or www.example.com)."
},
"redirect": {
"type": "boolean",
"description": "If true, redirect the non-primary host to the primary. Default true."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Record one staged file after the client PUT to the presigned URL from get_upload_url. Use confirm_uploads_batch when several files were uploaded. Does not publish the site — call deploy after confirms. Re-confirming the same path updates metadata.
| Argument | Type | Description |
|---|---|---|
| path* | string | Site-relative path (e.g. index.html or css/app.css). No leading slash required. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| content_type | string | MIME type for the file. Optional; inferred from the path extension when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"content_type": {
"type": "string",
"description": "MIME type for the file. Optional; inferred from the path extension when omitted."
}
},
"additionalProperties": false
}Confirm many uploads after get_upload_urls_batch PUTs. 200 body is { files, errors }. errors is always an array (empty on full success); retry only failed paths. Use confirm_upload for a single file. Does not deploy.
| Argument | Type | Description |
|---|---|---|
| files* | array | Same paths that were presigned and PUT. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required."
},
"content_type": {
"type": "string",
"description": "MIME type for the file. Optional; inferred from the path extension when omitted."
}
},
"additionalProperties": false
},
"description": "Same paths that were presigned and PUT."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Mint a short-lived mgmt_ token for a local HTML console (account:read, billing:portal, project:members). Never put nv_ keys in HTML.
No arguments.
{
"type": "object",
"properties": {}
}Mint an extra labelled nv_ key (e.g. ci, laptop) that keeps working when reissue_key replaces the primary key. Max 10 named keys; cannot exceed the calling key's permissions; the owner is emailed. The key is shown once — tell the user to save it.
| Argument | Type | Description |
|---|---|---|
| name* | string | Label, e.g. ci or laptop. Letters, digits, spaces, . _ - |
| project_id | string | Restrict the key to one project. Omit for an account key (account keys only). |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "Label, e.g. ci or laptop. Letters, digits, spaces, . _ -"
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Restrict the key to one project. Omit for an account key (account keys only)."
}
},
"additionalProperties": false
}Create a Novence form on a project (optional — sites may use Formspree/Web3forms instead). Returns submit URLs for edge + public API.
| Argument | Type | Description |
|---|---|---|
| name* | string | Display name for the form in the account. |
| slug | string | URL slug. Optional; generated from name if omitted. |
| fields | array | Field definitions. Empty array allowed; add fields later with update_form. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| notify_email | any | Where to email new submissions. Optional. |
| honeypot_field | string | Hidden field name used as a spam honeypot. Optional. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Display name for the form in the account."
},
"slug": {
"type": "string",
"description": "URL slug. Optional; generated from name if omitted."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"type"
],
"properties": {
"name": {
"type": "string",
"description": "HTML field name submitted with the form."
},
"type": {
"enum": [
"text",
"email",
"tel",
"url",
"textarea",
"number",
"select",
"checkbox",
"hidden"
],
"type": "string",
"description": "Input type rendered in the hosted form."
},
"label": {
"type": "string",
"description": "Visible label. Defaults to name if omitted."
},
"options": {
"type": "array",
"items": {
"type": "string"
},
"description": "Choices for type=select."
},
"required": {
"type": "boolean",
"description": "Whether the visitor must fill this field."
}
},
"additionalProperties": false
},
"default": [],
"description": "Field definitions. Empty array allowed; add fields later with update_form."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"notify_email": {
"anyOf": [
{
"anyOf": [
{
"not": {}
},
{
"type": "string",
"format": "email"
}
]
},
{
"type": "null"
}
],
"description": "Where to email new submissions. Optional."
},
"honeypot_field": {
"type": "string",
"description": "Hidden field name used as a spam honeypot. Optional."
}
},
"additionalProperties": false
}Create a new hosting project on the caller's account (counts against the caller's project quota). To edit a shared site, pass that project's project_id to upload/deploy tools instead.
| Argument | Type | Description |
|---|---|---|
| name* | string | Human-readable project name. |
| description | string | Optional notes stored on the project. Not shown on the live site. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Human-readable project name."
},
"description": {
"type": "string",
"description": "Optional notes stored on the project. Not shown on the live site."
}
},
"additionalProperties": false
}Remove one path from staging. Does not change the already-live deploy until the next deploy. Irreversible for that staged path; re-upload to restore. Use delete_form_submission for form PII, not this.
| Argument | Type | Description |
|---|---|---|
| path* | string | Site-relative path (e.g. index.html or css/app.css). No leading slash required. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Permanently delete one form submission (PII). Does not disable the form — use update_form status=disabled. Irreversible.
| Argument | Type | Description |
|---|---|---|
| form_id* | string | Form UUID from create_form or list_forms. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| submission_id* | string | Submission UUID from list_form_submissions. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"form_id",
"submission_id"
],
"properties": {
"form_id": {
"type": "string",
"format": "uuid",
"description": "Form UUID from create_form or list_forms."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"submission_id": {
"type": "string",
"format": "uuid",
"description": "Submission UUID from list_form_submissions."
}
},
"additionalProperties": false
}Publish the site. Verified accounts run quality checks; unverified accounts skip checks (checkRuns: 0) and still go live. POST returns quickly — poll get_deployment_status until live or failed. Do not retry POST while status is queued, checking, or promoting.
| Argument | Type | Description |
|---|---|---|
| force | boolean | If true, publish even when quality checks would block. Optional; default false. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"force": {
"type": "boolean",
"description": "If true, publish even when quality checks would block. Optional; default false."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Full account snapshot: profile, subscription, quotas, usage, projects. Use get_quotas_and_usage for limits only; use get_account_console_kit to render a local HTML console. Read-only.
No arguments.
{
"type": "object",
"properties": {}
}JSON kit to write a local novence-console.html: snapshot, HTML template (replace the /*NOVENCE_INJECT*/ marker), and session. With an nv_ key, session.token is a fresh 30-minute mgmt_ token — do not log it. Humans can instead run `npx novence dashboard`. Serve on the first free 127.0.0.1 port (never assume 8765). Use get_account for JSON without the kit.
No arguments.
{
"type": "object",
"properties": {}
}Read Lighthouse, a11y, and link results for a deployment. Omit deployment_id for the latest. Use run_checks to trigger a new cycle; use get_deployment_status for publish/promote state, not scores.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| deployment_id | string | Specific deployment UUID. Omit to use the project's latest deployment. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"deployment_id": {
"type": "string",
"format": "uuid",
"description": "Specific deployment UUID. Omit to use the project's latest deployment."
}
},
"additionalProperties": false
}Poll publish state after deploy (queued, checking, promoting, live, failed). queued = waiting for a check runner (queuePosition shows your place); wait recommendedPollSeconds between polls. Omit deployment_id for the latest. Use get_checks_results for Lighthouse/a11y scores and get_preview_url once live. Read-only; do not retry deploy while queued, checking, or promoting.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| deployment_id | string | Specific deployment UUID. Omit to use the project's latest deployment. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"deployment_id": {
"type": "string",
"format": "uuid",
"description": "Specific deployment UUID. Omit to use the project's latest deployment."
}
},
"additionalProperties": false
}Read DNS for the project's custom hostname after configure_custom_domain. Returns dns.www, dns.apex, and dns.next (a single next DNS step, or null when www CNAME is in place and apex has records). customDomainStatus stays pending after attach — poll dns.next until null. Do not use this to attach a domain. Read-only.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Return metadata for one staged path (not file bytes). Use list_files to discover paths; use get_upload_url to replace content. Read-only.
| Argument | Type | Description |
|---|---|---|
| path* | string | Site-relative path (e.g. index.html or css/app.css). No leading slash required. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Return the public site URL. On Pro/Scale this is the per-deploy https://{suffix}--{ref}.novence.ai alias (last 5 successful deploys stay). On Free it is the live https://{suffix}.novence.ai host. Use get_deployment_status to know if live yet; use configure_custom_domain for a custom hostname. Read-only.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Return one hosting project (name, suffix, settings, membership). Use list_projects to discover IDs. Use get_preview_url for the public URL (alias on Pro/Scale), and get_project_usage for quotas on that site. Read-only; does not mutate.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Cookieless edge analytics for a hosted site: pageviews, 404s, top pages, referrers, and countries. Off by default. Enable with update_project_settings analytics_enabled=true. Default last 7 days (max 90). If disabled, returns enabled=false and empty totals.
| Argument | Type | Description |
|---|---|---|
| to | string | Inclusive end date (ISO). Optional; default today. Range max 90 days. |
| from | string | Inclusive start date (ISO). Optional; default 7 days ago. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"to": {
"type": "string",
"description": "Inclusive end date (ISO). Optional; default today. Range max 90 days."
},
"from": {
"type": "string",
"description": "Inclusive start date (ISO). Optional; default 7 days ago."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Per-project usage (storage, deploys, check minutes, bandwidth, forms). Bandwidth is live from edge-served bytes. Use get_quotas_and_usage for account totals; use get_project_analytics for pageviews. Read-only.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Account-level plan limits and current consumption (projects, storage, deploys, bandwidth). Use get_project_usage for one site; use get_account for profile plus quotas together. Read-only snapshot, not a live meter stream.
No arguments.
{
"type": "object",
"properties": {}
}Private webmaster brief for this project (Pro/Scale). Markdown or JSON, max 64 KB. Not on the live origin. On session start call this then list_site_events. Empty is brief: null. Read-only.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Get a presigned PUT URL for one site file. content_type is optional (inferred from extension). Use get_upload_urls_batch for multi-file sites, then confirm_upload after the PUT.
| Argument | Type | Description |
|---|---|---|
| path* | string | Site-relative path (e.g. index.html or css/app.css). No leading slash required. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| content_type | string | MIME type for the file. Optional; inferred from the path extension when omitted. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"content_type": {
"type": "string",
"description": "MIME type for the file. Optional; inferred from the path extension when omitted."
}
},
"additionalProperties": false
}Presign many site files at once (max 100). Prefer this over get_upload_url for multi-file sites. After PUTs, call confirm_uploads_batch, not confirm_upload.
| Argument | Type | Description |
|---|---|---|
| files* | array | Files to presign, max 100. Each needs a site-relative path. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"files"
],
"properties": {
"files": {
"type": "array",
"items": {
"type": "object",
"required": [
"path"
],
"properties": {
"path": {
"type": "string",
"description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required."
},
"content_type": {
"type": "string",
"description": "MIME type for the file. Optional; inferred from the path extension when omitted."
}
},
"additionalProperties": false
},
"description": "Files to presign, max 100. Each needs a site-relative path."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Invite a collaborator by email. Requires Pro/Scale on the project owner. Only the owner can invite as admin. Creates a new project on the caller's account if you use create_project instead — pass project_id here. Do not share the owner's nv_ key.
| Argument | Type | Description |
|---|---|---|
| role | string | Access level. Default editor. Only the owner can grant admin. |
| email* | string | Invitee's email. They accept with accept_project_invite. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"email"
],
"properties": {
"role": {
"enum": [
"viewer",
"editor",
"admin"
],
"type": "string",
"default": "editor",
"description": "Access level. Default editor. Only the owner can grant admin."
},
"email": {
"type": "string",
"format": "email",
"description": "Invitee's email. They accept with accept_project_invite."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Leave a project you were invited to. Owners cannot leave — transfer or stay. Revokes your project keys. Use remove_project_member if you are the owner removing someone else.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}List staged site files for a project (paths, types, sizes). Use get_file for one path's metadata; use delete_file to remove a path. Read-only; does not deploy.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}List visitor submissions for one Novence form (paginated). Use delete_form_submission to remove PII. Not for update_form schema changes. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Page size, 1–100. Optional. |
| offset | integer | Number of submissions to skip. Optional; default 0. |
| form_id* | string | Form UUID from create_form or list_forms. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"form_id"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Page size, 1–100. Optional."
},
"offset": {
"type": "integer",
"minimum": 0,
"description": "Number of submissions to skip. Optional; default 0."
},
"form_id": {
"type": "string",
"format": "uuid",
"description": "Form UUID from create_form or list_forms."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}List Novence forms on a project (ids, slugs, status). Use update_form to change one; use list_form_submissions to read leads. Not for third-party widgets. Read-only.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}List members and pending invites for a project. Use invite_project_member to add; use revoke_project_invite for pending tokens; use remove_project_member for accepted collaborators. Read-only.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}List hosting projects the caller owns or is invited to (ids, names, suffixes). Use get_project for one project's settings; use get_preview_url for the public URL (per-deploy alias on Pro/Scale, live host on Free). Read-only; does not create a project.
No arguments.
{
"type": "object",
"properties": {}
}Webmaster inbox (Pro/Scale): form.submitted, collection.updated (agent vs owner_edit), check.completed, deploy.live. Default last 7 days, max 100. Pass since from the last session. Forms still email the owner. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Max rows (1–100). Optional; default 50. |
| since | string | ISO timestamp; only events after this. Optional; default 7 days ago. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"limit": {
"type": "integer",
"description": "Max rows (1–100). Optional; default 50."
},
"since": {
"type": "string",
"description": "ISO timestamp; only events after this. Optional; default 7 days ago."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Start or complete Pro/Scale via Machine Payments Protocol. Requires nv_ + verified email. First call returns a 402 Payment challenge; retry with payment_authorization (Payment credential) or _meta org.paymentauth/credential. Use after a 2nd project or a 402 — never after the first live URL.
| Argument | Type | Description |
|---|---|---|
| plan | string | Paid plan to start. Defaults to pro. |
| payment_authorization | string | Payment credential from settling the 402 challenge. Omit on the first call. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"plan": {
"enum": [
"pro",
"scale"
],
"type": "string",
"default": "pro",
"description": "Paid plan to start. Defaults to pro."
},
"payment_authorization": {
"type": "string",
"description": "Payment credential from settling the 402 challenge. Omit on the first call."
}
},
"additionalProperties": false
}Publish one HTML document (report, dashboard, Claude-style artifact) as index.html and deploy. Omit project_id to create a project. Hosted MCP cannot read local files — pass the HTML string (read the file first). Returns url, project_id, and deployment. Poll get_deployment_status until live or failed. For multi-file sites use the upload + deploy loop instead. Re-call with the same project_id to replace the live page.
| Argument | Type | Description |
|---|---|---|
| html* | string | Full HTML document to publish as /index.html. If you have a local file, read it and pass the contents here. |
| force | boolean | If true, publish even when quality checks would block. Optional; default false. |
| title | string | Project display name when creating a project. Optional; defaults to artifact. |
| project_id | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"html"
],
"properties": {
"html": {
"type": "string",
"description": "Full HTML document to publish as /index.html. If you have a local file, read it and pass the contents here."
},
"force": {
"type": "boolean",
"description": "If true, publish even when quality checks would block. Optional; default false."
},
"title": {
"type": "string",
"description": "Project display name when creating a project. Optional; defaults to artifact."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Write the private webmaster brief (Pro/Scale, max 64 KB). What the site is, which /data files matter, form ids, owner email, what not to touch. Empty string clears it. Survives deploys.
| Argument | Type | Description |
|---|---|---|
| brief* | string | Markdown or JSON. Empty string clears the brief. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"brief"
],
"properties": {
"brief": {
"type": "string",
"description": "Markdown or JSON. Empty string clears the brief."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Write /data/{name}.json on the live site without a deploy (Pro/Scale). Page JS keeps fetch("/data/{name}.json"). JSON must be an object or array, max 256 KB. Include the file in the next deploy or a repo upload that omits it can wipe it. Do not store secrets — the URL is public. Free: upload the JSON and call deploy instead.
| Argument | Type | Description |
|---|---|---|
| json* | any | JSON object/array, or a JSON string of the same. |
| name* | string | Collection name only (e.g. menu). Becomes /data/menu.json. Letters, digits, _ or -. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"name",
"json"
],
"properties": {
"json": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"additionalProperties": {}
},
{
"type": "array",
"items": {}
}
],
"description": "JSON object/array, or a JSON string of the same."
},
"name": {
"type": "string",
"description": "Collection name only (e.g. menu). Becomes /data/menu.json. Letters, digits, _ or -."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Mint a new primary account nv_ key from email OTP. No Bearer key required. WARNING: revokes the previous primary account key; named keys (create_api_key) keep working unless revoke_all is true. Also verifies email if needed.
| Argument | Type | Description |
|---|---|---|
| code* | string | OTP from resend_verification or the latest verification email. |
| email* | string | Account email that owns the key. |
| revoke_all | boolean | Also revoke every named key. Use when a key may have leaked. Default false. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"code"
],
"properties": {
"code": {
"type": "string",
"description": "OTP from resend_verification or the latest verification email."
},
"email": {
"type": "string",
"format": "email",
"description": "Account email that owns the key."
},
"revoke_all": {
"type": "boolean",
"description": "Also revoke every named key. Use when a key may have leaked. Default false."
}
},
"additionalProperties": false
}Remove an accepted collaborator and revoke their project API keys. Owner-only for admins. For a pending invite, use revoke_project_invite instead. Irreversible; they must be invited again.
| Argument | Type | Description |
|---|---|---|
| account_id* | string | Collaborator account UUID from list_project_members. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"account_id"
],
"properties": {
"account_id": {
"type": "string",
"format": "uuid",
"description": "Collaborator account UUID from list_project_members."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Email a new OTP (also used for reissue_key). No Bearer key required. Works when already verified.
| Argument | Type | Description |
|---|---|---|
| email* | string | Account email to receive a new OTP. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Account email to receive a new OTP."
}
},
"additionalProperties": false
}Cancel a pending invite so the token no longer works. Does not remove someone who already accepted — use remove_project_member for that. Irreversible for that invite_id; send a new invite_project_member if needed.
| Argument | Type | Description |
|---|---|---|
| invite_id* | string | Pending invite UUID from list_project_members. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"invite_id"
],
"properties": {
"invite_id": {
"type": "string",
"format": "uuid",
"description": "Pending invite UUID from list_project_members."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Re-promote a previous successful snapshot to https://{suffix}.novence.ai without a new upload. Pro/Scale only (HTTP 402 on Free). Omit deployment_id to restore the previous live deploy. Only the last 5 successful deploys are retained. HTML and unhashed CSS/JS use Cache-Control max-age=60 — hard-refresh or wait. Fingerprinted filenames stay cached. Does not run Lighthouse or increment deploys_count.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| deployment_id | string | Specific deployment UUID. Omit to use the project's latest deployment. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"deployment_id": {
"type": "string",
"format": "uuid",
"description": "Specific deployment UUID. Omit to use the project's latest deployment."
}
},
"additionalProperties": false
}Start a Lighthouse, a11y, and link check cycle on the latest deployment. Does not publish a new deploy — use deploy for that. Then poll get_checks_results (not get_deployment_status) until scores appear. Unverified accounts skip checks on deploy; this still queues a cycle when allowed.
| Argument | Type | Description |
|---|---|---|
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Write /_redirects (Netlify subset) into staging. Call deploy afterwards to publish. SPA History routing: /* /index.html 200. Exact files always win. Optional custom 404 is a separate /404.html upload. Does not write the live prefix.
| Argument | Type | Description |
|---|---|---|
| body* | string | Contents of /_redirects. Example: /* /index.html 200 |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"body"
],
"properties": {
"body": {
"type": "string",
"description": "Contents of /_redirects. Example: /* /index.html 200"
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Patch an existing Novence form (name, slug, fields, notify_email, honeypot, active|disabled). Partial update: omitted fields stay unchanged. Use create_form for a new form; use list_forms to get form_id. Does not delete submissions.
| Argument | Type | Description |
|---|---|---|
| name | string | New display name. Omit to leave unchanged. |
| slug | string | New URL slug. Omit to leave unchanged. |
| fields | array | Replacement field list when provided. Omit to leave the current schema unchanged. |
| status | string | active accepts submissions; disabled rejects them. Omit to leave unchanged. |
| form_id* | string | Form UUID from create_form or list_forms. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| notify_email | any | Notification inbox. Pass null to clear. Omit to leave unchanged. |
| honeypot_field | string | Spam honeypot field name. Omit to leave unchanged. |
Change a collaborator's role. Only the owner can grant or demote admin. Use remove_project_member to revoke access entirely. Does not affect pending invites — use revoke_project_invite for those.
| Argument | Type | Description |
|---|---|---|
| role* | string | New role. Only the owner can set admin. |
| account_id* | string | Collaborator account UUID from list_project_members. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"account_id",
"role"
],
"properties": {
"role": {
"enum": [
"viewer",
"editor",
"admin"
],
"type": "string",
"description": "New role. Only the owner can set admin."
},
"account_id": {
"type": "string",
"format": "uuid",
"description": "Collaborator account UUID from list_project_members."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
}
},
"additionalProperties": false
}Update project name, description, check thresholds, analyticsEnabled (cookieless edge traffic; off by default), shareGateEmails (optional OTP gate on platform hosts only; empty = public), siteMcp (off | read | forms visitor MCP on Pro/Scale), or owner-edit (data_edit_emails + data_edit_names, optional data_edit_path; Pro/Scale, off by default).
| Argument | Type | Description |
|---|---|---|
| name | string | New display name. Omit to leave unchanged. |
| site_mcp | string | Visitor Site MCP. off (default), read (list_pages + get_site_data), or forms (also list_forms + submit_form). Pro/Scale. Cannot enable while share_gate_emails is set. Control plane stays /mcp with nv_. |
| project_id* | string | Hosting project UUID from create_project or list_projects. |
| description | string | New internal notes. Omit to leave unchanged. |
| data_edit_path | string | Single path segment for the editor (default edit → /edit). Letters, digits, hyphen. |
| data_edit_names | array | 1–5 collection names the owner may edit (e.g. menu, hours). Required when data_edit_emails is set. |
| check_thresholds | object | Quality-check threshold overrides: lighthousePerformance (50), lighthouseAccessibility (80), maxCriticalAxeViolations (0), allowBrokenInternalLinks (false), enforcePerformance (false — low performance only warns). Omit to leave unchanged. |
Confirm the email OTP (15 min TTL). No Bearer key required. Call after the first live URL, before checkout/mpp_upgrade.
| Argument | Type | Description |
|---|---|---|
| code* | string | One-time code from the verification email (about 15 minutes TTL). |
| email* | string | Same email used with bootstrap. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"code"
],
"properties": {
"code": {
"type": "string",
"description": "One-time code from the verification email (about 15 minutes TTL)."
},
"email": {
"type": "string",
"format": "email",
"description": "Same email used with bootstrap."
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id",
"form_id"
],
"properties": {
"name": {
"type": "string",
"description": "New display name. Omit to leave unchanged."
},
"slug": {
"type": "string",
"description": "New URL slug. Omit to leave unchanged."
},
"fields": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"type"
],
"properties": {
"name": {
"type": "string",
"description": "HTML field name submitted with the form."
},
"type": {
"enum": [
"text",
"email",
"tel",
"url",
"textarea",
"number",
"select",
"checkbox",
"hidden"
],
"type": "string",
"description": "Input type rendered in the hosted form."
},
"label": {
"type": "string",
"description": "Visible label. Defaults to name if omitted."
},
"options": {
"type": "array",
"items": {
"type": "string"
},
"description": "Choices for type=select."
},
"required": {
"type": "boolean",
"description": "Whether the visitor must fill this field."
}
},
"additionalProperties": false
},
"description": "Replacement field list when provided. Omit to leave the current schema unchanged."
},
"status": {
"enum": [
"active",
"disabled"
],
"type": "string",
"description": "active accepts submissions; disabled rejects them. Omit to leave unchanged."
},
"form_id": {
"type": "string",
"format": "uuid",
"description": "Form UUID from create_form or list_forms."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"notify_email": {
"anyOf": [
{
"anyOf": [
{
"not": {}
},
{
"type": "string",
"format": "email"
}
]
},
{
"type": "null"
}
],
"description": "Notification inbox. Pass null to clear. Omit to leave unchanged."
},
"honeypot_field": {
"type": "string",
"description": "Spam honeypot field name. Omit to leave unchanged."
}
},
"additionalProperties": false
}| data_edit_emails | array | Up to 5 owner emails for live /edit (OTP). Empty turns owner-edit off. Pro/Scale. Custom domains included. Requires data_edit_names. |
| analytics_enabled | boolean | Enable cookieless edge analytics. Required true before get_project_analytics returns totals. |
| share_gate_emails | array | Up to 5 client emails. Non-empty turns on email OTP on *.novence.ai and /p/{suffix}/ only. Custom domains stay public. Empty array turns the gate off. Saving the list does not send mail. |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"project_id"
],
"properties": {
"name": {
"type": "string",
"description": "New display name. Omit to leave unchanged."
},
"site_mcp": {
"enum": [
"off",
"read",
"forms"
],
"type": "string",
"description": "Visitor Site MCP. off (default), read (list_pages + get_site_data), or forms (also list_forms + submit_form). Pro/Scale. Cannot enable while share_gate_emails is set. Control plane stays /mcp with nv_."
},
"project_id": {
"type": "string",
"format": "uuid",
"description": "Hosting project UUID from create_project or list_projects."
},
"description": {
"type": "string",
"description": "New internal notes. Omit to leave unchanged."
},
"data_edit_path": {
"type": "string",
"description": "Single path segment for the editor (default edit → /edit). Letters, digits, hyphen."
},
"data_edit_names": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "1–5 collection names the owner may edit (e.g. menu, hours). Required when data_edit_emails is set."
},
"check_thresholds": {
"type": "object",
"description": "Quality-check threshold overrides: lighthousePerformance (50), lighthouseAccessibility (80), maxCriticalAxeViolations (0), allowBrokenInternalLinks (false), enforcePerformance (false — low performance only warns). Omit to leave unchanged.",
"additionalProperties": {}
},
"data_edit_emails": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Up to 5 owner emails for live /edit (OTP). Empty turns owner-edit off. Pro/Scale. Custom domains included. Requires data_edit_names."
},
"analytics_enabled": {
"type": "boolean",
"description": "Enable cookieless edge analytics. Required true before get_project_analytics returns totals."
},
"share_gate_emails": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 5,
"description": "Up to 5 client emails. Non-empty turns on email OTP on *.novence.ai and /p/{suffix}/ only. Custom domains stay public. Empty array turns the gate off. Saving the list does not send mail."
}
},
"additionalProperties": false
}