From a954a818c0679e3469e18c105362a2e49502373a Mon Sep 17 00:00:00 2001 From: Mahesh Sanikommu Date: Wed, 14 Oct 2026 13:58:57 -0700 Subject: [PATCH] fix(mcp): share the v5 metadata schema between add_memory and save_memory --- apps/mcp/src/server/tools/add-memory.ts | 18 ++++++++++-------- apps/mcp/src/server/tools/save-memory.ts | 6 ++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apps/mcp/src/server/tools/add-memory.ts b/apps/mcp/src/server/tools/add-memory.ts index 6cad7416..ff3f7f00 100644 --- a/apps/mcp/src/server/tools/add-memory.ts +++ b/apps/mcp/src/server/tools/add-memory.ts @@ -10,6 +10,15 @@ import { forgetMemory } from "./forget-memory" import { addMemoryOutputSchema, type AddMemoryOutput } from "./output-schemas" import { textContent, type ToolDeps } from "./types" +// v5 metadata values are flat: string, number, boolean or string list. +export const memoryMetadataSchema = z + .record( + z.string(), + z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]), + ) + .optional() + .describe("Optional metadata to attach to the saved memory") + export function register(deps: ToolDeps) { const inputSchema = z.object({ content: z @@ -25,14 +34,7 @@ export function register(deps: ToolDeps) { ), namespace: optionalNamespaceSchema, ...legacyNamespaceInput, - // v5 metadata values are flat: string, number, boolean or string list. - metadata: z - .record( - z.string(), - z.union([z.string(), z.number(), z.boolean(), z.array(z.string())]), - ) - .optional() - .describe("Optional metadata to attach to the saved memory"), + metadata: memoryMetadataSchema, }) deps.server.registerTool( diff --git a/apps/mcp/src/server/tools/save-memory.ts b/apps/mcp/src/server/tools/save-memory.ts index 036b0487..3ffc3d19 100644 --- a/apps/mcp/src/server/tools/save-memory.ts +++ b/apps/mcp/src/server/tools/save-memory.ts @@ -3,6 +3,7 @@ import { saveSuccessViewSchema, type ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" import { namespaceSchema } from "../namespace" import { legacyNamespaceInput, namespaceArg, withLegacyView } from "./compat" +import { memoryMetadataSchema } from "./add-memory" import { ADDITIVE_MEMORY_TOOL_ANNOTATIONS } from "./annotations" import { textContent, type ToolDeps } from "./types" @@ -13,10 +14,7 @@ export function register(deps: ToolDeps) { description: "Save content to memory", inputSchema: z.object({ content: z.string().min(1), - metadata: z - .record(z.string(), z.unknown()) - .optional() - .describe("Optional key-value metadata to attach to the memory"), + metadata: memoryMetadataSchema, namespace: namespaceSchema.optional(), ...legacyNamespaceInput, viewId: z.string().uuid().optional(),