@s_s/mnemo 1.0.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.
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Register the memory_search tool
4
+ */
5
+ export declare function registerSearchTool(server: McpServer): void;
@@ -0,0 +1,107 @@
1
+ import { z } from 'zod';
2
+ import { searchNotes, isEmbeddingReady } from '../core/embedding.js';
3
+ import { readNote } from '../core/notes.js';
4
+ /**
5
+ * Register the memory_search tool
6
+ */
7
+ export function registerSearchTool(server) {
8
+ server.registerTool('memory_search', {
9
+ title: 'Search Memory',
10
+ description: 'Search through persistent memories using semantic similarity. Use this at the start of conversations to load relevant context, when the user references past discussions, or when you need background information for a task.',
11
+ inputSchema: {
12
+ query: z
13
+ .string()
14
+ .describe("Natural language description of what you're looking for. E.g., 'architecture decisions for the mnemo project', 'user preferences about code style'"),
15
+ top_k: z
16
+ .number()
17
+ .int()
18
+ .min(1)
19
+ .max(20)
20
+ .default(5)
21
+ .optional()
22
+ .describe('Maximum number of results to return (default: 5)'),
23
+ source_filter: z
24
+ .string()
25
+ .optional()
26
+ .describe("Filter results by source agent tool, e.g., 'opencode', 'claude-code'"),
27
+ tag_filter: z
28
+ .array(z.string())
29
+ .optional()
30
+ .describe('Filter results to only include notes that have ALL of the specified tags. E.g., ["architecture", "decision"]'),
31
+ },
32
+ }, async ({ query, top_k, source_filter, tag_filter }) => {
33
+ try {
34
+ if (!isEmbeddingReady()) {
35
+ return {
36
+ content: [
37
+ {
38
+ type: 'text',
39
+ text: 'Mnemo is still loading the embedding model. Please try again in a few seconds.',
40
+ },
41
+ ],
42
+ };
43
+ }
44
+ // When tag_filter is used, fetch more results to compensate for post-filtering
45
+ const fetchK = tag_filter && tag_filter.length > 0 ? (top_k || 5) * 3 : top_k || 5;
46
+ let results = await searchNotes(query, fetchK, source_filter);
47
+ // Post-filter by tags if specified
48
+ if (tag_filter && tag_filter.length > 0) {
49
+ results = results.filter((r) => {
50
+ const noteTags = r.tags.split(',').filter(Boolean);
51
+ return tag_filter.every((t) => noteTags.includes(t));
52
+ });
53
+ results = results.slice(0, top_k || 5);
54
+ }
55
+ if (results.length === 0) {
56
+ return {
57
+ content: [
58
+ {
59
+ type: 'text',
60
+ text: 'No relevant memories found.',
61
+ },
62
+ ],
63
+ };
64
+ }
65
+ // For each result, load the full note content
66
+ const enrichedResults = await Promise.all(results.map(async (r) => {
67
+ const note = await readNote(r.id);
68
+ return {
69
+ id: r.id,
70
+ score: r.score,
71
+ content: note?.content || r.text,
72
+ tags: note?.meta.tags || r.tags.split(',').filter(Boolean),
73
+ source: r.source,
74
+ created: r.created,
75
+ };
76
+ }));
77
+ const output = enrichedResults
78
+ .map((r, i) => `### Memory ${i + 1} (relevance: ${(r.score * 100).toFixed(1)}%)\n` +
79
+ `- **ID:** ${r.id}\n` +
80
+ `- **Tags:** [${Array.isArray(r.tags) ? r.tags.join(', ') : r.tags}]\n` +
81
+ `- **Source:** ${r.source}\n` +
82
+ `- **Created:** ${r.created}\n\n` +
83
+ `${r.content}`)
84
+ .join('\n\n---\n\n');
85
+ return {
86
+ content: [
87
+ {
88
+ type: 'text',
89
+ text: `Found ${results.length} relevant memories:\n\n${output}`,
90
+ },
91
+ ],
92
+ };
93
+ }
94
+ catch (error) {
95
+ return {
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: `Failed to search memories: ${error instanceof Error ? error.message : String(error)}`,
100
+ },
101
+ ],
102
+ isError: true,
103
+ };
104
+ }
105
+ });
106
+ }
107
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ /**
3
+ * Register the memory_setup tool
4
+ */
5
+ export declare function registerSetupTool(server: McpServer): void;
@@ -0,0 +1,120 @@
1
+ import fs from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import { z } from 'zod';
4
+ import { AGENT_TYPES } from '../core/config.js';
5
+ import { getAgentConfig, injectPrompt, hasPromptInjected } from '../prompts/templates.js';
6
+ /**
7
+ * Detect which agent tool is being used by checking config file existence
8
+ */
9
+ async function detectAgentType(cwd) {
10
+ const home = os.homedir();
11
+ // Check for agent-specific config files
12
+ const checks = [
13
+ {
14
+ type: 'opencode',
15
+ paths: [`${cwd}/opencode.json`, `${cwd}/opencode.jsonc`, `${home}/.config/opencode/opencode.json`],
16
+ },
17
+ {
18
+ type: 'claude-code',
19
+ paths: [`${cwd}/CLAUDE.md`, `${home}/.claude/CLAUDE.md`],
20
+ },
21
+ {
22
+ type: 'openclaw',
23
+ paths: [`${home}/.openclaw/openclaw.json`],
24
+ },
25
+ {
26
+ type: 'codex',
27
+ paths: [`${cwd}/.codex/config.toml`, `${home}/.codex/config.toml`],
28
+ },
29
+ ];
30
+ for (const check of checks) {
31
+ for (const p of check.paths) {
32
+ try {
33
+ await fs.access(p);
34
+ return check.type;
35
+ }
36
+ catch {
37
+ continue;
38
+ }
39
+ }
40
+ }
41
+ return null;
42
+ }
43
+ /**
44
+ * Register the memory_setup tool
45
+ */
46
+ export function registerSetupTool(server) {
47
+ server.registerTool('memory_setup', {
48
+ title: 'Memory Setup',
49
+ description: "Initialize Mnemo memory management. Writes memory management instructions into the agent's configuration file (e.g., AGENTS.md for OpenCode). Should be called once when setting up Mnemo for the first time.",
50
+ inputSchema: {
51
+ agent_type: z
52
+ .enum(AGENT_TYPES)
53
+ .optional()
54
+ .describe('Agent tool type. If not specified, will try to auto-detect. Valid values: opencode, claude-code, openclaw, codex'),
55
+ scope: z
56
+ .enum(['project', 'global'])
57
+ .default('project')
58
+ .describe("Where to write the prompt: 'project' for current project, 'global' for user-level config"),
59
+ },
60
+ }, async ({ agent_type, scope }) => {
61
+ const cwd = process.cwd();
62
+ const home = os.homedir();
63
+ // Determine agent type
64
+ let agentType = agent_type;
65
+ if (!agentType) {
66
+ const detected = await detectAgentType(cwd);
67
+ if (!detected) {
68
+ return {
69
+ content: [
70
+ {
71
+ type: 'text',
72
+ text: `Could not auto-detect agent type. Please specify agent_type parameter. Valid values: ${AGENT_TYPES.join(', ')}`,
73
+ },
74
+ ],
75
+ isError: true,
76
+ };
77
+ }
78
+ agentType = detected;
79
+ }
80
+ const config = getAgentConfig(agentType);
81
+ const targetPath = scope === 'global' ? config.globalPath(home) : config.projectPath(cwd);
82
+ // Read existing content or start fresh
83
+ let existingContent = '';
84
+ try {
85
+ existingContent = await fs.readFile(targetPath, 'utf-8');
86
+ }
87
+ catch {
88
+ // File doesn't exist yet, that's fine
89
+ }
90
+ // Check if already installed
91
+ if (hasPromptInjected(existingContent)) {
92
+ // Update in place
93
+ const updated = injectPrompt(existingContent);
94
+ await fs.writeFile(targetPath, updated, 'utf-8');
95
+ return {
96
+ content: [
97
+ {
98
+ type: 'text',
99
+ text: `Mnemo memory instructions updated in ${targetPath}`,
100
+ },
101
+ ],
102
+ };
103
+ }
104
+ // Inject prompt
105
+ const updated = injectPrompt(existingContent);
106
+ // Ensure parent directory exists
107
+ const dir = targetPath.substring(0, targetPath.lastIndexOf('/'));
108
+ await fs.mkdir(dir, { recursive: true });
109
+ await fs.writeFile(targetPath, updated, 'utf-8');
110
+ return {
111
+ content: [
112
+ {
113
+ type: 'text',
114
+ text: `Mnemo memory management initialized successfully.\n\nAgent type: ${agentType}\nConfig file: ${targetPath}\n\nMnemo is now ready to use.`,
115
+ },
116
+ ],
117
+ };
118
+ });
119
+ }
120
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/tools/setup.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@s_s/mnemo",
3
+ "version": "1.0.0",
4
+ "description": "Memory management MCP server for AI coding assistants",
5
+ "type": "module",
6
+ "main": "./build/index.js",
7
+ "bin": {
8
+ "mnemo": "build/index.js"
9
+ },
10
+ "files": [
11
+ "build"
12
+ ],
13
+ "scripts": {
14
+ "build": "tsc",
15
+ "dev": "tsc --watch",
16
+ "start": "node build/index.js",
17
+ "prettier": "prettier --check \"**/*\"",
18
+ "prettier:fix": "prettier -c --write \"**/*\"",
19
+ "prettier:staged": "prettier --write",
20
+ "test": "vitest run",
21
+ "test:watch": "vitest",
22
+ "release": "bash scripts/release.sh",
23
+ "prepare": "husky"
24
+ },
25
+ "keywords": [
26
+ "mcp",
27
+ "memory",
28
+ "agent"
29
+ ],
30
+ "author": "",
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@huggingface/transformers": "^3.8.1",
34
+ "@modelcontextprotocol/sdk": "^1.27.1",
35
+ "vectra": "^0.12.3",
36
+ "zod": "^4.3.6"
37
+ },
38
+ "devDependencies": {
39
+ "@types/node": "^25.3.3",
40
+ "husky": "^9.1.7",
41
+ "lint-staged": "^16.3.2",
42
+ "prettier": "^3.8.1",
43
+ "typescript": "^5.9.3",
44
+ "vitest": "^4.0.18"
45
+ },
46
+ "lint-staged": {
47
+ "**/*.{js,ts,md}": "npm run prettier:staged --"
48
+ }
49
+ }