From 1ae35a7e213ff57349a2bf32d21ab3f0e7bed8eb Mon Sep 17 00:00:00 2001 From: saravanakumardb1 Date: Fri, 10 Apr 2026 01:41:28 -0700 Subject: [PATCH] fix(palace): wire palace MCP tools into register-note-tools registry --- backend/src/mcp/register-note-tools.test.ts | 25 +++++++++++++++++---- backend/src/mcp/register-note-tools.ts | 5 +++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/backend/src/mcp/register-note-tools.test.ts b/backend/src/mcp/register-note-tools.test.ts index ab2acd2..fd32bbd 100644 --- a/backend/src/mcp/register-note-tools.test.ts +++ b/backend/src/mcp/register-note-tools.test.ts @@ -29,26 +29,39 @@ const { executableToolsMock, toolNames } = vi.hoisted(() => ({ vi.mock('./note-tools.js', () => ({ NotesExecutableMcpTools: executableToolsMock, })); +vi.mock('./palace-tools.js', () => ({ + PalaceMcpToolDefinitions: [ + { + name: 'notes.mempalace.search', + description: 'Search palace', + requiredRole: 'viewer' as const, + inputSchema: { safeParse: vi.fn() }, + execute: vi.fn(async () => []), + readOnly: true, + }, + ], +})); import { getNotesMcpToolsForRegistration, registerNotesMcpTools } from './register-note-tools.js'; describe('register note tools adapter', () => { - it('returns a registration-friendly tool list', () => { + it('returns a registration-friendly tool list including palace tools', () => { const tools = getNotesMcpToolsForRegistration(); - expect(tools).toHaveLength(2); + expect(tools).toHaveLength(3); expect(tools.map(tool => tool.name)).toEqual([ toolNames.list, toolNames.createDraft, + 'notes.mempalace.search', ]); }); - it('registers every executable tool through the provided callback', () => { + it('registers every executable tool (notes + palace) through the provided callback', () => { const registerTool = vi.fn(); registerNotesMcpTools(registerTool); - expect(registerTool).toHaveBeenCalledTimes(2); + expect(registerTool).toHaveBeenCalledTimes(3); expect(registerTool).toHaveBeenNthCalledWith( 1, expect.objectContaining({ name: toolNames.list, requiredRole: 'viewer' }) @@ -57,5 +70,9 @@ describe('register note tools adapter', () => { 2, expect.objectContaining({ name: toolNames.createDraft, requiredRole: 'admin' }) ); + expect(registerTool).toHaveBeenNthCalledWith( + 3, + expect.objectContaining({ name: 'notes.mempalace.search', requiredRole: 'viewer' }) + ); }); }); diff --git a/backend/src/mcp/register-note-tools.ts b/backend/src/mcp/register-note-tools.ts index e3c96f6..25d0fbe 100644 --- a/backend/src/mcp/register-note-tools.ts +++ b/backend/src/mcp/register-note-tools.ts @@ -1,5 +1,6 @@ import type { ZodTypeAny } from 'zod'; import { NotesExecutableMcpTools } from './note-tools.js'; +import { PalaceMcpToolDefinitions } from './palace-tools.js'; export interface RegisterableMcpTool { name: string; @@ -12,7 +13,7 @@ export interface RegisterableMcpTool { export type RegisterToolFn = (tool: RegisterableMcpTool) => void; export function registerNotesMcpTools(registerTool: RegisterToolFn): void { - for (const tool of NotesExecutableMcpTools) { + for (const tool of [...NotesExecutableMcpTools, ...PalaceMcpToolDefinitions]) { registerTool({ name: tool.name, description: tool.description, @@ -24,7 +25,7 @@ export function registerNotesMcpTools(registerTool: RegisterToolFn): void { } export function getNotesMcpToolsForRegistration(): RegisterableMcpTool[] { - return NotesExecutableMcpTools.map(tool => ({ + return [...NotesExecutableMcpTools, ...PalaceMcpToolDefinitions].map(tool => ({ name: tool.name, description: tool.description, requiredRole: tool.requiredRole,