engram-tools 0.1.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/dist/index.js ADDED
@@ -0,0 +1,231 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
+ import { z } from 'zod';
5
+ const API_BASE = process.env.ENGRAM_API_URL || 'https://api.engram.tools';
6
+ const API_KEY = process.env.ENGRAM_API_KEY || '';
7
+ async function apiCall(path, body) {
8
+ const res = await fetch(`${API_BASE}${path}`, {
9
+ method: 'POST',
10
+ headers: {
11
+ 'Content-Type': 'application/json',
12
+ Authorization: `Bearer ${API_KEY}`,
13
+ },
14
+ body: JSON.stringify(body),
15
+ });
16
+ if (!res.ok) {
17
+ const err = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
18
+ throw new Error(err.error || `API error: ${res.status}`);
19
+ }
20
+ return res.json();
21
+ }
22
+ async function apiGet(path) {
23
+ const res = await fetch(`${API_BASE}${path}`, {
24
+ headers: { Authorization: `Bearer ${API_KEY}` },
25
+ });
26
+ if (!res.ok) {
27
+ const err = await res.json().catch(() => ({ error: `HTTP ${res.status}` }));
28
+ throw new Error(err.error || `API error: ${res.status}`);
29
+ }
30
+ return res.json();
31
+ }
32
+ async function main() {
33
+ if (!API_KEY) {
34
+ console.error('ENGRAM_API_KEY environment variable is required.');
35
+ console.error('Get your key at https://engram.tools/human');
36
+ process.exit(1);
37
+ }
38
+ const server = new McpServer({
39
+ name: 'engram',
40
+ version: '0.2.0',
41
+ });
42
+ // atm_store
43
+ server.registerTool('atm_store', {
44
+ title: 'Store Memory',
45
+ description: 'Store a learned convention, pattern, gotcha, or solution so the whole team benefits. Use this when you: fix a hard-to-find bug, discover an undocumented convention, find a working solution to a recurring problem, or notice a version-specific library quirk. Do NOT store obvious facts or temporary debugging info.',
46
+ inputSchema: {
47
+ type: z.enum(['CONVENTION', 'PATTERN', 'GOTCHA', 'SOLUTION', 'ARCHITECTURE', 'DEPENDENCY'])
48
+ .describe('Type of memory'),
49
+ content: z.string().describe('The knowledge to store. Be specific and actionable.'),
50
+ repo: z.string().optional().describe('Repository name'),
51
+ tags: z.array(z.string()).optional().describe('Tags for categorization'),
52
+ agent_tool: z.string().optional().describe('Which AI tool you are'),
53
+ context: z.record(z.string(), z.unknown()).optional().describe('Additional context'),
54
+ },
55
+ }, async (args) => {
56
+ try {
57
+ const result = await apiCall('/api/v1/store', args);
58
+ const r = result;
59
+ return { content: [{ type: 'text', text: r.message }] };
60
+ }
61
+ catch (e) {
62
+ return { content: [{ type: 'text', text: `Failed to store: ${e}` }], isError: true };
63
+ }
64
+ });
65
+ // atm_recall
66
+ server.registerTool('atm_recall', {
67
+ title: 'Recall Memory',
68
+ description: 'Search team memory for relevant conventions, patterns, gotchas, and solutions. Use this BEFORE making architectural decisions, when encountering unfamiliar errors, or when wondering "has someone solved this before?" Always check memory before reinventing a solution.',
69
+ inputSchema: {
70
+ query: z.string().describe('What you want to know'),
71
+ repo: z.string().optional().describe('Filter by repository'),
72
+ type: z.enum(['CONVENTION', 'PATTERN', 'GOTCHA', 'SOLUTION', 'ARCHITECTURE', 'DEPENDENCY']).optional(),
73
+ tags: z.array(z.string()).optional(),
74
+ limit: z.number().min(1).max(20).optional().describe('Max results (default: 5)'),
75
+ },
76
+ }, async (args) => {
77
+ try {
78
+ const result = await apiCall('/api/v1/recall', args);
79
+ const r = result;
80
+ if (r.count === 0) {
81
+ return { content: [{ type: 'text', text: 'No relevant memories found. Consider storing new knowledge with atm_store.' }] };
82
+ }
83
+ const summary = r.memories.slice(0, 3).map(m => m.content.split('\n')[0].slice(0, 80)).join(' | ');
84
+ const formatted = r.memories.map((m, i) => {
85
+ const rel = m.relevance ? ` | relevance: ${(m.relevance * 100).toFixed(0)}%` : '';
86
+ const stale = m.stale ? ' | STALE (30+ days, verify before using)' : '';
87
+ return `### ${i + 1}. [${m.type}]${rel}${stale}\n${m.content}\n${m.tags.length > 0 ? `Tags: ${m.tags.join(', ')}` : ''}\nID: ${m.id}`;
88
+ }).join('\n\n');
89
+ const staleCount = r.memories.filter(m => m.stale).length;
90
+ const staleNote = staleCount > 0 ? `\n\nNote: ${staleCount} memories are 30+ days old. Verify before acting on them.` : '';
91
+ return { content: [{ type: 'text', text: `Found ${r.count} relevant memories.\n\nQuick summary: ${summary}\n\n${formatted}${staleNote}\n\nTip: Use atm_report_outcome to confirm or flag memories after using them.` }] };
92
+ }
93
+ catch (e) {
94
+ return { content: [{ type: 'text', text: `Failed to recall: ${e}` }], isError: true };
95
+ }
96
+ });
97
+ // atm_report_outcome
98
+ server.registerTool('atm_report_outcome', {
99
+ title: 'Report Outcome',
100
+ description: 'Report whether a recalled memory was helpful or not. This is critical for learning. Always report after using a recalled memory. If it failed, explain WHY.',
101
+ inputSchema: {
102
+ memory_id: z.string().describe('The memory ID from atm_recall results'),
103
+ success: z.boolean().describe('true = helped, false = did not help or was wrong'),
104
+ detail: z.string().optional().describe('Explain the outcome. REQUIRED when success=false.'),
105
+ failure_reason: z.enum(['outdated', 'wrong_context', 'incorrect', 'partial', 'other']).optional()
106
+ .describe('Why did it fail? Only when success=false.'),
107
+ },
108
+ }, async (args) => {
109
+ try {
110
+ const result = await apiCall('/api/v1/report', args);
111
+ const r = result;
112
+ return { content: [{ type: 'text', text: r.message }] };
113
+ }
114
+ catch (e) {
115
+ return { content: [{ type: 'text', text: `Failed to report: ${e}` }], isError: true };
116
+ }
117
+ });
118
+ // atm_get_context
119
+ server.registerTool('atm_get_context', {
120
+ title: 'Get Context',
121
+ description: 'Load all relevant memories for a repository. Use at session start or when switching repos.',
122
+ inputSchema: {
123
+ repo: z.string().describe('Repository name'),
124
+ file: z.string().optional().describe('Current file path'),
125
+ task: z.string().optional().describe('What you are about to do'),
126
+ },
127
+ }, async (args) => {
128
+ try {
129
+ const result = await apiCall('/api/v1/context', args);
130
+ const r = result;
131
+ const sections = [];
132
+ const fmt = (mems) => mems.map(m => `- [${m.confidence.toFixed(2)}]${m.stale ? ' [STALE]' : ''} ${m.content}`).join('\n');
133
+ if (r.conventions.length)
134
+ sections.push('## Conventions\n' + fmt(r.conventions));
135
+ if (r.gotchas.length)
136
+ sections.push('## Gotchas (Watch Out!)\n' + fmt(r.gotchas));
137
+ if (r.patterns.length)
138
+ sections.push('## Patterns\n' + fmt(r.patterns));
139
+ if (r.solutions.length)
140
+ sections.push('## Solutions\n' + fmt(r.solutions));
141
+ if (r.architecture.length)
142
+ sections.push('## Architecture\n' + fmt(r.architecture));
143
+ if (sections.length === 0) {
144
+ return { content: [{ type: 'text', text: `No memories for repo "${args.repo}". Use atm_store to save useful findings as you work.` }] };
145
+ }
146
+ const guidance = `\n---\n## When to use Engram this session\n\n**STORE** when you fix a hard bug, discover a convention, or find a solution.\n**RECALL** before architectural decisions or when encountering errors.\n**REPORT** after using a recalled memory (helps the system learn).\n\n_${r.total} memories loaded._`;
147
+ return { content: [{ type: 'text', text: `# Team Context for ${args.repo}\n\n${sections.join('\n\n')}${guidance}` }] };
148
+ }
149
+ catch (e) {
150
+ return { content: [{ type: 'text', text: `Failed to get context: ${e}` }], isError: true };
151
+ }
152
+ });
153
+ // atm_setup
154
+ server.registerTool('atm_setup', {
155
+ title: 'Setup / Onboarding',
156
+ description: 'Call this ONCE when you first connect to Engram, or when you need a refresher on how to use the memory system.',
157
+ inputSchema: {
158
+ agent_tool: z.string().optional().describe('Which AI tool you are (e.g. "claude-code", "cursor")'),
159
+ },
160
+ }, async (args) => {
161
+ try {
162
+ const result = await apiCall('/api/v1/setup', args);
163
+ const r = result;
164
+ const text = `# Welcome to Engram!
165
+
166
+ ## Your Workspace: ${r.workspace.name}
167
+ - Memories: ${r.workspace.memories}
168
+ - Team members: ${r.workspace.members}
169
+ - Repos: ${r.workspace.repos}
170
+
171
+ ## Your 5 Tools
172
+ - **atm_store** - Save knowledge for the team
173
+ - **atm_recall** - Search before you decide
174
+ - **atm_report_outcome** - Help the system learn
175
+ - **atm_get_context** - Load repo knowledge at session start
176
+ - **atm_setup** - This onboarding (you just called it)
177
+
178
+ ## When to Store
179
+ ${r.guidelines.store_when.map(s => `- ${s}`).join('\n')}
180
+
181
+ ## Do NOT Store
182
+ ${r.guidelines.do_not_store.map(s => `- ${s}`).join('\n')}
183
+
184
+ ## When to Recall
185
+ ${r.guidelines.recall_when.map(s => `- ${s}`).join('\n')}
186
+
187
+ ## Always Report Outcomes
188
+ After using a recalled memory, report if it helped or not. This is how Engram learns.
189
+
190
+ ---
191
+ Setup complete. Start with **atm_get_context** for your current repo.`;
192
+ return { content: [{ type: 'text', text }] };
193
+ }
194
+ catch (e) {
195
+ return { content: [{ type: 'text', text: `Setup failed: ${e}` }], isError: true };
196
+ }
197
+ });
198
+ // atm_skill
199
+ server.registerTool('atm_skill', {
200
+ title: 'Get Skill Bundle',
201
+ description: 'Get a complete skill guide for a specific task. Returns all step-by-step memories for that skill as one organized bundle. Use this when you are about to perform a complex task like code review, database migration, security audit, deployment, etc. Call with no skill to list available skills.',
202
+ inputSchema: {
203
+ skill: z.string().optional().describe('Skill name (e.g. "code-review", "database-migration", "security-audit", "deployment"). Leave empty to list all available skills.'),
204
+ },
205
+ }, async (args) => {
206
+ try {
207
+ const result = await apiCall('/api/v1/skill', { skill: args.skill || '' });
208
+ const r = result;
209
+ if (r.available_skills) {
210
+ return { content: [{ type: 'text', text: `Available skills:\n${r.available_skills.map(s => `- ${s}`).join('\n')}\n\nUsage: atm_skill({ skill: "skill-name" })` }] };
211
+ }
212
+ if (r.count === 0) {
213
+ return { content: [{ type: 'text', text: r.message || `No memories found for skill "${args.skill}".` }] };
214
+ }
215
+ return { content: [{ type: 'text', text: `# Skill: ${r.skill} (${r.count} steps)\n\n${r.combined}` }] };
216
+ }
217
+ catch (e) {
218
+ return { content: [{ type: 'text', text: `Failed to get skill: ${e}` }], isError: true };
219
+ }
220
+ });
221
+ // Connect via stdio
222
+ const transport = new StdioServerTransport();
223
+ await server.connect(transport);
224
+ process.on('SIGINT', async () => { await server.close(); process.exit(0); });
225
+ process.on('SIGTERM', async () => { await server.close(); process.exit(0); });
226
+ }
227
+ main().catch((error) => {
228
+ console.error('Fatal error:', error);
229
+ process.exit(1);
230
+ });
231
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "engram-tools",
3
+ "version": "0.1.0",
4
+ "description": "Shared memory for AI coding agents. Store, recall, and learn across tools, sessions, and teams.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "bin": {
8
+ "engram-tools": "dist/index.js"
9
+ },
10
+ "files": [
11
+ "dist/index.js",
12
+ "dist/index.js.map",
13
+ "README.md",
14
+ "LICENSE"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "dev": "tsx src/index.ts",
19
+ "dev:http": "tsx src/http.ts",
20
+ "start": "node dist/index.js",
21
+ "start:http": "node dist/http.js",
22
+ "db:generate": "prisma generate",
23
+ "db:push": "prisma db push",
24
+ "db:migrate": "prisma migrate dev",
25
+ "db:seed": "tsx prisma/seed.ts",
26
+ "db:setup": "prisma db push && tsx prisma/seed.ts",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "keywords": [
30
+ "mcp",
31
+ "ai",
32
+ "memory",
33
+ "team",
34
+ "coding-agent"
35
+ ],
36
+ "author": "Emre Varol",
37
+ "license": "MIT",
38
+ "dependencies": {
39
+ "@hono/node-server": "^1.19.11",
40
+ "@modelcontextprotocol/sdk": "^1.27.1",
41
+ "@prisma/adapter-pg": "^7.5.0",
42
+ "@prisma/client": "^7.5.0",
43
+ "dotenv": "^17.3.1",
44
+ "hono": "^4.12.9",
45
+ "pg": "^8.20.0",
46
+ "zod": "^4.3.6"
47
+ },
48
+ "devDependencies": {
49
+ "@types/node": "^25.5.0",
50
+ "prisma": "^7.5.0",
51
+ "tsx": "^4.21.0",
52
+ "typescript": "^6.0.2"
53
+ },
54
+ "prisma": {
55
+ "seed": "tsx prisma/seed.ts"
56
+ }
57
+ }