@mmnto/mcp 1.9.0 → 1.10.1
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/dist/context.d.ts +4 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +3 -13
- package/dist/context.js.map +1 -1
- package/dist/context.test.d.ts +2 -0
- package/dist/context.test.d.ts.map +1 -0
- package/dist/context.test.js +69 -0
- package/dist/context.test.js.map +1 -0
- package/package.json +5 -3
package/dist/context.d.ts
CHANGED
|
@@ -11,6 +11,10 @@ export interface ServerContext {
|
|
|
11
11
|
* No-op if the context hasn't been initialized yet.
|
|
12
12
|
*/
|
|
13
13
|
export declare function reconnectStore(): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Load environment variables from .env file (does not override existing).
|
|
16
|
+
*/
|
|
17
|
+
export declare function loadEnv(cwd: string): void;
|
|
14
18
|
/**
|
|
15
19
|
* Lazily initialize and return the shared server context.
|
|
16
20
|
* Config, embedder, and LanceStore are created on first call and cached.
|
package/dist/context.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAEL,UAAU,EAIX,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,KAAK,EAAE,UAAU,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;CACpB;AAKD;;;GAGG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAKzC;AA0CD;;;;;GAKG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,aAAa,CAAC,CASzD"}
|
package/dist/context.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
+
import dotenv from 'dotenv';
|
|
3
4
|
import { createEmbedder, LanceStore, requireEmbedding, TotemConfigError, TotemConfigSchema, } from '@mmnto/totem';
|
|
4
5
|
let cached;
|
|
5
6
|
let initPromise;
|
|
@@ -15,22 +16,11 @@ export async function reconnectStore() {
|
|
|
15
16
|
/**
|
|
16
17
|
* Load environment variables from .env file (does not override existing).
|
|
17
18
|
*/
|
|
18
|
-
function loadEnv(cwd) {
|
|
19
|
+
export function loadEnv(cwd) {
|
|
19
20
|
const envPath = path.join(cwd, '.env');
|
|
20
21
|
if (!fs.existsSync(envPath))
|
|
21
22
|
return;
|
|
22
|
-
|
|
23
|
-
for (const line of content.split('\n')) {
|
|
24
|
-
const match = line.match(/^([^#=]+)=(.*)$/);
|
|
25
|
-
if (match) {
|
|
26
|
-
const key = match[1].trim();
|
|
27
|
-
const raw = match[2].trim();
|
|
28
|
-
const value = raw.replace(/^(['"])(.*)(\1)$/, '$2');
|
|
29
|
-
if (!process.env[key]) {
|
|
30
|
-
process.env[key] = value;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
23
|
+
dotenv.config({ path: envPath });
|
|
34
24
|
}
|
|
35
25
|
/**
|
|
36
26
|
* Load and parse totem.config.ts via jiti.
|
package/dist/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,OAAO,EACL,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,cAAc,CAAC;AAStB,IAAI,MAAiC,CAAC;AACtC,IAAI,WAA+C,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,GAAW;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACvC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO;IAEpC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AACnC,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,UAAU,CAAC,UAAkB;IAC1C,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4B,CAAC;IACvE,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC;IAClC,OAAO,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,WAAW;IACxB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC7D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,gBAAgB,CACxB,gDAAgD,EAChD,yBAAyB,EACzB,gBAAgB,CACjB,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,WAAW,CAAC,CAAC;IAErB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;IAEtB,MAAM,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,WAAW,GAAG,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACxC,WAAW,GAAG,SAAS,CAAC,CAAC,oCAAoC;YAC7D,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.d.ts","sourceRoot":"","sources":["../src/context.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as os from 'node:os';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { loadEnv } from './context.js';
|
|
6
|
+
describe('loadEnv', () => {
|
|
7
|
+
let tmpDir;
|
|
8
|
+
const injectedKeys = [];
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'totem-env-'));
|
|
11
|
+
});
|
|
12
|
+
afterEach(() => {
|
|
13
|
+
// Clean up any keys we injected into process.env
|
|
14
|
+
for (const key of injectedKeys) {
|
|
15
|
+
delete process.env[key];
|
|
16
|
+
}
|
|
17
|
+
injectedKeys.length = 0;
|
|
18
|
+
// Remove temp directory
|
|
19
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
20
|
+
});
|
|
21
|
+
function writeEnv(content) {
|
|
22
|
+
fs.writeFileSync(path.join(tmpDir, '.env'), content, 'utf-8');
|
|
23
|
+
}
|
|
24
|
+
function trackKey(key) {
|
|
25
|
+
injectedKeys.push(key);
|
|
26
|
+
}
|
|
27
|
+
it('parses a basic key=value pair', () => {
|
|
28
|
+
const key = 'TOTEM_TEST_BASIC';
|
|
29
|
+
trackKey(key);
|
|
30
|
+
writeEnv(`${key}=value`);
|
|
31
|
+
loadEnv(tmpDir);
|
|
32
|
+
expect(process.env[key]).toBe('value');
|
|
33
|
+
});
|
|
34
|
+
it('strips inline comments', () => {
|
|
35
|
+
const key = 'TOTEM_TEST_WITH_COMMENT';
|
|
36
|
+
trackKey(key);
|
|
37
|
+
writeEnv(`${key}=secret # expires tomorrow`);
|
|
38
|
+
loadEnv(tmpDir);
|
|
39
|
+
expect(process.env[key]).toBe('secret');
|
|
40
|
+
});
|
|
41
|
+
it('preserves hash inside double-quoted values', () => {
|
|
42
|
+
const key = 'TOTEM_TEST_QUOTED_HASH';
|
|
43
|
+
trackKey(key);
|
|
44
|
+
writeEnv(`${key}="my#secret" # actual comment`);
|
|
45
|
+
loadEnv(tmpDir);
|
|
46
|
+
expect(process.env[key]).toBe('my#secret');
|
|
47
|
+
});
|
|
48
|
+
it('handles empty values', () => {
|
|
49
|
+
const key = 'TOTEM_TEST_EMPTY_VAL';
|
|
50
|
+
trackKey(key);
|
|
51
|
+
writeEnv(`${key}=`);
|
|
52
|
+
loadEnv(tmpDir);
|
|
53
|
+
expect(process.env[key]).toBe('');
|
|
54
|
+
});
|
|
55
|
+
it('completes silently when .env file does not exist', () => {
|
|
56
|
+
const nonExistent = path.join(tmpDir, 'no-such-dir');
|
|
57
|
+
// Should not throw
|
|
58
|
+
expect(() => loadEnv(nonExistent)).not.toThrow();
|
|
59
|
+
});
|
|
60
|
+
it('does not overwrite existing process.env keys', () => {
|
|
61
|
+
const key = 'TOTEM_TEST_NO_OVERWRITE';
|
|
62
|
+
trackKey(key);
|
|
63
|
+
process.env[key] = 'original';
|
|
64
|
+
writeEnv(`${key}=overwritten`);
|
|
65
|
+
loadEnv(tmpDir);
|
|
66
|
+
expect(process.env[key]).toBe('original');
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=context.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.test.js","sourceRoot":"","sources":["../src/context.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mmnto/mcp",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.10.1",
|
|
4
4
|
"description": "MCP server for Totem — AI persistent memory and context layer",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
18
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
19
|
+
"dotenv": "^16.4.0",
|
|
19
20
|
"jiti": "^2.4.0",
|
|
20
21
|
"zod": "^3.24.0",
|
|
21
|
-
"@mmnto/totem": "1.
|
|
22
|
+
"@mmnto/totem": "1.10.1"
|
|
22
23
|
},
|
|
23
24
|
"devDependencies": {
|
|
24
25
|
"@types/node": "^22.0.0",
|
|
@@ -40,7 +41,8 @@
|
|
|
40
41
|
"url": "https://github.com/mmnto-ai/totem/issues"
|
|
41
42
|
},
|
|
42
43
|
"publishConfig": {
|
|
43
|
-
"access": "public"
|
|
44
|
+
"access": "public",
|
|
45
|
+
"provenance": true
|
|
44
46
|
},
|
|
45
47
|
"scripts": {
|
|
46
48
|
"build": "tsc",
|