Skip to main content
Glama

Publish a folder

publish_dir
Destructive

Turns a disk folder into a live HTTPS link, serving its index.html or documents like Markdown, PDF and Word files through a reader.

Instructions

Publishes a folder from disk and returns its URL. The folder needs an index.html at its root, or documents (.md, .pdf, .docx, .xlsx, .epub), which are served through the reader.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "path": "<path>"
    },
    "name": "publish_dir"
  }
}

Input Schema

NameRequiredDescriptionDefault
pathYesAbsolute path of the folder to publish.
siteNoSubdomain or site id to publish over. Omit to create a new site.
folderNoFolder to file the new site in, when the person asked for one: its path of names such as Clients/Acme, or its id from list_folders. Only for a new site — do not pass it together with `site`; moving an existing site is update_site's `folder`. It never creates a folder: a folder that does not exist is refused with the list of those that do, and nothing is published.
subdomainNoSubdomain to create the new site under, when the person asked for a particular address. Only for a new site: leave it out to publish over an existing one, and do not pass it together with `site`. Ask rather than inventing one — the name is the URL somebody will be given, changing it later spends one of the few changes a site gets, and an unused site made under a guessed name has to be deleted by hand.

Output Schema

NameRequiredDescriptionDefault
urlYesThe live URL of the published site.
filesYesHow many files the site now serves.
siteIdYesIdentifier of the site, stable across publishes.
subdomainYesThe site's subdomain, which is what `site` accepts.
unchangedYesTrue when every file already matched what the site served, so no new version was published.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.2.6
    • changedInput schema / properties / subdomain / description
      Previous value: -"Subdomain to create the new site under, when the person asked for a particular address. Only for a new site: leave it out to publish over an existing one, and do not pass it together with `site`. Ask rather than inventing one — the name is the URL somebody will be given, it cannot be changed afterwards, and an unused site made under a guessed name has to be deleted by hand."New value: +"Subdomain to create the new site under, when the person asked for a particular address. Only for a new site: leave it out to publish over an existing one, and do not pass it together with `site`. Ask rather than inventing one — the name is the URL somebody will be given, changing it later spends one of the few changes a site gets, and an unused site made under a guessed name has to be deleted by hand."
  2. Changed1 schema field changedv0.2.5
    • changedInput schema / properties / folder / description
      Previous value: -"Folder to file the new site in, when the person asked for one: its path of names such as Clients/Acme, or its id from list_folders. Only for a new site — do not pass it together with `site`; moving an existing site is done in the dashboard. It never creates a folder: a folder that does not exist is refused with the list of those that do, and nothing is published."New value: +"Folder to file the new site in, when the person asked for one: its path of names such as Clients/Acme, or its id from list_folders. Only for a new site — do not pass it together with `site`; moving an existing site is update_site's `folder`. It never creates a folder: a folder that does not exist is refused with the list of those that do, and nothing is published."
  3. Changed2 schema fields changedv0.2.4
    • addedInput schema / properties / folder
      Added value: +{
      +  "description": "Folder to file the new site in, when the person asked for one: its path of names such as Clients/Acme, or its id from list_folders. Only for a new site — do not pass it together with `site`; moving an existing site is done in the dashboard. It never creates a folder: a folder that does not exist is refused with the list of those that do, and nothing is published.",
      +  "type": "string"
      +}
    • addedInput schema / properties / subdomain
      Added value: +{
      +  "description": "Subdomain to create the new site under, when the person asked for a particular address. Only for a new site: leave it out to publish over an existing one, and do not pass it together with `site`. Ask rather than inventing one — the name is the URL somebody will be given, it cannot be changed afterwards, and an unused site made under a guessed name has to be deleted by hand.",
      +  "type": "string"
      +}
  4. Changed1 schema field changedv0.2.1
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "http://json-schema.org/draft-07/schema#",
      +  "additionalProperties": false,
      +  "properties": {
      +    "files": {
      +      "description": "How many files the site now serves.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "siteId": {
      +      "description": "Identifier of the site, stable across publishes.",
      +      "type": "string"
      +    },
      +    "subdomain": {
      +      "description": "The site's subdomain, which is what `site` accepts.",
      +      "type": "string"
      +    },
      +    "unchanged": {
      +      "description": "True when every file already matched what the site served, so no new version was published.",
      +      "type": "boolean"
      +    },
      +    "url": {
      +      "description": "The live URL of the published site.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "url",
      +    "siteId",
      +    "subdomain",
      +    "files",
      +    "unchanged"
      +  ],
      +  "type": "object"
      +}
  5. First observedv0.2.0

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=false and openWorldHint=true, so the agent knows publishing is public and mutating. The description usefully adds the content requirements that determine whether the operation succeeds, but never discloses what happens when publishing over an existing site (overwrite/replace semantics), which is the main behavioral risk here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and result, followed immediately by the one constraint that governs success. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, and the content precondition is covered. However, for a destructive, non-idempotent publish that can target an existing site via `site`, the description omits what publishing over an existing site does to prior content, leaving a meaningful gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the parameters carry unusually rich descriptions (e.g., folder's refusal behavior, subdomain's change budget and ask-rather-than-invent guidance). The description adds nothing parameter-specific, so the baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Publishes') and resource ('a folder from disk') and names the outcome ('returns its URL'). It also disambiguates the content requirement (index.html or reader-served documents), which separates it from the publish_files sibling, though it never names that sibling directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description states the folder's content precondition but gives no when-to-use versus alternatives guidance, and never mentions publish_files or when a folder publish is preferred over a file publish. Usage must be inferred from the precondition alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.