For agents

Recommended prompts

Drop-in system prompt fragments and tool definitions. Adapt the names and JSON shapes to fit your agent harness.

System prompt fragment

Paste this into your agent's system prompt. It establishes the publish-on-completion habit.

plaintext
You have access to DropFast for publishing HTML artifacts.
 
When you produce an HTML artifact (a plan, a prototype, a report, a
design doc, a review), publish it with the dropfast_publish tool and
include the returned URL in your response. The URL is what the human
will share or reference later.
 
If you are continuing work on a previously published artifact, use
dropfast_update with the same slug instead of dropfast_publish — this
keeps the URL stable across turns.
 
Default accessMode to "private" unless the user has explicitly asked to
share. Flip to "public" (or "password" with a password the user
chose) only on request.

Tool — dropfast_publish

json
{
  "name": "dropfast_publish",
  "description": "Publish an HTML artifact to a stable URL on DropFast. Returns the URL and slug.",
  "input_schema": {
    "type": "object",
    "required": ["html", "name"],
    "properties": {
      "html": {
        "type": "string",
        "description": "Full HTML document. Will be served as index.html."
      },
      "name": {
        "type": "string",
        "description": "Short, human-readable name. Seeds the slug."
      },
      "accessMode": {
        "type": "string",
        "enum": ["public", "private", "password"],
        "default": "private"
      },
      "password": {
        "type": "string",
        "description": "Required only when accessMode is 'password'."
      },
      "message": {
        "type": "string",
        "description": "Optional commit-message-style note. Attached to the version row for this publish/update."
      },
      "commentsEnabled": {
        "type": "boolean",
        "description": "When true, enables the Phase 4 comments overlay/API on the new site so a human (or another agent) can leave inline feedback. Read the feedback later with get_comments and mark items resolved with resolve_comment. Default: false."
      },
      "metadata": {
        "type": "object",
        "description": "Optional key-value tags. Seven reserved keys live under df.* — df.pr, df.repo, df.session, df.agent, df.project, df.type, df.parent. Unknown df.* keys fail loudly. User keys (no df. prefix) are free-form, string | string[]. 8 KB cap on JSON.stringify(metadata). Stored on the site and queryable via the ?metadata.df.*= filter on GET /api/v1/sites.",
        "properties": {
          "df": {
            "type": "object",
            "properties": {
              "pr":      { "type": "string", "description": "e.g. \"github:org/repo#247\"" },
              "repo":    { "type": "string", "description": "e.g. \"github:org/repo\"" },
              "session": { "type": "string", "description": "Session id" },
              "agent":   { "type": "string", "description": "Agent identifier" },
              "project": { "type": "string", "description": "Project label" },
              "type":    { "oneOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }], "description": "Site type tag(s)" },
              "parent":  { "type": "string", "description": "Parent site slug" }
            },
            "additionalProperties": false
          }
        },
        "additionalProperties": {
          "oneOf": [{ "type": "string" }, { "type": "array", "items": { "type": "string" } }]
        }
      }
    }
  }
}

Tool — dropfast_update

json
{
  "name": "dropfast_update",
  "description": "Replace the HTML at an existing DropFast slug. The URL stays the same.",
  "input_schema": {
    "type": "object",
    "required": ["slug", "html"],
    "properties": {
      "slug": {
        "type": "string",
        "description": "The slug returned from dropfast_publish."
      },
      "html": {
        "type": "string",
        "description": "New full HTML document."
      },
      "message": {
        "type": "string",
        "description": "Optional commit-message-style note attached to the new version row."
      }
    }
  }
}

For settings-only edits (toggle access, enable comments, rename), prefer dropfast_update_settings over re-publishing the HTML — files stay untouched and you don't burn a version row.

Tool — dropfast_update_settings

json
{
  "name": "dropfast_update_settings",
  "description": "Change a site's behavior settings (name, accessMode, password, commentsEnabled) without replacing files. Use set_metadata for df.* metadata.",
  "input_schema": {
    "type": "object",
    "required": ["slug"],
    "properties": {
      "slug": { "type": "string" },
      "name": { "type": "string", "description": "Display name. Pass null to clear." },
      "accessMode": {
        "type": "string",
        "enum": ["public", "private", "password"]
      },
      "password": {
        "type": "string",
        "description": "Required when accessMode is 'password'."
      },
      "commentsEnabled": {
        "type": "boolean",
        "description": "Toggle the Phase 4 inline-comments overlay/API on this site. Omit to leave unchanged."
      }
    }
  }
}

Tool — dropfast_get_comments (Phase 4 spike)

json
{
  "name": "dropfast_get_comments",
  "description": "Read open comments on a DropFast site. The site must have commentsEnabled=true. Use before dropfast_update when a human has left review feedback on the published artifact.",
  "input_schema": {
    "type": "object",
    "required": ["slug"],
    "properties": {
      "slug": { "type": "string" },
      "status": {
        "type": "string",
        "enum": ["open", "resolved", "all"],
        "description": "Default 'open'."
      }
    }
  }
}

Implement as GET /api/v1/sites/{slug}/comments?status=open with the Authorization: Bearer df_sk_... header (or MCP get_comments).

Tool — dropfast_add_comment (Phase 4 spike)

json
{
  "name": "dropfast_add_comment",
  "description": "Leave a plain-text comment on a DropFast site (agent-to-agent review). The target must include path and at least one anchor: cssSelector, textQuote, or both x and y.",
  "input_schema": {
    "type": "object",
    "required": ["slug", "bodyText", "target"],
    "properties": {
      "slug": { "type": "string" },
      "bodyText": {
        "type": "string",
        "minLength": 1,
        "maxLength": 2000,
        "description": "Plain text only. HTML rejects."
      },
      "target": {
        "type": "object",
        "required": ["path"],
        "properties": {
          "path": { "type": "string", "description": "Site-local path, e.g. '/' or '/section-2'." },
          "cssSelector": { "type": "string" },
          "textQuote": {
            "type": "object",
            "required": ["exact"],
            "properties": {
              "prefix": { "type": "string" },
              "exact": { "type": "string" },
              "suffix": { "type": "string" }
            }
          },
          "x": { "type": "number", "minimum": 0, "maximum": 1 },
          "y": { "type": "number", "minimum": 0, "maximum": 1 }
        }
      }
    }
  }
}

Tool — dropfast_resolve_comment (Phase 4 spike)

json
{
  "name": "dropfast_resolve_comment",
  "description": "Mark a Phase 4 spike comment open or resolved. Use after dropfast_update when the agent has addressed the comment.",
  "input_schema": {
    "type": "object",
    "required": ["commentId"],
    "properties": {
      "commentId": { "type": "string" },
      "status": {
        "type": "string",
        "enum": ["open", "resolved"],
        "description": "Default 'resolved'."
      }
    }
  }
}

Tool — dropfast_read

Optional but useful when an agent picks up a thread from a URL.

json
{
  "name": "dropfast_read",
  "description": "Fetch the current HTML at a DropFast slug.",
  "input_schema": {
    "type": "object",
    "required": ["slug"],
    "properties": {
      "slug": { "type": "string" }
    }
  }
}

Implement it as a GET https://dropfast.dev/api/v1/sites/{slug} with the Authorization: Bearer df_sk_... header — that endpoint returns the site's metadata under owner auth. The public-facing /s/{slug}/ renderer only honors the Clerk dashboard session, so the API-key path is the right one for agent loops. (To fetch the rendered HTML of your own artifact, keep the slug list locally and GET /s/{slug}/ from a session-authenticated browser, or expose a metadata-only dropfast_read instead.)

Response shape — what to do with the URL

After dropfast_publish returns, your agent's response text should contain the URL on its own line so the human (and any downstream tool) can pick it out:

plaintext
I drafted the spec.
 
Published: https://dropfast.dev/s/feature-spec-7c
 
Want me to keep iterating, or are you taking it from here?

Avoid wrapping the URL in markdown link syntax in chat surfaces that don't render markdown — many do not.

Edit this page on GitHub