diff --git a/src/core/plugin-types.ts b/src/core/plugin-types.ts index 590691e2..0544b6f5 100644 --- a/src/core/plugin-types.ts +++ b/src/core/plugin-types.ts @@ -1,10 +1,12 @@ import { z } from 'zod'; +import { ToolAnnotations } from '@camsoft/mcp-sdk/types.js'; import { ToolResponse } from '../types/common.ts'; export interface PluginMeta { readonly name: string; // Verb used by MCP readonly schema: Record; // Zod validation schema (object schema) readonly description?: string; // One-liner shown in help + readonly annotations?: ToolAnnotations; // MCP tool annotations for LLM behavior hints handler(params: Record): Promise; } diff --git a/src/mcp/tools/device/build_device.ts b/src/mcp/tools/device/build_device.ts index cbb799db..8a6c3973 100644 --- a/src/mcp/tools/device/build_device.ts +++ b/src/mcp/tools/device/build_device.ts @@ -78,6 +78,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Build Device', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: buildDeviceSchema as unknown as z.ZodType, logicFunction: buildDeviceLogic, diff --git a/src/mcp/tools/device/get_device_app_path.ts b/src/mcp/tools/device/get_device_app_path.ts index 6e1f9f21..edf31954 100644 --- a/src/mcp/tools/device/get_device_app_path.ts +++ b/src/mcp/tools/device/get_device_app_path.ts @@ -161,6 +161,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Get Device App Path', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: getDeviceAppPathSchema as unknown as z.ZodType, logicFunction: get_device_app_pathLogic, diff --git a/src/mcp/tools/device/install_app_device.ts b/src/mcp/tools/device/install_app_device.ts index 96f8d0fe..14e479ef 100644 --- a/src/mcp/tools/device/install_app_device.ts +++ b/src/mcp/tools/device/install_app_device.ts @@ -92,6 +92,10 @@ export default { sessionAware: publicSchemaObject, legacy: installAppDeviceSchema, }), + annotations: { + title: 'Install App Device', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: installAppDeviceSchema as unknown as z.ZodType, logicFunction: install_app_deviceLogic, diff --git a/src/mcp/tools/device/launch_app_device.ts b/src/mcp/tools/device/launch_app_device.ts index cea6219e..f189e12f 100644 --- a/src/mcp/tools/device/launch_app_device.ts +++ b/src/mcp/tools/device/launch_app_device.ts @@ -151,6 +151,10 @@ export default { sessionAware: publicSchemaObject, legacy: launchAppDeviceSchema, }), + annotations: { + title: 'Launch App Device', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: launchAppDeviceSchema as unknown as z.ZodType, logicFunction: launch_app_deviceLogic, diff --git a/src/mcp/tools/device/list_devices.ts b/src/mcp/tools/device/list_devices.ts index 47227266..52cfbcdd 100644 --- a/src/mcp/tools/device/list_devices.ts +++ b/src/mcp/tools/device/list_devices.ts @@ -431,5 +431,9 @@ export default { description: 'Lists connected physical Apple devices (iPhone, iPad, Apple Watch, Apple TV, Apple Vision Pro) with their UUIDs, names, and connection status. Use this to discover physical devices for testing.', schema: listDevicesSchema.shape, // MCP SDK compatibility + annotations: { + title: 'List Devices', + readOnlyHint: true, + }, handler: createTypedTool(listDevicesSchema, list_devicesLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/device/stop_app_device.ts b/src/mcp/tools/device/stop_app_device.ts index bc5f4565..0aa8b9f7 100644 --- a/src/mcp/tools/device/stop_app_device.ts +++ b/src/mcp/tools/device/stop_app_device.ts @@ -94,6 +94,10 @@ export default { sessionAware: publicSchemaObject, legacy: stopAppDeviceSchema, }), + annotations: { + title: 'Stop App Device', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: stopAppDeviceSchema as unknown as z.ZodType, logicFunction: stop_app_deviceLogic, diff --git a/src/mcp/tools/device/test_device.ts b/src/mcp/tools/device/test_device.ts index 15dbb8df..b273f1d9 100644 --- a/src/mcp/tools/device/test_device.ts +++ b/src/mcp/tools/device/test_device.ts @@ -291,6 +291,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Test Device', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: testDeviceSchema as unknown as z.ZodType, logicFunction: (params: TestDeviceParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/discovery/discover_tools.ts b/src/mcp/tools/discovery/discover_tools.ts index c05c1f3b..cf0890f0 100644 --- a/src/mcp/tools/discovery/discover_tools.ts +++ b/src/mcp/tools/discovery/discover_tools.ts @@ -384,6 +384,10 @@ export default { description: 'Analyzes a natural language task description and enables the most relevant development workflow. Prioritizes project/workspace workflows (simulator/device/macOS) and also supports task-based workflows (simulator-management, logging) and Swift packages.', schema: discoverToolsSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Discover Tools', + readOnlyHint: true, + }, handler: createTypedTool( discoverToolsSchema, (params: DiscoverToolsParams, executor) => { diff --git a/src/mcp/tools/doctor/doctor.ts b/src/mcp/tools/doctor/doctor.ts index c0e7799a..c41e1289 100644 --- a/src/mcp/tools/doctor/doctor.ts +++ b/src/mcp/tools/doctor/doctor.ts @@ -273,6 +273,10 @@ export default { description: 'Provides comprehensive information about the MCP server environment, available dependencies, and configuration status.', schema: doctorSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Doctor', + readOnlyHint: true, + }, handler: createTypedTool(doctorSchema, doctorMcpHandler, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/logging/start_device_log_cap.ts b/src/mcp/tools/logging/start_device_log_cap.ts index 8420720d..4ea436c0 100644 --- a/src/mcp/tools/logging/start_device_log_cap.ts +++ b/src/mcp/tools/logging/start_device_log_cap.ts @@ -688,6 +688,10 @@ export default { sessionAware: publicSchemaObject, legacy: startDeviceLogCapSchema, }), + annotations: { + title: 'Start Device Log Capture', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: startDeviceLogCapSchema as unknown as z.ZodType, logicFunction: start_device_log_capLogic, diff --git a/src/mcp/tools/logging/start_sim_log_cap.ts b/src/mcp/tools/logging/start_sim_log_cap.ts index e23ad14d..e4a22c6d 100644 --- a/src/mcp/tools/logging/start_sim_log_cap.ts +++ b/src/mcp/tools/logging/start_sim_log_cap.ts @@ -68,6 +68,10 @@ export default { sessionAware: publicSchemaObject, legacy: startSimLogCapSchema, }), + annotations: { + title: 'Start Simulator Log Capture', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: startSimLogCapSchema as unknown as z.ZodType, logicFunction: start_sim_log_capLogic, diff --git a/src/mcp/tools/logging/stop_device_log_cap.ts b/src/mcp/tools/logging/stop_device_log_cap.ts index cc2b8a9f..ec92d062 100644 --- a/src/mcp/tools/logging/stop_device_log_cap.ts +++ b/src/mcp/tools/logging/stop_device_log_cap.ts @@ -312,6 +312,10 @@ export default { name: 'stop_device_log_cap', description: 'Stops an active Apple device log capture session and returns the captured logs.', schema: stopDeviceLogCapSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Stop Device Log Capture', + destructiveHint: true, + }, handler: createTypedTool( stopDeviceLogCapSchema, (params: StopDeviceLogCapParams) => { diff --git a/src/mcp/tools/logging/stop_sim_log_cap.ts b/src/mcp/tools/logging/stop_sim_log_cap.ts index b90e3e63..ab3fad66 100644 --- a/src/mcp/tools/logging/stop_sim_log_cap.ts +++ b/src/mcp/tools/logging/stop_sim_log_cap.ts @@ -44,5 +44,9 @@ export default { name: 'stop_sim_log_cap', description: 'Stops an active simulator log capture session and returns the captured logs.', schema: stopSimLogCapSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Stop Simulator Log Capture', + destructiveHint: true, + }, handler: createTypedTool(stopSimLogCapSchema, stop_sim_log_capLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/macos/build_macos.ts b/src/mcp/tools/macos/build_macos.ts index 80d41bd7..578dc960 100644 --- a/src/mcp/tools/macos/build_macos.ts +++ b/src/mcp/tools/macos/build_macos.ts @@ -105,6 +105,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Build macOS', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: buildMacOSSchema as unknown as z.ZodType, logicFunction: buildMacOSLogic, diff --git a/src/mcp/tools/macos/build_run_macos.ts b/src/mcp/tools/macos/build_run_macos.ts index 78249bae..27682701 100644 --- a/src/mcp/tools/macos/build_run_macos.ts +++ b/src/mcp/tools/macos/build_run_macos.ts @@ -223,6 +223,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Build Run macOS', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: buildRunMacOSSchema as unknown as z.ZodType, logicFunction: buildRunMacOSLogic, diff --git a/src/mcp/tools/macos/get_mac_app_path.ts b/src/mcp/tools/macos/get_mac_app_path.ts index a14221ec..4e586eac 100644 --- a/src/mcp/tools/macos/get_mac_app_path.ts +++ b/src/mcp/tools/macos/get_mac_app_path.ts @@ -195,6 +195,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Get macOS App Path', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: getMacosAppPathSchema as unknown as z.ZodType, logicFunction: get_mac_app_pathLogic, diff --git a/src/mcp/tools/macos/launch_mac_app.ts b/src/mcp/tools/macos/launch_mac_app.ts index f3174943..4f28f41f 100644 --- a/src/mcp/tools/macos/launch_mac_app.ts +++ b/src/mcp/tools/macos/launch_mac_app.ts @@ -79,5 +79,9 @@ export default { description: "Launches a macOS application. IMPORTANT: You MUST provide the appPath parameter. Example: launch_mac_app({ appPath: '/path/to/your/app.app' }) Note: In some environments, this tool may be prefixed as mcp0_launch_macos_app.", schema: launchMacAppSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Launch macOS App', + destructiveHint: true, + }, handler: createTypedTool(launchMacAppSchema, launch_mac_appLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/macos/stop_mac_app.ts b/src/mcp/tools/macos/stop_mac_app.ts index 2fdfc75f..b6086f5f 100644 --- a/src/mcp/tools/macos/stop_mac_app.ts +++ b/src/mcp/tools/macos/stop_mac_app.ts @@ -82,5 +82,9 @@ export default { name: 'stop_mac_app', description: 'Stops a running macOS application. Can stop by app name or process ID.', schema: stopMacAppSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Stop macOS App', + destructiveHint: true, + }, handler: createTypedTool(stopMacAppSchema, stop_mac_appLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/macos/test_macos.ts b/src/mcp/tools/macos/test_macos.ts index 393aa3ce..e677d964 100644 --- a/src/mcp/tools/macos/test_macos.ts +++ b/src/mcp/tools/macos/test_macos.ts @@ -333,6 +333,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Test macOS', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: testMacosSchema as unknown as z.ZodType, logicFunction: (params, executor) => diff --git a/src/mcp/tools/project-discovery/discover_projs.ts b/src/mcp/tools/project-discovery/discover_projs.ts index 1d5b2115..e54a8b7a 100644 --- a/src/mcp/tools/project-discovery/discover_projs.ts +++ b/src/mcp/tools/project-discovery/discover_projs.ts @@ -274,6 +274,10 @@ export default { description: 'Scans a directory (defaults to workspace root) to find Xcode project (.xcodeproj) and workspace (.xcworkspace) files.', schema: discoverProjsSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Discover Projects', + readOnlyHint: true, + }, handler: createTypedTool( discoverProjsSchema, (params: DiscoverProjsParams) => { diff --git a/src/mcp/tools/project-discovery/get_app_bundle_id.ts b/src/mcp/tools/project-discovery/get_app_bundle_id.ts index 35d22519..bf24c2cd 100644 --- a/src/mcp/tools/project-discovery/get_app_bundle_id.ts +++ b/src/mcp/tools/project-discovery/get_app_bundle_id.ts @@ -128,6 +128,10 @@ export default { description: "Extracts the bundle identifier from an app bundle (.app) for any Apple platform (iOS, iPadOS, watchOS, tvOS, visionOS). IMPORTANT: You MUST provide the appPath parameter. Example: get_app_bundle_id({ appPath: '/path/to/your/app.app' })", schema: getAppBundleIdSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Get App Bundle ID', + readOnlyHint: true, + }, handler: createTypedTool( getAppBundleIdSchema, (params: GetAppBundleIdParams) => diff --git a/src/mcp/tools/project-discovery/get_mac_bundle_id.ts b/src/mcp/tools/project-discovery/get_mac_bundle_id.ts index 92c67742..61234b0d 100644 --- a/src/mcp/tools/project-discovery/get_mac_bundle_id.ts +++ b/src/mcp/tools/project-discovery/get_mac_bundle_id.ts @@ -125,6 +125,10 @@ export default { description: "Extracts the bundle identifier from a macOS app bundle (.app). IMPORTANT: You MUST provide the appPath parameter. Example: get_mac_bundle_id({ appPath: '/path/to/your/app.app' }) Note: In some environments, this tool may be prefixed as mcp0_get_macos_bundle_id.", schema: getMacBundleIdSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Get Mac Bundle ID', + readOnlyHint: true, + }, handler: createTypedTool( getMacBundleIdSchema, (params: GetMacBundleIdParams) => diff --git a/src/mcp/tools/project-discovery/list_schemes.ts b/src/mcp/tools/project-discovery/list_schemes.ts index 7ef25d4f..3ff06090 100644 --- a/src/mcp/tools/project-discovery/list_schemes.ts +++ b/src/mcp/tools/project-discovery/list_schemes.ts @@ -124,6 +124,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'List Schemes', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: listSchemesSchema as unknown as z.ZodType, logicFunction: listSchemesLogic, diff --git a/src/mcp/tools/project-discovery/show_build_settings.ts b/src/mcp/tools/project-discovery/show_build_settings.ts index fd6a25b3..7eae24b4 100644 --- a/src/mcp/tools/project-discovery/show_build_settings.ts +++ b/src/mcp/tools/project-discovery/show_build_settings.ts @@ -118,6 +118,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Show Build Settings', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: showBuildSettingsSchema as unknown as z.ZodType, logicFunction: showBuildSettingsLogic, diff --git a/src/mcp/tools/project-scaffolding/scaffold_ios_project.ts b/src/mcp/tools/project-scaffolding/scaffold_ios_project.ts index 4e7bfb18..ebcf74b4 100644 --- a/src/mcp/tools/project-scaffolding/scaffold_ios_project.ts +++ b/src/mcp/tools/project-scaffolding/scaffold_ios_project.ts @@ -501,6 +501,10 @@ export default { description: 'Scaffold a new iOS project from templates. Creates a modern Xcode project with workspace structure, SPM package for features, and proper iOS configuration.', schema: ScaffoldiOSProjectSchema.shape, + annotations: { + title: 'Scaffold iOS Project', + destructiveHint: true, + }, async handler(args: Record): Promise { const params = ScaffoldiOSProjectSchema.parse(args); return scaffold_ios_projectLogic( diff --git a/src/mcp/tools/project-scaffolding/scaffold_macos_project.ts b/src/mcp/tools/project-scaffolding/scaffold_macos_project.ts index 062364ca..d159c20a 100644 --- a/src/mcp/tools/project-scaffolding/scaffold_macos_project.ts +++ b/src/mcp/tools/project-scaffolding/scaffold_macos_project.ts @@ -407,6 +407,10 @@ export default { description: 'Scaffold a new macOS project from templates. Creates a modern Xcode project with workspace structure, SPM package for features, and proper macOS configuration.', schema: ScaffoldmacOSProjectSchema.shape, + annotations: { + title: 'Scaffold macOS Project', + destructiveHint: true, + }, async handler(args: Record): Promise { // Validate the arguments against the schema before processing const validatedArgs = ScaffoldmacOSProjectSchema.parse(args); diff --git a/src/mcp/tools/session-management/session_clear_defaults.ts b/src/mcp/tools/session-management/session_clear_defaults.ts index 286a86fc..b8760c00 100644 --- a/src/mcp/tools/session-management/session_clear_defaults.ts +++ b/src/mcp/tools/session-management/session_clear_defaults.ts @@ -33,5 +33,9 @@ export default { name: 'session-clear-defaults', description: 'Clear selected or all session defaults.', schema: schemaObj.shape, + annotations: { + title: 'Clear Session Defaults', + destructiveHint: true, + }, handler: createTypedTool(schemaObj, sessionClearDefaultsLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/session-management/session_set_defaults.ts b/src/mcp/tools/session-management/session_set_defaults.ts index 6526a143..d066194f 100644 --- a/src/mcp/tools/session-management/session_set_defaults.ts +++ b/src/mcp/tools/session-management/session_set_defaults.ts @@ -57,5 +57,9 @@ export default { description: 'Set the session defaults needed by many tools. Most tools require one or more session defaults to be set before they can be used. Agents should set all relevant defaults up front in a single call (e.g., project/workspace, scheme, simulator or device ID, useLatestOS) to avoid iterative prompts; only set the keys your workflow needs.', schema: baseSchema.shape, + annotations: { + title: 'Set Session Defaults', + destructiveHint: true, + }, handler: createTypedTool(schemaObj, sessionSetDefaultsLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/session-management/session_show_defaults.ts b/src/mcp/tools/session-management/session_show_defaults.ts index 8c4e6f0b..fc04eff3 100644 --- a/src/mcp/tools/session-management/session_show_defaults.ts +++ b/src/mcp/tools/session-management/session_show_defaults.ts @@ -5,6 +5,10 @@ export default { name: 'session-show-defaults', description: 'Show current session defaults.', schema: {}, + annotations: { + title: 'Show Session Defaults', + readOnlyHint: true, + }, handler: async (): Promise => { const current = sessionStore.getAll(); return { content: [{ type: 'text', text: JSON.stringify(current, null, 2) }], isError: false }; diff --git a/src/mcp/tools/simulator-management/erase_sims.ts b/src/mcp/tools/simulator-management/erase_sims.ts index afe9437f..2313fb94 100644 --- a/src/mcp/tools/simulator-management/erase_sims.ts +++ b/src/mcp/tools/simulator-management/erase_sims.ts @@ -90,6 +90,10 @@ export default { sessionAware: publicSchemaObject, legacy: eraseSimsSchema, }), + annotations: { + title: 'Erase Simulators', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: eraseSimsSchema as unknown as z.ZodType, logicFunction: erase_simsLogic, diff --git a/src/mcp/tools/simulator-management/reset_sim_location.ts b/src/mcp/tools/simulator-management/reset_sim_location.ts index 8f146d25..808e5ab1 100644 --- a/src/mcp/tools/simulator-management/reset_sim_location.ts +++ b/src/mcp/tools/simulator-management/reset_sim_location.ts @@ -99,6 +99,10 @@ export default { sessionAware: publicSchemaObject, legacy: resetSimulatorLocationSchema, }), + annotations: { + title: 'Reset Simulator Location', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: resetSimulatorLocationSchema as unknown as z.ZodType, diff --git a/src/mcp/tools/simulator-management/set_sim_appearance.ts b/src/mcp/tools/simulator-management/set_sim_appearance.ts index b97e9f59..0c8fb352 100644 --- a/src/mcp/tools/simulator-management/set_sim_appearance.ts +++ b/src/mcp/tools/simulator-management/set_sim_appearance.ts @@ -99,6 +99,10 @@ export default { sessionAware: publicSchemaObject, legacy: setSimAppearanceSchema, }), + annotations: { + title: 'Set Simulator Appearance', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: setSimAppearanceSchema as unknown as z.ZodType, logicFunction: set_sim_appearanceLogic, diff --git a/src/mcp/tools/simulator-management/set_sim_location.ts b/src/mcp/tools/simulator-management/set_sim_location.ts index 732222fe..f5b41292 100644 --- a/src/mcp/tools/simulator-management/set_sim_location.ts +++ b/src/mcp/tools/simulator-management/set_sim_location.ts @@ -127,6 +127,10 @@ export default { sessionAware: publicSchemaObject, legacy: setSimulatorLocationSchema, }), + annotations: { + title: 'Set Simulator Location', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: setSimulatorLocationSchema as unknown as z.ZodType, logicFunction: set_sim_locationLogic, diff --git a/src/mcp/tools/simulator-management/sim_statusbar.ts b/src/mcp/tools/simulator-management/sim_statusbar.ts index 45e9c119..3208cf76 100644 --- a/src/mcp/tools/simulator-management/sim_statusbar.ts +++ b/src/mcp/tools/simulator-management/sim_statusbar.ts @@ -101,6 +101,10 @@ export default { sessionAware: publicSchemaObject, legacy: simStatusbarSchema, }), // MCP SDK compatibility + annotations: { + title: 'Simulator Statusbar', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: simStatusbarSchema as unknown as z.ZodType, logicFunction: sim_statusbarLogic, diff --git a/src/mcp/tools/simulator/boot_sim.ts b/src/mcp/tools/simulator/boot_sim.ts index 970f19fb..b8fa10e4 100644 --- a/src/mcp/tools/simulator/boot_sim.ts +++ b/src/mcp/tools/simulator/boot_sim.ts @@ -75,6 +75,10 @@ export default { sessionAware: publicSchemaObject, legacy: bootSimSchemaObject, }), + annotations: { + title: 'Boot Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: bootSimSchemaObject, logicFunction: boot_simLogic, diff --git a/src/mcp/tools/simulator/build_run_sim.ts b/src/mcp/tools/simulator/build_run_sim.ts index d4721c80..1fe459ab 100644 --- a/src/mcp/tools/simulator/build_run_sim.ts +++ b/src/mcp/tools/simulator/build_run_sim.ts @@ -510,6 +510,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Build Run Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: buildRunSimulatorSchema as unknown as z.ZodType, logicFunction: build_run_simLogic, diff --git a/src/mcp/tools/simulator/build_sim.ts b/src/mcp/tools/simulator/build_sim.ts index 6d357d2e..6681a296 100644 --- a/src/mcp/tools/simulator/build_sim.ts +++ b/src/mcp/tools/simulator/build_sim.ts @@ -157,6 +157,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), // MCP SDK compatibility (public inputs only) + annotations: { + title: 'Build Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: buildSimulatorSchema as unknown as z.ZodType, logicFunction: build_simLogic, diff --git a/src/mcp/tools/simulator/get_sim_app_path.ts b/src/mcp/tools/simulator/get_sim_app_path.ts index 8787eae6..be4e7ce7 100644 --- a/src/mcp/tools/simulator/get_sim_app_path.ts +++ b/src/mcp/tools/simulator/get_sim_app_path.ts @@ -310,6 +310,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseGetSimulatorAppPathSchema, }), + annotations: { + title: 'Get Simulator App Path', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: getSimulatorAppPathSchema as unknown as z.ZodType, logicFunction: get_sim_app_pathLogic, diff --git a/src/mcp/tools/simulator/install_app_sim.ts b/src/mcp/tools/simulator/install_app_sim.ts index f511913b..9fa1f826 100644 --- a/src/mcp/tools/simulator/install_app_sim.ts +++ b/src/mcp/tools/simulator/install_app_sim.ts @@ -103,6 +103,10 @@ export default { sessionAware: publicSchemaObject, legacy: installAppSimSchemaObject, }), + annotations: { + title: 'Install App Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: installAppSimSchemaObject, logicFunction: install_app_simLogic, diff --git a/src/mcp/tools/simulator/launch_app_logs_sim.ts b/src/mcp/tools/simulator/launch_app_logs_sim.ts index 88823fbe..71cdb266 100644 --- a/src/mcp/tools/simulator/launch_app_logs_sim.ts +++ b/src/mcp/tools/simulator/launch_app_logs_sim.ts @@ -74,6 +74,10 @@ export default { sessionAware: publicSchemaObject, legacy: launchAppLogsSimSchemaObject, }), + annotations: { + title: 'Launch App Logs Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: launchAppLogsSimSchemaObject, logicFunction: launch_app_logs_simLogic, diff --git a/src/mcp/tools/simulator/launch_app_sim.ts b/src/mcp/tools/simulator/launch_app_sim.ts index caa7d1c9..3247dc7b 100644 --- a/src/mcp/tools/simulator/launch_app_sim.ts +++ b/src/mcp/tools/simulator/launch_app_sim.ts @@ -207,6 +207,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Launch App Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: launchAppSimSchema as unknown as z.ZodType, logicFunction: launch_app_simLogic, diff --git a/src/mcp/tools/simulator/list_sims.ts b/src/mcp/tools/simulator/list_sims.ts index 12d42118..2cd86e8f 100644 --- a/src/mcp/tools/simulator/list_sims.ts +++ b/src/mcp/tools/simulator/list_sims.ts @@ -217,5 +217,9 @@ export default { name: 'list_sims', description: 'Lists available iOS simulators with their UUIDs. ', schema: listSimsSchema.shape, // MCP SDK compatibility + annotations: { + title: 'List Simulators', + readOnlyHint: true, + }, handler: createTypedTool(listSimsSchema, list_simsLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/simulator/open_sim.ts b/src/mcp/tools/simulator/open_sim.ts index ec7aad4c..0569a887 100644 --- a/src/mcp/tools/simulator/open_sim.ts +++ b/src/mcp/tools/simulator/open_sim.ts @@ -71,5 +71,9 @@ export default { name: 'open_sim', description: 'Opens the iOS Simulator app.', schema: openSimSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Open Simulator', + destructiveHint: true, + }, handler: createTypedTool(openSimSchema, open_simLogic, getDefaultCommandExecutor), }; diff --git a/src/mcp/tools/simulator/record_sim_video.ts b/src/mcp/tools/simulator/record_sim_video.ts index d4152bab..d3380b57 100644 --- a/src/mcp/tools/simulator/record_sim_video.ts +++ b/src/mcp/tools/simulator/record_sim_video.ts @@ -230,6 +230,10 @@ export default { sessionAware: publicSchemaObject, legacy: recordSimVideoSchemaObject, }), + annotations: { + title: 'Record Simulator Video', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: recordSimVideoSchema as unknown as z.ZodType, logicFunction: record_sim_videoLogic, diff --git a/src/mcp/tools/simulator/stop_app_sim.ts b/src/mcp/tools/simulator/stop_app_sim.ts index 7321281e..7beb2da1 100644 --- a/src/mcp/tools/simulator/stop_app_sim.ts +++ b/src/mcp/tools/simulator/stop_app_sim.ts @@ -161,6 +161,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Stop App Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: stopAppSimSchema as unknown as z.ZodType, logicFunction: stop_app_simLogic, diff --git a/src/mcp/tools/simulator/test_sim.ts b/src/mcp/tools/simulator/test_sim.ts index c6061c30..58336888 100644 --- a/src/mcp/tools/simulator/test_sim.ts +++ b/src/mcp/tools/simulator/test_sim.ts @@ -135,6 +135,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Test Simulator', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: testSimulatorSchema as unknown as z.ZodType, logicFunction: test_simLogic, diff --git a/src/mcp/tools/swift-package/swift_package_build.ts b/src/mcp/tools/swift-package/swift_package_build.ts index 51d14427..47491255 100644 --- a/src/mcp/tools/swift-package/swift_package_build.ts +++ b/src/mcp/tools/swift-package/swift_package_build.ts @@ -77,6 +77,10 @@ export default { name: 'swift_package_build', description: 'Builds a Swift Package with swift build', schema: swiftPackageBuildSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Swift Package Build', + destructiveHint: true, + }, handler: createTypedTool( swiftPackageBuildSchema, swift_package_buildLogic, diff --git a/src/mcp/tools/swift-package/swift_package_clean.ts b/src/mcp/tools/swift-package/swift_package_clean.ts index f268dee2..dad1ea5b 100644 --- a/src/mcp/tools/swift-package/swift_package_clean.ts +++ b/src/mcp/tools/swift-package/swift_package_clean.ts @@ -52,6 +52,10 @@ export default { name: 'swift_package_clean', description: 'Cleans Swift Package build artifacts and derived data', schema: swiftPackageCleanSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Swift Package Clean', + destructiveHint: true, + }, handler: createTypedTool( swiftPackageCleanSchema, swift_package_cleanLogic, diff --git a/src/mcp/tools/swift-package/swift_package_list.ts b/src/mcp/tools/swift-package/swift_package_list.ts index f72fcf89..cf1d9e5d 100644 --- a/src/mcp/tools/swift-package/swift_package_list.ts +++ b/src/mcp/tools/swift-package/swift_package_list.ts @@ -79,6 +79,10 @@ export default { name: 'swift_package_list', description: 'Lists currently running Swift Package processes', schema: swiftPackageListSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Swift Package List', + readOnlyHint: true, + }, handler: createTypedTool( swiftPackageListSchema, (params: SwiftPackageListParams) => { diff --git a/src/mcp/tools/swift-package/swift_package_run.ts b/src/mcp/tools/swift-package/swift_package_run.ts index e5ba55a9..6a551e1e 100644 --- a/src/mcp/tools/swift-package/swift_package_run.ts +++ b/src/mcp/tools/swift-package/swift_package_run.ts @@ -223,6 +223,10 @@ export default { name: 'swift_package_run', description: 'Runs an executable target from a Swift Package with swift run', schema: swiftPackageRunSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Swift Package Run', + destructiveHint: true, + }, handler: createTypedTool( swiftPackageRunSchema, swift_package_runLogic, diff --git a/src/mcp/tools/swift-package/swift_package_stop.ts b/src/mcp/tools/swift-package/swift_package_stop.ts index be0f5602..789d65cc 100644 --- a/src/mcp/tools/swift-package/swift_package_stop.ts +++ b/src/mcp/tools/swift-package/swift_package_stop.ts @@ -105,6 +105,10 @@ export default { name: 'swift_package_stop', description: 'Stops a running Swift Package executable started with swift_package_run', schema: swiftPackageStopSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Swift Package Stop', + destructiveHint: true, + }, async handler(args: Record): Promise { // Validate parameters using Zod const parseResult = swiftPackageStopSchema.safeParse(args); diff --git a/src/mcp/tools/swift-package/swift_package_test.ts b/src/mcp/tools/swift-package/swift_package_test.ts index a5386fa1..5c0f2f7f 100644 --- a/src/mcp/tools/swift-package/swift_package_test.ts +++ b/src/mcp/tools/swift-package/swift_package_test.ts @@ -90,6 +90,10 @@ export default { name: 'swift_package_test', description: 'Runs tests for a Swift Package with swift test', schema: swiftPackageTestSchema.shape, // MCP SDK compatibility + annotations: { + title: 'Swift Package Test', + destructiveHint: true, + }, handler: createTypedTool( swiftPackageTestSchema, swift_package_testLogic, diff --git a/src/mcp/tools/ui-testing/button.ts b/src/mcp/tools/ui-testing/button.ts index a06787d7..a8434582 100644 --- a/src/mcp/tools/ui-testing/button.ts +++ b/src/mcp/tools/ui-testing/button.ts @@ -86,6 +86,10 @@ export default { sessionAware: publicSchemaObject, legacy: buttonSchema, }), + annotations: { + title: 'Hardware Button', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: buttonSchema as unknown as z.ZodType, logicFunction: (params: ButtonParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/describe_ui.ts b/src/mcp/tools/ui-testing/describe_ui.ts index 7587a40b..4dad6320 100644 --- a/src/mcp/tools/ui-testing/describe_ui.ts +++ b/src/mcp/tools/ui-testing/describe_ui.ts @@ -119,6 +119,10 @@ export default { sessionAware: publicSchemaObject, legacy: describeUiSchema, }), + annotations: { + title: 'Describe UI', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: describeUiSchema as unknown as z.ZodType, logicFunction: (params: DescribeUiParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/gesture.ts b/src/mcp/tools/ui-testing/gesture.ts index dc205368..50d919ab 100644 --- a/src/mcp/tools/ui-testing/gesture.ts +++ b/src/mcp/tools/ui-testing/gesture.ts @@ -163,6 +163,10 @@ export default { sessionAware: publicSchemaObject, legacy: gestureSchema, }), + annotations: { + title: 'Gesture', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: gestureSchema as unknown as z.ZodType, logicFunction: (params: GestureParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/key_press.ts b/src/mcp/tools/ui-testing/key_press.ts index d9ebbe02..a439b8ea 100644 --- a/src/mcp/tools/ui-testing/key_press.ts +++ b/src/mcp/tools/ui-testing/key_press.ts @@ -91,6 +91,10 @@ export default { sessionAware: publicSchemaObject, legacy: keyPressSchema, }), + annotations: { + title: 'Key Press', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: keyPressSchema as unknown as z.ZodType, logicFunction: (params: KeyPressParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/key_sequence.ts b/src/mcp/tools/ui-testing/key_sequence.ts index 8ca95989..dcf1bb59 100644 --- a/src/mcp/tools/ui-testing/key_sequence.ts +++ b/src/mcp/tools/ui-testing/key_sequence.ts @@ -99,6 +99,10 @@ export default { sessionAware: publicSchemaObject, legacy: keySequenceSchema, }), + annotations: { + title: 'Key Sequence', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: keySequenceSchema as unknown as z.ZodType, logicFunction: (params: KeySequenceParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/long_press.ts b/src/mcp/tools/ui-testing/long_press.ts index 9c47e931..aaddaa9f 100644 --- a/src/mcp/tools/ui-testing/long_press.ts +++ b/src/mcp/tools/ui-testing/long_press.ts @@ -119,6 +119,10 @@ export default { sessionAware: publicSchemaObject, legacy: longPressSchema, }), + annotations: { + title: 'Long Press', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: longPressSchema as unknown as z.ZodType, logicFunction: (params: LongPressParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/screenshot.ts b/src/mcp/tools/ui-testing/screenshot.ts index 7758f8dd..94e1e1ab 100644 --- a/src/mcp/tools/ui-testing/screenshot.ts +++ b/src/mcp/tools/ui-testing/screenshot.ts @@ -150,6 +150,10 @@ export default { sessionAware: publicSchemaObject, legacy: screenshotSchema, }), + annotations: { + title: 'Screenshot', + readOnlyHint: true, + }, handler: createSessionAwareTool({ internalSchema: screenshotSchema as unknown as z.ZodType, logicFunction: (params: ScreenshotParams, executor: CommandExecutor) => { diff --git a/src/mcp/tools/ui-testing/swipe.ts b/src/mcp/tools/ui-testing/swipe.ts index 0434c0ac..0ae98ece 100644 --- a/src/mcp/tools/ui-testing/swipe.ts +++ b/src/mcp/tools/ui-testing/swipe.ts @@ -130,6 +130,10 @@ export default { sessionAware: publicSchemaObject, legacy: swipeSchema, }), + annotations: { + title: 'Swipe', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: swipeSchema as unknown as z.ZodType, logicFunction: (params: SwipeParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/tap.ts b/src/mcp/tools/ui-testing/tap.ts index 1f51e420..b72d42b5 100644 --- a/src/mcp/tools/ui-testing/tap.ts +++ b/src/mcp/tools/ui-testing/tap.ts @@ -186,6 +186,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseTapSchema, }), + annotations: { + title: 'Tap', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: tapSchema as unknown as z.ZodType, logicFunction: (params: TapParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/ui-testing/touch.ts b/src/mcp/tools/ui-testing/touch.ts index cf6834ce..7bc3197a 100644 --- a/src/mcp/tools/ui-testing/touch.ts +++ b/src/mcp/tools/ui-testing/touch.ts @@ -120,6 +120,10 @@ export default { sessionAware: publicSchemaObject, legacy: touchSchema, }), + annotations: { + title: 'Touch', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: touchSchema as unknown as z.ZodType, logicFunction: (params: TouchParams, executor: CommandExecutor) => touchLogic(params, executor), diff --git a/src/mcp/tools/ui-testing/type_text.ts b/src/mcp/tools/ui-testing/type_text.ts index 4a2f4f1e..88804146 100644 --- a/src/mcp/tools/ui-testing/type_text.ts +++ b/src/mcp/tools/ui-testing/type_text.ts @@ -92,6 +92,10 @@ export default { sessionAware: publicSchemaObject, legacy: typeTextSchema, }), + annotations: { + title: 'Type Text', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: typeTextSchema as unknown as z.ZodType, logicFunction: (params: TypeTextParams, executor: CommandExecutor) => diff --git a/src/mcp/tools/utilities/clean.ts b/src/mcp/tools/utilities/clean.ts index f59b288b..6c3c7bdc 100644 --- a/src/mcp/tools/utilities/clean.ts +++ b/src/mcp/tools/utilities/clean.ts @@ -163,6 +163,10 @@ export default { sessionAware: publicSchemaObject, legacy: baseSchemaObject, }), + annotations: { + title: 'Clean', + destructiveHint: true, + }, handler: createSessionAwareTool({ internalSchema: cleanSchema as unknown as z.ZodType, logicFunction: cleanLogic, diff --git a/src/utils/tool-registry.ts b/src/utils/tool-registry.ts index 9e9d0da4..b5adf542 100644 --- a/src/utils/tool-registry.ts +++ b/src/utils/tool-registry.ts @@ -128,6 +128,7 @@ export async function registerDiscoveryTools(server: McpServer): Promise { config: { description: plugin.description ?? '', inputSchema: plugin.schema, + annotations: plugin.annotations, }, // Adapt callback to match SDK's expected signature callback: (args: unknown): Promise => @@ -165,6 +166,7 @@ export async function registerSelectedWorkflows( config: { description: tool.description ?? '', inputSchema: tool.schema, + annotations: tool.annotations, }, callback: (args: unknown): Promise => tool.handler(args as Record), @@ -201,6 +203,7 @@ export async function registerAllToolsStatic(server: McpServer): Promise { config: { description: plugin.description ?? '', inputSchema: plugin.schema, + annotations: plugin.annotations, }, // Adapt callback to match SDK's expected signature callback: (args: unknown): Promise =>