@membank/mcp 0.6.0 → 0.7.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.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
- import { DatabaseManager, EmbeddingService, MEMORY_TYPE_VALUES, MemoryRepository, QueryEngine, listMemoryTypes, resolveScope } from "@membank/core";
2
+ import { DatabaseManager, EmbeddingService, MEMORY_TYPE_VALUES, MemoryRepository, ProjectRepository, QueryEngine, listMemoryTypes, resolveProject } from "@membank/core";
3
3
  import { Server } from "@modelcontextprotocol/sdk/server";
4
4
  import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError } from "@modelcontextprotocol/sdk/types.js";
5
5
  //#region src/server.ts
@@ -8,12 +8,14 @@ const SERVER_VERSION = "0.1.0";
8
8
  function initCore(options = {}) {
9
9
  const db = options.useInMemoryDb ? DatabaseManager.openInMemory() : DatabaseManager.open(options.dbPath);
10
10
  const embedding = new EmbeddingService();
11
- const repo = new MemoryRepository(db, embedding);
11
+ const projects = new ProjectRepository(db);
12
+ const repo = new MemoryRepository(db, embedding, projects);
12
13
  return {
13
14
  db,
14
15
  embedding,
15
16
  repo,
16
- query: new QueryEngine(db, embedding, repo)
17
+ query: new QueryEngine(db, embedding, repo),
18
+ projects
17
19
  };
18
20
  }
19
21
  function createServer(core) {
@@ -168,13 +170,21 @@ function createServer(core) {
168
170
  if (typeof content !== "string" || content.trim() === "") throw new McpError(ErrorCode.InvalidParams, "content is required and must be a non-empty string");
169
171
  if (typeof type !== "string" || !MEMORY_TYPE_VALUES.includes(type)) throw new McpError(ErrorCode.InvalidParams, "type is required and must be one of: correction, preference, decision, learning, fact");
170
172
  const tags = Array.isArray(args?.tags) ? args.tags : void 0;
171
- const scope = typeof args?.scope === "string" ? args.scope : await resolveScope();
173
+ let projectHash;
174
+ if (typeof args?.scope === "string") {
175
+ projectHash = args.scope;
176
+ core.projects.upsertByHash(args.scope, `project-${args.scope.slice(0, 8)}`);
177
+ } else {
178
+ const project = await resolveProject();
179
+ core.projects.upsertByHash(project.hash, project.name);
180
+ projectHash = project.hash;
181
+ }
172
182
  try {
173
183
  const memory = await core.repo.save({
174
184
  content,
175
185
  type,
176
186
  tags,
177
- scope
187
+ projectHash
178
188
  });
179
189
  return { content: [{
180
190
  type: "text",
@@ -250,20 +260,20 @@ function createServer(core) {
250
260
  const queryText = args?.query;
251
261
  if (typeof queryText !== "string" || queryText.trim() === "") throw new McpError(ErrorCode.InvalidParams, "query is required and must be a non-empty string");
252
262
  const type = args?.type;
253
- const scope = args?.scope;
263
+ const projectHash = args?.scope;
254
264
  const limit = typeof args?.limit === "number" ? args.limit : 10;
255
265
  try {
256
266
  const serialised = (await core.query.query({
257
267
  query: queryText,
258
268
  type,
259
- scope,
269
+ projectHash,
260
270
  limit
261
271
  })).map((r) => ({
262
272
  id: r.id,
263
273
  content: r.content,
264
274
  type: r.type,
265
275
  tags: r.tags,
266
- scope: r.scope,
276
+ projects: r.projects,
267
277
  pinned: r.pinned,
268
278
  score: r.score
269
279
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/server.ts","../src/index.ts"],"sourcesContent":["import type { MemoryType } from \"@membank/core\";\nimport {\n DatabaseManager,\n EmbeddingService,\n listMemoryTypes,\n MEMORY_TYPE_VALUES,\n MemoryRepository,\n QueryEngine,\n resolveScope,\n} from \"@membank/core\";\nimport { Server } from \"@modelcontextprotocol/sdk/server\";\nimport {\n CallToolRequestSchema,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nconst SERVER_NAME = \"membank\";\nconst SERVER_VERSION = \"0.1.0\";\n\nexport interface CoreServices {\n db: DatabaseManager;\n embedding: EmbeddingService;\n repo: MemoryRepository;\n query: QueryEngine;\n}\n\nexport interface ServerOptions {\n dbPath?: string;\n useInMemoryDb?: boolean;\n}\n\nexport function initCore(options: ServerOptions = {}): CoreServices {\n const db = options.useInMemoryDb\n ? DatabaseManager.openInMemory()\n : DatabaseManager.open(options.dbPath);\n const embedding = new EmbeddingService();\n const repo = new MemoryRepository(db, embedding);\n const query = new QueryEngine(db, embedding, repo);\n return { db, embedding, repo, query };\n}\n\nexport function createServer(core: CoreServices): Server {\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, () => ({\n tools: [\n {\n name: \"list_memory_types\",\n description: \"Returns the ordered list of memory type values supported by membank.\",\n inputSchema: { type: \"object\", properties: {}, required: [] },\n },\n {\n name: \"save_memory\",\n description:\n \"Save a new memory. Handles deduplication automatically — near-identical memories (cosine similarity >0.92, same type and scope) overwrite the existing record.\",\n inputSchema: {\n type: \"object\",\n properties: {\n content: { type: \"string\", description: \"Memory content to save\" },\n type: {\n type: \"string\",\n enum: [...MEMORY_TYPE_VALUES],\n description: \"Memory type\",\n },\n tags: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional tags\",\n },\n scope: { type: \"string\", description: \"Scope (defaults to resolved project scope)\" },\n },\n required: [\"content\", \"type\"],\n },\n },\n {\n name: \"update_memory\",\n description: \"Update the content and/or tags of an existing memory by id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to update\" },\n content: { type: \"string\", description: \"New content for the memory\" },\n tags: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Replacement tags (optional)\",\n },\n },\n required: [\"id\", \"content\"],\n },\n },\n {\n name: \"delete_memory\",\n description: \"Delete a memory by id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to delete\" },\n },\n required: [\"id\"],\n },\n },\n {\n name: \"query_memory\",\n description:\n \"Search memories by semantic similarity. Returns results ranked by confidence score.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search text\" },\n type: {\n type: \"string\",\n enum: [...MEMORY_TYPE_VALUES],\n description: \"Filter by memory type\",\n },\n scope: { type: \"string\", description: \"Filter by scope\" },\n limit: { type: \"number\", description: \"Maximum results to return (default 10)\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"pin_memory\",\n description:\n \"Pin a memory by id. Pinned memories are always injected into the session context.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to pin\" },\n },\n required: [\"id\"],\n },\n },\n {\n name: \"unpin_memory\",\n description: \"Unpin a memory by id. Removes the memory from guaranteed session injection.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to unpin\" },\n },\n required: [\"id\"],\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"list_memory_types\") {\n try {\n return {\n content: [{ type: \"text\", text: JSON.stringify(listMemoryTypes()) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"save_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const content = args?.content;\n const type = args?.type;\n\n if (typeof content !== \"string\" || content.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"content is required and must be a non-empty string\"\n );\n }\n\n if (typeof type !== \"string\" || !(MEMORY_TYPE_VALUES as readonly string[]).includes(type)) {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"type is required and must be one of: correction, preference, decision, learning, fact\"\n );\n }\n\n const tags = Array.isArray(args?.tags) ? (args.tags as string[]) : undefined;\n const scope = typeof args?.scope === \"string\" ? args.scope : await resolveScope();\n\n try {\n const memory = await core.repo.save({\n content,\n type: type as MemoryType,\n tags,\n scope,\n });\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(memory) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"update_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const id = args?.id;\n const content = args?.content;\n\n if (typeof id !== \"string\" || id.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"id is required and must be a non-empty string\"\n );\n }\n\n if (typeof content !== \"string\" || content.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"content is required and must be a non-empty string\"\n );\n }\n\n const tags = Array.isArray(args?.tags) ? (args.tags as string[]) : undefined;\n\n try {\n const memory = await core.repo.update(id, { content, tags });\n return { content: [{ type: \"text\", text: JSON.stringify(memory) }] };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"delete_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const id = args?.id;\n\n if (typeof id !== \"string\" || id.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"id is required and must be a non-empty string\"\n );\n }\n\n try {\n const exists =\n core.db.db\n .prepare<[string], { id: string }>(`SELECT id FROM memories WHERE id = ?`)\n .get(id) !== undefined;\n\n if (!exists) {\n return {\n content: [{ type: \"text\", text: `Memory not found: ${id}` }],\n isError: true,\n };\n }\n\n await core.repo.delete(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ success: true, id }) }] };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"query_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const queryText = args?.query;\n\n if (typeof queryText !== \"string\" || queryText.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"query is required and must be a non-empty string\"\n );\n }\n\n const type = args?.type as MemoryType | undefined;\n const scope = args?.scope as string | undefined;\n const limit = typeof args?.limit === \"number\" ? args.limit : 10;\n\n try {\n const results = await core.query.query({ query: queryText, type, scope, limit });\n\n const serialised = results.map((r) => ({\n id: r.id,\n content: r.content,\n type: r.type,\n tags: r.tags,\n scope: r.scope,\n pinned: r.pinned,\n score: r.score,\n }));\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(serialised) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"pin_memory\" || request.params.name === \"unpin_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const id = args?.id;\n\n if (typeof id !== \"string\" || id.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"id is required and must be a non-empty string\"\n );\n }\n\n const pinned = request.params.name === \"pin_memory\";\n\n try {\n const memory = core.repo.setPin(id, pinned);\n return { content: [{ type: \"text\", text: JSON.stringify(memory) }] };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type { CoreServices } from \"./server.js\";\nimport { createServer, initCore } from \"./server.js\";\n\nexport async function startServer(): Promise<void> {\n let core: CoreServices;\n try {\n core = initCore();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`membank: failed to initialise core: ${message}\\n`);\n process.exit(1);\n }\n\n const server = createServer(core);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/server.ts","../src/index.ts"],"sourcesContent":["import type { MemoryType } from \"@membank/core\";\nimport {\n DatabaseManager,\n EmbeddingService,\n listMemoryTypes,\n MEMORY_TYPE_VALUES,\n MemoryRepository,\n ProjectRepository,\n QueryEngine,\n resolveProject,\n} from \"@membank/core\";\nimport { Server } from \"@modelcontextprotocol/sdk/server\";\nimport {\n CallToolRequestSchema,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from \"@modelcontextprotocol/sdk/types.js\";\n\nconst SERVER_NAME = \"membank\";\nconst SERVER_VERSION = \"0.1.0\";\n\nexport interface CoreServices {\n db: DatabaseManager;\n embedding: EmbeddingService;\n repo: MemoryRepository;\n query: QueryEngine;\n projects: ProjectRepository;\n}\n\nexport interface ServerOptions {\n dbPath?: string;\n useInMemoryDb?: boolean;\n}\n\nexport function initCore(options: ServerOptions = {}): CoreServices {\n const db = options.useInMemoryDb\n ? DatabaseManager.openInMemory()\n : DatabaseManager.open(options.dbPath);\n const embedding = new EmbeddingService();\n const projects = new ProjectRepository(db);\n const repo = new MemoryRepository(db, embedding, projects);\n const query = new QueryEngine(db, embedding, repo);\n return { db, embedding, repo, query, projects };\n}\n\nexport function createServer(core: CoreServices): Server {\n const server = new Server(\n { name: SERVER_NAME, version: SERVER_VERSION },\n { capabilities: { tools: {} } }\n );\n\n server.setRequestHandler(ListToolsRequestSchema, () => ({\n tools: [\n {\n name: \"list_memory_types\",\n description: \"Returns the ordered list of memory type values supported by membank.\",\n inputSchema: { type: \"object\", properties: {}, required: [] },\n },\n {\n name: \"save_memory\",\n description:\n \"Save a new memory. Handles deduplication automatically — near-identical memories (cosine similarity >0.92, same type and scope) overwrite the existing record.\",\n inputSchema: {\n type: \"object\",\n properties: {\n content: { type: \"string\", description: \"Memory content to save\" },\n type: {\n type: \"string\",\n enum: [...MEMORY_TYPE_VALUES],\n description: \"Memory type\",\n },\n tags: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Optional tags\",\n },\n scope: { type: \"string\", description: \"Scope (defaults to resolved project scope)\" },\n },\n required: [\"content\", \"type\"],\n },\n },\n {\n name: \"update_memory\",\n description: \"Update the content and/or tags of an existing memory by id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to update\" },\n content: { type: \"string\", description: \"New content for the memory\" },\n tags: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Replacement tags (optional)\",\n },\n },\n required: [\"id\", \"content\"],\n },\n },\n {\n name: \"delete_memory\",\n description: \"Delete a memory by id.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to delete\" },\n },\n required: [\"id\"],\n },\n },\n {\n name: \"query_memory\",\n description:\n \"Search memories by semantic similarity. Returns results ranked by confidence score.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search text\" },\n type: {\n type: \"string\",\n enum: [...MEMORY_TYPE_VALUES],\n description: \"Filter by memory type\",\n },\n scope: { type: \"string\", description: \"Filter by scope\" },\n limit: { type: \"number\", description: \"Maximum results to return (default 10)\" },\n },\n required: [\"query\"],\n },\n },\n {\n name: \"pin_memory\",\n description:\n \"Pin a memory by id. Pinned memories are always injected into the session context.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to pin\" },\n },\n required: [\"id\"],\n },\n },\n {\n name: \"unpin_memory\",\n description: \"Unpin a memory by id. Removes the memory from guaranteed session injection.\",\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Memory id to unpin\" },\n },\n required: [\"id\"],\n },\n },\n ],\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n if (request.params.name === \"list_memory_types\") {\n try {\n return {\n content: [{ type: \"text\", text: JSON.stringify(listMemoryTypes()) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"save_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const content = args?.content;\n const type = args?.type;\n\n if (typeof content !== \"string\" || content.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"content is required and must be a non-empty string\"\n );\n }\n\n if (typeof type !== \"string\" || !(MEMORY_TYPE_VALUES as readonly string[]).includes(type)) {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"type is required and must be one of: correction, preference, decision, learning, fact\"\n );\n }\n\n const tags = Array.isArray(args?.tags) ? (args.tags as string[]) : undefined;\n\n let projectHash: string | undefined;\n if (typeof args?.scope === \"string\") {\n projectHash = args.scope;\n core.projects.upsertByHash(args.scope, `project-${args.scope.slice(0, 8)}`);\n } else {\n const project = await resolveProject();\n core.projects.upsertByHash(project.hash, project.name);\n projectHash = project.hash;\n }\n\n try {\n const memory = await core.repo.save({\n content,\n type: type as MemoryType,\n tags,\n projectHash,\n });\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(memory) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"update_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const id = args?.id;\n const content = args?.content;\n\n if (typeof id !== \"string\" || id.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"id is required and must be a non-empty string\"\n );\n }\n\n if (typeof content !== \"string\" || content.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"content is required and must be a non-empty string\"\n );\n }\n\n const tags = Array.isArray(args?.tags) ? (args.tags as string[]) : undefined;\n\n try {\n const memory = await core.repo.update(id, { content, tags });\n return { content: [{ type: \"text\", text: JSON.stringify(memory) }] };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"delete_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const id = args?.id;\n\n if (typeof id !== \"string\" || id.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"id is required and must be a non-empty string\"\n );\n }\n\n try {\n const exists =\n core.db.db\n .prepare<[string], { id: string }>(`SELECT id FROM memories WHERE id = ?`)\n .get(id) !== undefined;\n\n if (!exists) {\n return {\n content: [{ type: \"text\", text: `Memory not found: ${id}` }],\n isError: true,\n };\n }\n\n await core.repo.delete(id);\n return { content: [{ type: \"text\", text: JSON.stringify({ success: true, id }) }] };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"query_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const queryText = args?.query;\n\n if (typeof queryText !== \"string\" || queryText.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"query is required and must be a non-empty string\"\n );\n }\n\n const type = args?.type as MemoryType | undefined;\n const projectHash = args?.scope as string | undefined;\n const limit = typeof args?.limit === \"number\" ? args.limit : 10;\n\n try {\n const results = await core.query.query({ query: queryText, type, projectHash, limit });\n\n const serialised = results.map((r) => ({\n id: r.id,\n content: r.content,\n type: r.type,\n tags: r.tags,\n projects: r.projects,\n pinned: r.pinned,\n score: r.score,\n }));\n\n return {\n content: [{ type: \"text\", text: JSON.stringify(serialised) }],\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n if (request.params.name === \"pin_memory\" || request.params.name === \"unpin_memory\") {\n const args = request.params.arguments as Record<string, unknown> | undefined;\n const id = args?.id;\n\n if (typeof id !== \"string\" || id.trim() === \"\") {\n throw new McpError(\n ErrorCode.InvalidParams,\n \"id is required and must be a non-empty string\"\n );\n }\n\n const pinned = request.params.name === \"pin_memory\";\n\n try {\n const memory = core.repo.setPin(id, pinned);\n return { content: [{ type: \"text\", text: JSON.stringify(memory) }] };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return { content: [{ type: \"text\", text: message }], isError: true };\n }\n }\n\n throw new Error(`Unknown tool: ${request.params.name}`);\n });\n\n return server;\n}\n","import { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport type { CoreServices } from \"./server.js\";\nimport { createServer, initCore } from \"./server.js\";\n\nexport async function startServer(): Promise<void> {\n let core: CoreServices;\n try {\n core = initCore();\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n process.stderr.write(`membank: failed to initialise core: ${message}\\n`);\n process.exit(1);\n }\n\n const server = createServer(core);\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@membank/mcp",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "repository": {
6
6
  "type": "git",
@@ -18,7 +18,7 @@
18
18
  ],
19
19
  "dependencies": {
20
20
  "@modelcontextprotocol/sdk": "^1.29.0",
21
- "@membank/core": "0.5.1"
21
+ "@membank/core": "0.6.0"
22
22
  },
23
23
  "devDependencies": {
24
24
  "@types/node": "^25.6.0",