@briefgate/mcp 0.7.1 → 0.7.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 +23 -0
- package/dist/http-auth.d.ts +31 -0
- package/dist/http-auth.d.ts.map +1 -0
- package/dist/http-auth.js +39 -0
- package/dist/http-auth.js.map +1 -0
- package/dist/index.js +42 -25
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -79,6 +79,29 @@ BRIEFGATE_API_KEY=bg_live_... npx @briefgate/mcp --http --port 3000
|
|
|
79
79
|
|
|
80
80
|
The server binds to `127.0.0.1` only and includes DNS-rebinding protection. Behind a reverse proxy, terminate TLS there and forward to the local port — do not expose the port directly.
|
|
81
81
|
|
|
82
|
+
### Published mode (one endpoint, many customers)
|
|
83
|
+
|
|
84
|
+
Set `BRIEFGATE_MCP_PUBLIC_HOST` to the hostname the server is published under and
|
|
85
|
+
it becomes a multi-customer endpoint: each caller sends its own key as
|
|
86
|
+
`Authorization: Bearer bg_live_...`, and the server speaks to the BriefGate API
|
|
87
|
+
as that caller.
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
BRIEFGATE_MCP_PUBLIC_HOST=mcp.example.com npx @briefgate/mcp --http --port 3000
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Three things change, on purpose:
|
|
94
|
+
|
|
95
|
+
- the listener binds `0.0.0.0` and the Host guard accepts that name, because a
|
|
96
|
+
server behind a reverse proxy is reached by its public name;
|
|
97
|
+
- **the `BRIEFGATE_API_KEY` fallback is switched off.** Leaving it on would let
|
|
98
|
+
an anonymous caller spend the operator's key;
|
|
99
|
+
- requests still reach `initialize` and `tools/list` without a key, so a client
|
|
100
|
+
or registry can read the tool list before anyone has signed up. A tool call
|
|
101
|
+
without a key fails with a sentence saying what to send.
|
|
102
|
+
|
|
103
|
+
The public instance is `https://mcp.briefgate.dev/mcp`.
|
|
104
|
+
|
|
82
105
|
## Tools
|
|
83
106
|
|
|
84
107
|
### `define_intake`
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { IncomingMessage } from 'node:http';
|
|
2
|
+
import type { BriefGateConfig } from './client.js';
|
|
3
|
+
export interface HttpAuthOptions {
|
|
4
|
+
/** Hostname this server is published under, or undefined when it is loopback-only. */
|
|
5
|
+
publicHost?: string | undefined;
|
|
6
|
+
/** BRIEFGATE_API_KEY, used only when the server is NOT published. */
|
|
7
|
+
envApiKey?: string | undefined;
|
|
8
|
+
baseUrl: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* The API key for one request.
|
|
12
|
+
*
|
|
13
|
+
* Published mode reads it from the Authorization header and nowhere else. The
|
|
14
|
+
* environment fallback exists so a laptop can run `--http` against the
|
|
15
|
+
* operator's own key; on a public endpoint it would hand that key to whoever
|
|
16
|
+
* asked first, so it is switched off there rather than merely discouraged.
|
|
17
|
+
*
|
|
18
|
+
* An absent key is not an error here. `initialize` and `tools/list` have to work
|
|
19
|
+
* without one, or no registry can read the tool list before anybody signs up —
|
|
20
|
+
* a tool call with no key fails later with a sentence saying so.
|
|
21
|
+
*/
|
|
22
|
+
export declare function configForRequest(req: IncomingMessage, opts: HttpAuthOptions): BriefGateConfig;
|
|
23
|
+
/**
|
|
24
|
+
* DNS-rebinding guard. On a laptop this is what stops a page in the user's own
|
|
25
|
+
* browser from talking to the server; published, it also refuses traffic that
|
|
26
|
+
* arrived under someone else's name — a proxy misroute, or a second hostname
|
|
27
|
+
* pointed at this box by whoever noticed the IP.
|
|
28
|
+
*/
|
|
29
|
+
export declare function isAllowedHost(host: string, publicHost?: string | undefined): boolean;
|
|
30
|
+
export declare function isAllowedOrigin(origin: string, publicHost?: string | undefined): boolean;
|
|
31
|
+
//# sourceMappingURL=http-auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-auth.d.ts","sourceRoot":"","sources":["../src/http-auth.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,eAAe,GAAG,eAAe,CAO7F;AAID;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAIpF;AAMD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAGxF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The API key for one request.
|
|
3
|
+
*
|
|
4
|
+
* Published mode reads it from the Authorization header and nowhere else. The
|
|
5
|
+
* environment fallback exists so a laptop can run `--http` against the
|
|
6
|
+
* operator's own key; on a public endpoint it would hand that key to whoever
|
|
7
|
+
* asked first, so it is switched off there rather than merely discouraged.
|
|
8
|
+
*
|
|
9
|
+
* An absent key is not an error here. `initialize` and `tools/list` have to work
|
|
10
|
+
* without one, or no registry can read the tool list before anybody signs up —
|
|
11
|
+
* a tool call with no key fails later with a sentence saying so.
|
|
12
|
+
*/
|
|
13
|
+
export function configForRequest(req, opts) {
|
|
14
|
+
const header = req.headers['authorization'];
|
|
15
|
+
const bearer = typeof header === 'string' ? /^Bearer\s+(\S+)$/i.exec(header.trim())?.[1] : undefined;
|
|
16
|
+
const apiKey = opts.publicHost ? (bearer ?? '') : (bearer ?? opts.envApiKey ?? '');
|
|
17
|
+
return { apiKey, baseUrl: opts.baseUrl };
|
|
18
|
+
}
|
|
19
|
+
const LOOPBACK_HOST_RE = /^(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/;
|
|
20
|
+
/**
|
|
21
|
+
* DNS-rebinding guard. On a laptop this is what stops a page in the user's own
|
|
22
|
+
* browser from talking to the server; published, it also refuses traffic that
|
|
23
|
+
* arrived under someone else's name — a proxy misroute, or a second hostname
|
|
24
|
+
* pointed at this box by whoever noticed the IP.
|
|
25
|
+
*/
|
|
26
|
+
export function isAllowedHost(host, publicHost) {
|
|
27
|
+
const withoutPort = host.replace(/:\d+$/, '').toLowerCase();
|
|
28
|
+
if (publicHost && withoutPort === publicHost.toLowerCase())
|
|
29
|
+
return true;
|
|
30
|
+
return LOOPBACK_HOST_RE.test(host);
|
|
31
|
+
}
|
|
32
|
+
/** Loopback origins and claude.ai, which proxies MCP for its own clients. */
|
|
33
|
+
const SAFE_ORIGIN_RE = /^https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$|^https:\/\/claude\.ai$/;
|
|
34
|
+
export function isAllowedOrigin(origin, publicHost) {
|
|
35
|
+
if (publicHost && origin.toLowerCase() === `https://${publicHost.toLowerCase()}`)
|
|
36
|
+
return true;
|
|
37
|
+
return SAFE_ORIGIN_RE.test(origin);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=http-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-auth.js","sourceRoot":"","sources":["../src/http-auth.ts"],"names":[],"mappings":"AAeA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAoB,EAAE,IAAqB;IAC1E,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5C,MAAM,MAAM,GACV,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAExF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACnF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,gBAAgB,GAAG,+CAA+C,CAAC;AAEzE;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,UAA+B;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,IAAI,UAAU,IAAI,WAAW,KAAK,UAAU,CAAC,WAAW,EAAE;QAAE,OAAO,IAAI,CAAC;IACxE,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC;AAED,6EAA6E;AAC7E,MAAM,cAAc,GAClB,iFAAiF,CAAC;AAEpF,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,UAA+B;IAC7E,IAAI,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,KAAK,WAAW,UAAU,CAAC,WAAW,EAAE,EAAE;QAAE,OAAO,IAAI,CAAC;IAC9F,OAAO,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -11,6 +11,7 @@ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/
|
|
|
11
11
|
import { CallToolRequestSchema, ListToolsRequestSchema, } from '@modelcontextprotocol/sdk/types.js';
|
|
12
12
|
import { createServer } from 'node:http';
|
|
13
13
|
import { TOOLS, executeTool } from './tools.js';
|
|
14
|
+
import { configForRequest, isAllowedHost, isAllowedOrigin } from './http-auth.js';
|
|
14
15
|
// ─── Config ───────────────────────────────────────────────────────────────────
|
|
15
16
|
const apiKey = process.env['BRIEFGATE_API_KEY'];
|
|
16
17
|
const baseUrl = process.env['BRIEFGATE_BASE_URL'] ?? 'https://api.briefgate.dev';
|
|
@@ -38,32 +39,49 @@ const config = {
|
|
|
38
39
|
apiKey: apiKey ?? '',
|
|
39
40
|
baseUrl,
|
|
40
41
|
};
|
|
42
|
+
// Set to the hostname this server is published under (e.g. mcp.briefgate.dev)
|
|
43
|
+
// to run it as a public, multi-customer endpoint. Unset — the default and the
|
|
44
|
+
// only thing `npx @briefgate/mcp --http` does on a laptop — keeps the server on
|
|
45
|
+
// loopback with the operator's own key, exactly as before.
|
|
46
|
+
//
|
|
47
|
+
// Turning it on changes two things on purpose:
|
|
48
|
+
// * the listener binds 0.0.0.0 and the Host guard accepts this name, because
|
|
49
|
+
// a server behind a reverse proxy is reached by its public name;
|
|
50
|
+
// * the BRIEFGATE_API_KEY fallback is switched OFF. Leaving it on would let
|
|
51
|
+
// an anonymous caller spend the operator's key, which is the whole failure
|
|
52
|
+
// this mode has to avoid.
|
|
53
|
+
const PUBLIC_HOST = process.env['BRIEFGATE_MCP_PUBLIC_HOST'];
|
|
41
54
|
// The version handed to clients in the MCP handshake. Read from package.json
|
|
42
55
|
// rather than repeated here: hand-maintained it had drifted to 0.1.0 while the
|
|
43
56
|
// package shipped 0.3.0, so every client was told the wrong version.
|
|
44
57
|
const PACKAGE_VERSION = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
|
|
45
58
|
// ─── Server factory ───────────────────────────────────────────────────────────
|
|
46
|
-
// Returns a fresh Server instance bound to
|
|
47
|
-
//
|
|
48
|
-
|
|
59
|
+
// Returns a fresh Server instance bound to one caller's config.
|
|
60
|
+
//
|
|
61
|
+
// HTTP mode builds one per request, which is what makes a public deployment
|
|
62
|
+
// possible at all: the API key travels with the request rather than the
|
|
63
|
+
// process, so two customers hitting the same server never share a credential.
|
|
64
|
+
function buildServer(cfg) {
|
|
49
65
|
const server = new Server({ name: '@briefgate/mcp', version: PACKAGE_VERSION }, { capabilities: { tools: {} } });
|
|
50
66
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools: TOOLS }));
|
|
51
67
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
52
68
|
const { name, arguments: rawArgs } = request.params;
|
|
53
69
|
const args = (rawArgs ?? {});
|
|
54
|
-
if (!apiKey) {
|
|
70
|
+
if (!cfg.apiKey) {
|
|
55
71
|
return {
|
|
56
72
|
content: [
|
|
57
73
|
{
|
|
58
74
|
type: 'text',
|
|
59
|
-
text:
|
|
75
|
+
text: PUBLIC_HOST
|
|
76
|
+
? 'Error: no API key was sent. Connect with an Authorization: Bearer bg_live_... header; get a key at https://briefgate.dev.'
|
|
77
|
+
: 'Error: BRIEFGATE_API_KEY is not set. Get a key at https://briefgate.dev and add it to your MCP client config.',
|
|
60
78
|
},
|
|
61
79
|
],
|
|
62
80
|
isError: true,
|
|
63
81
|
};
|
|
64
82
|
}
|
|
65
83
|
try {
|
|
66
|
-
const result = await executeTool(name,
|
|
84
|
+
const result = await executeTool(name, cfg, args);
|
|
67
85
|
return {
|
|
68
86
|
content: [{ type: 'text', text: result.text }],
|
|
69
87
|
...(result.isError ? { isError: true } : {}),
|
|
@@ -91,27 +109,33 @@ if (useHttp) {
|
|
|
91
109
|
const port = !isNaN(portArg)
|
|
92
110
|
? portArg
|
|
93
111
|
: parseInt(process.env['BRIEFGATE_MCP_PORT'] ?? '', 10) || 3000;
|
|
94
|
-
//
|
|
95
|
-
//
|
|
96
|
-
//
|
|
97
|
-
const host = '127.0.0.1';
|
|
112
|
+
// Loopback unless this server is deliberately published. On a laptop the
|
|
113
|
+
// loopback bind is what stops a browser-based attacker reaching the server at
|
|
114
|
+
// all; behind a reverse proxy it would stop the proxy too.
|
|
115
|
+
const host = PUBLIC_HOST ? '0.0.0.0' : '127.0.0.1';
|
|
98
116
|
const httpServer = createServer(async (req, res) => {
|
|
99
117
|
// DNS rebinding guard: reject requests whose Host header does not resolve
|
|
100
118
|
// to a loopback address. A real browser attacker cannot spoof this header,
|
|
101
119
|
// but a misconfigured proxy or custom client might send something unexpected.
|
|
102
120
|
const host_ = req.headers['host'] ?? '';
|
|
103
|
-
if (!
|
|
121
|
+
if (!isAllowedHost(host_, PUBLIC_HOST)) {
|
|
104
122
|
res.writeHead(400, { 'Content-Type': 'application/json' });
|
|
105
|
-
res.end(JSON.stringify({
|
|
123
|
+
res.end(JSON.stringify({
|
|
124
|
+
error: PUBLIC_HOST
|
|
125
|
+
? 'Invalid Host header'
|
|
126
|
+
: 'Invalid Host header — only localhost connections are accepted',
|
|
127
|
+
}));
|
|
106
128
|
return;
|
|
107
129
|
}
|
|
108
130
|
// CORS: allow claude.ai and localhost origins; reject everything else.
|
|
109
131
|
const origin = req.headers['origin'];
|
|
110
132
|
if (origin !== undefined) {
|
|
111
|
-
if (
|
|
133
|
+
if (isAllowedOrigin(origin, PUBLIC_HOST)) {
|
|
112
134
|
res.setHeader('Access-Control-Allow-Origin', origin);
|
|
113
135
|
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, DELETE, OPTIONS');
|
|
114
|
-
|
|
136
|
+
// authorization is on the list because that is how a remote caller
|
|
137
|
+
// sends its key; without it a browser client cannot connect at all.
|
|
138
|
+
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, mcp-session-id, authorization');
|
|
115
139
|
}
|
|
116
140
|
else {
|
|
117
141
|
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
@@ -137,7 +161,7 @@ if (useHttp) {
|
|
|
137
161
|
return;
|
|
138
162
|
}
|
|
139
163
|
const transport = new StreamableHTTPServerTransport({ sessionIdGenerator: undefined });
|
|
140
|
-
const server = buildServer();
|
|
164
|
+
const server = buildServer(configForRequest(req, { publicHost: PUBLIC_HOST, envApiKey: apiKey, baseUrl }));
|
|
141
165
|
res.on('close', () => {
|
|
142
166
|
transport.close();
|
|
143
167
|
server.close();
|
|
@@ -168,7 +192,9 @@ if (useHttp) {
|
|
|
168
192
|
}
|
|
169
193
|
else {
|
|
170
194
|
// ── stdio transport (default) ──────────────────────────────────────────────
|
|
171
|
-
|
|
195
|
+
// One process, one user, key from the environment — a local client has no
|
|
196
|
+
// other way to hand one over.
|
|
197
|
+
const server = buildServer(config);
|
|
172
198
|
const transport = new StdioServerTransport();
|
|
173
199
|
await server.connect(transport);
|
|
174
200
|
}
|
|
@@ -181,13 +207,4 @@ function readBody(req) {
|
|
|
181
207
|
req.on('error', reject);
|
|
182
208
|
});
|
|
183
209
|
}
|
|
184
|
-
const SAFE_HOST_RE = /^(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/;
|
|
185
|
-
function isSafeHost(host) {
|
|
186
|
-
return SAFE_HOST_RE.test(host);
|
|
187
|
-
}
|
|
188
|
-
// Allow requests from localhost origins and claude.ai (which proxies MCP).
|
|
189
|
-
const SAFE_ORIGIN_RE = /^https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$|^https:\/\/claude\.ai$/;
|
|
190
|
-
function isSafeOrigin(origin) {
|
|
191
|
-
return SAFE_ORIGIN_RE.test(origin);
|
|
192
|
-
}
|
|
193
210
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,mCAAmC;AACnC,0EAA0E;AAC1E,gFAAgF;AAChF,4EAA4E;AAC5E,8CAA8C;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAC;AAEpF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@briefgate/mcp",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.2",
|
|
4
4
|
"mcpName": "io.github.sekera-radim/briefgate",
|
|
5
5
|
"description": "BriefGate MCP server — your coding agent asks the client for logos, copy and credentials, and BriefGate chases them until they arrive.",
|
|
6
6
|
"keywords": [
|