Koskamo

BrewPage MCP

An MCP server that enables AI agents to publish HTML, Markdown, files, and sites to BrewPage, manage visibility, and retrieve stats via tools like publish_html and delete_resource.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

BrewPage MCP logo, by kochetkov-maCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-01Published by kochetkov-ma
MCP endpoint (Streamable HTTP)
https://brewpage.app/mcp
Vendor documentation

What you can do with it

  • Publish HTML or Markdown content to a shareable link
  • Upload files or multi-file sites to BrewPage
  • Delete published resources using an owner token
  • Fetch published page content and platform statistics

Source and maintenance

Community listingRegistry 1.16.6
Maintenance checked

Protocol and capabilities

Server
brewpage-mcp 1.16.6
MCP protocol
2025-06-18
Tools
20 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  }
}

Tools

20 advertised

publish_html — Publish HTML, Markdown, code or JSON page
Advertised by the server during the last successful anonymous check.

Publish HTML, Markdown, code or JSON to BrewPage (max 5 MiB). Send namespace=public to be found: gallery + Google, Bing & AI search. Omitted: private. Format omitted -> server detects it. Returns its primary share link and owner token. Optional password, TTL, filename, top toolbar (showTopBar). A `public` page without deliveryMode may get its own subdomain if it needs browser features a BrewPage link lacks; the result then has deliveryModeReason and a delivery notice. Markdown raw HTML is allowlisted: scripts, styles, event handlers, forms, embeds removed. Returns manageUrl, a private management link (grants control; not for public sharing). Secrets allowed; likely ones are flagged in notices. Private namespace + password suit secrets. BrewPage tokens and manage links must never be in public content.

publish_html input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "content"
  ],
  "properties": {
    "format": {
      "type": "string",
      "minLength": 1,
      "description": "Omit: server detects html, markdown, code or JSON. `html` keeps code/JSON as HTML; also markdown/md or a code language."
    },
    "content": {
      "type": "string",
      "description": "HTML, Markdown, code or JSON to publish"
    },
    "ttlDays": {
      "anyOf": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "maxLength": 32,
          "minLength": 1
        }
      ],
      "description": "Requested TTL: days as a number, or a string such as '2w', '36h' or '1 month' (default 15 days). The server rounds to whole days and clamps to the allowed range (1-30; up to 90 with an owner token in a profile), reporting each adjustment in notices; the returned expiresAt is the actual expiry."
    },
    "filename": {
      "type": "string",
      "maxLength": 200,
      "description": "Optional original filename (≤200 chars). Used as title fallback when no <title>/<h1>; immutable on update."
    },
    "password": {
      "type": "string",
      "description": "Optional password to protect the page"
    },
    "namespace": {
      "type": "string",
      "description": "Send namespace=public for anything meant to be found or shared (docs, guides, demos, portfolios, reports, landing pages): listed in the public gallery and sitemap, so Google, Bing and AI search index it and people discover it. Public pages are served on the brewpage.app domain itself, for the strongest search reach; code that needs its own origin (cookies, storage) gets its own subdomain automatically. Anyone can find and read a public page, so it is unsuitable for secrets, tokens or personal data. Omit (default): private, a generated priv-* namespace; unlisted, not indexed; the link still opens it. Lowercase only: 1-32 of a-z, 0-9, hyphen."
    },
    "ownerToken": {
      "type": "string",
      "description": "Optional; the ownerToken from your first create keeps publications under one owner. Default: env BREWPAGE_OWNER_TOKEN (local server only), else a new token per create."
    },
    "showTopBar": {
      "type": "boolean",
      "description": "Add a thin top toolbar (filename + Download button + theme toggle) on the served page. Default: hidden."
    },
    "deliveryMode": {
      "enum": [
        "path",
        "subdomain"
      ],
      "type": "string",
      "description": "Optional delivery choice for a fresh publication, independent of password/namespace. Fresh sites and HTML-format pages outside public (including the default unlisted namespace) always use subdomain; an explicit path there still publishes, on subdomain, with a delivery notice. Everything else in any namespace (Markdown, code/text, files, JSON, KV, public HTML) defaults to path (Promotion); public HTML may automatically choose subdomain for browser features. When creation returns an existing publication, it keeps its actual mode and URL."
    }
  }
}
publish_html annotations
{
  "title": "Publish HTML, Markdown, code or JSON page",
  "readOnlyHint": false,
  "destructiveHint": false
}
publish_file — Publish file from URL
Advertised by the server during the last successful anonymous check.

Upload a file from a URL. Send namespace=public to be found: gallery + Google, Bing & AI search. Omitted: private. Max 5 MiB, video 20 MiB; no password or TTL. Returns its primary share link and owner token. Returns manageUrl, a private management link (grants control; not for public sharing). Secrets allowed; likely ones are flagged in notices. Private namespace + password suit secrets. BrewPage tokens and manage links must never be in public content.

publish_file input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "url"
  ],
  "properties": {
    "url": {
      "type": "string",
      "format": "uri",
      "description": "URL of the file to upload"
    },
    "filename": {
      "type": "string",
      "description": "Custom filename (optional)"
    },
    "namespace": {
      "type": "string",
      "description": "Send namespace=public for anything meant to be found or shared (docs, guides, demos, portfolios, reports, landing pages): listed in the public gallery and sitemap, so Google, Bing and AI search index it and people discover it. Public pages are served on the brewpage.app domain itself, for the strongest search reach; code that needs its own origin (cookies, storage) gets its own subdomain automatically. Anyone can find and read a public page, so it is unsuitable for secrets, tokens or personal data. Omit (default): private, a generated priv-* namespace; unlisted, not indexed; the link still opens it. Lowercase only: 1-32 of a-z, 0-9, hyphen."
    },
    "ownerToken": {
      "type": "string",
      "description": "Optional; the ownerToken from your first create keeps publications under one owner. Default: env BREWPAGE_OWNER_TOKEN (local server only), else a new token per create."
    },
    "deliveryMode": {
      "enum": [
        "path",
        "subdomain"
      ],
      "type": "string",
      "description": "Optional delivery choice for a fresh publication, independent of password/namespace. Fresh sites and HTML-format pages outside public (including the default unlisted namespace) always use subdomain; an explicit path there still publishes, on subdomain, with a delivery notice. Everything else in any namespace (Markdown, code/text, files, JSON, KV, public HTML) defaults to path (Promotion); public HTML may automatically choose subdomain for browser features. When creation returns an existing publication, it keeps its actual mode and URL."
    }
  }
}
publish_file annotations
{
  "title": "Publish file from URL",
  "readOnlyHint": false,
  "destructiveHint": false
}
update_hosting — Change delivery mode
Advertised by the server during the last successful anonymous check.

Change delivery mode for a NEW publication (not a site, not a non-public HTML-format page). Requires owner token; optional expectedVersion = current hostingVersion. Mismatches are reported, not rejected: a stale version still applies, and OLD links or forced subdomain modes stay unchanged; the result then carries a delivery notice. Content updates never change hosting.

update_hosting input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "type",
    "namespace",
    "id",
    "deliveryMode"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Resource ID"
    },
    "type": {
      "enum": [
        "html",
        "file",
        "json",
        "kv"
      ],
      "type": "string",
      "description": "Resource type; sites always stay on their own subdomain"
    },
    "namespace": {
      "type": "string",
      "description": "Resource namespace; non-public HTML-format pages stay on subdomain"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    },
    "deliveryMode": {
      "enum": [
        "path",
        "subdomain"
      ],
      "type": "string",
      "description": "path = Promotion; subdomain = Dedicated subdomain"
    },
    "expectedVersion": {
      "type": "integer",
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Optional current hostingVersion from the server; a stale value still applies and the result says so"
    }
  }
}
update_hosting annotations
{
  "title": "Change delivery mode",
  "readOnlyHint": false,
  "destructiveHint": false
}
delete_resource — Delete publication
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a BrewPage resource (HTML page, site, KV store, JSON document, or file) using the owner token.

delete_resource input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "type",
    "namespace",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Resource ID"
    },
    "type": {
      "enum": [
        "html",
        "site",
        "kv",
        "json",
        "file"
      ],
      "type": "string",
      "description": "Resource type to delete"
    },
    "namespace": {
      "type": "string",
      "description": "Resource namespace"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
delete_resource annotations
{
  "title": "Delete publication",
  "readOnlyHint": false,
  "destructiveHint": true
}
get_page — Read page
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch stored rendered HTML or format-specific code/text by namespace and ID. This reads API content, not the owner-only original-source endpoint or browser viewer. Protected reads use the password header.

get_page input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Page ID"
    },
    "password": {
      "type": "string",
      "description": "Password if the page is protected"
    },
    "namespace": {
      "type": "string",
      "description": "Page namespace"
    }
  }
}
get_page annotations
{
  "title": "Read page",
  "readOnlyHint": true
}
get_stats — Get platform statistics
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get BrewPage platform-wide usage statistics including page count, file count, and storage usage. Counts use disjoint split: alive_public + alive_private + deleted == total. Optional `tz` shifts the 'today' boundary to the given IANA zone (default UTC).

get_stats input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "tz": {
      "type": "string",
      "description": "Optional IANA timezone id for the 'today' boundary, e.g. 'Europe/Lisbon'. Defaults to UTC. Invalid value falls back to UTC silently."
    }
  }
}
get_stats annotations
{
  "title": "Get platform statistics",
  "readOnlyHint": true
}
publish_site — Publish site
Advertised by the server during the last successful anonymous check.

Publish an HTML site to BrewPage. Send namespace=public to be found: gallery + Google, Bing & AI search. Omitted: private. Single-page: `entryContent`. Multi-page: `files` (`{path, content}` array). Optional `entry` overrides `index.html`. Returns its primary share link and owner token. Static only: HTML, CSS, JS (incl. built React/Vue bundles) run in the browser; server code (PHP etc.) never runs. Default limits (current: GET /api/limits): request 25 MiB; site 200 files, 5 MiB per file, 20 MiB total; path 380 characters. System files (.DS_Store, __MACOSX/ and similar) are skipped and never count; files with an unsupported extension or too-long path are skipped and listed in notices. Entry: `entry`, else root index.html, else the shallowest HTML file. Errors: 400 = a site limit exceeded (the message names it), invalid path, no HTML file, or a PDF/Office file unreadable or password-protected; 413 = request over 25 MiB, too many files and form fields, or a file name/path too long; 422 = no servable file left; 503 = busy, retry after Retry-After seconds. Returns manageUrl, a private management link (grants control; not for public sharing). Secrets allowed; likely ones are flagged in notices. Private namespace + password suit secrets. BrewPage tokens and manage links must never be in public content.

publish_site input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "entry": {
      "type": "string",
      "description": "Entry file path, default index.html"
    },
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path",
          "content"
        ],
        "properties": {
          "path": {
            "type": "string"
          },
          "content": {
            "type": "string"
          }
        }
      },
      "description": "Multi-file site: array of `{path, content}`. Mutually exclusive with `entryContent`."
    },
    "ttlDays": {
      "anyOf": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "maxLength": 32,
          "minLength": 1
        }
      ],
      "description": "Requested TTL: days as a number, or a string such as '2w', '36h' or '1 month' (default 15 days). The server rounds to whole days and clamps to the allowed range (1-30; up to 90 with an owner token in a profile), reporting each adjustment in notices; the returned expiresAt is the actual expiry."
    },
    "password": {
      "type": "string",
      "description": "Optional password to protect the site"
    },
    "namespace": {
      "type": "string",
      "description": "Send namespace=public for anything meant to be found or shared (docs, guides, demos, portfolios, reports, landing pages): listed in the public gallery and sitemap, so Google, Bing and AI search index it and people discover it. A site always gets its own subdomain. Anyone can find and read a public page, so it is unsuitable for secrets, tokens or personal data. Omit (default): private, a generated priv-* namespace; unlisted, not indexed; the link still opens it. Lowercase only: 1-32 of a-z, 0-9, hyphen."
    },
    "ownerToken": {
      "type": "string",
      "description": "Optional; the ownerToken from your first create keeps publications under one owner. Default: env BREWPAGE_OWNER_TOKEN (local server only), else a new token per create."
    },
    "deliveryMode": {
      "enum": [
        "path",
        "subdomain"
      ],
      "type": "string",
      "description": "Optional delivery choice for a fresh publication, independent of password/namespace. Fresh sites and HTML-format pages outside public (including the default unlisted namespace) always use subdomain; an explicit path there still publishes, on subdomain, with a delivery notice. Everything else in any namespace (Markdown, code/text, files, JSON, KV, public HTML) defaults to path (Promotion); public HTML may automatically choose subdomain for browser features. When creation returns an existing publication, it keeps its actual mode and URL."
    },
    "entryContent": {
      "type": "string",
      "description": "HTML content for a single-page site (entry file). Mutually exclusive with `files`."
    }
  }
}
publish_site annotations
{
  "title": "Publish site",
  "readOnlyHint": false,
  "destructiveHint": false
}
republish_site — Republish site
Advertised by the server during the last successful anonymous check.
Advertised destructive

Republish (full-replace) an existing multi-file BrewPage site in place at the SAME URL/ID. Requires owner token. The uploaded bundle becomes the complete new file set — files absent from it are removed, new files added, matching files overwritten. Single-page: `entryContent`. Multi-page: `files` (array of `{path, content}`). Optional `entry` overrides the default `index.html`. Republishing preserves existing expiry. Old publications (made before 5 October 2026) are read-only: 409 OLD_PUBLICATION_READ_ONLY with createUrl to publish anew. Default limits (current: GET /api/limits): request 25 MiB; site 200 files, 5 MiB per file, 20 MiB total; path 380 characters. System files (.DS_Store, __MACOSX/ and similar) are skipped and never count; files with an unsupported extension or too-long path are skipped and listed in notices. Entry: `entry`, else root index.html, else the shallowest HTML file. Errors: 400 = a site limit exceeded (the message names it), invalid path, no HTML file, or a PDF/Office file unreadable or password-protected; 413 = request over 25 MiB, too many files and form fields, or a file name/path too long; 422 = no servable file left; 503 = busy, retry after Retry-After seconds. BrewPage tokens and manage links must never be in public content.

republish_site input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Site ID"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional tags; replace the site's stored tags. Omit to keep them."
    },
    "entry": {
      "type": "string",
      "description": "Entry file path, default index.html"
    },
    "files": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path",
          "content"
        ],
        "properties": {
          "path": {
            "type": "string"
          },
          "content": {
            "type": "string"
          }
        }
      },
      "description": "Multi-file site: array of `{path, content}`. Mutually exclusive with `entryContent`."
    },
    "ttlDays": {
      "anyOf": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "maxLength": 32,
          "minLength": 1
        }
      ],
      "description": "Ignored: republishing keeps the existing expiry; a supplied value comes back as a ttl-ignored notice."
    },
    "namespace": {
      "type": "string",
      "description": "Site namespace"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    },
    "entryContent": {
      "type": "string",
      "description": "HTML content for a single-page site (entry file). Mutually exclusive with `files`."
    }
  }
}
republish_site annotations
{
  "title": "Republish site",
  "readOnlyHint": false,
  "destructiveHint": true
}
update_html — Update page
Advertised by the server during the last successful anonymous check.
Advertised destructive

Update an existing BrewPage HTML, Markdown, code or JSON page. Requires owner token. Returns the updated page metadata. The link and delivery mode never change on update; an advisory deliveryModeReason and delivery notice are included when the new content uses browser features that may not work fully on a BrewPage link. Old publications (made before 5 October 2026) are read-only: 409 OLD_PUBLICATION_READ_ONLY with createUrl to publish anew. BrewPage tokens and manage links must never be in public content.

update_html input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id",
    "content"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Page ID"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional tags; replace the page's stored tags ([] clears). Omit to keep them."
    },
    "format": {
      "type": "string",
      "description": "Content format. Accepts (case-insensitive on html/markdown): 'html', 'markdown'/'md', or a code language — yaml, json, xml, csv, tsv, log, toml, ini, sql, sh, bat, env, javascript, typescript, tsx, jsx, css, properties, docker, txt. Omit to preserve the stored format."
    },
    "content": {
      "type": "string",
      "description": "New HTML, Markdown, code or JSON content"
    },
    "namespace": {
      "type": "string",
      "description": "Page namespace"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
update_html annotations
{
  "title": "Update page",
  "readOnlyHint": false,
  "destructiveHint": true
}
publish_json — Publish JSON document
Advertised by the server during the last successful anonymous check.

Publish a JSON document to BrewPage (max 1 MiB). Accepts a JSON object, array, or a JSON-encoded string containing any valid JSON, including scalars/null. Returns its primary share link and owner token. Returns manageUrl, a private management link (grants control; not for public sharing). Secrets allowed; likely ones are flagged in notices. Private namespace + password suit secrets. BrewPage tokens and manage links must never be in public content.

publish_json input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "json"
  ],
  "properties": {
    "json": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        {
          "type": "array",
          "items": {}
        }
      ],
      "description": "JSON document to publish (object, array, or JSON-encoded string)"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional tags for the document"
    },
    "ttlDays": {
      "anyOf": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "maxLength": 32,
          "minLength": 1
        }
      ],
      "description": "Requested TTL: days as a number, or a string such as '2w', '36h' or '1 month' (default 15 days). The server rounds to whole days and clamps to the allowed range (1-30; up to 90 with an owner token in a profile), reporting each adjustment in notices; the returned expiresAt is the actual expiry."
    },
    "password": {
      "type": "string",
      "description": "Optional password to protect the document"
    },
    "namespace": {
      "type": "string",
      "description": "Omit (default): private. namespace=public: the shared public namespace. JSON and KV are never listed in the gallery or indexed, in any namespace; anyone who has the link can open it. Lowercase only: 1-32 of a-z, 0-9, hyphen."
    },
    "ownerToken": {
      "type": "string",
      "description": "Optional; the ownerToken from your first create keeps publications under one owner. Default: env BREWPAGE_OWNER_TOKEN (local server only), else a new token per create."
    },
    "deliveryMode": {
      "enum": [
        "path",
        "subdomain"
      ],
      "type": "string",
      "description": "Optional delivery choice for a fresh publication, independent of password/namespace. Fresh sites and HTML-format pages outside public (including the default unlisted namespace) always use subdomain; an explicit path there still publishes, on subdomain, with a delivery notice. Everything else in any namespace (Markdown, code/text, files, JSON, KV, public HTML) defaults to path (Promotion); public HTML may automatically choose subdomain for browser features. When creation returns an existing publication, it keeps its actual mode and URL."
    }
  }
}
publish_json annotations
{
  "title": "Publish JSON document",
  "readOnlyHint": false,
  "destructiveHint": false
}
get_json — Read JSON document
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch a published BrewPage JSON document by namespace and ID.

get_json input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Document ID"
    },
    "password": {
      "type": "string",
      "description": "Password if the document is protected"
    },
    "namespace": {
      "type": "string",
      "description": "Document namespace"
    }
  }
}
get_json annotations
{
  "title": "Read JSON document",
  "readOnlyHint": true
}
update_json — Update JSON document
Advertised by the server during the last successful anonymous check.
Advertised destructive

Update an existing BrewPage JSON document. Requires owner token. Accepts a JSON object, array, or a JSON-encoded string. Old publications (made before 5 October 2026) are read-only: 409 OLD_PUBLICATION_READ_ONLY with createUrl to publish anew. BrewPage tokens and manage links must never be in public content.

update_json input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id",
    "json"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Document ID"
    },
    "json": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "object",
          "propertyNames": {
            "type": "string"
          },
          "additionalProperties": {}
        },
        {
          "type": "array",
          "items": {}
        }
      ],
      "description": "New JSON document (object, array, or JSON-encoded string)"
    },
    "namespace": {
      "type": "string",
      "description": "Document namespace"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
update_json annotations
{
  "title": "Update JSON document",
  "readOnlyHint": false,
  "destructiveHint": true
}
publish_kv — Publish KV entry
Advertised by the server during the last successful anonymous check.

Publish a key/value entry to BrewPage. Creates a KV store; the entry is addressed by (namespace, id, key). Max 1 MiB per value, 1,000 keys per store; the key name `hosting` is reserved. Returns its primary share link and owner token. Returns manageUrl, a private management link (grants control; not for public sharing). Secrets allowed; likely ones are flagged in notices. Private namespace + password suit secrets. BrewPage tokens and manage links must never be in public content.

publish_kv input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "key",
    "value"
  ],
  "properties": {
    "key": {
      "type": "string",
      "description": "KV key (first part of the (namespace, id, key) addressing tuple)"
    },
    "tags": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional tags for the KV entry"
    },
    "value": {
      "type": "string",
      "description": "KV value"
    },
    "ttlDays": {
      "anyOf": [
        {
          "type": "number",
          "exclusiveMinimum": 0
        },
        {
          "type": "string",
          "maxLength": 32,
          "minLength": 1
        }
      ],
      "description": "Requested TTL: days as a number, or a string such as '2w', '36h' or '1 month' (default 15 days). The server rounds to whole days and clamps to the allowed range (1-30; up to 90 with an owner token in a profile), reporting each adjustment in notices; the returned expiresAt is the actual expiry."
    },
    "password": {
      "type": "string",
      "description": "Optional password to protect the KV store"
    },
    "namespace": {
      "type": "string",
      "description": "Omit (default): private. namespace=public: the shared public namespace. JSON and KV are never listed in the gallery or indexed, in any namespace; anyone who has the link can open it. Lowercase only: 1-32 of a-z, 0-9, hyphen."
    },
    "ownerToken": {
      "type": "string",
      "description": "Optional; the ownerToken from your first create keeps publications under one owner. Default: env BREWPAGE_OWNER_TOKEN (local server only), else a new token per create."
    },
    "deliveryMode": {
      "enum": [
        "path",
        "subdomain"
      ],
      "type": "string",
      "description": "Optional delivery choice for a fresh publication, independent of password/namespace. Fresh sites and HTML-format pages outside public (including the default unlisted namespace) always use subdomain; an explicit path there still publishes, on subdomain, with a delivery notice. Everything else in any namespace (Markdown, code/text, files, JSON, KV, public HTML) defaults to path (Promotion); public HTML may automatically choose subdomain for browser features. When creation returns an existing publication, it keeps its actual mode and URL."
    }
  }
}
publish_kv annotations
{
  "title": "Publish KV entry",
  "readOnlyHint": false,
  "destructiveHint": false
}
set_kv — Set KV value
Advertised by the server during the last successful anonymous check.
Advertised destructive

Set or update a key in an existing BrewPage KV store. Requires owner token. The key name `hosting` is reserved. Old publications (made before 5 October 2026) are read-only: 409 OLD_PUBLICATION_READ_ONLY with createUrl to publish anew. BrewPage tokens and manage links must never be in public content.

set_kv input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id",
    "key",
    "value"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "KV store ID"
    },
    "key": {
      "type": "string",
      "description": "Key to set"
    },
    "value": {
      "type": "string",
      "description": "Value to assign to the key"
    },
    "namespace": {
      "type": "string",
      "description": "KV store namespace"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
set_kv annotations
{
  "title": "Set KV value",
  "readOnlyHint": false,
  "destructiveHint": true
}
get_kv — Read KV value
Advertised by the server during the last successful anonymous check.
Advertised read-only

Fetch a value from a BrewPage KV store by namespace, ID, and key.

get_kv input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "namespace",
    "id",
    "key"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "KV store ID"
    },
    "key": {
      "type": "string",
      "description": "Key to fetch"
    },
    "password": {
      "type": "string",
      "description": "Password if the KV store is protected"
    },
    "namespace": {
      "type": "string",
      "description": "KV store namespace"
    }
  }
}
get_kv annotations
{
  "title": "Read KV value",
  "readOnlyHint": true
}
get_limits — Get upload limits
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the current BrewPage limits (GET /api/limits): request size; per type (html, json, kv, files, sites) max size, counts and TTL default/maximum; profileMaxTtlDays (TTL cap for a token in a profile); site ZIP expansion, path and name lengths, allowed file extensions and skipped system files. Sizes are bytes, TTLs days. The answer always has reach: `profile` only when the owner token is active in a profile, else `token` (also with no token). With a usable owner token also ownerMaxTtlDays.

get_limits input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
get_limits annotations
{
  "title": "Get upload limits",
  "readOnlyHint": true
}
search_gallery — Search public gallery
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search the BrewPage public gallery. Optional filters: text query, pagination, sort, and 'mine' (owner-scoped, requires owner token).

search_gallery input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "q": {
      "type": "string",
      "description": "Free-text search query"
    },
    "mine": {
      "type": "boolean",
      "description": "If true, restricts results to entries owned by the supplied owner token"
    },
    "page": {
      "type": "integer",
      "default": 1,
      "maximum": 9007199254740991,
      "minimum": 1,
      "description": "Page number (1-based; default 1)"
    },
    "size": {
      "type": "integer",
      "maximum": 100,
      "minimum": 1,
      "description": "Page size (1-100; backend caps at 100)"
    },
    "sort": {
      "enum": [
        "date",
        "views"
      ],
      "type": "string",
      "description": "Sort order: 'date' or 'views'"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token; only sent as X-Owner-Token when 'mine' is true. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
search_gallery annotations
{
  "title": "Search public gallery",
  "readOnlyHint": true
}
set_visibility — Set gallery visibility
Advertised by the server during the last successful anonymous check.

Hide or show a public publication in the gallery and sitemap. Link unchanged.

set_visibility input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "type",
    "namespace",
    "id",
    "listed"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Publication ID"
    },
    "type": {
      "enum": [
        "html",
        "site",
        "file",
        "json",
        "kv"
      ],
      "type": "string",
      "description": "Publication type; only public html, site and file can be listed"
    },
    "listed": {
      "type": "boolean",
      "description": "false = hide, true = show"
    },
    "namespace": {
      "type": "string",
      "description": "Publication namespace"
    },
    "ownerToken": {
      "type": "string",
      "description": "Owner token from create. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
set_visibility annotations
{
  "title": "Set gallery visibility",
  "readOnlyHint": false,
  "destructiveHint": false
}
bind_token — Add token to profile
Advertised by the server during the last successful anonymous check.

Add an owner token to your BrewPage profile (as publish). Needs an admin token of that profile.

bind_token input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "token"
  ],
  "properties": {
    "token": {
      "type": "string",
      "description": "Owner token to add"
    },
    "ownerToken": {
      "type": "string",
      "description": "Admin token of the profile. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
bind_token annotations
{
  "title": "Add token to profile",
  "readOnlyHint": false,
  "destructiveHint": false
}
mint_token — Mint profile token
Advertised by the server during the last successful anonymous check.

Mint a new profile token with an admin token; the new token is shown once. Scope publish (default) or admin; expiry 30d, 90d, 1y or never.

mint_token input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "label": {
      "type": "string",
      "description": "Optional label shown in the profile"
    },
    "scope": {
      "enum": [
        "publish",
        "admin"
      ],
      "type": "string",
      "description": "publish (default) or admin (can manage tokens)"
    },
    "expiresIn": {
      "enum": [
        "30d",
        "90d",
        "1y",
        "never"
      ],
      "type": "string",
      "description": "Default: admin 90d, publish never"
    },
    "ownerToken": {
      "type": "string",
      "description": "Admin token of the profile. Default: env BREWPAGE_OWNER_TOKEN (local server only)."
    }
  }
}
mint_token annotations
{
  "title": "Mint profile token",
  "readOnlyHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1154 ms
95th percentile latency
1154 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1154 ms · metadata changed · 20 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http brewpage-mcp https://brewpage.app/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add brewpage-mcp --url https://brewpage.app/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable brewpage-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "brewpage-mcp": {
      "url": "https://brewpage.app/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "brewpage-mcp": {
      "type": "streamableHttp",
      "url": "https://brewpage.app/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start brewpage-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "brewpage-mcp": {
      "type": "http",
      "url": "https://brewpage.app/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http brewpage-mcp https://brewpage.app/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "brewpage-mcp": {
      "url": "https://brewpage.app/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "brewpage-mcp": {
      "serverUrl": "https://brewpage.app/mcp"
    }
  }
}

Let your agent find its tools

Find servers like BrewPage MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.