@n24q02m/mcp-core 1.18.0-beta.3 → 1.18.0-beta.4

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.
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Pluggable credential backends.
3
+ *
4
+ * A backend stores and retrieves OPAQUE ciphertext blobs keyed by a string.
5
+ * Encryption and key derivation live in PerPluginStore; backends never see
6
+ * plaintext. This seam lets MCP servers run serverless (e.g. Cloudflare Workers
7
+ * KV) while stdio/VM deployments keep the on-disk layout via LocalFsBackend.
8
+ */
9
+ /** Stores opaque ciphertext blobs keyed by a string. */
10
+ export interface CredentialBackend {
11
+ get(key: string): Promise<Buffer | null>;
12
+ put(key: string, blob: Buffer): Promise<void>;
13
+ delete(key: string): Promise<void>;
14
+ }
15
+ /** Map-backed backend, primarily for tests. */
16
+ export declare class InMemoryBackend implements CredentialBackend {
17
+ private store;
18
+ get(key: string): Promise<Buffer | null>;
19
+ put(key: string, blob: Buffer): Promise<void>;
20
+ delete(key: string): Promise<void>;
21
+ }
22
+ /** Stores blobs on local disk, preserving the per-plugin layout. */
23
+ export declare class LocalFsBackend implements CredentialBackend {
24
+ get(key: string): Promise<Buffer | null>;
25
+ put(key: string, blob: Buffer): Promise<void>;
26
+ delete(key: string): Promise<void>;
27
+ }
28
+ /** Minimal injectable HTTP client returning status + body. */
29
+ export interface Http {
30
+ request(method: string, url: string, data?: Buffer, headers?: Record<string, string>): Promise<{
31
+ status: number;
32
+ body: Buffer;
33
+ }>;
34
+ }
35
+ /**
36
+ * Stores blobs in a Cloudflare Workers KV namespace over HTTP.
37
+ *
38
+ * Error contract: 200 -> data, 404 -> absent (null for get, no-op for delete).
39
+ * Every other HTTP status, plus transport errors from the HTTP client, raises --
40
+ * failures are loud, never silently returned as data. Error messages carry the
41
+ * status only; never the token or the response body.
42
+ */
43
+ export declare class CfKvBackend implements CredentialBackend {
44
+ private readonly baseUrl;
45
+ private readonly token?;
46
+ private readonly http;
47
+ constructor(baseUrl: string, token?: string, http?: Http);
48
+ private url;
49
+ private headers;
50
+ get(key: string): Promise<Buffer | null>;
51
+ put(key: string, blob: Buffer): Promise<void>;
52
+ delete(key: string): Promise<void>;
53
+ }
54
+ /** Select a credential backend from the MCP_STORAGE_BACKEND env var. */
55
+ export declare function backendFromEnv(): CredentialBackend;
56
+ //# sourceMappingURL=backends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backends.d.ts","sourceRoot":"","sources":["../../src/storage/backends.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;IACxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACnC;AAED,+CAA+C;AAC/C,qBAAa,eAAgB,YAAW,iBAAiB;IACvD,OAAO,CAAC,KAAK,CAA4B;IAEnC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzC;AA0CD,oEAAoE;AACpE,qBAAa,cAAe,YAAW,iBAAiB;IAChD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAUxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAQzC;AAED,8DAA8D;AAC9D,MAAM,WAAW,IAAI;IACnB,OAAO,CACL,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC/B,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7C;AAqBD;;;;;;;GAOG;AACH,qBAAa,WAAY,YAAW,iBAAiB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAQ;IAC/B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;gBAEf,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,IAAgB;IAMnE,OAAO,CAAC,GAAG;IAIX,OAAO,CAAC,OAAO;IAIT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOxC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzC;AAED,wEAAwE;AACxE,wBAAgB,cAAc,IAAI,iBAAiB,CAWlD"}
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Pluggable credential backends.
3
+ *
4
+ * A backend stores and retrieves OPAQUE ciphertext blobs keyed by a string.
5
+ * Encryption and key derivation live in PerPluginStore; backends never see
6
+ * plaintext. This seam lets MCP servers run serverless (e.g. Cloudflare Workers
7
+ * KV) while stdio/VM deployments keep the on-disk layout via LocalFsBackend.
8
+ */
9
+ import { mkdir, readFile, unlink, writeFile } from 'node:fs/promises';
10
+ import { dirname, join, resolve, sep } from 'node:path';
11
+ import { getHomeDir } from './home-dir.js';
12
+ /** Map-backed backend, primarily for tests. */
13
+ export class InMemoryBackend {
14
+ constructor() {
15
+ this.store = new Map();
16
+ }
17
+ async get(key) {
18
+ return this.store.get(key) ?? null;
19
+ }
20
+ async put(key, blob) {
21
+ this.store.set(key, blob);
22
+ }
23
+ async delete(key) {
24
+ this.store.delete(key);
25
+ }
26
+ }
27
+ function validateComponent(name) {
28
+ if (!name || name === '.' || name === '..' || name.includes('/') || name.includes('\\') || name.includes('\x00')) {
29
+ throw new Error(`Invalid path component: ${name}`);
30
+ }
31
+ return name;
32
+ }
33
+ /**
34
+ * Map a backend key to its on-disk path.
35
+ *
36
+ * "<plugin>/config" -> ~/.<plugin>-mcp/config.json
37
+ * "<plugin>/subs/<sub>/config" -> ~/.<plugin>-mcp/subs/<sub>/config.json
38
+ */
39
+ function keyToPath(key) {
40
+ const slash = key.indexOf('/');
41
+ const plugin = slash === -1 ? key : key.slice(0, slash);
42
+ const rest = slash === -1 ? '' : key.slice(slash + 1);
43
+ validateComponent(plugin);
44
+ const base = join(getHomeDir(), `.${plugin}-mcp`);
45
+ let path;
46
+ if (rest === 'config') {
47
+ path = join(base, 'config.json');
48
+ }
49
+ else if (rest.startsWith('subs/') && rest.endsWith('/config')) {
50
+ const sub = rest.slice('subs/'.length, -'/config'.length);
51
+ validateComponent(sub);
52
+ path = join(base, 'subs', sub, 'config.json');
53
+ }
54
+ else {
55
+ throw new Error(`Invalid backend key: ${key}`);
56
+ }
57
+ // Defense-in-depth: validateComponent already rejects separators/./../empty/NUL.
58
+ const baseResolved = resolve(base);
59
+ const pathResolved = resolve(path);
60
+ if (pathResolved !== baseResolved && !pathResolved.startsWith(baseResolved + sep)) {
61
+ throw new Error(`Path escapes base: ${key}`);
62
+ }
63
+ return path;
64
+ }
65
+ /** Stores blobs on local disk, preserving the per-plugin layout. */
66
+ export class LocalFsBackend {
67
+ async get(key) {
68
+ const path = keyToPath(key);
69
+ try {
70
+ return await readFile(path);
71
+ }
72
+ catch (err) {
73
+ if (err.code === 'ENOENT')
74
+ return null;
75
+ throw err;
76
+ }
77
+ }
78
+ async put(key, blob) {
79
+ const path = keyToPath(key);
80
+ await mkdir(dirname(path), { recursive: true, mode: 0o700 });
81
+ await writeFile(path, blob, { mode: 0o600 });
82
+ }
83
+ async delete(key) {
84
+ const path = keyToPath(key);
85
+ try {
86
+ await unlink(path);
87
+ }
88
+ catch (err) {
89
+ if (err.code !== 'ENOENT')
90
+ throw err;
91
+ }
92
+ }
93
+ }
94
+ /**
95
+ * Default HTTP implementation over global fetch.
96
+ *
97
+ * fetch resolves on 4xx/5xx and rejects only on network error, so status checks
98
+ * in CfKvBackend handle HTTP errors while transport errors propagate -- matching
99
+ * the Python httpx client behavior.
100
+ */
101
+ const fetchHttp = {
102
+ async request(method, url, data, headers) {
103
+ const resp = await fetch(url, {
104
+ method,
105
+ body: data ? new Uint8Array(data) : undefined,
106
+ headers
107
+ });
108
+ const body = Buffer.from(await resp.arrayBuffer());
109
+ return { status: resp.status, body };
110
+ }
111
+ };
112
+ /**
113
+ * Stores blobs in a Cloudflare Workers KV namespace over HTTP.
114
+ *
115
+ * Error contract: 200 -> data, 404 -> absent (null for get, no-op for delete).
116
+ * Every other HTTP status, plus transport errors from the HTTP client, raises --
117
+ * failures are loud, never silently returned as data. Error messages carry the
118
+ * status only; never the token or the response body.
119
+ */
120
+ export class CfKvBackend {
121
+ constructor(baseUrl, token, http = fetchHttp) {
122
+ this.baseUrl = baseUrl.replace(/\/+$/, '');
123
+ this.token = token;
124
+ this.http = http;
125
+ }
126
+ url(key) {
127
+ return `${this.baseUrl}/${encodeURIComponent(key)}`;
128
+ }
129
+ headers() {
130
+ return this.token ? { Authorization: `Bearer ${this.token}` } : {};
131
+ }
132
+ async get(key) {
133
+ const { status, body } = await this.http.request('GET', this.url(key), undefined, this.headers());
134
+ if (status === 200)
135
+ return body;
136
+ if (status === 404)
137
+ return null;
138
+ throw new Error(`CfKvBackend get failed: HTTP ${status}`);
139
+ }
140
+ async put(key, blob) {
141
+ const { status } = await this.http.request('PUT', this.url(key), blob, this.headers());
142
+ if (status !== 200 && status !== 204) {
143
+ throw new Error(`CfKvBackend put failed: HTTP ${status}`);
144
+ }
145
+ }
146
+ async delete(key) {
147
+ const { status } = await this.http.request('DELETE', this.url(key), undefined, this.headers());
148
+ if (status !== 200 && status !== 204 && status !== 404) {
149
+ throw new Error(`CfKvBackend delete failed: HTTP ${status}`);
150
+ }
151
+ }
152
+ }
153
+ /** Select a credential backend from the MCP_STORAGE_BACKEND env var. */
154
+ export function backendFromEnv() {
155
+ const kind = (process.env.MCP_STORAGE_BACKEND ?? 'local').toLowerCase();
156
+ if (kind === 'local' || kind === 'local-fs' || kind === '') {
157
+ return new LocalFsBackend();
158
+ }
159
+ if (kind === 'cf-kv') {
160
+ const baseUrl = process.env.MCP_KV_BASE_URL;
161
+ if (!baseUrl)
162
+ throw new Error('MCP_KV_BASE_URL is required when MCP_STORAGE_BACKEND=cf-kv');
163
+ return new CfKvBackend(baseUrl, process.env.MCP_KV_TOKEN);
164
+ }
165
+ throw new Error(`Unknown MCP_STORAGE_BACKEND: ${kind}`);
166
+ }
167
+ //# sourceMappingURL=backends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backends.js","sourceRoot":"","sources":["../../src/storage/backends.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Shared home-directory resolution with a testing override.
3
+ *
4
+ * Extracted out of per-plugin-store.ts so that both PerPluginStore and the
5
+ * LocalFsBackend in backends.ts can honor the same override without a circular
6
+ * value import (per-plugin-store imports backendFromEnv from backends).
7
+ */
8
+ /** Override the home directory used by storage modules. Pass null to reset. */
9
+ export declare function setHomeDirForTesting(dir: string | null): void;
10
+ export declare function getHomeDir(): string;
11
+ //# sourceMappingURL=home-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-dir.d.ts","sourceRoot":"","sources":["../../src/storage/home-dir.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,+EAA+E;AAC/E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE7D;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Shared home-directory resolution with a testing override.
3
+ *
4
+ * Extracted out of per-plugin-store.ts so that both PerPluginStore and the
5
+ * LocalFsBackend in backends.ts can honor the same override without a circular
6
+ * value import (per-plugin-store imports backendFromEnv from backends).
7
+ */
8
+ import { homedir } from 'node:os';
9
+ // Module-level override for testing.
10
+ let homeDirOverride = null;
11
+ /** Override the home directory used by storage modules. Pass null to reset. */
12
+ export function setHomeDirForTesting(dir) {
13
+ homeDirOverride = dir;
14
+ }
15
+ export function getHomeDir() {
16
+ return homeDirOverride ?? homedir();
17
+ }
18
+ //# sourceMappingURL=home-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"home-dir.js","sourceRoot":"","sources":["../../src/storage/home-dir.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,qCAAqC;AACrC,IAAI,eAAe,GAAkB,IAAI,CAAA;AAEzC,+EAA+E;AAC/E,MAAM,UAAU,oBAAoB,CAAC,GAAkB;IACrD,eAAe,GAAG,GAAG,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,eAAe,IAAI,OAAO,EAAE,CAAA;AACrC,CAAC"}
@@ -1,3 +1,4 @@
1
+ export { backendFromEnv, CfKvBackend, type CredentialBackend, InMemoryBackend, LocalFsBackend } from './backends.js';
1
2
  export { deleteConfig, exportConfig, importConfig, listConfigs, readConfig, setConfigPath, writeConfig } from './config-file.js';
2
3
  export { decryptData, deriveFileKey, derivePassphraseKey, encryptData } from './encryption.js';
3
4
  export { getMachineId, getUsername } from './machine-id.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,WAAW,EAChB,UAAU,EACV,gBAAgB,EACjB,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,WAAW,EACX,KAAK,iBAAiB,EACtB,eAAe,EACf,cAAc,EACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,KAAK,WAAW,EAChB,UAAU,EACV,gBAAgB,EACjB,MAAM,mBAAmB,CAAA"}
@@ -1,3 +1,4 @@
1
+ export { backendFromEnv, CfKvBackend, InMemoryBackend, LocalFsBackend } from './backends.js';
1
2
  export { deleteConfig, exportConfig, importConfig, listConfigs, readConfig, setConfigPath, writeConfig } from './config-file.js';
2
3
  export { decryptData, deriveFileKey, derivePassphraseKey, encryptData } from './encryption.js';
3
4
  export { getMachineId, getUsername } from './machine-id.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAmB,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,EAA0C,aAAa,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,UAAU,EACV,gBAAgB,EACjB,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,WAAW,EAEX,eAAe,EACf,cAAc,EACf,MAAM,eAAe,CAAA;AACtB,OAAO,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,UAAU,EACV,aAAa,EACb,WAAW,EACZ,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,OAAO,EAAmB,YAAY,EAAE,MAAM,WAAW,CAAA;AAC7E,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AACtF,OAAO,EAA0C,aAAa,EAAE,MAAM,eAAe,CAAA;AACrF,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAElB,UAAU,EACV,gBAAgB,EACjB,MAAM,mBAAmB,CAAA"}
@@ -14,14 +14,16 @@
14
14
  * Replaces deprecated config-file (shared config.enc) which caused
15
15
  * multi-daemon path-drift contention with platformdirs version skew.
16
16
  */
17
- /** Override the home directory used by this module. Pass null to reset. */
18
- export declare function setHomeDirForTesting(dir: string | null): void;
17
+ import { type CredentialBackend } from './backends.js';
18
+ export { setHomeDirForTesting } from './home-dir.js';
19
19
  export declare function credPath(pluginName: string, sub: string | null): string;
20
20
  export declare class PerPluginStore {
21
21
  pluginName: string;
22
22
  sub: string | null;
23
23
  readonly credPath: string;
24
- constructor(pluginName: string, sub?: string | null);
24
+ private readonly credKey;
25
+ private readonly backend;
26
+ constructor(pluginName: string, sub?: string | null, backend?: CredentialBackend);
25
27
  private key;
26
28
  load(): Promise<Record<string, unknown> | null>;
27
29
  save(payload: Record<string, unknown>): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"per-plugin-store.d.ts","sourceRoot":"","sources":["../../src/storage/per-plugin-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAUH,2EAA2E;AAC3E,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE7D;AAMD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUvE;AA0BD,qBAAa,cAAc;IAIhB,UAAU,EAAE,MAAM;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI;IAJ3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;gBAGhB,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,GAAG,IAAW;YAKpB,GAAG;IAIX,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAsB/C,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAO7B"}
1
+ {"version":3,"file":"per-plugin-store.d.ts","sourceRoot":"","sources":["../../src/storage/per-plugin-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAKH,OAAO,EAAkB,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAGtE,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAEpD,wBAAgB,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAUvE;AA0BD,qBAAa,cAAc;IAMhB,UAAU,EAAE,MAAM;IAClB,GAAG,EAAE,MAAM,GAAG,IAAI;IAN3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAGlC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,GAAG,IAAW,EAChC,OAAO,CAAC,EAAE,iBAAiB;YAOf,GAAG;IAIX,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAkB/C,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B"}
@@ -15,18 +15,11 @@
15
15
  * multi-daemon path-drift contention with platformdirs version skew.
16
16
  */
17
17
  import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from 'node:crypto';
18
- import { mkdir, readFile, unlink, writeFile } from 'node:fs/promises';
19
- import { homedir } from 'node:os';
20
- import { dirname, join } from 'node:path';
21
- // Module-level override for testing.
22
- let homeDirOverride = null;
23
- /** Override the home directory used by this module. Pass null to reset. */
24
- export function setHomeDirForTesting(dir) {
25
- homeDirOverride = dir;
26
- }
27
- function getHomeDir() {
28
- return homeDirOverride ?? homedir();
29
- }
18
+ import { mkdir, readFile, writeFile } from 'node:fs/promises';
19
+ import { join } from 'node:path';
20
+ import { backendFromEnv } from './backends.js';
21
+ import { getHomeDir } from './home-dir.js';
22
+ export { setHomeDirForTesting } from './home-dir.js';
30
23
  export function credPath(pluginName, sub) {
31
24
  const unsafe = /[^a-zA-Z0-9.-]/g;
32
25
  if (!pluginName || unsafe.test(pluginName) || pluginName.includes('..')) {
@@ -62,22 +55,20 @@ function deriveMultiUserKey(pluginName, sub) {
62
55
  });
63
56
  }
64
57
  export class PerPluginStore {
65
- constructor(pluginName, sub = null) {
58
+ constructor(pluginName, sub = null, backend) {
66
59
  this.pluginName = pluginName;
67
60
  this.sub = sub;
68
61
  this.credPath = credPath(pluginName, sub);
62
+ this.credKey = sub ? `${pluginName}/subs/${sub}/config` : `${pluginName}/config`;
63
+ this.backend = backend ?? backendFromEnv();
69
64
  }
70
65
  async key() {
71
66
  return this.sub ? deriveMultiUserKey(this.pluginName, this.sub) : loadOrGenMachineKey(this.pluginName);
72
67
  }
73
68
  async load() {
74
- let blob;
75
- try {
76
- blob = await readFile(this.credPath);
77
- }
78
- catch {
69
+ const blob = await this.backend.get(this.credKey);
70
+ if (blob === null)
79
71
  return null;
80
- }
81
72
  // Format: [12-byte IV][ciphertext][16-byte GCM tag]
82
73
  if (blob.length < 29)
83
74
  return null;
@@ -95,21 +86,15 @@ export class PerPluginStore {
95
86
  }
96
87
  }
97
88
  async save(payload) {
98
- await mkdir(dirname(this.credPath), { recursive: true, mode: 0o700 });
99
89
  const iv = randomBytes(12);
100
90
  const cipher = createCipheriv('aes-256-gcm', await this.key(), iv, { authTagLength: 16 });
101
91
  const plaintext = Buffer.from(JSON.stringify(payload), 'utf-8');
102
92
  const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
103
93
  const tag = cipher.getAuthTag();
104
- await writeFile(this.credPath, Buffer.concat([iv, ciphertext, tag]), { mode: 0o600 });
94
+ await this.backend.put(this.credKey, Buffer.concat([iv, ciphertext, tag]));
105
95
  }
106
96
  async clear() {
107
- try {
108
- await unlink(this.credPath);
109
- }
110
- catch {
111
- // ignore if file does not exist
112
- }
97
+ await this.backend.delete(this.credKey);
113
98
  }
114
99
  }
115
100
  //# sourceMappingURL=per-plugin-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"per-plugin-store.js","sourceRoot":"","sources":["../../src/storage/per-plugin-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"per-plugin-store.js","sourceRoot":"","sources":["../../src/storage/per-plugin-store.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@n24q02m/mcp-core",
3
- "version": "1.18.0-beta.3",
3
+ "version": "1.18.0-beta.4",
4
4
  "description": "Unified MCP Streamable HTTP 2025-11-25 transport, OAuth 2.1 AS, lifecycle, install",
5
5
  "keywords": [
6
6
  "mcp",