brewpage-mcp 1.15.3 → 1.15.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -17,7 +17,7 @@ Choosing a host? See how BrewPage compares with GitHub Pages, Netlify Drop, Tiin
17
17
  ## Quick Start
18
18
 
19
19
  ```bash
20
- npx -y brewpage-mcp@1.15.3
20
+ npx -y brewpage-mcp@1.15.5
21
21
  ```
22
22
 
23
23
  Requires Node.js 20 or newer. This starts the stdio server for an MCP client.
@@ -50,7 +50,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
50
50
  "mcpServers": {
51
51
  "brewpage": {
52
52
  "command": "npx",
53
- "args": ["-y", "brewpage-mcp@1.15.3"]
53
+ "args": ["-y", "brewpage-mcp@1.15.5"]
54
54
  }
55
55
  }
56
56
  }
@@ -61,7 +61,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
61
61
  Register a project-scoped stdio server:
62
62
 
63
63
  ```bash
64
- claude mcp add --transport stdio --scope project brewpage -- npx -y brewpage-mcp@1.15.3
64
+ claude mcp add --transport stdio --scope project brewpage -- npx -y brewpage-mcp@1.15.5
65
65
  ```
66
66
 
67
67
  This writes `.mcp.json` in the project root. Use `--scope user` for user-scoped registration. See the [official Claude Code MCP guide](https://code.claude.com/docs/en/mcp).
@@ -75,7 +75,7 @@ Open **Settings > MCP** and add:
75
75
  "mcpServers": {
76
76
  "brewpage": {
77
77
  "command": "npx",
78
- "args": ["-y", "brewpage-mcp@1.15.3"]
78
+ "args": ["-y", "brewpage-mcp@1.15.5"]
79
79
  }
80
80
  }
81
81
  }
@@ -89,7 +89,7 @@ Open the Cline MCP settings panel and add:
89
89
  {
90
90
  "brewpage": {
91
91
  "command": "npx",
92
- "args": ["-y", "brewpage-mcp@1.15.3"]
92
+ "args": ["-y", "brewpage-mcp@1.15.5"]
93
93
  }
94
94
  }
95
95
  ```
@@ -97,7 +97,7 @@ Open the Cline MCP settings panel and add:
97
97
  ### Global Install
98
98
 
99
99
  ```bash
100
- npm install -g brewpage-mcp@1.15.3
100
+ npm install -g brewpage-mcp@1.15.5
101
101
  brewpage-mcp
102
102
  ```
103
103
 
@@ -107,7 +107,7 @@ Twenty tools are available. Creation returns an owner token; keep it to modify o
107
107
 
108
108
  | Tool | Purpose |
109
109
  |------|---------|
110
- | `publish_html` | Publish HTML or Markdown |
110
+ | `publish_html` | Publish HTML, Markdown, code or JSON |
111
111
  | `update_html` | Replace page content; omitted format preserves stored format |
112
112
  | `get_page` | Fetch raw page content |
113
113
  | `publish_file` | Fetch a source URL and upload the file |
@@ -156,7 +156,7 @@ update_hosting(type="html", namespace="public", id="aBcDeFgHiJ", ownerToken="tok
156
156
 
157
157
  ### `publish_html`
158
158
 
159
- Publish HTML or Markdown content to BrewPage. Returns a public URL and owner token. Markdown raw HTML is rendered through an allowlist: scripts, styles, event handlers, forms, frames/embeds and `meta`/`base`/`link` are removed; links allow `http`, `https`, `mailto`, `tel` and relative URLs, images also `data:`; a lone unknown tag such as `<author>` shows as text.
159
+ Publish HTML, Markdown, code or JSON content to BrewPage; with `format` omitted the server detects it. Returns a public URL and owner token. Markdown raw HTML is rendered through an allowlist: scripts, styles, event handlers, forms, frames/embeds and `meta`/`base`/`link` are removed; links allow `http`, `https`, `mailto`, `tel` and relative URLs, images also `data:`; a lone unknown tag such as `<author>` shows as text.
160
160
 
161
161
  Parameters: `content` (string), `format` (optional; omit to let the server detect HTML, Markdown, code or JSON; `html` keeps code/JSON as HTML; also `markdown`/`md` or a code language), `namespace` (optional -- **omit for private, unlisted content**; `public` lists the page in the gallery and sitemap for Google, Bing and AI search, served on the brewpage.app domain; never put secrets there), `password` (optional), `ttlDays` (days or a string such as `2w`; default 15; the server clamps to 1--30), `filename` (optional, used as title fallback), `showTopBar` (optional boolean -- adds a toolbar with filename, Download button, and theme toggle), `deliveryMode` (optional).
162
162
 
@@ -442,7 +442,7 @@ get_stats()
442
442
 
443
443
  ### `get_limits`
444
444
 
445
- Read the current upload limits from `GET /api/limits` (no auth; with `BREWPAGE_OWNER_TOKEN` also `reach` and `ownerMaxTtlDays`). Sizes are bytes: `requestMaxBytes` plus `sites.maxFiles`, `maxFileBytes`, `maxTotalBytes` (uncompressed), `maxArchiveExpansionBytes`, `maxPathChars`, `maxPathBytes`, `maxNameBytes`, `defaultTtlDays`, `maxTtlDays`, `allowedExtensions`, `skippedFileNames` and `skippedRootFolders`. Call it before publishing a large or multi-file site.
445
+ Read the current limits from `GET /api/limits` (no auth; with `BREWPAGE_OWNER_TOKEN` also `reach` and `ownerMaxTtlDays`). Sizes are bytes, TTLs days: `requestMaxBytes`; `html`, `json`, `kv` and `files` max size, counts and TTL default/maximum; `profileMaxTtlDays` (TTL cap for a token in a profile); `sites.maxFiles`, `maxFileBytes`, `maxTotalBytes` (uncompressed), `maxArchiveExpansionBytes`, `maxPathChars`, `maxPathBytes`, `maxNameBytes`, `defaultTtlDays`, `maxTtlDays`, `allowedExtensions`, `skippedFileNames` and `skippedRootFolders`. Call it before publishing a large or multi-file site.
446
446
 
447
447
  Parameters: none.
448
448
 
@@ -469,7 +469,7 @@ get_limits()
469
469
  | "Remove the page I published" | `delete_resource` | Requires `ownerToken` from creation |
470
470
  | "Read back the page I published" | `get_page` | Returns raw content for editing |
471
471
  | "How many pages are on BrewPage?" | `get_stats` | Returns platform totals |
472
- | "How big can my site be?" | `get_limits` | Current request and site limits in bytes |
472
+ | "How big can my site be?" | `get_limits` | Current request and per-type limits (bytes, TTL days) |
473
473
  | "Store JSON state between turns" | `publish_json` | Returns short URL + owner token |
474
474
  | "Read that JSON document back" | `get_json` | By `namespace` + `id` |
475
475
  | "Update the JSON I stored" | `update_json` | Requires `ownerToken`; preserves URL |
@@ -530,6 +530,14 @@ Every publish response includes an **owner token** -- the only credential that a
530
530
 
531
531
  ## Changelog
532
532
 
533
+ ## 1.15.5 -- 2026-10-29
534
+
535
+ - `publish_html` prints the page title (`Title:`) when the server reports one; tool texts state plain size limits; `get_limits` names the per-type limits and the profile TTL cap.
536
+
537
+ ## 1.15.4 -- 2026-10-29
538
+
539
+ - `publish_html` and `update_html` texts name HTML, Markdown, code or JSON; `format` omitted -> server detects it.
540
+
533
541
  ## 1.15.3 -- 2026-10-29
534
542
 
535
543
  - `publish_html` sends `format` only when given, so the server detects code or JSON (contract 2.8.27); pass `html` to keep HTML.
package/dist/tools.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { McpServer } from "@modelcontextprotocol/server";
2
2
  export declare const DEFAULT_BASE_URL = "https://brewpage.app";
3
- export declare const USER_AGENT = "brewpage-mcp/1.15.3";
3
+ export declare const USER_AGENT = "brewpage-mcp/1.15.5";
4
4
  export declare const OWNER_TOKEN_ENV = "BREWPAGE_OWNER_TOKEN";
5
5
  export interface ServerOptions {
6
6
  /** BrewPage origin for API calls; default https://brewpage.app. */
package/dist/tools.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { McpServer } from "@modelcontextprotocol/server";
2
2
  import { z } from "zod";
3
3
  export const DEFAULT_BASE_URL = "https://brewpage.app";
4
- export const USER_AGENT = "brewpage-mcp/1.15.3";
4
+ export const USER_AGENT = "brewpage-mcp/1.15.5";
5
5
  export const OWNER_TOKEN_ENV = "BREWPAGE_OWNER_TOKEN";
6
6
  const READ_ONLY = { readOnlyHint: true };
7
7
  const DESTRUCTIVE = { readOnlyHint: false, destructiveHint: true };
@@ -188,7 +188,7 @@ export function createServer(options = {}) {
188
188
  const apiFetch = options.fetch ?? fetch;
189
189
  const server = new McpServer({
190
190
  name: "brewpage-mcp",
191
- version: "1.15.3",
191
+ version: "1.15.5",
192
192
  });
193
193
  /** Caller argument first, then the configured default; `fromEnv` marks the configured one. */
194
194
  function ownerTokenFor(argument) {
@@ -236,7 +236,7 @@ export function createServer(options = {}) {
236
236
  const data = responseType === "text" ? await res.text() : await res.json().catch(() => null);
237
237
  return { ok: res.ok, status: res.status, data, headers: res.headers };
238
238
  }
239
- /** `Title:` line when the server derived an entry page title; nothing otherwise. */
239
+ /** `Title:` line when the server returned a page or site entry title; nothing otherwise. */
240
240
  function titleLines(data) {
241
241
  return typeof data.title === "string" && data.title ? [`Title: ${data.title}`] : [];
242
242
  }
@@ -248,7 +248,7 @@ export function createServer(options = {}) {
248
248
  ];
249
249
  if (data.shortUrl)
250
250
  lines.push(`Short URL: ${data.shortUrl}`);
251
- lines.push(`Namespace: ${data.namespace || "N/A"}`, `ID: ${data.id || "N/A"}`);
251
+ lines.push(`Namespace: ${data.namespace || "N/A"}`, `ID: ${data.id || "N/A"}`, ...titleLines(data));
252
252
  if (data.expiresAt)
253
253
  lines.push(`Expires: ${data.expiresAt}`);
254
254
  lines.push(...hostingResponseLines(data));
@@ -261,8 +261,8 @@ export function createServer(options = {}) {
261
261
  return lines.join("\n");
262
262
  }
263
263
  server.registerTool("publish_html", {
264
- ...toolMeta("Publish HTML or Markdown page", ADDITIVE),
265
- description: "Publish HTML or Markdown content to BrewPage (repository default limit 5 MiB). Returns its primary share link and owner token. Supports password protection, custom TTL, optional filename, and an opt-in top toolbar (showTopBar). " +
264
+ ...toolMeta("Publish HTML, Markdown, code or JSON page", ADDITIVE),
265
+ description: "Publish HTML, Markdown, code or JSON content to BrewPage (max 5 MiB); format omitted -> the server detects it. Returns its primary share link and owner token. Supports password protection, custom TTL, optional filename, and an opt-in top toolbar (showTopBar). " +
266
266
  "When deliveryMode is omitted for a `public` page, the server may publish it on its own subdomain if the page needs browser features a BrewPage link does not provide; " +
267
267
  "the result then includes deliveryModeReason and a delivery notice. Markdown raw HTML is allowlisted: scripts, styles, event handlers, forms and embeds are removed. " +
268
268
  MANAGE_URL_TEXT + " " + SECRETS,
@@ -333,7 +333,7 @@ export function createServer(options = {}) {
333
333
  });
334
334
  server.registerTool("publish_file", {
335
335
  ...toolMeta("Publish file from URL", ADDITIVE),
336
- description: "Upload a file to BrewPage via URL. Repository defaults: 5 MiB for files/audio, 20 MiB for video. Returns its primary share link and owner token. Does not expose password or TTL inputs. " +
336
+ description: "Upload a file to BrewPage via URL. Max 5 MiB, video 20 MiB. Returns its primary share link and owner token. Does not expose password or TTL inputs. " +
337
337
  MANAGE_URL_TEXT + " " + SECRETS,
338
338
  inputSchema: {
339
339
  url: z.string().url().describe("URL of the file to upload"),
@@ -715,12 +715,12 @@ export function createServer(options = {}) {
715
715
  });
716
716
  server.registerTool("update_html", {
717
717
  ...toolMeta("Update page", DESTRUCTIVE),
718
- description: "Update an existing BrewPage HTML/Markdown page. Requires owner token. Returns the updated page metadata. " +
718
+ description: "Update an existing BrewPage HTML, Markdown, code or JSON page. Requires owner token. Returns the updated page metadata. " +
719
719
  "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_READ_ONLY_TEXT,
720
720
  inputSchema: {
721
721
  namespace: z.string().describe("Page namespace"),
722
722
  id: z.string().describe("Page ID"),
723
- content: z.string().describe("New HTML or Markdown content"),
723
+ content: z.string().describe("New HTML, Markdown, code or JSON content"),
724
724
  ownerToken: z.string().optional().describe(OWNER_TOKEN_DESCRIPTION),
725
725
  format: z
726
726
  .string()
@@ -751,7 +751,7 @@ export function createServer(options = {}) {
751
751
  });
752
752
  server.registerTool("publish_json", {
753
753
  ...toolMeta("Publish JSON document", ADDITIVE),
754
- description: "Publish a JSON document to BrewPage (repository default limit 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. " +
754
+ description: "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. " +
755
755
  MANAGE_URL_TEXT + " " + SECRETS,
756
756
  inputSchema: {
757
757
  deliveryMode: DELIVERY_MODE_SCHEMA,
@@ -887,7 +887,7 @@ export function createServer(options = {}) {
887
887
  });
888
888
  server.registerTool("publish_kv", {
889
889
  ...toolMeta("Publish KV entry", ADDITIVE),
890
- description: "Publish a key/value entry to BrewPage. Creates a KV store; the entry is addressed by (namespace, id, key). Repository defaults: 1 MiB per value, 1,000 keys per store; the key name `hosting` is reserved. Returns its primary share link and owner token. " +
890
+ description: "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. " +
891
891
  MANAGE_URL_TEXT + " " + SECRETS,
892
892
  inputSchema: {
893
893
  deliveryMode: DELIVERY_MODE_SCHEMA,
@@ -1011,8 +1011,9 @@ export function createServer(options = {}) {
1011
1011
  });
1012
1012
  server.registerTool("get_limits", {
1013
1013
  ...toolMeta("Get upload limits", READ_ONLY),
1014
- description: "Get the current BrewPage upload limits (GET /api/limits): request size, site file count, per-file and total size, " +
1015
- "ZIP expansion, path and name lengths, TTL default/maximum, allowed file extensions and skipped system files. Sizes are bytes. " +
1014
+ description: "Get the current BrewPage limits (GET /api/limits): request size; per type (html, json, kv, files, sites) max size, " +
1015
+ "counts and TTL default/maximum; profileMaxTtlDays (TTL cap for a token in a profile); site ZIP expansion, path and name lengths, " +
1016
+ "allowed file extensions and skipped system files. Sizes are bytes, TTLs days. " +
1016
1017
  `With ${OWNER_TOKEN_ENV} set: also reach (token|profile) and ownerMaxTtlDays.`,
1017
1018
  inputSchema: {},
1018
1019
  }, async () => {
@@ -1033,7 +1034,7 @@ export function createServer(options = {}) {
1033
1034
  content: [
1034
1035
  {
1035
1036
  type: "text",
1036
- text: `BrewPage upload limits (bytes):\n\n${JSON.stringify(data, null, 2)}`,
1037
+ text: `BrewPage limits (sizes in bytes, TTLs in days):\n\n${JSON.stringify(data, null, 2)}`,
1037
1038
  },
1038
1039
  ],
1039
1040
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brewpage-mcp",
3
- "version": "1.15.3",
3
+ "version": "1.15.5",
4
4
  "mcpName": "io.github.kochetkov-ma/brewpage-mcp",
5
5
  "description": "MCP server for BrewPage — publish and manage HTML, sites, KV, JSON and files from AI assistants",
6
6
  "type": "module",