brewpage-mcp 1.15.1 → 1.15.3

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.1
20
+ npx -y brewpage-mcp@1.15.3
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.1"]
53
+ "args": ["-y", "brewpage-mcp@1.15.3"]
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.1
64
+ claude mcp add --transport stdio --scope project brewpage -- npx -y brewpage-mcp@1.15.3
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.1"]
78
+ "args": ["-y", "brewpage-mcp@1.15.3"]
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.1"]
92
+ "args": ["-y", "brewpage-mcp@1.15.3"]
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.1
100
+ npm install -g brewpage-mcp@1.15.3
101
101
  brewpage-mcp
102
102
  ```
103
103
 
@@ -158,7 +158,7 @@ update_hosting(type="html", namespace="public", id="aBcDeFgHiJ", ownerToken="tok
158
158
 
159
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.
160
160
 
161
- Parameters: `content` (string), `format` (default `HTML`; `HTML`, `MARKDOWN` or an alias the server maps, e.g. `md`), `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).
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
 
163
163
  The result includes `deliveryModeReason` and a `Delivery notice:` line when the server returns them (see above).
164
164
 
@@ -230,7 +230,7 @@ publish_file(url="https://example.com/diagram.png")
230
230
 
231
231
  ### `publish_site`
232
232
 
233
- Publish a single-page or multi-file HTML site. Pass `entryContent` for a single page or `files` (array of `{path, content}`) for a multi-file site. Supports password protection, TTL, and owner token grouping.
233
+ Publish a single-page or multi-file HTML site. Pass `entryContent` for a single page or `files` (array of `{path, content}`) for a multi-file site. Supports password protection, TTL, and owner token grouping. The result prints `Title:` (entry page title) after `ID:` when the server derives one.
234
234
 
235
235
  Limits (current values from `get_limits`): a request is at most 25 MB; a site at most 200 files, 5 MB per file and 20 MB in total; each path at most 380 characters. System files such as `.DS_Store` and `__MACOSX/` are skipped and never count; files with an unsupported extension or a too-long path are skipped and reported in notices. Entry: `entry`, else root `index.html`, else the shallowest HTML file. A site limit hit answers 400 with a message naming the limit, as does a PDF/Office file that is unreadable or password-protected; 413 means the request is over 25 MB, has too many files and form fields, or a file name/path is too long; 422 means no servable file is left; 503 means busy: retry after `Retry-After` seconds (failed publish tools print it).
236
236
 
@@ -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.3 -- 2026-10-29
534
+
535
+ - `publish_html` sends `format` only when given, so the server detects code or JSON (contract 2.8.27); pass `html` to keep HTML.
536
+
537
+ ## 1.15.2 -- 2026-10-29
538
+
539
+ - `publish_site` and `republish_site` print the site's entry page title (`Title:`) when the server reports one.
540
+
533
541
  ## 1.15.1 -- 2026-10-27
534
542
 
535
543
  - Tool texts match contract 2.8.5 PDF/Office errors: a 400 means the file is unreadable or password-protected.
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.1";
3
+ export declare const USER_AGENT = "brewpage-mcp/1.15.3";
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.1";
4
+ export const USER_AGENT = "brewpage-mcp/1.15.3";
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.1",
191
+ version: "1.15.3",
192
192
  });
193
193
  /** Caller argument first, then the configured default; `fromEnv` marks the configured one. */
194
194
  function ownerTokenFor(argument) {
@@ -236,6 +236,10 @@ 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. */
240
+ function titleLines(data) {
241
+ return typeof data.title === "string" && data.title ? [`Title: ${data.title}`] : [];
242
+ }
239
243
  function formatPublishResponse(data, effectiveNamespace, sentOwnerToken, listable = true) {
240
244
  const lines = [
241
245
  `Published successfully!`,
@@ -263,13 +267,13 @@ export function createServer(options = {}) {
263
267
  "the result then includes deliveryModeReason and a delivery notice. Markdown raw HTML is allowlisted: scripts, styles, event handlers, forms and embeds are removed. " +
264
268
  MANAGE_URL_TEXT + " " + SECRETS,
265
269
  inputSchema: {
266
- content: z.string().describe("HTML or Markdown content to publish"),
270
+ content: z.string().describe("HTML, Markdown, code or JSON to publish"),
267
271
  deliveryMode: DELIVERY_MODE_SCHEMA,
268
272
  format: z
269
273
  .string()
270
274
  .min(1)
271
- .default("HTML")
272
- .describe("Content format, default HTML. HTML or MARKDOWN; the server also maps aliases (md, text/markdown, file extensions, code languages) and detects unknown values from content, reporting the change in notices."),
275
+ .optional()
276
+ .describe("Omit: server detects html, markdown, code or JSON. `html` keeps code/JSON as HTML; also markdown/md or a code language."),
273
277
  namespace: z
274
278
  .string()
275
279
  .optional()
@@ -292,7 +296,7 @@ export function createServer(options = {}) {
292
296
  },
293
297
  }, async ({ content, format, namespace, password, ttlDays, filename, showTopBar, deliveryMode, ownerToken }) => {
294
298
  const effectiveNamespace = resolveNamespace(namespace);
295
- const path = withQuery(apiPath("html"), [["ns", effectiveNamespace], ["format", format.toLowerCase()], ["ttl", ttlDays]]);
299
+ const path = withQuery(apiPath("html"), [["ns", effectiveNamespace], ["format", format?.toLowerCase()], ["ttl", ttlDays]]);
296
300
  const body = { content };
297
301
  if (filename)
298
302
  body.filename = filename;
@@ -596,6 +600,7 @@ export function createServer(options = {}) {
596
600
  `URL: ${site.link || "N/A"}`,
597
601
  `Namespace: ${site.namespace || "N/A"}`,
598
602
  `ID: ${site.id || "N/A"}`,
603
+ ...titleLines(site),
599
604
  `Entry file: ${site.entryFile || "index.html"}`,
600
605
  `Files: ${site.fileCount || 1}`,
601
606
  ];
@@ -687,6 +692,7 @@ export function createServer(options = {}) {
687
692
  `URL: ${site.link || "N/A"}`,
688
693
  `Namespace: ${site.namespace || namespace}`,
689
694
  `ID: ${site.id || id}`,
695
+ ...titleLines(site),
690
696
  `Entry file: ${site.entryFile || "index.html"}`,
691
697
  `Files: ${site.fileCount || 1}`,
692
698
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "brewpage-mcp",
3
- "version": "1.15.1",
3
+ "version": "1.15.3",
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",