diff --git a/apps/mcp/src/server/tools/annotations.ts b/apps/mcp/src/server/tools/annotations.ts index fd2a81e3..fe77f2e1 100644 --- a/apps/mcp/src/server/tools/annotations.ts +++ b/apps/mcp/src/server/tools/annotations.ts @@ -12,3 +12,11 @@ export const MEMORY_TOOL_ANNOTATIONS = { idempotentHint: false, openWorldHint: false, } as const + +/** Non-destructive account/session mutations, e.g. switching the active space. */ +export const SETTINGS_TOOL_ANNOTATIONS = { + readOnlyHint: false, + destructiveHint: false, + idempotentHint: true, + openWorldHint: false, +} as const diff --git a/apps/mcp/src/server/tools/guided-save.ts b/apps/mcp/src/server/tools/guided-save.ts index 97fc1dc9..8b17b226 100644 --- a/apps/mcp/src/server/tools/guided-save.ts +++ b/apps/mcp/src/server/tools/guided-save.ts @@ -2,6 +2,7 @@ import { z } from "zod" import type { ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" import { effectiveContainerTagAccess } from "../auth/rbac" +import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -14,6 +15,7 @@ export function register(deps: ToolDeps) { prefill: z.string().optional().describe("Optional content to prefill"), }), _meta: appToolMeta(), + annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async (args) => { try { diff --git a/apps/mcp/src/server/tools/select-space.ts b/apps/mcp/src/server/tools/select-space.ts index 3f74cb62..827f8808 100644 --- a/apps/mcp/src/server/tools/select-space.ts +++ b/apps/mcp/src/server/tools/select-space.ts @@ -2,6 +2,7 @@ import { z } from "zod" import type { ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" import { effectiveContainerTagAccess } from "../auth/rbac" +import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -13,6 +14,7 @@ export function register(deps: ToolDeps) { "Choose the active Supermemory space. Shows available spaces as interactive cards.", inputSchema: z.object({}), _meta: appToolMeta(), + annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async () => { try { diff --git a/apps/mcp/src/server/tools/set-active-tag.ts b/apps/mcp/src/server/tools/set-active-tag.ts index 3d93d57e..7797b460 100644 --- a/apps/mcp/src/server/tools/set-active-tag.ts +++ b/apps/mcp/src/server/tools/set-active-tag.ts @@ -2,6 +2,7 @@ import { z } from "zod" import type { ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" import { containerTagSchema } from "../container-tag" +import { SETTINGS_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -14,6 +15,7 @@ export function register(deps: ToolDeps) { viewId: z.string().uuid().optional(), }), _meta: appToolMeta(["app"]), + annotations: SETTINGS_TOOL_ANNOTATIONS, }, async (args) => { const { containerTag } = args diff --git a/apps/mcp/src/server/tools/upload-file.ts b/apps/mcp/src/server/tools/upload-file.ts index 4a6c2f15..6b905cd3 100644 --- a/apps/mcp/src/server/tools/upload-file.ts +++ b/apps/mcp/src/server/tools/upload-file.ts @@ -2,6 +2,7 @@ import { z } from "zod" import type { ViewMessage } from "../../shared/types" import { appResultMeta, appToolMeta } from "../app-metadata" import { effectiveContainerTagAccess } from "../auth/rbac" +import { READ_ONLY_TOOL_ANNOTATIONS } from "./annotations" import type { ToolDeps } from "./types" export function register(deps: ToolDeps) { @@ -12,6 +13,7 @@ export function register(deps: ToolDeps) { description: "Upload a file (PDF, text, image, video) to memory.", inputSchema: z.object({}), _meta: appToolMeta(), + annotations: READ_ONLY_TOOL_ANNOTATIONS, }, async () => { try {