latchkey 3.13.0 → 3.14.0
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 +18 -1
- package/dist/src/cliCommands.d.ts.map +1 -1
- package/dist/src/cliCommands.js +29 -9
- package/dist/src/cliCommands.js.map +1 -1
- package/dist/src/curlInjection.d.ts +13 -4
- package/dist/src/curlInjection.d.ts.map +1 -1
- package/dist/src/curlInjection.js +10 -6
- package/dist/src/curlInjection.js.map +1 -1
- package/dist/src/errorMessages.d.ts.map +1 -1
- package/dist/src/errorMessages.js +35 -1
- package/dist/src/errorMessages.js.map +1 -1
- package/dist/src/gateway/gatewayEndpoint.d.ts.map +1 -1
- package/dist/src/gateway/gatewayEndpoint.js +10 -4
- package/dist/src/gateway/gatewayEndpoint.js.map +1 -1
- package/dist/src/gateway/headerEncoding.d.ts +22 -0
- package/dist/src/gateway/headerEncoding.d.ts.map +1 -0
- package/dist/src/gateway/headerEncoding.js +26 -0
- package/dist/src/gateway/headerEncoding.js.map +1 -0
- package/dist/src/gateway/server.d.ts.map +1 -1
- package/dist/src/gateway/server.js +4 -1
- package/dist/src/gateway/server.js.map +1 -1
- package/dist/src/services/notion-mcp.d.ts.map +1 -1
- package/dist/src/services/notion-mcp.js +35 -23
- package/dist/src/services/notion-mcp.js.map +1 -1
- package/dist/src/version.d.ts +1 -1
- package/dist/src/version.js +1 -1
- package/dist/tests/cli.test.js +65 -0
- package/dist/tests/cli.test.js.map +1 -1
- package/dist/tests/errorMessages.test.d.ts +6 -0
- package/dist/tests/errorMessages.test.d.ts.map +1 -0
- package/dist/tests/errorMessages.test.js +31 -0
- package/dist/tests/errorMessages.test.js.map +1 -0
- package/dist/tests/gateway.test.js +40 -0
- package/dist/tests/gateway.test.js.map +1 -1
- package/dist/tests/headerEncoding.test.d.ts +5 -0
- package/dist/tests/headerEncoding.test.d.ts.map +1 -0
- package/dist/tests/headerEncoding.test.js +40 -0
- package/dist/tests/headerEncoding.test.js.map +1 -0
- package/dist/tests/serviceAccounts.test.js +34 -14
- package/dist/tests/serviceAccounts.test.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovering the original text of HTTP header values.
|
|
3
|
+
*
|
|
4
|
+
* Node's HTTP parser hands header values back as latin-1: each byte on the
|
|
5
|
+
* wire becomes one character, so a UTF-8 value arrives mojibake'd (an account
|
|
6
|
+
* named `Jane’s Space` reads as `Janeâs Space`). Clients send
|
|
7
|
+
* UTF-8 — curl writes the bytes of its argument verbatim — so the gateway has
|
|
8
|
+
* to undo that decoding before comparing a value against anything it holds as
|
|
9
|
+
* real text, such as a stored account or the configured password.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Re-interpret a header value that Node decoded as latin-1 as the UTF-8 it
|
|
13
|
+
* almost certainly was.
|
|
14
|
+
*
|
|
15
|
+
* The conversion is applied only when it round-trips: re-encoding the result
|
|
16
|
+
* must reproduce the exact bytes received. That leaves a pure-ASCII value
|
|
17
|
+
* untouched (ASCII is its own UTF-8), and leaves a value whose bytes are not
|
|
18
|
+
* valid UTF-8 exactly as received rather than replacing the offending bytes
|
|
19
|
+
* with U+FFFD.
|
|
20
|
+
*/
|
|
21
|
+
export declare function decodeHeaderValue(value: string): string;
|
|
22
|
+
//# sourceMappingURL=headerEncoding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headerEncoding.d.ts","sourceRoot":"","sources":["../../../src/gateway/headerEncoding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAIvD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovering the original text of HTTP header values.
|
|
3
|
+
*
|
|
4
|
+
* Node's HTTP parser hands header values back as latin-1: each byte on the
|
|
5
|
+
* wire becomes one character, so a UTF-8 value arrives mojibake'd (an account
|
|
6
|
+
* named `Jane’s Space` reads as `Janeâs Space`). Clients send
|
|
7
|
+
* UTF-8 — curl writes the bytes of its argument verbatim — so the gateway has
|
|
8
|
+
* to undo that decoding before comparing a value against anything it holds as
|
|
9
|
+
* real text, such as a stored account or the configured password.
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* Re-interpret a header value that Node decoded as latin-1 as the UTF-8 it
|
|
13
|
+
* almost certainly was.
|
|
14
|
+
*
|
|
15
|
+
* The conversion is applied only when it round-trips: re-encoding the result
|
|
16
|
+
* must reproduce the exact bytes received. That leaves a pure-ASCII value
|
|
17
|
+
* untouched (ASCII is its own UTF-8), and leaves a value whose bytes are not
|
|
18
|
+
* valid UTF-8 exactly as received rather than replacing the offending bytes
|
|
19
|
+
* with U+FFFD.
|
|
20
|
+
*/
|
|
21
|
+
export function decodeHeaderValue(value) {
|
|
22
|
+
const bytes = Buffer.from(value, 'latin1');
|
|
23
|
+
const decoded = bytes.toString('utf8');
|
|
24
|
+
return Buffer.from(decoded, 'utf8').equals(bytes) ? decoded : value;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=headerEncoding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headerEncoding.js","sourceRoot":"","sources":["../../../src/gateway/headerEncoding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACtE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AA8D9B,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAkDD;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,eAAe,EACrB,kBAAkB,EAAE,kBAAkB,EACtC,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC,CAyJxB"}
|
|
@@ -8,6 +8,7 @@ import * as http from 'node:http';
|
|
|
8
8
|
import { ErrorMessages } from '../errorMessages.js';
|
|
9
9
|
import { extractTargetUrl, GATEWAY_PATH_PREFIX, handleGatewayRequest, } from './gatewayEndpoint.js';
|
|
10
10
|
import { handleLatchkeyRequest } from './latchkeyEndpoint.js';
|
|
11
|
+
import { decodeHeaderValue } from './headerEncoding.js';
|
|
11
12
|
import { GATEWAY_PASSWORD_HEADER, passwordsMatch } from './password.js';
|
|
12
13
|
import { createServiceRegistry } from '../serviceRegistry.js';
|
|
13
14
|
import { dispatchExtensionRequest, loadExtensions, startExtensions, stopExtensions, } from './extensions.js';
|
|
@@ -19,11 +20,13 @@ function sendErrorResponse(response, statusCode, message) {
|
|
|
19
20
|
/**
|
|
20
21
|
* Read a single header value, treating arrays (which Node returns for some
|
|
21
22
|
* headers) as missing because the password header is not allowed to repeat.
|
|
23
|
+
* The value is decoded out of Node's latin-1 rendering so that a password
|
|
24
|
+
* containing non-ASCII characters compares equal to the configured one.
|
|
22
25
|
*/
|
|
23
26
|
function readSingleHeader(request, headerName) {
|
|
24
27
|
const value = request.headers[headerName];
|
|
25
28
|
if (typeof value === 'string')
|
|
26
|
-
return value;
|
|
29
|
+
return decodeHeaderValue(value);
|
|
27
30
|
return undefined;
|
|
28
31
|
}
|
|
29
32
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAIlC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GAErB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EACL,wBAAwB,EACxB,cAAc,EACd,eAAe,EACf,cAAc,GAEf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,+BAA+B,EAC/B,mCAAmC,EACnC,+BAA+B,GAChC,MAAM,0BAA0B,CAAC;AAElC,SAAS,iBAAiB,CACxB,QAA6B,EAC7B,UAAkB,EAClB,OAAe;IAEf,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACvE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxE,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/gateway/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion-mcp.d.ts","sourceRoot":"","sources":["../../../src/services/notion-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,2BAA2B,CAAC;AAclF,OAAO,EACL,OAAO,EACP,cAAc,EACd,KAAK,WAAW,EAKjB,MAAM,gBAAgB,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;EAI7B,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"notion-mcp.d.ts","sourceRoot":"","sources":["../../../src/services/notion-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAAE,KAAK,cAAc,EAAoB,MAAM,2BAA2B,CAAC;AAclF,OAAO,EACL,OAAO,EACP,cAAc,EACd,KAAK,WAAW,EAKjB,MAAM,gBAAgB,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B;;;;;;EAI7B,CAAC;AAEZ,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAiKhF,cAAM,gBAAiB,SAAQ,cAAc;IAC3C,UAAU,CAAC,SAAS,EAAE,QAAQ,GAAG,IAAI;IAIrC,SAAS,CAAC,eAAe,IAAI,OAAO;IAKpC,SAAS,CAAC,mBAAmB,CAC3B,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,cAAc,EACxB,eAAe,CAAC,EAAE,cAAc,GAC/B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAKlB,KAAK,CAClB,gBAAgB,EAAE,OAAO,wBAAwB,EAAE,gBAAgB,EACnE,aAAa,GAAE,OAAO,uBAAuB,EAAE,oBAAyB,EACxE,cAAc,CAAC,EAAE,cAAc,GAC9B,OAAO,CAAC,WAAW,CAAC;CA8FxB;AAED,qBAAa,SAAU,SAAQ,OAAO;IACpC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,WAAW,gBAAgB;IACpC,QAAQ,CAAC,WAAW,uCAAwC;IAC5D,QAAQ,CAAC,QAAQ,sCAA0B;IAC3C,QAAQ,CAAC,IAAI,SAK8G;IAE3H,QAAQ,CAAC,4BAA4B,oVAa1B;IAEX,qBAAqB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;IAIlD;;;;OAIG;IACM,eAAe,CAAC,UAAU,EAAE,OAAO,GAAG,cAAc;IAYpD,UAAU,CAAC,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQlE,UAAU,CAAC,aAAa,EAAE,MAAM,GAAG,gBAAgB;IAI7C,kBAAkB,CAC/B,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CA+BlC;AAED,eAAO,MAAM,UAAU,WAAkB,CAAC"}
|
|
@@ -54,24 +54,26 @@ async function registerClient(redirectUri, clientName) {
|
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
56
|
* Fallback account derivation from the token-exchange response, used when the
|
|
57
|
-
* MCP `
|
|
57
|
+
* MCP `fetch self` lookup fails. Notion's MCP token endpoint reports `user_id`,
|
|
58
58
|
* `workspace_id` and `email_domain` (but not the full e-mail or the workspace
|
|
59
59
|
* name), so the best it can offer is the opaque user id combined with the
|
|
60
|
-
* e-mail domain
|
|
60
|
+
* opaque workspace id. The workspace id is preferred over the e-mail domain
|
|
61
|
+
* because the account must tell the same user's workspaces apart.
|
|
61
62
|
*/
|
|
62
63
|
function parseAccountFromTokenResponse(tokens) {
|
|
63
|
-
const workspacePart = tokens.
|
|
64
|
+
const workspacePart = tokens.workspace_id ?? tokens.email_domain;
|
|
64
65
|
if (tokens.user_id !== undefined && workspacePart !== undefined) {
|
|
65
|
-
return `${tokens.user_id}
|
|
66
|
+
return `${tokens.user_id}:${workspacePart}`;
|
|
66
67
|
}
|
|
67
68
|
return tokens.user_id ?? tokens.workspace_id ?? DEFAULT_ACCOUNT;
|
|
68
69
|
}
|
|
69
70
|
/**
|
|
70
|
-
* A single stateless `tools/call` asking the `notion-
|
|
71
|
-
*
|
|
72
|
-
*
|
|
71
|
+
* A single stateless `tools/call` asking the `notion-fetch` tool for the
|
|
72
|
+
* special id `self`, which reveals the connected workspace and user. Notion's
|
|
73
|
+
* MCP server does not require the initialize handshake or a session id for
|
|
74
|
+
* this, so one POST is enough.
|
|
73
75
|
*/
|
|
74
|
-
const
|
|
76
|
+
const FETCH_SELF_CURL_ARGUMENTS = [
|
|
75
77
|
'-X',
|
|
76
78
|
'POST',
|
|
77
79
|
'-H',
|
|
@@ -83,7 +85,7 @@ const GET_SELF_CURL_ARGUMENTS = [
|
|
|
83
85
|
jsonrpc: '2.0',
|
|
84
86
|
id: 1,
|
|
85
87
|
method: 'tools/call',
|
|
86
|
-
params: { name: 'notion-
|
|
88
|
+
params: { name: 'notion-fetch', arguments: { id: 'self' } },
|
|
87
89
|
}),
|
|
88
90
|
MCP_ENDPOINT,
|
|
89
91
|
];
|
|
@@ -109,13 +111,19 @@ function parseMcpResponseBody(body) {
|
|
|
109
111
|
return tryParseJson(trimmed);
|
|
110
112
|
}
|
|
111
113
|
/**
|
|
112
|
-
* Extract the
|
|
113
|
-
* result rides as JSON text inside the MCP content parts
|
|
114
|
-
* `{"
|
|
115
|
-
* "
|
|
116
|
-
*
|
|
114
|
+
* Extract the account from a `notion-fetch` response for the id `self`. The
|
|
115
|
+
* tool result rides as JSON text inside the MCP content parts and describes
|
|
116
|
+
* the connected workspace and user, e.g. `{"workspace":{"id":"...","name":
|
|
117
|
+
* "Acme Inc"},"user":{"id":"...","name":"Jane Doe","type":"person","email":
|
|
118
|
+
* "jane@example.com"}}` (possibly wrapped in a `self` key).
|
|
119
|
+
*
|
|
120
|
+
* A Notion MCP token is scoped to a single workspace and the authorization
|
|
121
|
+
* screen makes the user pick one, so the same user signed in to two workspaces
|
|
122
|
+
* holds two unrelated sets of credentials. The account therefore combines the
|
|
123
|
+
* user (e-mail, or the name for bots which have none) with the workspace name,
|
|
124
|
+
* as `user:workspace`, so that each workspace login lands in its own account.
|
|
117
125
|
*/
|
|
118
|
-
function
|
|
126
|
+
function parseAccountFromFetchSelfResponse(responseBody) {
|
|
119
127
|
const message = parseMcpResponseBody(responseBody);
|
|
120
128
|
const content = message?.result?.content;
|
|
121
129
|
if (!Array.isArray(content)) {
|
|
@@ -126,10 +134,13 @@ function parseAccountFromGetUsersResponse(responseBody) {
|
|
|
126
134
|
continue;
|
|
127
135
|
}
|
|
128
136
|
const toolResult = tryParseJson(part.text);
|
|
129
|
-
const self = toolResult?.
|
|
130
|
-
|
|
131
|
-
|
|
137
|
+
const self = toolResult?.self ?? toolResult;
|
|
138
|
+
const userIdentity = self?.user?.email ?? self?.user?.name;
|
|
139
|
+
if (userIdentity === undefined) {
|
|
140
|
+
continue;
|
|
132
141
|
}
|
|
142
|
+
const workspaceName = self?.workspace?.name;
|
|
143
|
+
return workspaceName === undefined ? userIdentity : `${userIdentity}:${workspaceName}`;
|
|
133
144
|
}
|
|
134
145
|
return null;
|
|
135
146
|
}
|
|
@@ -192,8 +203,9 @@ class NotionMcpSession extends ServiceSession {
|
|
|
192
203
|
tokens.access_token, tokens.refresh_token, accessTokenExpiresAt);
|
|
193
204
|
return {
|
|
194
205
|
credentials,
|
|
195
|
-
// Prefer the
|
|
196
|
-
// back to the
|
|
206
|
+
// Prefer the e-mail and workspace name resolved via the MCP fetch
|
|
207
|
+
// tool; fall back to the opaque ids riding along in the token
|
|
208
|
+
// response.
|
|
197
209
|
account: (await this.service.getAccount?.(credentials)) ?? parseAccountFromTokenResponse(tokens),
|
|
198
210
|
};
|
|
199
211
|
}
|
|
@@ -246,10 +258,10 @@ export class NotionMcp extends Service {
|
|
|
246
258
|
return buildPreparedCredentials(this.name, NotionMcpPrepareInputSchema, parsedJson, ({ clientId }) => new OAuthCredentials(clientId, ''));
|
|
247
259
|
}
|
|
248
260
|
// MCP-audienced tokens cannot call the classic REST API, but the MCP
|
|
249
|
-
// endpoint itself can reveal the identity: the `
|
|
250
|
-
//
|
|
261
|
+
// endpoint itself can reveal the identity: the `fetch` tool returns the
|
|
262
|
+
// connected workspace and the current user when asked for `self`.
|
|
251
263
|
getAccount(apiCredentials) {
|
|
252
|
-
return fetchAccountFromEndpoint(apiCredentials,
|
|
264
|
+
return fetchAccountFromEndpoint(apiCredentials, FETCH_SELF_CURL_ARGUMENTS, parseAccountFromFetchSelfResponse);
|
|
253
265
|
}
|
|
254
266
|
getSession(appNamePrefix) {
|
|
255
267
|
return new NotionMcpSession(this, appNamePrefix);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notion-mcp.js","sourceRoot":"","sources":["../../../src/services/notion-mcp.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAuB,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClF,OAAO,EACL,eAAe,EACf,wBAAwB,EACxB,YAAY,GACb,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,OAAO,EACP,cAAc,EAEd,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC;KACzC,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC5B,CAAC;KACD,MAAM,EAAE,CAAC;AAIZ,MAAM,YAAY,GAAG,4BAA4B,CAAC;AAClD,MAAM,cAAc,GAAG,8BAA8B,CAAC;AACtD,MAAM,qBAAqB,GAAG,iCAAiC,CAAC;AAChE,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAClE,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAOhC,KAAK,UAAU,cAAc,CAC3B,WAAmB,EACnB,UAAkB;IAElB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC1B,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,CAAC,WAAW,CAAC;QAC5B,WAAW,EAAE,CAAC,oBAAoB,EAAE,eAAe,CAAC;QACpD,cAAc,EAAE,CAAC,MAAM,CAAC;QACxB,0BAA0B,EAAE,MAAM;KACnC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,gBAAgB,CACnC,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,gCAAgC,EAAE,IAAI,EAAE,IAAI,EAAE,qBAAqB,CAAC,EAC/F,EAAE,CACH,CAAC;IAEF,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,gBAAgB,CAAC,oCAAoC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAyB,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,gBAAgB,CACxB,mDAAmD,MAAM,CAAC,MAAM,EAAE,CACnE,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAI,KAAK,YAAY,gBAAgB,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,gBAAgB,CACxB,iDAAiD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAC1G,CAAC;IACJ,CAAC;AACH,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"notion-mcp.js","sourceRoot":"","sources":["../../../src/services/notion-mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/src/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "3.
|
|
1
|
+
export declare const VERSION = "3.14.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/src/version.js
CHANGED
package/dist/tests/cli.test.js
CHANGED
|
@@ -808,6 +808,16 @@ describe('CLI commands with dependency injection', () => {
|
|
|
808
808
|
expect(errorLogs.join('\n')).toContain("No credentials found for slack (account 'missing@example.com')");
|
|
809
809
|
expect(errorLogs.join('\n')).toContain('latchkey --account missing@example.com auth browser slack');
|
|
810
810
|
});
|
|
811
|
+
it('shell-quotes an account that needs it in the suggested commands', async () => {
|
|
812
|
+
// A Notion account is named after its workspace, so it routinely holds
|
|
813
|
+
// spaces and typographic punctuation. The suggested commands have to
|
|
814
|
+
// survive a copy-paste into the shell.
|
|
815
|
+
writeMultiAccountStore({ 'jane@example.com:Jane\u2019s Space': 'workspace' });
|
|
816
|
+
const deps = createMockDependencies();
|
|
817
|
+
await runCommand(['--account', 'Jane\u2019s Space', 'curl', 'https://slack.com/api/test'], deps);
|
|
818
|
+
expect(exitCode).toBe(1);
|
|
819
|
+
expect(errorLogs.join('\n')).toContain('latchkey --account "Jane\u2019s Space" auth browser slack');
|
|
820
|
+
});
|
|
811
821
|
it('auth clear keeps the preparation without --all', async () => {
|
|
812
822
|
const storePath = join(tempDir, 'credentials.json');
|
|
813
823
|
writeSecureFile(storePath, JSON.stringify({
|
|
@@ -887,6 +897,61 @@ describe('CLI commands with dependency injection', () => {
|
|
|
887
897
|
expect(errorLogs.join('\n')).toContain('--account option is not supported');
|
|
888
898
|
});
|
|
889
899
|
});
|
|
900
|
+
describe('--dry-run option', () => {
|
|
901
|
+
it('curl reports the injecting service instead of sending the request', async () => {
|
|
902
|
+
const storePath = join(tempDir, 'credentials.json');
|
|
903
|
+
writeSecureFile(storePath, JSON.stringify(nestAccounts({
|
|
904
|
+
slack: { objectType: 'slack', token: 'stored-token', dCookie: 'stored-cookie' },
|
|
905
|
+
})));
|
|
906
|
+
const deps = createMockDependencies();
|
|
907
|
+
await runCommand(['--dry-run', 'curl', 'https://slack.com/api/test'], deps);
|
|
908
|
+
expect(exitCode).toBe(0);
|
|
909
|
+
expect(capturedArgs).toEqual([]);
|
|
910
|
+
expect(logs).toHaveLength(1);
|
|
911
|
+
expect(JSON.parse(logs[0] ?? '')).toEqual({
|
|
912
|
+
credentialsInjected: true,
|
|
913
|
+
service: 'slack',
|
|
914
|
+
});
|
|
915
|
+
});
|
|
916
|
+
it('curl reports no injection for a passed-through request', async () => {
|
|
917
|
+
const deps = createMockDependencies({
|
|
918
|
+
config: createMockConfig({ passthroughUnknown: true }),
|
|
919
|
+
});
|
|
920
|
+
await runCommand(['--dry-run', 'curl', 'https://unknown-api.example.com/test'], deps);
|
|
921
|
+
expect(exitCode).toBe(0);
|
|
922
|
+
expect(capturedArgs).toEqual([]);
|
|
923
|
+
expect(JSON.parse(logs[0] ?? '')).toEqual({
|
|
924
|
+
credentialsInjected: false,
|
|
925
|
+
service: null,
|
|
926
|
+
});
|
|
927
|
+
});
|
|
928
|
+
it('curl still fails when no credentials can be injected', async () => {
|
|
929
|
+
const deps = createMockDependencies();
|
|
930
|
+
await runCommand(['--dry-run', 'curl', 'https://slack.com/api/test'], deps);
|
|
931
|
+
expect(exitCode).toBe(1);
|
|
932
|
+
expect(logs).toHaveLength(0);
|
|
933
|
+
expect(capturedArgs).toEqual([]);
|
|
934
|
+
});
|
|
935
|
+
it('rejects --dry-run in gateway mode', async () => {
|
|
936
|
+
const deps = createMockDependencies({
|
|
937
|
+
config: createMockConfig({ gatewayUrl: 'http://localhost:9000' }),
|
|
938
|
+
});
|
|
939
|
+
await runCommand(['--dry-run', 'curl', 'https://slack.com/api/test'], deps);
|
|
940
|
+
expect(exitCode).toBe(1);
|
|
941
|
+
expect(capturedArgs).toEqual([]);
|
|
942
|
+
expect(errorLogs.join('\n')).toContain('--dry-run option is not supported in gateway mode');
|
|
943
|
+
});
|
|
944
|
+
it.each([
|
|
945
|
+
['auth', 'list'],
|
|
946
|
+
['services', 'list'],
|
|
947
|
+
['auth', 'set', 'slack', '-H', 'X-Token: secret'],
|
|
948
|
+
])('rejects --dry-run for the unsupported command: %s %s', async (...commandArgs) => {
|
|
949
|
+
const deps = createMockDependencies();
|
|
950
|
+
await runCommand(['--dry-run', ...commandArgs], deps);
|
|
951
|
+
expect(exitCode).toBe(1);
|
|
952
|
+
expect(errorLogs.join('\n')).toContain('--dry-run option is not supported');
|
|
953
|
+
});
|
|
954
|
+
});
|
|
890
955
|
describe('auth list command', () => {
|
|
891
956
|
it('should list stored credentials with their status', async () => {
|
|
892
957
|
const storePath = join(tempDir, 'credentials.json');
|