diff --git a/packages/mcp-server/src/driver/webview-interactions.ts b/packages/mcp-server/src/driver/webview-interactions.ts index 1021927..060fa85 100644 --- a/packages/mcp-server/src/driver/webview-interactions.ts +++ b/packages/mcp-server/src/driver/webview-interactions.ts @@ -97,7 +97,7 @@ export const WaitForSchema = WindowTargetSchema.extend({ export const GetStylesSchema = WindowTargetSchema.extend({ selector: z.string().describe('Element selector: CSS selector (default), XPath expression, text content, or ref ID'), strategy: selectorStrategyField, - properties: z.array(z.string()).optional().describe('Specific CSS properties to retrieve. If omitted, returns all computed styles'), + cssProperties: z.array(z.string()).optional().describe('Specific CSS properties to retrieve. If omitted, returns all computed styles'), multiple: z.boolean().optional().default(false) .describe('Whether to get styles for all matching elements (true) or just the first (false)'), }); @@ -338,19 +338,19 @@ export async function waitFor(options: WaitForOptions): Promise { export interface GetStylesOptions { selector: string; strategy?: string; - properties?: string[]; + cssProperties?: string[]; multiple?: boolean; windowId?: string; appIdentifier?: string | number; } export async function getStyles(options: GetStylesOptions): Promise { - const { selector, strategy, properties, multiple = false, windowId, appIdentifier } = options; + const { selector, strategy, cssProperties, multiple = false, windowId, appIdentifier } = options; const script = buildScript(SCRIPTS.getStyles, { selector, strategy: strategy ?? 'css', - properties: properties || [], + properties: cssProperties || [], multiple, }); diff --git a/packages/mcp-server/src/server.ts b/packages/mcp-server/src/server.ts index 2b74dee..9d49002 100644 --- a/packages/mcp-server/src/server.ts +++ b/packages/mcp-server/src/server.ts @@ -8,6 +8,37 @@ import { } from '@modelcontextprotocol/sdk/types.js'; import { zodToJsonSchema } from 'zod-to-json-schema'; +function fixSchema(obj: Record): Record { + const result: Record = {}; + + for (const [ k, v ] of Object.entries(obj)) { + if (k === '$schema') { + continue; + } + // Bedrock rejects numeric exclusiveMinimum/Maximum (draft 2019-09 syntax) + if ((k === 'exclusiveMinimum' || k === 'exclusiveMaximum') && typeof v === 'number') { + continue; + } + if (k === 'type' && Array.isArray(v)) { + result.anyOf = (v as string[]).map((t) => { return { type: t }; }); + } else if (v !== null && typeof v === 'object' && !Array.isArray(v)) { + result[k] = fixSchema(v as Record); + } else if (Array.isArray(v)) { + result[k] = v.map((i) => { return (i !== null && typeof i === 'object' ? fixSchema(i as Record) : i); }); + } else { + result[k] = v; + } + } + return result; +} + +function toInputSchema(schema: Parameters[0]): Record { + const result = fixSchema(zodToJsonSchema(schema) as Record); + + result.$schema = 'https://json-schema.org/draft/2020-12/schema'; + return result; +} + import { TOOLS, TOOL_MAP, ToolResult, ToolContent } from './tools-registry.js'; import { PROMPTS, PROMPT_MAP } from './prompts-registry.js'; import { createMcpLogger } from './logger.js'; @@ -32,7 +63,7 @@ export function getCliToolDefinitions(): CliToolDefinition[] { return { name: tool.name, description: tool.description, - inputSchema: zodToJsonSchema(tool.schema) as Record, + inputSchema: toInputSchema(tool.schema), }; }); } @@ -91,7 +122,7 @@ export function createMcpServer(info: McpServerInfo): Server { return { name: tool.name, description: tool.description, - inputSchema: zodToJsonSchema(tool.schema) as Record, + inputSchema: toInputSchema(tool.schema), annotations: tool.annotations, }; }), diff --git a/packages/mcp-server/src/tools-registry.ts b/packages/mcp-server/src/tools-registry.ts index 54f75c6..dfe2cde 100644 --- a/packages/mcp-server/src/tools-registry.ts +++ b/packages/mcp-server/src/tools-registry.ts @@ -375,7 +375,7 @@ export const TOOLS: ToolDefinition[] = [ return await getStyles({ selector: parsed.selector, strategy: parsed.strategy, - properties: parsed.properties, + cssProperties: parsed.cssProperties, multiple: parsed.multiple, windowId: parsed.windowId, appIdentifier: parsed.appIdentifier,