{
  "data": {
    "tool": {
      "category": "infrastructure",
      "endpoint": "https://api.novence.ai/mcp",
      "jsonUrl": "https://www.anchorterminal.com/api/v1/tools/novence-mcp.json",
      "kind": "mcp",
      "listed": "indexed",
      "liveUrl": "https://www.anchorterminal.com/api/v1/live/novence-mcp.json",
      "markdownUrl": "https://www.anchorterminal.com/tools/novence-mcp.md",
      "mcpTools": {
        "check": {
          "checker": "anchor-check/1.0",
          "totalTokens": 10879,
          "counts": {
            "error": 0,
            "note": 1,
            "warn": 1
          },
          "findings": [
            {
              "rule": "TC23",
              "severity": "warn",
              "message": "50 tools",
              "fix": "Offer a smaller default toolset and let clients opt into the rest."
            },
            {
              "rule": "TC24",
              "severity": "note",
              "message": "50 of 50 tools have no outputSchema",
              "fix": "Declare outputSchema for tools that return structured data, and return structuredContent that matches it."
            }
          ]
        },
        "checkedAt": "2026-10-04T22:20:26Z",
        "count": 50,
        "schemaTokens": 10879,
        "status": "ok",
        "tools": [
          {
            "name": "bootstrap",
            "title": "Bootstrap account",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "email": {
                  "description": "Account email. Receives the OTP after the first live URL.",
                  "format": "email",
                  "type": "string"
                }
              },
              "required": [
                "email"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "verify_email",
            "title": "Verify email",
            "description": "Confirm the email OTP (15 min TTL). No Bearer key required. Call after the first live URL, before checkout/mpp_upgrade.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "code": {
                  "description": "One-time code from the verification email (about 15 minutes TTL).",
                  "type": "string"
                },
                "email": {
                  "description": "Same email used with bootstrap.",
                  "format": "email",
                  "type": "string"
                }
              },
              "required": [
                "email",
                "code"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "resend_verification",
            "title": "Resend verification",
            "description": "Email a new OTP (also used for reissue_key). No Bearer key required. Works when already verified.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "email": {
                  "description": "Account email to receive a new OTP.",
                  "format": "email",
                  "type": "string"
                }
              },
              "required": [
                "email"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "reissue_key",
            "title": "Reissue API key",
            "description": "Mint a new account nv_ key from email OTP. No Bearer key required. WARNING: revokes prior account-scoped nv_ keys. Also verifies email if needed.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "code": {
                  "description": "OTP from resend_verification or the latest verification email.",
                  "type": "string"
                },
                "email": {
                  "description": "Account email that owns the key.",
                  "format": "email",
                  "type": "string"
                }
              },
              "required": [
                "email",
                "code"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "checkout",
            "title": "Stripe Checkout",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "cancel_url": {
                  "description": "Browser return URL if the customer cancels Checkout. Optional.",
                  "format": "uri",
                  "type": "string"
                },
                "plan": {
                  "default": "pro",
                  "description": "Paid plan to subscribe. Defaults to pro.",
                  "enum": [
                    "pro",
                    "scale"
                  ],
                  "type": "string"
                },
                "success_url": {
                  "description": "Browser return URL after successful payment. Optional.",
                  "format": "uri",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "mpp_upgrade",
            "title": "MPP upgrade",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "payment_authorization": {
                  "description": "Payment credential from settling the 402 challenge. Omit on the first call.",
                  "type": "string"
                },
                "plan": {
                  "default": "pro",
                  "description": "Paid plan to start. Defaults to pro.",
                  "enum": [
                    "pro",
                    "scale"
                  ],
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "billing_portal",
            "title": "Billing portal",
            "description": "Stripe Customer Portal URL for an existing subscriber (manage/cancel). Not first-time subscribe — use checkout or mpp_upgrade for that.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "return_url": {
                  "description": "Browser URL after leaving the Stripe portal. Optional.",
                  "format": "uri",
                  "type": "string"
                }
              },
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "create_project",
            "title": "Create project",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "description": {
                  "description": "Optional notes stored on the project. Not shown on the live site.",
                  "type": "string"
                },
                "name": {
                  "description": "Human-readable project name.",
                  "type": "string"
                }
              },
              "required": [
                "name"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "publish_html",
            "title": "Publish HTML",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "force": {
                  "description": "If true, publish even when quality checks would block. Optional; default false.",
                  "type": "boolean"
                },
                "html": {
                  "description": "Full HTML document to publish as /index.html. If you have a local file, read it and pass the contents here.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "title": {
                  "description": "Project display name when creating a project. Optional; defaults to artifact.",
                  "type": "string"
                }
              },
              "required": [
                "html"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "list_projects",
            "title": "List projects",
            "description": "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.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_project",
            "title": "Get project",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "update_project_settings",
            "title": "Update project settings",
            "description": "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).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "analytics_enabled": {
                  "description": "Enable cookieless edge analytics. Required true before get_project_analytics returns totals.",
                  "type": "boolean"
                },
                "check_thresholds": {
                  "additionalProperties": {},
                  "description": "Quality-check threshold overrides. Omit to leave unchanged.",
                  "type": "object"
                },
                "data_edit_emails": {
                  "description": "Up to 5 owner emails for live /edit (OTP). Empty turns owner-edit off. Pro/Scale. Custom domains included. Requires data_edit_names.",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 5,
                  "type": "array"
                },
                "data_edit_names": {
                  "description": "1–5 collection names the owner may edit (e.g. menu, hours). Required when data_edit_emails is set.",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 5,
                  "type": "array"
                },
                "data_edit_path": {
                  "description": "Single path segment for the editor (default edit → /edit). Letters, digits, hyphen.",
                  "type": "string"
                },
                "description": {
                  "description": "New internal notes. Omit to leave unchanged.",
                  "type": "string"
                },
                "name": {
                  "description": "New display name. Omit to leave unchanged.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "share_gate_emails": {
                  "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.",
                  "items": {
                    "type": "string"
                  },
                  "maxItems": 5,
                  "type": "array"
                },
                "site_mcp": {
                  "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_.",
                  "enum": [
                    "off",
                    "read",
                    "forms"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_upload_url",
            "title": "Get upload URL",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "content_type": {
                  "description": "MIME type for the file. Optional; inferred from the path extension when omitted.",
                  "type": "string"
                },
                "path": {
                  "description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "path"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_upload_urls_batch",
            "title": "Get upload URLs (batch)",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "files": {
                  "description": "Files to presign, max 100. Each needs a site-relative path.",
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "content_type": {
                        "description": "MIME type for the file. Optional; inferred from the path extension when omitted.",
                        "type": "string"
                      },
                      "path": {
                        "description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "path"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "files"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "confirm_upload",
            "title": "Confirm upload",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "content_type": {
                  "description": "MIME type for the file. Optional; inferred from the path extension when omitted.",
                  "type": "string"
                },
                "path": {
                  "description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "path"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "confirm_uploads_batch",
            "title": "Confirm uploads (batch)",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "files": {
                  "description": "Same paths that were presigned and PUT.",
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "content_type": {
                        "description": "MIME type for the file. Optional; inferred from the path extension when omitted.",
                        "type": "string"
                      },
                      "path": {
                        "description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required.",
                        "type": "string"
                      }
                    },
                    "required": [
                      "path"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "files"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "list_files",
            "title": "List files",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_file",
            "title": "Get file",
            "description": "Return metadata for one staged path (not file bytes). Use list_files to discover paths; use get_upload_url to replace content. Read-only.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "path": {
                  "description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "path"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "delete_file",
            "title": "Delete file",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "path": {
                  "description": "Site-relative path (e.g. index.html or css/app.css). No leading slash required.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "path"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "set_redirects",
            "title": "Set redirects",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "body": {
                  "description": "Contents of /_redirects. Example: /*    /index.html   200",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "body"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "put_site_data",
            "title": "Put live site JSON",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "json": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "additionalProperties": {},
                      "type": "object"
                    },
                    {
                      "items": {},
                      "type": "array"
                    }
                  ],
                  "description": "JSON object/array, or a JSON string of the same."
                },
                "name": {
                  "description": "Collection name only (e.g. menu). Becomes /data/menu.json. Letters, digits, _ or -.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "name",
                "json"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_site_brief",
            "title": "Get site brief",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "put_site_brief",
            "title": "Put site brief",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "brief": {
                  "description": "Markdown or JSON. Empty string clears the brief.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "brief"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "list_site_events",
            "title": "List site events",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "limit": {
                  "description": "Max rows (1–100). Optional; default 50.",
                  "type": "integer"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "since": {
                  "description": "ISO timestamp; only events after this. Optional; default 7 days ago.",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "deploy",
            "title": "Deploy site",
            "description": "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 promoting or checking.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "force": {
                  "description": "If true, publish even when quality checks would block. Optional; default false.",
                  "type": "boolean"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_deployment_status",
            "title": "Get deployment status",
            "description": "Poll publish state after deploy (queued, checking, promoting, live, failed). 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 promoting or checking.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "deployment_id": {
                  "description": "Specific deployment UUID. Omit to use the project's latest deployment.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_preview_url",
            "title": "Get preview URL",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "rollback",
            "title": "Rollback live site",
            "description": "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 Cache-Control is 60s — hard-refresh or wait. Does not run Lighthouse or increment deploys_count.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "deployment_id": {
                  "description": "Specific deployment UUID. Omit to use the project's latest deployment.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "run_checks",
            "title": "Run quality checks",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_checks_results",
            "title": "Get check results",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "deployment_id": {
                  "description": "Specific deployment UUID. Omit to use the project's latest deployment.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "configure_custom_domain",
            "title": "Configure custom domain",
            "description": "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).",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "hostname": {
                  "description": "Custom hostname (e.g. example.com or www.example.com).",
                  "type": "string"
                },
                "primary": {
                  "description": "Which host is canonical. Default www.",
                  "enum": [
                    "www",
                    "apex"
                  ],
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "redirect": {
                  "description": "If true, redirect the non-primary host to the primary. Default true.",
                  "type": "boolean"
                }
              },
              "required": [
                "project_id",
                "hostname"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_domain_status",
            "title": "Get domain status",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "create_form",
            "title": "Create form",
            "description": "Create a Novence form on a project (optional — sites may use Formspree/Web3forms instead). Returns submit URLs for edge + public API.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "fields": {
                  "default": [],
                  "description": "Field definitions. Empty array allowed; add fields later with update_form.",
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "label": {
                        "description": "Visible label. Defaults to name if omitted.",
                        "type": "string"
                      },
                      "name": {
                        "description": "HTML field name submitted with the form.",
                        "type": "string"
                      },
                      "options": {
                        "description": "Choices for type=select.",
                        "items": {
                          "type": "string"
                        },
                        "type": "array"
                      },
                      "required": {
                        "description": "Whether the visitor must fill this field.",
                        "type": "boolean"
                      },
                      "type": {
                        "description": "Input type rendered in the hosted form.",
                        "enum": [
                          "text",
                          "email",
                          "tel",
                          "url",
                          "textarea",
                          "number",
                          "select",
                          "checkbox",
                          "hidden"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "name",
                      "type"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "honeypot_field": {
                  "description": "Hidden field name used as a spam honeypot. Optional.",
                  "type": "string"
                },
                "name": {
                  "description": "Display name for the form in the account.",
                  "type": "string"
                },
                "notify_email": {
                  "anyOf": [
                    {
                      "anyOf": [
                        {
                          "not": {}
                        },
                        {
                          "format": "email",
                          "type": "string"
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Where to email new submissions. Optional."
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "slug": {
                  "description": "URL slug. Optional; generated from name if omitted.",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "name"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": true,
              "readOnlyHint": false
            }
          },
          {
            "name": "list_forms",
            "title": "List forms",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "update_form",
            "title": "Update form",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "fields": {
                  "description": "Replacement field list when provided. Omit to leave the current schema unchanged.",
                  "items": {
                    "additionalProperties": false,
                    "properties": {
                      "label": {
                        "description": "Visible label. Defaults to name if omitted.",
                        "type": "string"
                      },
                      "name": {
                        "description": "HTML field name submitted with the form.",
                        "type": "string"
                      },
                      "options": {
                        "description": "Choices for type=select.",
                        "items": {
                          "type": "string"
                        },
                        "type": "array"
                      },
                      "required": {
                        "description": "Whether the visitor must fill this field.",
                        "type": "boolean"
                      },
                      "type": {
                        "description": "Input type rendered in the hosted form.",
                        "enum": [
                          "text",
                          "email",
                          "tel",
                          "url",
                          "textarea",
                          "number",
                          "select",
                          "checkbox",
                          "hidden"
                        ],
                        "type": "string"
                      }
                    },
                    "required": [
                      "name",
                      "type"
                    ],
                    "type": "object"
                  },
                  "type": "array"
                },
                "form_id": {
                  "description": "Form UUID from create_form or list_forms.",
                  "format": "uuid",
                  "type": "string"
                },
                "honeypot_field": {
                  "description": "Spam honeypot field name. Omit to leave unchanged.",
                  "type": "string"
                },
                "name": {
                  "description": "New display name. Omit to leave unchanged.",
                  "type": "string"
                },
                "notify_email": {
                  "anyOf": [
                    {
                      "anyOf": [
                        {
                          "not": {}
                        },
                        {
                          "format": "email",
                          "type": "string"
                        }
                      ]
                    },
                    {
                      "type": "null"
                    }
                  ],
                  "description": "Notification inbox. Pass null to clear. Omit to leave unchanged."
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "slug": {
                  "description": "New URL slug. Omit to leave unchanged.",
                  "type": "string"
                },
                "status": {
                  "description": "active accepts submissions; disabled rejects them. Omit to leave unchanged.",
                  "enum": [
                    "active",
                    "disabled"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "form_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "list_form_submissions",
            "title": "List form submissions",
            "description": "List visitor submissions for one Novence form (paginated). Use delete_form_submission to remove PII. Not for update_form schema changes. Read-only.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "form_id": {
                  "description": "Form UUID from create_form or list_forms.",
                  "format": "uuid",
                  "type": "string"
                },
                "limit": {
                  "description": "Page size, 1–100. Optional.",
                  "maximum": 100,
                  "minimum": 1,
                  "type": "integer"
                },
                "offset": {
                  "description": "Number of submissions to skip. Optional; default 0.",
                  "minimum": 0,
                  "type": "integer"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "form_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "delete_form_submission",
            "title": "Delete form submission",
            "description": "Permanently delete one form submission (PII). Does not disable the form — use update_form status=disabled. Irreversible.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "form_id": {
                  "description": "Form UUID from create_form or list_forms.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "submission_id": {
                  "description": "Submission UUID from list_form_submissions.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "form_id",
                "submission_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_quotas_and_usage",
            "title": "Get quotas and usage",
            "description": "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.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_project_usage",
            "title": "Get project usage",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_project_analytics",
            "title": "Get project analytics",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "from": {
                  "description": "Inclusive start date (ISO). Optional; default 7 days ago.",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "to": {
                  "description": "Inclusive end date (ISO). Optional; default today. Range max 90 days.",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "get_account",
            "title": "Get account",
            "description": "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.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "create_account_session",
            "title": "Create account session",
            "description": "Mint a short-lived mgmt_ token for a local HTML console (account:read, billing:portal, project:members). Never put nv_ keys in HTML.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "get_account_console_kit",
            "title": "Get account console kit",
            "description": "JSON kit to write a local novence-console.html: snapshot, HTML template, session mint instructions. Serve on localhost. Use create_account_session for the mgmt_ token; use get_account for JSON without the kit. Read-only.",
            "inputSchema": {
              "properties": {},
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "invite_project_member",
            "title": "Invite project member",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "email": {
                  "description": "Invitee's email. They accept with accept_project_invite.",
                  "format": "email",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "role": {
                  "default": "editor",
                  "description": "Access level. Default editor. Only the owner can grant admin.",
                  "enum": [
                    "viewer",
                    "editor",
                    "admin"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "email"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "list_project_members",
            "title": "List project members",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "idempotentHint": true,
              "openWorldHint": false,
              "readOnlyHint": true
            }
          },
          {
            "name": "update_project_member",
            "title": "Update project member role",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "account_id": {
                  "description": "Collaborator account UUID from list_project_members.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                },
                "role": {
                  "description": "New role. Only the owner can set admin.",
                  "enum": [
                    "viewer",
                    "editor",
                    "admin"
                  ],
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "account_id",
                "role"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "remove_project_member",
            "title": "Remove project member",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "account_id": {
                  "description": "Collaborator account UUID from list_project_members.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "account_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "revoke_project_invite",
            "title": "Revoke project invite",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "invite_id": {
                  "description": "Pending invite UUID from list_project_members.",
                  "format": "uuid",
                  "type": "string"
                },
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id",
                "invite_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "leave_project",
            "title": "Leave project",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "project_id": {
                  "description": "Hosting project UUID from create_project or list_projects.",
                  "format": "uuid",
                  "type": "string"
                }
              },
              "required": [
                "project_id"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": true,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          },
          {
            "name": "accept_project_invite",
            "title": "Accept project invite",
            "description": "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.",
            "inputSchema": {
              "$schema": "http://json-schema.org/draft-07/schema#",
              "additionalProperties": false,
              "properties": {
                "otp": {
                  "description": "Email OTP required when the invitee is not yet verified. Optional if already verified.",
                  "type": "string"
                },
                "token": {
                  "description": "Invite token from the invitation email (or invite_project_member in local/dev).",
                  "type": "string"
                }
              },
              "required": [
                "token"
              ],
              "type": "object"
            },
            "annotations": {
              "destructiveHint": false,
              "openWorldHint": false,
              "readOnlyHint": false
            }
          }
        ]
      },
      "name": "Novence",
      "note": "Indexed from the official MCP registry: facts and our own checks, not reviewed, so no score, grade or rank.",
      "packages": null,
      "pageJsonUrl": "https://www.anchorterminal.com/tools/novence-mcp.json",
      "popularity": {
        "githubStars": 1
      },
      "registryName": "ai.novence/mcp",
      "remotes": [
        {
          "type": "streamable-http",
          "url": "https://api.novence.ai/mcp"
        }
      ],
      "repository": "https://github.com/Novence-ai/mcp",
      "reviewed": false,
      "slug": "novence-mcp",
      "source": "the official MCP registry",
      "sourceUrl": "https://registry.modelcontextprotocol.io/v0.1/servers?search=ai.novence/mcp",
      "summary": "Hosted MCP for creating, checking, deploying, and hosting static sites for AI agents.",
      "updatedAt": "2026-09-05T08:49:11Z",
      "url": "https://www.anchorterminal.com/tools/novence-mcp",
      "vendor": "novence.ai",
      "vendorUrl": "https://novence.ai/mcp",
      "version": "0.1.3",
      "websiteUrl": "https://novence.ai/mcp",
      "where": "hosted",
      "why": [
        "vendor"
      ]
    }
  },
  "kind": "anchor.page",
  "links": {
    "api": "https://www.anchorterminal.com/api/v1/index.json",
    "html": "https://www.anchorterminal.com/tools/novence-mcp",
    "json": "https://www.anchorterminal.com/tools/novence-mcp.json",
    "llms": "https://www.anchorterminal.com/llms.txt",
    "markdown": "https://www.anchorterminal.com/tools/novence-mcp.md",
    "slim": "https://www.anchorterminal.com/tools/novence-mcp.min.md"
  },
  "markdown": "# Novence\n\n\u003e Indexed, not reviewed: facts from the official MCP registry and our own checks. No score, grade or rank, and not in the rankings until the panel reviews it. How the index works: https://www.anchorterminal.com/indexed/\n\n- Kind: MCP server, by novence.ai (https://novence.ai/mcp)\n- Category: Cloud \u0026 infrastructure (https://www.anchorterminal.com/categories/infrastructure.md)\n- Listed because: It's published in the registry under novence.ai, a namespace the registry only gives to whoever proves they control that domain.\n- What the official MCP registry says: Hosted MCP for creating, checking, deploying, and hosting static sites for AI agents.\n\n## Facts\n\n- MCP registry: `ai.novence/mcp` 0.1.3\n- Endpoint: https://api.novence.ai/mcp (streamable HTTP)\n- Source: https://github.com/Novence-ai/mcp\n- Website: https://novence.ai/mcp\n- GitHub stars: 1\n- Registry entry updated: 2026-09-05\n\n## Tools\n\n- Tools it lists (50, about 10,879 tokens of context, `tools/list` without credentials over MCP 2025-11-25, checked 2026-10-04 22:20 UTC):\n  - `bootstrap` (writes): 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…\n  - `verify_email` (writes): Confirm the email OTP (15 min TTL). No Bearer key required. Call after the first live URL, before checkout/mpp_upgrade.\n  - `resend_verification` (writes): Email a new OTP (also used for reissue_key). No Bearer key required. Works when already verified.\n  - `reissue_key` (writes): Mint a new account nv_ key from email OTP. No Bearer key required. WARNING: revokes prior account-scoped nv_ keys. Also verifies email if needed.\n  - `checkout` (writes): 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.\n  - `mpp_upgrade` (writes): Start or complete Pro/Scale via Machine Payments Protocol. Requires nv_ + verified email. First call returns a 402 Payment challenge; retry with…\n  - `billing_portal` (writes): Stripe Customer Portal URL for an existing subscriber (manage/cancel). Not first-time subscribe — use checkout or mpp_upgrade for that.\n  - `create_project` (writes): 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…\n  - `publish_html` (writes): 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…\n  - `list_projects` (read-only): 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…\n  - `get_project` (read-only): Return one hosting project (name, suffix, settings, membership). Use list_projects to discover IDs. Use get_preview_url for the public URL (alias on…\n  - `update_project_settings` (writes): Update project name, description, check thresholds, analyticsEnabled (cookieless edge traffic; off by default), shareGateEmails (optional OTP gate on platform…\n  - `get_upload_url` (writes): 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…\n  - `get_upload_urls_batch` (writes): 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.\n  - `confirm_upload` (writes): 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…\n  - `confirm_uploads_batch` (writes): 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…\n  - `list_files` (read-only): 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.\n  - `get_file` (read-only): Return metadata for one staged path (not file bytes). Use list_files to discover paths; use get_upload_url to replace content. Read-only.\n  - `delete_file` (writes): 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…\n  - `set_redirects` (writes): Write /_redirects (Netlify subset) into staging. Call deploy afterwards to publish. SPA History routing: /* /index.html 200. Exact files always win. Optional…\n  - `put_site_data` (writes): 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.…\n  - `get_site_brief` (read-only): 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.…\n  - `put_site_brief` (writes): 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…\n  - `list_site_events` (read-only): Webmaster inbox (Pro/Scale): form.submitted, collection.updated (agent vs owner_edit), check.completed, deploy.live. Default last 7 days, max 100. Pass since…\n  - `deploy` (writes): Publish the site. Verified accounts run quality checks; unverified accounts skip checks (checkRuns: 0) and still go live. POST returns quickly — poll…\n  - `get_deployment_status` (read-only): Poll publish state after deploy (queued, checking, promoting, live, failed). Omit deployment_id for the latest. Use get_checks_results for Lighthouse/a11y…\n  - `get_preview_url` (read-only): 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…\n  - `rollback` (writes): 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…\n  - `run_checks` (writes): 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…\n  - `get_checks_results` (read-only): 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…\n  - `configure_custom_domain` (writes): 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…\n  - `get_domain_status` (read-only): 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…\n  - `create_form` (writes): Create a Novence form on a project (optional — sites may use Formspree/Web3forms instead). Returns submit URLs for edge + public API.\n  - `list_forms` (read-only): 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.…\n  - `update_form` (writes): Patch an existing Novence form (name, slug, fields, notify_email, honeypot, active|disabled). Partial update: omitted fields stay unchanged. Use create_form…\n  - `list_form_submissions` (read-only): List visitor submissions for one Novence form (paginated). Use delete_form_submission to remove PII. Not for update_form schema changes. Read-only.\n  - `delete_form_submission` (writes): Permanently delete one form submission (PII). Does not disable the form — use update_form status=disabled. Irreversible.\n  - `get_quotas_and_usage` (read-only): Account-level plan limits and current consumption (projects, storage, deploys, bandwidth). Use get_project_usage for one site; use get_account for profile plus…\n  - `get_project_usage` (read-only): Per-project usage (storage, deploys, check minutes, bandwidth, forms). Bandwidth is live from edge-served bytes. Use get_quotas_and_usage for account totals;…\n  - `get_project_analytics` (read-only): Cookieless edge analytics for a hosted site: pageviews, 404s, top pages, referrers, and countries. Off by default. Enable with update_project_settings…\n  - `get_account` (read-only): 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…\n  - `create_account_session` (writes): Mint a short-lived mgmt_ token for a local HTML console (account:read, billing:portal, project:members). Never put nv_ keys in HTML.\n  - `get_account_console_kit` (read-only): JSON kit to write a local novence-console.html: snapshot, HTML template, session mint instructions. Serve on localhost. Use create_account_session for the…\n  - `invite_project_member` (writes): 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…\n  - `list_project_members` (read-only): 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…\n  - `update_project_member` (writes): 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 —…\n  - `remove_project_member` (writes): Remove an accepted collaborator and revoke their project API keys. Owner-only for admins. For a pending invite, use revoke_project_invite instead.…\n  - `revoke_project_invite` (writes): 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…\n  - `leave_project` (writes): 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…\n  - `accept_project_invite` (writes): 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…\n- How its tools read to an agent (0 errors, 1 warning, 1 note, about 10,879 tokens; rules at https://www.anchorterminal.com/check.md; not part of the score):\n  - warn TC23 server: 50 tools\n  - note TC24 server: 50 of 50 tools have no outputSchema\n\n- JSON: https://www.anchorterminal.com/api/v1/tools/novence-mcp.json\n- Being indexed says nothing about quality, and nobody can pay for it. Ask for a review: https://www.anchorterminal.com/builders/#claiming\n",
  "meta": {
    "attribution": "Anchor Terminal (https://www.anchorterminal.com)",
    "docs": "https://www.anchorterminal.com/docs/",
    "generatedAt": "2026-10-05",
    "license": "CC-BY-4.0",
    "method": "https://www.anchorterminal.com/benchmark/",
    "methodology": "0.3",
    "openapi": "https://www.anchorterminal.com/openapi.json",
    "preview": false,
    "run": "2026-10-01",
    "runLabel": "October 2026 research run"
  },
  "page": {
    "breadcrumbs": [
      {
        "name": "Home",
        "url": "https://www.anchorterminal.com/"
      },
      {
        "name": "Terminal",
        "url": "https://www.anchorterminal.com/tools/"
      },
      {
        "name": "Indexed",
        "url": "https://www.anchorterminal.com/indexed/"
      },
      {
        "name": "Novence",
        "url": ""
      }
    ],
    "description": "Novence, an MCP server by novence.ai, listed from the official MCP registry. Indexed, not reviewed: facts and our own checks, no score or ranking. Hosted MCP for creating, checking, deploying, and hosting static sites for AI agents.",
    "facts": [
      "not reviewed",
      "not ranked",
      "facts only"
    ],
    "h1": "Novence",
    "image": "https://www.anchorterminal.com/assets/og/indexed.png",
    "path": "/tools/novence-mcp",
    "published": "",
    "section": "indexed",
    "title": "Novence: MCP server, indexed from the official MCP registry",
    "toc": null,
    "updated": "2026-10-05",
    "url": "https://www.anchorterminal.com/tools/novence-mcp"
  },
  "tokens": {
    "markdown": 2900,
    "slim": 2830
  },
  "version": 1
}
