ShipStatic

Deploy static websites from AI agents. Free at mcp.shipstatic.com — no install, no signup.

Should I use this

Quality & Safety

A
Description quality
99%
Schema completeness
94%
Naming quality
80%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~7,854Tokens (tool definitions)
~5.7 KBTypical response size
Significant attention impact (6.14% of 128k context)

This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.

Install

One-Click Install

Add this to your `claude_desktop_config.json` file:

{
  "mcpServers": {
    "mcp": {
      "command": "npx",
      "args": [
        "@shipstatic/mcp"
      ]
    }
  }
}

Runnable packages

npm@shipstatic/mcp2.3.1stdio

Remote endpoints

https://mcp.shipstatic.comstreamable-http

What it can do

Tool inventory

Tools (15)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟡deployments_upload(files, labels, password, idempotencyKey, ttl)

Deploy a static site to a live URL: free, no account or API key required. **File content is plain text by default.** Pass HTML/CSS/JS/JSON/SVG/etc. directly in each file's `content` as a regular string. Only set `encoding: "base64"` per-file for binary content (images, fonts) — do not base64-encode text. Returns the live URL. Without a connected account, the response also includes a one-time claim URL, and the site expires in 3 days unless claimed. Pass `password` to make the site private.

Input Schema

{
  "type": "object",
  "properties": {
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "description": "Relative path within the site (e.g. \"index.html\", \"assets/app.css\"). No leading slash; no parent-folder wrapping."
          },
          "content": {
            "type": "string",
            "description": "File content as a plain text string. For HTML, CSS, JS, JSON, SVG, plain text — pass directly with no encoding step. For binary files (images, fonts) ONLY, set this entry's `encoding: \"base64\"` and pass base64-encoded bytes."
          },
          "encoding": {
            "description": "Defaults to `\"utf-8\"` (raw text). Set to `\"base64\"` ONLY for binary files. Never base64-encode text content — pass it as a plain string.",
            "type": "string",
            "enum": [
              "utf-8",
              "base64"
            ]
          }
        },
        "required": [
          "path",
          "content"
        ]
      },
      "description": "Files that make up the site. The site root is implied by these paths."
    },
    "labels": {
      "description": "Labels for organizing deployments (e.g. [\"production\", \"v1.2\"]). Lowercase, 3-25 chars, allows . _ - separators. Up to 10.",
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "password": {
      "description": "Optional password to gate the deployment behind an unlock prompt (6–128 characters; whitespace significant). Visitors must enter this password before viewing the site, including on any custom domains pointing at it.",
      "type": "string"
    },
    "idempotencyKey": {
      "description": "Makes this deploy replayable instead of repeatable. A deploy is not naturally idempotent: if a call times out you cannot tell \"it never landed\" from \"it landed and the response was lost\", and retrying creates a second deployment. Send the same key on the retry and the original deployment is replayed instead (within 24 hours). Key the ATTEMPT — a run id, a commit sha, a uuid minted before the first try — never one minted fresh on each retry, which would defeat the point.",
      "type": "string"
    },
    "ttl": {
      "description": "Seconds until this deployment expires and the platform reclaims it; omit for one that never does. Only for authenticated deploys — an anonymous deployment already expires on the platform's schedule, and a requested ttl on one is refused. A deployment carrying a ttl cannot be linked to a custom domain: deploy without one if the site needs a domain.",
      "type": "number"
    }
  },
  "required": [
    "files"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the live deployment."
    },
    "files": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Number of files in the deployment."
    },
    "size": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Total deployment size in bytes."
    },
    "status": {
      "type": "string",
      "description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
    },
    "config": {
      "type": "boolean",
      "description": "True if the deployment includes a ship.json routing config."
    },
    "password": {
      "type": "boolean",
      "description": "True if the deployment is password-protected."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Labels attached to the deployment; empty when none."
    },
    "via": {
      "description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
      "type": [
        "string",
        "null"
      ]
    },
    "created": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Unix timestamp (seconds) when the deployment was created."
    },
    "expires": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
    },
    "screenshot": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
    },
    "claim": {
      "description": "One-time URL that claims this anonymous deployment to a free account, making it permanent. Only present on anonymous deploys; absent when the deploy was made with a connected account.",
      "type": "string",
      "format": "uri"
    }
  },
  "required": [
    "deployment",
    "url",
    "files",
    "size",
    "status",
    "config",
    "password",
    "labels",
    "via",
    "created",
    "expires",
    "screenshot"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢deployments_list(limit, cursor)

List all deployments with their URLs, status, labels, and password protection state. The response's `cursor` is null on the last page; pass it back as `cursor` to fetch the next.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Maximum number of items to return in one page. Omit for the server default.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Opaque position from the previous response's `cursor` field; omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "cursor": {
      "description": "Opaque cursor for the next page; null on the last page. The whole has-more signal.",
      "type": [
        "string",
        "null"
      ]
    },
    "deployments": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "deployment": {
            "type": "string",
            "description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Full URL to the live deployment."
          },
          "files": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "Number of files in the deployment."
          },
          "size": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "Total deployment size in bytes."
          },
          "status": {
            "type": "string",
            "description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
          },
          "config": {
            "type": "boolean",
            "description": "True if the deployment includes a ship.json routing config."
          },
          "password": {
            "type": "boolean",
            "description": "True if the deployment is password-protected."
          },
          "labels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Labels attached to the deployment; empty when none."
          },
          "via": {
            "description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
            "type": [
              "string",
              "null"
            ]
          },
          "created": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Unix timestamp (seconds) when the deployment was created."
          },
          "expires": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
          },
          "screenshot": {
            "type": "string",
            "format": "uri",
            "description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
          }
        },
        "required": [
          "deployment",
          "url",
          "files",
          "size",
          "status",
          "config",
          "password",
          "labels",
          "via",
          "created",
          "expires",
          "screenshot"
        ],
        "additionalProperties": false
      },
      "description": "The deployments on this page."
    }
  },
  "required": [
    "cursor",
    "deployments"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢deployments_get(deployment)

Get deployment details including URL, status, file count, size, labels, and password protection state.

Input Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "Deployment hostname (e.g. \"happy-cat-abc1234.shipstatic.com\"). Returned by deployments_upload or deployments_list."
    }
  },
  "required": [
    "deployment"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the live deployment."
    },
    "files": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Number of files in the deployment."
    },
    "size": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Total deployment size in bytes."
    },
    "status": {
      "type": "string",
      "description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
    },
    "config": {
      "type": "boolean",
      "description": "True if the deployment includes a ship.json routing config."
    },
    "password": {
      "type": "boolean",
      "description": "True if the deployment is password-protected."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Labels attached to the deployment; empty when none."
    },
    "via": {
      "description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
      "type": [
        "string",
        "null"
      ]
    },
    "created": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Unix timestamp (seconds) when the deployment was created."
    },
    "expires": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
    },
    "screenshot": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
    }
  },
  "required": [
    "deployment",
    "url",
    "files",
    "size",
    "status",
    "config",
    "password",
    "labels",
    "via",
    "created",
    "expires",
    "screenshot"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🔴deployments_set(deployment, labels)

Update deployment labels. Replaces all existing labels.

Input Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "Deployment hostname (e.g. \"happy-cat-abc1234.shipstatic.com\"). Use deployments_list to find deployments."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Labels to set. Replaces all existing labels. Pass empty array to clear."
    }
  },
  "required": [
    "deployment",
    "labels"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "Deployment hostname, e.g. \"happy-cat-abc1234.shipstatic.com\"."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the live deployment."
    },
    "files": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Number of files in the deployment."
    },
    "size": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "Total deployment size in bytes."
    },
    "status": {
      "type": "string",
      "description": "Deployment lifecycle state; \"success\" means the site is live. One of: pending, success, failed, deleting."
    },
    "config": {
      "type": "boolean",
      "description": "True if the deployment includes a ship.json routing config."
    },
    "password": {
      "type": "boolean",
      "description": "True if the deployment is password-protected."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Labels attached to the deployment; empty when none."
    },
    "via": {
      "description": "How the deployment was created, as shown in deployment history (today one of: web, sdk, cli, mcp, git, n8n, gpt, vsc, cld, crs, gmn, api). Null on deployments older than the tag.",
      "type": [
        "string",
        "null"
      ]
    },
    "created": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Unix timestamp (seconds) when the deployment was created."
    },
    "expires": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when the deployment expires; null when permanent. Anonymous deployments expire 3 days after creation unless claimed; an authenticated deployment carries one only when it requested a ttl."
    },
    "screenshot": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the deployment screenshot. Rendered on the first request for it, so the URL is returned immediately and the first request takes a few seconds; every request after that is served immediately."
    }
  },
  "required": [
    "deployment",
    "url",
    "files",
    "size",
    "status",
    "config",
    "password",
    "labels",
    "via",
    "created",
    "expires",
    "screenshot"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🔴deployments_delete(deployment)

Permanently deletes a deployment and its files.

Input Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "Deployment hostname to delete (e.g. \"happy-cat-abc1234.shipstatic.com\")"
    }
  },
  "required": [
    "deployment"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "deployment": {
      "type": "string",
      "description": "The deployment hostname that was marked for removal."
    },
    "status": {
      "type": "string",
      "description": "The state the deployment is in while background cleanup runs. One of: pending, success, failed, deleting."
    }
  },
  "required": [
    "deployment",
    "status"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🔴domains_set(domain, deployment, labels)

Create or update a custom domain. Can reserve a name (omit deployment), link it to a deployment, switch deployments, or update labels. domains_records then returns the DNS records to configure.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name (e.g. \"www.example.com\" or \"blog.example.com\")"
    },
    "deployment": {
      "description": "Deployment to serve on this domain (e.g. \"happy-cat-abc1234.shipstatic.com\"). Omit to reserve the domain without linking.",
      "type": "string"
    },
    "labels": {
      "description": "Labels for organizing domains (e.g. [\"production\"]).",
      "type": "array",
      "items": {
        "type": "string"
      }
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain name, e.g. \"www.example.com\"."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the domain."
    },
    "status": {
      "type": "string",
      "description": "What this domain needs from its owner, derived: \"live\" serves the linked deployment and needs nothing; \"unlinked\" is verified with nothing published there, so link a deployment; \"unverified\" needs its DNS records configured; \"paused\" means the plan no longer has room for it. Read this word rather than recomputing it. One of: live, unlinked, unverified, paused."
    },
    "deployment": {
      "description": "The deployment hostname this domain points to; null when reserved but not yet linked.",
      "type": [
        "string",
        "null"
      ]
    },
    "linked": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when a deployment was last linked; null if never linked."
    },
    "links": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "How many times a deployment has been linked to this domain."
    },
    "verification": {
      "type": "string",
      "description": "How far DNS verification has got: \"pending\" is the site's CNAME not pointing here, \"partial\" is a www domain's CNAME pointing here without its apex A record (the redirect), \"verified\" is every required record. The diagnostic under \"unverified\"; platform domains are born verified. One of: pending, partial, verified."
    },
    "verified": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "When DNS last became verified; null if it never has, and never cleared, so a domain whose records moved away keeps it. Read `verification` for whether DNS is right now."
    },
    "verifications": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "How many DNS verification attempts this domain has had."
    },
    "paused": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when plan enforcement paused serving; null while the plan has room for it."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Labels attached to the domain; empty when none."
    },
    "created": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Unix timestamp (seconds) when the domain was created."
    },
    "isCreate": {
      "type": "boolean",
      "description": "True when this call created the domain; false when it updated an existing one."
    }
  },
  "required": [
    "domain",
    "url",
    "status",
    "deployment",
    "linked",
    "links",
    "verification",
    "verified",
    "verifications",
    "paused",
    "labels",
    "created",
    "isCreate"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_list(limit, cursor)

List all domains with their URLs, linked deployment, and `status`. The response's `cursor` is null on the last page; pass it back as `cursor` to fetch the next.

Input Schema

{
  "type": "object",
  "properties": {
    "limit": {
      "description": "Maximum number of items to return in one page. Omit for the server default.",
      "type": "integer",
      "minimum": 1,
      "maximum": 9007199254740991
    },
    "cursor": {
      "description": "Opaque position from the previous response's `cursor` field; omit for the first page.",
      "type": "string"
    }
  },
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "cursor": {
      "description": "Opaque cursor for the next page; null on the last page. The whole has-more signal.",
      "type": [
        "string",
        "null"
      ]
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "domain": {
            "type": "string",
            "description": "The domain name, e.g. \"www.example.com\"."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "Full URL to the domain."
          },
          "status": {
            "type": "string",
            "description": "What this domain needs from its owner, derived: \"live\" serves the linked deployment and needs nothing; \"unlinked\" is verified with nothing published there, so link a deployment; \"unverified\" needs its DNS records configured; \"paused\" means the plan no longer has room for it. Read this word rather than recomputing it. One of: live, unlinked, unverified, paused."
          },
          "deployment": {
            "description": "The deployment hostname this domain points to; null when reserved but not yet linked.",
            "type": [
              "string",
              "null"
            ]
          },
          "linked": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unix timestamp (seconds) when a deployment was last linked; null if never linked."
          },
          "links": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "How many times a deployment has been linked to this domain."
          },
          "verification": {
            "type": "string",
            "description": "How far DNS verification has got: \"pending\" is the site's CNAME not pointing here, \"partial\" is a www domain's CNAME pointing here without its apex A record (the redirect), \"verified\" is every required record. The diagnostic under \"unverified\"; platform domains are born verified. One of: pending, partial, verified."
          },
          "verified": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "When DNS last became verified; null if it never has, and never cleared, so a domain whose records moved away keeps it. Read `verification` for whether DNS is right now."
          },
          "verifications": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991,
            "description": "How many DNS verification attempts this domain has had."
          },
          "paused": {
            "anyOf": [
              {
                "type": "integer",
                "minimum": -9007199254740991,
                "maximum": 9007199254740991
              },
              {
                "type": "null"
              }
            ],
            "description": "Unix timestamp (seconds) when plan enforcement paused serving; null while the plan has room for it."
          },
          "labels": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Labels attached to the domain; empty when none."
          },
          "created": {
            "type": "integer",
            "minimum": -9007199254740991,
            "maximum": 9007199254740991,
            "description": "Unix timestamp (seconds) when the domain was created."
          }
        },
        "required": [
          "domain",
          "url",
          "status",
          "deployment",
          "linked",
          "links",
          "verification",
          "verified",
          "verifications",
          "paused",
          "labels",
          "created"
        ],
        "additionalProperties": false
      },
      "description": "The domains on this page."
    }
  },
  "required": [
    "cursor",
    "domains"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_get(domain)

Get domain details including URL, linked deployment, labels, and `status`: the one word saying what the domain needs from its owner (`unverified`, `unlinked`, `live`, `paused`).

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name (e.g. \"www.example.com\"). Use domains_list to find names."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain name, e.g. \"www.example.com\"."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "Full URL to the domain."
    },
    "status": {
      "type": "string",
      "description": "What this domain needs from its owner, derived: \"live\" serves the linked deployment and needs nothing; \"unlinked\" is verified with nothing published there, so link a deployment; \"unverified\" needs its DNS records configured; \"paused\" means the plan no longer has room for it. Read this word rather than recomputing it. One of: live, unlinked, unverified, paused."
    },
    "deployment": {
      "description": "The deployment hostname this domain points to; null when reserved but not yet linked.",
      "type": [
        "string",
        "null"
      ]
    },
    "linked": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when a deployment was last linked; null if never linked."
    },
    "links": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "How many times a deployment has been linked to this domain."
    },
    "verification": {
      "type": "string",
      "description": "How far DNS verification has got: \"pending\" is the site's CNAME not pointing here, \"partial\" is a www domain's CNAME pointing here without its apex A record (the redirect), \"verified\" is every required record. The diagnostic under \"unverified\"; platform domains are born verified. One of: pending, partial, verified."
    },
    "verified": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "When DNS last became verified; null if it never has, and never cleared, so a domain whose records moved away keeps it. Read `verification` for whether DNS is right now."
    },
    "verifications": {
      "type": "integer",
      "minimum": 0,
      "maximum": 9007199254740991,
      "description": "How many DNS verification attempts this domain has had."
    },
    "paused": {
      "anyOf": [
        {
          "type": "integer",
          "minimum": -9007199254740991,
          "maximum": 9007199254740991
        },
        {
          "type": "null"
        }
      ],
      "description": "Unix timestamp (seconds) when plan enforcement paused serving; null while the plan has room for it."
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Labels attached to the domain; empty when none."
    },
    "created": {
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991,
      "description": "Unix timestamp (seconds) when the domain was created."
    }
  },
  "required": [
    "domain",
    "url",
    "status",
    "deployment",
    "linked",
    "links",
    "verification",
    "verified",
    "verifications",
    "paused",
    "labels",
    "created"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_records(domain)

Returns the DNS records to configure at the domain's DNS provider. Call after domains_set.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name. Must be a domain previously created with domains_set."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain the records are for."
    },
    "apex": {
      "type": "string",
      "description": "The apex (registered) domain where DNS records are managed."
    },
    "records": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "A",
              "CNAME"
            ],
            "description": "Record type: A for the apex redirect, CNAME for the hosted subdomain."
          },
          "name": {
            "type": "string",
            "description": "The DNS name to configure."
          },
          "value": {
            "type": "string",
            "description": "The value to set: an IP for A, a hostname for CNAME."
          }
        },
        "required": [
          "type",
          "name",
          "value"
        ],
        "additionalProperties": false
      },
      "description": "The records to configure at the DNS provider, in the order to add them."
    }
  },
  "required": [
    "domain",
    "apex",
    "records"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_dns(domain)

Returns the DNS provider recorded for the domain, if known (e.g. Cloudflare, Namecheap): where its DNS records are configured.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name (e.g. \"www.example.com\"). Must be a domain previously created with domains_set."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain name."
    },
    "dns": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "provider": {
              "description": "The provider serving this domain's DNS; absent when unidentified.",
              "type": "object",
              "properties": {
                "name": {
                  "description": "Provider name, e.g. \"Cloudflare\"; null if unknown.",
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "url": {
                  "description": "The provider's DNS dashboard, where the records get added; null or absent when unknown.",
                  "anyOf": [
                    {
                      "type": "string",
                      "format": "uri"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "required": [
                "name"
              ],
              "additionalProperties": false
            }
          },
          "additionalProperties": false
        },
        {
          "type": "null"
        }
      ],
      "description": "What the platform recorded about the domain's DNS provider when the domain was created; null if nothing was recorded."
    }
  },
  "required": [
    "domain",
    "dns"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_share(domain)

Returns a shareable DNS setup URL that needs no API key, for whoever manages the domain's DNS.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name to generate a share link for. Must be a domain previously created with domains_set."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain the setup link is for."
    },
    "url": {
      "type": "string",
      "format": "uri",
      "description": "The shareable DNS setup URL; whoever opens it sees the records to configure, with no API key."
    }
  },
  "required": [
    "domain",
    "url"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_validate(domain)

Check if a domain name is valid and available before creating it. Returns the normalized form and availability.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name to check (e.g. \"www.example.com\"). Call before domains_set to check availability."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "valid": {
      "type": "boolean",
      "description": "Whether the domain's shape is usable."
    },
    "normalized": {
      "description": "The normalized domain name; null when invalid.",
      "type": [
        "string",
        "null"
      ]
    },
    "available": {
      "description": "Whether nobody has registered the name yet; null when invalid. Creating it would be new; re-pointing your own domain is a write, not a create.",
      "type": [
        "boolean",
        "null"
      ]
    },
    "reason": {
      "description": "Why the name is unusable, for display; null when it is usable.",
      "type": [
        "string",
        "null"
      ]
    }
  },
  "required": [
    "valid",
    "normalized",
    "available",
    "reason"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢domains_verify(domain)

Trigger DNS verification for a custom domain. Call after the user has configured DNS records from domains_records. Verification is asynchronous — read the domain again with domains_get to learn the verdict, since its `status` has not moved yet when this returns. A verified domain serves nothing until a deployment is linked with domains_set.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name to verify DNS for. Must be a domain previously created with domains_set."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain whose DNS verification was queued, normalized. The check runs asynchronously; the domain's `verification` and `status` update once DNS propagates, so read the domain again rather than trusting this acknowledgement for a verdict."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🔴domains_delete(domain)

Permanently deletes a domain.

Input Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domain name to delete (e.g. \"www.example.com\")"
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#"
}

Output Schema

{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "The domain name that was removed, normalized."
    }
  },
  "required": [
    "domain"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}
🟢whoami

Returns the account's email, name, plan, current usage and plan caps.

Input Schema

{
  "type": "object",
  "properties": {}
}

Output Schema

{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "The account email address."
    },
    "name": {
      "description": "Display name; null if not set.",
      "type": [
        "string",
        "null"
      ]
    },
    "plan": {
      "type": "string",
      "description": "The plan the account is on. One of: free, pro, team, scale, sponsored."
    },
    "usage": {
      "type": "object",
      "properties": {
        "deployments": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Deployments, every row whatever its status."
        },
        "platformDomains": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Names chosen under the platform's own suffix, e.g. \"my-app.shipstatic.com\"."
        },
        "customDomains": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Hostnames the customer owns, paused ones included."
        },
        "seats": {
          "description": "People with a seat: the owner and every member. Absent on responses that predate seats, which then mean one seat.",
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "deployments",
        "platformDomains",
        "customDomains"
      ],
      "additionalProperties": false,
      "description": "What the account currently holds."
    },
    "caps": {
      "type": "object",
      "properties": {
        "deployments": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Deployments, every row whatever its status."
        },
        "platformDomains": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Names chosen under the platform's own suffix, e.g. \"my-app.shipstatic.com\"."
        },
        "customDomains": {
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991,
          "description": "Hostnames the customer owns, paused ones included."
        },
        "seats": {
          "description": "People with a seat: the owner and every member. Absent on responses that predate seats, which then mean one seat.",
          "type": "integer",
          "minimum": 0,
          "maximum": 9007199254740991
        }
      },
      "required": [
        "deployments",
        "platformDomains",
        "customDomains"
      ],
      "additionalProperties": false,
      "description": "What the account is allowed to hold: the same keys as usage, so the pair divides."
    }
  },
  "required": [
    "email",
    "name",
    "plan",
    "usage",
    "caps"
  ],
  "$schema": "http://json-schema.org/draft-07/schema#",
  "additionalProperties": false
}

Community

Rate this Server

Evidence

Recent observations

verifiedversion not recorded15 tools
verifiedversion not recorded15 tools