@prom.codes/memory-mcp 0.2.0 → 0.3.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 +1 -1
- package/dist/bin.js +78 -17
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @prom.codes/memory-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
prom.codes Memory — persistent, local-first agent memory as an MCP server (stdio).
|
|
4
4
|
|
|
5
5
|
Gives coding agents a durable memory across sessions: facts, decisions and
|
|
6
6
|
procedures survive context-window resets. Records live in a local SQLite
|
package/dist/bin.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// dist/bin.js
|
|
4
|
+
import { McpServer as McpServer2 } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
4
5
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
5
6
|
|
|
6
7
|
// dist/composition.js
|
|
@@ -1150,7 +1151,9 @@ function discoverMemoryEmbedder(env) {
|
|
|
1150
1151
|
}
|
|
1151
1152
|
function composeFromEnv(opts) {
|
|
1152
1153
|
const env = opts.env;
|
|
1153
|
-
const
|
|
1154
|
+
const override = (opts.workspaceRootOverride ?? "").trim();
|
|
1155
|
+
const envRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
|
|
1156
|
+
const workspaceRoot = resolve(override !== "" ? override : envRoot !== "" ? envRoot : process.cwd());
|
|
1154
1157
|
const projectId = projectIdFor(workspaceRoot);
|
|
1155
1158
|
const projectName = basename(workspaceRoot) || workspaceRoot;
|
|
1156
1159
|
const rawDbPath = env.PROMETHEUS_MEMORY_DB_PATH;
|
|
@@ -1169,6 +1172,36 @@ function composeFromEnv(opts) {
|
|
|
1169
1172
|
};
|
|
1170
1173
|
}
|
|
1171
1174
|
|
|
1175
|
+
// dist/roots.js
|
|
1176
|
+
import { fileURLToPath } from "node:url";
|
|
1177
|
+
async function rootFromClient(server, timeoutMs = 2500) {
|
|
1178
|
+
let supportsRoots = false;
|
|
1179
|
+
try {
|
|
1180
|
+
supportsRoots = server.getClientCapabilities()?.roots != null;
|
|
1181
|
+
} catch {
|
|
1182
|
+
return null;
|
|
1183
|
+
}
|
|
1184
|
+
if (!supportsRoots)
|
|
1185
|
+
return null;
|
|
1186
|
+
let res;
|
|
1187
|
+
try {
|
|
1188
|
+
res = await server.listRoots(void 0, { timeout: timeoutMs });
|
|
1189
|
+
} catch {
|
|
1190
|
+
return null;
|
|
1191
|
+
}
|
|
1192
|
+
const roots = res?.roots ?? [];
|
|
1193
|
+
for (const r of roots) {
|
|
1194
|
+
const uri = typeof r?.uri === "string" ? r.uri : "";
|
|
1195
|
+
if (uri.startsWith("file://")) {
|
|
1196
|
+
try {
|
|
1197
|
+
return fileURLToPath(uri);
|
|
1198
|
+
} catch {
|
|
1199
|
+
}
|
|
1200
|
+
}
|
|
1201
|
+
}
|
|
1202
|
+
return null;
|
|
1203
|
+
}
|
|
1204
|
+
|
|
1172
1205
|
// dist/server.js
|
|
1173
1206
|
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
1174
1207
|
|
|
@@ -1719,40 +1752,68 @@ ${p.value}`)
|
|
|
1719
1752
|
var SERVER_IDENTITY = {
|
|
1720
1753
|
name: "prometheus-memory-mcp",
|
|
1721
1754
|
version: PROMETHEUS_VERSION,
|
|
1722
|
-
title: "
|
|
1755
|
+
title: "prom.codes Memory"
|
|
1723
1756
|
};
|
|
1724
1757
|
var SERVER_INSTRUCTIONS = "Persistent agent memory for this workspace. At the START of a session or task, call memory_read to recall facts, decisions and procedures from earlier sessions. When the user states a durable preference, decision or correction, store it with memory_write. Use memory_search for keyword recall when memory_read is not specific enough. At the END of a session, consolidate what was learned with memory_capture. Run memory_setup once per workspace to install the memory protocol into runtime rule files. Never store secrets, API keys or credentials \u2014 such writes are rejected.";
|
|
1725
|
-
function createServer(deps, options = {}) {
|
|
1726
|
-
const identity = { ...SERVER_IDENTITY, ...options.identity ?? {} };
|
|
1727
|
-
const capabilities = options.capabilities ?? { tools: {} };
|
|
1728
|
-
const server = new McpServer(identity, {
|
|
1729
|
-
capabilities,
|
|
1730
|
-
instructions: SERVER_INSTRUCTIONS
|
|
1731
|
-
});
|
|
1732
|
-
registerTools(server, deps);
|
|
1733
|
-
return server;
|
|
1734
|
-
}
|
|
1735
1758
|
|
|
1736
1759
|
// dist/bin.js
|
|
1737
1760
|
async function main() {
|
|
1738
|
-
const
|
|
1739
|
-
|
|
1740
|
-
`);
|
|
1741
|
-
const server = createServer(composed);
|
|
1761
|
+
const env = process.env;
|
|
1762
|
+
const explicitRoot = (env.PROMETHEUS_WORKSPACE_ROOT ?? "").trim();
|
|
1742
1763
|
const transport = new StdioServerTransport();
|
|
1764
|
+
const server = new McpServer2(SERVER_IDENTITY, {
|
|
1765
|
+
capabilities: { tools: {} },
|
|
1766
|
+
instructions: SERVER_INSTRUCTIONS
|
|
1767
|
+
});
|
|
1768
|
+
let composed = null;
|
|
1743
1769
|
const shutdown = async (signal) => {
|
|
1744
1770
|
process.stderr.write(`prometheus-memory-mcp: received ${signal}, shutting down
|
|
1745
1771
|
`);
|
|
1746
1772
|
try {
|
|
1747
1773
|
await server.close();
|
|
1748
1774
|
} finally {
|
|
1749
|
-
|
|
1775
|
+
if (composed !== null)
|
|
1776
|
+
await composed.close();
|
|
1750
1777
|
process.exit(0);
|
|
1751
1778
|
}
|
|
1752
1779
|
};
|
|
1753
1780
|
process.once("SIGINT", shutdown);
|
|
1754
1781
|
process.once("SIGTERM", shutdown);
|
|
1782
|
+
const boot = (override, via) => {
|
|
1783
|
+
composed = composeFromEnv({
|
|
1784
|
+
env,
|
|
1785
|
+
...override !== void 0 && override !== "" ? { workspaceRootOverride: override } : {}
|
|
1786
|
+
});
|
|
1787
|
+
process.stderr.write(`prometheus-memory-mcp: workspace=${composed.workspaceRoot} (via ${via}) project=${composed.projectName} (${composed.projectId}) db=${composed.dbPath} embed=${composed.embedderId}${composed.embeddingsEnabled ? "" : " (keyword-only)"}
|
|
1788
|
+
`);
|
|
1789
|
+
registerTools(server, composed);
|
|
1790
|
+
};
|
|
1791
|
+
if (explicitRoot !== "") {
|
|
1792
|
+
boot(void 0, "PROMETHEUS_WORKSPACE_ROOT");
|
|
1793
|
+
await server.connect(transport);
|
|
1794
|
+
return;
|
|
1795
|
+
}
|
|
1796
|
+
let booted = false;
|
|
1797
|
+
const resolveAndBoot = async () => {
|
|
1798
|
+
if (booted)
|
|
1799
|
+
return;
|
|
1800
|
+
booted = true;
|
|
1801
|
+
try {
|
|
1802
|
+
const fromRoots = await rootFromClient(server.server);
|
|
1803
|
+
boot(fromRoots ?? process.cwd(), fromRoots !== null ? "MCP roots" : "cwd fallback (client advertised no roots)");
|
|
1804
|
+
} catch (err) {
|
|
1805
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
1806
|
+
process.stderr.write(`prometheus-memory-mcp: fatal during boot: ${message}
|
|
1807
|
+
`);
|
|
1808
|
+
process.exit(1);
|
|
1809
|
+
}
|
|
1810
|
+
};
|
|
1811
|
+
server.server.oninitialized = () => {
|
|
1812
|
+
void resolveAndBoot();
|
|
1813
|
+
};
|
|
1755
1814
|
await server.connect(transport);
|
|
1815
|
+
const t = setTimeout(() => void resolveAndBoot(), 5e3);
|
|
1816
|
+
t.unref?.();
|
|
1756
1817
|
}
|
|
1757
1818
|
main().catch((err) => {
|
|
1758
1819
|
const message = err instanceof Error ? err.message : String(err);
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prom.codes/memory-mcp",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "prom.codes Memory — persistent, local-first agent memory as an MCP server.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"prometheus-memory-mcp": "dist/bin.js"
|