brewpage-mcp 1.15.0 → 1.15.2
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 +33 -8
- package/dist/tools.d.ts +1 -1
- package/dist/tools.js +10 -4
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,11 +17,28 @@ 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.
|
|
20
|
+
npx -y brewpage-mcp@1.15.2
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
Requires Node.js 20 or newer. This starts the stdio server for an MCP client.
|
|
24
24
|
|
|
25
|
+
### Remote (no install)
|
|
26
|
+
|
|
27
|
+
Add `https://brewpage.app/mcp` as a custom connector / remote MCP server by URL in Claude.ai, ChatGPT or any Streamable HTTP client. No auth; same 20 tools.
|
|
28
|
+
|
|
29
|
+
Claude Code: `claude mcp add --transport http brewpage https://brewpage.app/mcp`, or in `.mcp.json`:
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"mcpServers": {
|
|
34
|
+
"brewpage": {
|
|
35
|
+
"type": "http",
|
|
36
|
+
"url": "https://brewpage.app/mcp"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
25
42
|
## Installation
|
|
26
43
|
|
|
27
44
|
### Claude Desktop
|
|
@@ -33,7 +50,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
|
33
50
|
"mcpServers": {
|
|
34
51
|
"brewpage": {
|
|
35
52
|
"command": "npx",
|
|
36
|
-
"args": ["-y", "brewpage-mcp@1.15.
|
|
53
|
+
"args": ["-y", "brewpage-mcp@1.15.2"]
|
|
37
54
|
}
|
|
38
55
|
}
|
|
39
56
|
}
|
|
@@ -44,7 +61,7 @@ Add to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS)
|
|
|
44
61
|
Register a project-scoped stdio server:
|
|
45
62
|
|
|
46
63
|
```bash
|
|
47
|
-
claude mcp add --transport stdio --scope project brewpage -- npx -y brewpage-mcp@1.15.
|
|
64
|
+
claude mcp add --transport stdio --scope project brewpage -- npx -y brewpage-mcp@1.15.2
|
|
48
65
|
```
|
|
49
66
|
|
|
50
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).
|
|
@@ -58,7 +75,7 @@ Open **Settings > MCP** and add:
|
|
|
58
75
|
"mcpServers": {
|
|
59
76
|
"brewpage": {
|
|
60
77
|
"command": "npx",
|
|
61
|
-
"args": ["-y", "brewpage-mcp@1.15.
|
|
78
|
+
"args": ["-y", "brewpage-mcp@1.15.2"]
|
|
62
79
|
}
|
|
63
80
|
}
|
|
64
81
|
}
|
|
@@ -72,7 +89,7 @@ Open the Cline MCP settings panel and add:
|
|
|
72
89
|
{
|
|
73
90
|
"brewpage": {
|
|
74
91
|
"command": "npx",
|
|
75
|
-
"args": ["-y", "brewpage-mcp@1.15.
|
|
92
|
+
"args": ["-y", "brewpage-mcp@1.15.2"]
|
|
76
93
|
}
|
|
77
94
|
}
|
|
78
95
|
```
|
|
@@ -80,7 +97,7 @@ Open the Cline MCP settings panel and add:
|
|
|
80
97
|
### Global Install
|
|
81
98
|
|
|
82
99
|
```bash
|
|
83
|
-
npm install -g brewpage-mcp@1.15.
|
|
100
|
+
npm install -g brewpage-mcp@1.15.2
|
|
84
101
|
brewpage-mcp
|
|
85
102
|
```
|
|
86
103
|
|
|
@@ -213,9 +230,9 @@ publish_file(url="https://example.com/diagram.png")
|
|
|
213
230
|
|
|
214
231
|
### `publish_site`
|
|
215
232
|
|
|
216
|
-
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.
|
|
217
234
|
|
|
218
|
-
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
|
|
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).
|
|
219
236
|
|
|
220
237
|
Parameters: exactly one of `entryContent` (string) or non-empty `files` (array of `{path, content}`), `entry` (optional entry file path, default `index.html`), `namespace` (optional -- omit for private, unlisted content; `public` lists the site in the gallery and sitemap for Google, Bing and AI search; a site always gets its own subdomain), `password` (optional), `ttlDays` (days or a string such as `2w`; default 15; the server clamps to 1--30), `ownerToken` (optional, groups site under an existing owner), `deliveryMode` (optional; fresh sites require `subdomain`).
|
|
221
238
|
|
|
@@ -513,6 +530,14 @@ Every publish response includes an **owner token** -- the only credential that a
|
|
|
513
530
|
|
|
514
531
|
## Changelog
|
|
515
532
|
|
|
533
|
+
## 1.15.2 -- 2026-10-29
|
|
534
|
+
|
|
535
|
+
- `publish_site` and `republish_site` print the site's entry page title (`Title:`) when the server reports one.
|
|
536
|
+
|
|
537
|
+
## 1.15.1 -- 2026-10-27
|
|
538
|
+
|
|
539
|
+
- Tool texts match contract 2.8.5 PDF/Office errors: a 400 means the file is unreadable or password-protected.
|
|
540
|
+
|
|
516
541
|
## 1.15.0 -- 2026-10-27
|
|
517
542
|
|
|
518
543
|
- Supports MCP protocol 2026-07-28 (SDK v2).
|
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
|
+
export declare const USER_AGENT = "brewpage-mcp/1.15.2";
|
|
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.
|
|
4
|
+
export const USER_AGENT = "brewpage-mcp/1.15.2";
|
|
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 };
|
|
@@ -111,8 +111,8 @@ const DELIVERY_MODE_SCHEMA = z.enum(["path", "subdomain"]).optional().describe("
|
|
|
111
111
|
const SITE_LIMITS_TEXT = "Default limits (current values: GET /api/limits): a request is at most 25 MB; a site at most 200 files, 5 MB per file and 20 MB in total; " +
|
|
112
112
|
"each path at most 380 characters. System files (.DS_Store, __MACOSX/ and similar) are skipped and never count; files with an unsupported extension " +
|
|
113
113
|
"or a too-long path are skipped and listed in notices. Entry: `entry`, else root index.html, else the shallowest HTML file. " +
|
|
114
|
-
"Errors: 400 = a site limit exceeded (the message names it), invalid path, no HTML file, or a PDF/Office file unreadable
|
|
115
|
-
"password-protected
|
|
114
|
+
"Errors: 400 = a site limit exceeded (the message names it), invalid path, no HTML file, or a PDF/Office file unreadable " +
|
|
115
|
+
"or password-protected; 413 = request over 25 MB, too many files and form fields, or a file name/path too long; " +
|
|
116
116
|
"422 = no servable file left; 503 = busy, retry after Retry-After seconds.";
|
|
117
117
|
function hostingResponseLines(data) {
|
|
118
118
|
const fields = ["routingCohort", "deliveryMode", "requestedDeliveryMode", "effectiveDeliveryMode",
|
|
@@ -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.
|
|
191
|
+
version: "1.15.2",
|
|
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!`,
|
|
@@ -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