hevy-mcp 1.8.6 → 1.8.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
9
9
 
10
10
  // package.json
11
11
  var name = "hevy-mcp";
12
- var version = "1.8.5";
12
+ var version = "1.8.7";
13
13
 
14
14
  // src/tools/folders.ts
15
15
  import { z } from "zod";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../package.json","../src/tools/folders.ts","../src/utils/error-handler.ts","../src/utils/formatters.ts","../src/utils/response-formatter.ts","../src/tools/routines.ts","../src/tools/templates.ts","../src/tools/webhooks.ts","../src/generated/client/schemas/deletedWorkoutSchema.ts","../src/generated/client/schemas/deleteV1WebhookSubscriptionSchema.ts","../src/generated/client/schemas/exerciseTemplateSchema.ts","../src/generated/client/schemas/getV1ExerciseTemplatesExercisetemplateidSchema.ts","../src/generated/client/schemas/getV1ExerciseTemplatesSchema.ts","../src/generated/client/schemas/routineFolderSchema.ts","../src/generated/client/schemas/getV1RoutineFoldersFolderidSchema.ts","../src/generated/client/schemas/getV1RoutineFoldersSchema.ts","../src/generated/client/schemas/routineSchema.ts","../src/generated/client/schemas/getV1RoutinesRoutineidSchema.ts","../src/generated/client/schemas/getV1RoutinesSchema.ts","../src/generated/client/schemas/getV1WebhookSubscriptionSchema.ts","../src/generated/client/schemas/getV1WorkoutsCountSchema.ts","../src/generated/client/schemas/workoutSchema.ts","../src/generated/client/schemas/updatedWorkoutSchema.ts","../src/generated/client/schemas/paginatedWorkoutEventsSchema.ts","../src/generated/client/schemas/getV1WorkoutsEventsSchema.ts","../src/generated/client/schemas/getV1WorkoutsSchema.ts","../src/generated/client/schemas/getV1WorkoutsWorkoutidSchema.ts","../src/generated/client/schemas/postRoutineFolderRequestBodySchema.ts","../src/generated/client/schemas/postRoutinesRequestSetSchema.ts","../src/generated/client/schemas/postRoutinesRequestExerciseSchema.ts","../src/generated/client/schemas/postRoutinesRequestBodySchema.ts","../src/generated/client/schemas/postV1RoutineFoldersSchema.ts","../src/generated/client/schemas/postV1RoutinesSchema.ts","../src/generated/client/schemas/webhookRequestBodySchema.ts","../src/generated/client/schemas/postV1WebhookSubscriptionSchema.ts","../src/generated/client/schemas/postWorkoutsRequestSetSchema.ts","../src/generated/client/schemas/postWorkoutsRequestExerciseSchema.ts","../src/generated/client/schemas/postWorkoutsRequestBodySchema.ts","../src/generated/client/schemas/postV1WorkoutsSchema.ts","../src/generated/client/schemas/putRoutinesRequestSetSchema.ts","../src/generated/client/schemas/putRoutinesRequestExerciseSchema.ts","../src/generated/client/schemas/putRoutinesRequestBodySchema.ts","../src/generated/client/schemas/putV1RoutinesRoutineidSchema.ts","../src/generated/client/schemas/putV1WorkoutsWorkoutidSchema.ts","../src/tools/workouts.ts","../src/utils/hevyClientKubb.ts","../src/generated/client/api/deleteV1WebhookSubscription.ts","../src/generated/client/api/getV1ExerciseTemplates.ts","../src/generated/client/api/getV1ExerciseTemplatesExercisetemplateid.ts","../src/generated/client/api/getV1RoutineFolders.ts","../src/generated/client/api/getV1RoutineFoldersFolderid.ts","../src/generated/client/api/getV1Routines.ts","../src/generated/client/api/getV1RoutinesRoutineid.ts","../src/generated/client/api/getV1WebhookSubscription.ts","../src/generated/client/api/getV1Workouts.ts","../src/generated/client/api/getV1WorkoutsCount.ts","../src/generated/client/api/getV1WorkoutsEvents.ts","../src/generated/client/api/getV1WorkoutsWorkoutid.ts","../src/generated/client/api/postV1RoutineFolders.ts","../src/generated/client/api/postV1Routines.ts","../src/generated/client/api/postV1WebhookSubscription.ts","../src/generated/client/api/postV1Workouts.ts","../src/generated/client/api/putV1RoutinesRoutineid.ts","../src/generated/client/api/putV1WorkoutsWorkoutid.ts","../src/utils/hevyClient.ts","../src/utils/httpServer.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"@dotenvx/dotenvx/config\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { name, version } from \"../package.json\";\nimport { registerFolderTools } from \"./tools/folders.js\";\nimport { registerRoutineTools } from \"./tools/routines.js\";\nimport { registerTemplateTools } from \"./tools/templates.js\";\nimport { registerWebhookTools } from \"./tools/webhooks.js\";\n// Import tool registration functions\nimport { registerWorkoutTools } from \"./tools/workouts.js\";\nimport { createClient } from \"./utils/hevyClient.js\";\nimport { createHttpServer } from \"./utils/httpServer.js\";\n\nconst HEVY_API_BASEURL = \"https://api.hevyapp.com\";\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nconst transportMode =\n\targs.includes(\"--http\") || process.env.MCP_TRANSPORT === \"http\"\n\t\t? \"http\"\n\t\t: \"stdio\";\nconst httpPort = Number.parseInt(process.env.MCP_HTTP_PORT || \"3000\", 10);\nconst httpHost = process.env.MCP_HTTP_HOST || \"127.0.0.1\";\nconst enableDnsRebindingProtection =\n\tprocess.env.MCP_DNS_REBINDING_PROTECTION === \"true\";\nconst allowedHosts = process.env.MCP_ALLOWED_HOSTS?.split(\",\") || [\"127.0.0.1\"];\n\n// Create server instance\nconst server = new McpServer({\n\tname,\n\tversion,\n});\n\n// Check for API key\nif (!process.env.HEVY_API_KEY) {\n\tconsole.error(\"HEVY_API_KEY environment variable is not set\");\n\tprocess.exit(1);\n}\n\n// Configure client\n// We've already checked for HEVY_API_KEY existence above, so it's safe to use here\nconst apiKey = process.env.HEVY_API_KEY || \"\";\nconst hevyClient = createClient(apiKey, HEVY_API_BASEURL);\n\n// Register all tools\nregisterWorkoutTools(server, hevyClient);\nregisterRoutineTools(server, hevyClient);\nregisterTemplateTools(server, hevyClient);\nregisterFolderTools(server, hevyClient);\nregisterWebhookTools(server, hevyClient);\n\n// Start the server\nasync function runServer() {\n\tif (transportMode === \"http\") {\n\t\tconsole.log(`Starting MCP server in HTTP mode on ${httpHost}:${httpPort}`);\n\t\tconst httpServer = createHttpServer(server, {\n\t\t\tport: httpPort,\n\t\t\thost: httpHost,\n\t\t\tenableDnsRebindingProtection,\n\t\t\tallowedHosts,\n\t\t});\n\t\tawait httpServer.startServer();\n\t} else {\n\t\tconsole.log(\"Starting MCP server in stdio mode\");\n\t\tconst transport = new StdioServerTransport();\n\t\tawait server.connect(transport);\n\t}\n}\n\nrunServer().catch((error) => {\n\tconsole.error(\"Fatal error in main():\", error);\n\tprocess.exit(1);\n});\n","{\n\t\"name\": \"hevy-mcp\",\n\t\"version\": \"1.8.5\",\n\t\"main\": \"dist/index.js\",\n\t\"module\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"README.md\"\n\t],\n\t\"access\": \"public\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/chrisdoc/hevy-mcp/issues\"\n\t},\n\t\"homepage\": \"https://github.com/chrisdoc/hevy-mcp#readme\",\n\t\"bin\": {\n\t\t\"hevy-mcp\": \"dist/index.js\"\n\t},\n\t\"scripts\": {\n\t\t\"inspect\": \"npm run build && npx -y @modelcontextprotocol/inspector@latest node dist/index.js\",\n\t\t\"test\": \"vitest --run\",\n\t\t\"export-specs\": \"node ./scripts/export-openapi-spec.js\",\n\t\t\"build\": \"tsup\",\n\t\t\"build:client\": \"kubb generate\",\n\t\t\"start\": \"node dist/index.js\",\n\t\t\"start:http\": \"node dist/index.js --http\",\n\t\t\"dev\": \"tsx watch --clear-screen=false src/index.ts\",\n\t\t\"dev:http\": \"MCP_TRANSPORT=http tsx watch --clear-screen=false src/index.ts\",\n\t\t\"check\": \"biome check --write --unsafe\",\n\t\t\"check:types\": \"tsc --noEmit\",\n\t\t\"version:patch\": \"npm version patch\",\n\t\t\"version:minor\": \"npm version minor\",\n\t\t\"version:major\": \"npm version major\",\n\t\t\"release\": \"semantic-release\",\n\t\t\"commit\": \"commit\"\n\t},\n\t\"type\": \"module\",\n\t\"keywords\": [\n\t\t\"mcp\",\n\t\t\"hevy\",\n\t\t\"fitness\",\n\t\t\"api\",\n\t\t\"model context protocol\"\n\t],\n\t\"author\": \"Christoph Kieslich\",\n\t\"license\": \"MIT\",\n\t\"description\": \"A Model Context Protocol (MCP) server implementation that interfaces with the Hevy fitness tracking app and its API.\",\n\t\"dependencies\": {\n\t\t\"@dotenvx/dotenvx\": \"^1.49.0\",\n\t\t\"@kubb/cli\": \"^3.18.1\",\n\t\t\"@kubb/core\": \"^3.18.1\",\n\t\t\"@kubb/plugin-client\": \"^3.18.1\",\n\t\t\"@kubb/plugin-faker\": \"^3.18.1\",\n\t\t\"@kubb/plugin-oas\": \"^3.18.1\",\n\t\t\"@kubb/plugin-ts\": \"^3.18.1\",\n\t\t\"@kubb/plugin-zod\": \"^3.18.1\",\n\t\t\"@modelcontextprotocol/sdk\": \"^1.17.4\",\n\t\t\"axios\": \"^1.11.0\",\n\t\t\"uuid\": \"^11.1.0\",\n\t\t\"zod\": \"^3.25.75\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@biomejs/biome\": \"2.2.3\",\n\t\t\"@commitlint/cli\": \"^19.8.1\",\n\t\t\"@commitlint/config-conventional\": \"^19.8.1\",\n\t\t\"@commitlint/prompt-cli\": \"^19.8.1\",\n\t\t\"@semantic-release/changelog\": \"^6.0.3\",\n\t\t\"@semantic-release/commit-analyzer\": \"^13.0.1\",\n\t\t\"@semantic-release/git\": \"^10.0.1\",\n\t\t\"@semantic-release/npm\": \"^12.0.2\",\n\t\t\"@semantic-release/release-notes-generator\": \"^14.0.3\",\n\t\t\"@types/express\": \"^5.0.3\",\n\t\t\"@types/node\": \"^24.3.0\",\n\t\t\"@types/uuid\": \"^10.0.0\",\n\t\t\"@vitest/coverage-v8\": \"^3.2.4\",\n\t\t\"abstract-syntax-tree\": \"^2.22.0\",\n\t\t\"lefthook\": \"^1.12.3\",\n\t\t\"semantic-release\": \"^24.2.7\",\n\t\t\"tsup\": \"^8.5.0\",\n\t\t\"tsx\": \"^4.20.5\",\n\t\t\"typescript\": \"^5.9.2\",\n\t\t\"vitest\": \"^3.2.4\"\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=20.0.0\"\n\t}\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n// Import types from generated client\nimport type { RoutineFolder } from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatRoutineFolder } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n// Type definitions for the folder operations\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n/**\n * Register all routine folder-related tools with the MCP server\n */\nexport function registerFolderTools(server: McpServer, hevyClient: HevyClient) {\n\t// Get routine folders\n\tserver.tool(\n\t\t\"get-routine-folders\",\n\t\t\"Get a paginated list of your routine folders, including both default and custom folders. Useful for organizing and browsing your workout routines.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({ page, pageSize }: { page: number; pageSize: number }) => {\n\t\t\t\tconst data = await hevyClient.getRoutineFolders({\n\t\t\t\t\tpage,\n\t\t\t\t\tpageSize,\n\t\t\t\t});\n\n\t\t\t\t// Process routine folders to extract relevant information\n\t\t\t\tconst folders =\n\t\t\t\t\tdata?.routine_folders?.map((folder: RoutineFolder) =>\n\t\t\t\t\t\tformatRoutineFolder(folder),\n\t\t\t\t\t) || [];\n\n\t\t\t\tif (folders.length === 0) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t\"No routine folders found for the specified parameters\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn createJsonResponse(folders);\n\t\t\t},\n\t\t\t\"get-routine-folders\",\n\t\t),\n\t);\n\n\t// Get single routine folder by ID\n\tserver.tool(\n\t\t\"get-routine-folder\",\n\t\t\"Get complete details of a specific routine folder by its ID, including name, creation date, and associated routines.\",\n\t\t{\n\t\t\tfolderId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ folderId }: { folderId: string }) => {\n\t\t\tconst data = await hevyClient.getRoutineFolder(folderId);\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t`Routine folder with ID ${folderId} not found`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst folder = formatRoutineFolder(data);\n\t\t\treturn createJsonResponse(folder);\n\t\t}, \"get-routine-folder\"),\n\t);\n\n\t// Create new routine folder\n\tserver.tool(\n\t\t\"create-routine-folder\",\n\t\t\"Create a new routine folder in your Hevy account. Requires a name for the folder. Returns the full folder details including the new folder ID.\",\n\t\t{\n\t\t\tname: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ name }: { name: string }) => {\n\t\t\tconst data = await hevyClient.createRoutineFolder({\n\t\t\t\troutine_folder: {\n\t\t\t\t\ttitle: name,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to create routine folder: Server returned no data\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst folder = formatRoutineFolder(data);\n\t\t\treturn createJsonResponse(folder, {\n\t\t\t\tpretty: true,\n\t\t\t\tindent: 2,\n\t\t\t});\n\t\t}, \"create-routine-folder\"),\n\t);\n}\n","/**\n * Centralized error handling utility for MCP tools\n */\n\n// Define the McpToolResponse interface based on the SDK's structure\ninterface McpToolResponse {\n\tcontent: Array<{ type: string; text: string }>;\n\tisError?: boolean;\n}\n\n/**\n * Standard error response interface\n */\nexport interface ErrorResponse {\n\tmessage: string;\n\tcode?: string;\n\tdetails?: unknown;\n}\n\n/**\n * Specific error types for better categorization\n */\nexport enum ErrorType {\n\tAPI_ERROR = \"API_ERROR\",\n\tVALIDATION_ERROR = \"VALIDATION_ERROR\",\n\tNOT_FOUND = \"NOT_FOUND\",\n\tNETWORK_ERROR = \"NETWORK_ERROR\",\n\tUNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\n/**\n * Enhanced error response with type categorization\n */\nexport interface EnhancedErrorResponse extends ErrorResponse {\n\ttype: ErrorType;\n}\n\n/**\n * Create a standardized error response for MCP tools\n *\n * @param error - The error object or message\n * @param context - Optional context information about where the error occurred\n * @returns A formatted MCP tool response with error information\n */\nexport function createErrorResponse(\n\terror: unknown,\n\tcontext?: string,\n): McpToolResponse {\n\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t// Extract error code if available (for logging purposes)\n\tconst errorCode =\n\t\terror instanceof Error && \"code\" in error\n\t\t\t? (error as { code?: string }).code\n\t\t\t: undefined;\n\n\t// Determine error type based on error characteristics\n\tconst errorType = determineErrorType(error, errorMessage);\n\n\t// Include error code in logs if available\n\tif (errorCode) {\n\t\tconsole.debug(`Error code: ${errorCode}`);\n\t}\n\n\tconst contextPrefix = context ? `[${context}] ` : \"\";\n\tconst formattedMessage = `${contextPrefix}Error: ${errorMessage}`;\n\n\t// Log the error for server-side debugging with type information\n\tconsole.error(`${formattedMessage} (Type: ${errorType})`, error);\n\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: formattedMessage,\n\t\t\t},\n\t\t],\n\t\tisError: true,\n\t};\n}\n\n/**\n * Determine the type of error based on error characteristics\n */\nfunction determineErrorType(error: unknown, message: string): ErrorType {\n\tconst messageLower = message.toLowerCase();\n\tconst nameLower = error instanceof Error ? error.name.toLowerCase() : \"\";\n\n\tif (\n\t\tnameLower.includes(\"network\") ||\n\t\tmessageLower.includes(\"network\") ||\n\t\tnameLower.includes(\"fetch\") ||\n\t\tmessageLower.includes(\"fetch\") ||\n\t\tnameLower.includes(\"timeout\") ||\n\t\tmessageLower.includes(\"timeout\")\n\t) {\n\t\treturn ErrorType.NETWORK_ERROR;\n\t}\n\n\tif (\n\t\tnameLower.includes(\"validation\") ||\n\t\tmessageLower.includes(\"validation\") ||\n\t\tmessageLower.includes(\"invalid\") ||\n\t\tmessageLower.includes(\"required\")\n\t) {\n\t\treturn ErrorType.VALIDATION_ERROR;\n\t}\n\n\tif (\n\t\tmessageLower.includes(\"not found\") ||\n\t\tmessageLower.includes(\"404\") ||\n\t\tmessageLower.includes(\"does not exist\")\n\t) {\n\t\treturn ErrorType.NOT_FOUND;\n\t}\n\n\tif (\n\t\tnameLower.includes(\"api\") ||\n\t\tmessageLower.includes(\"api\") ||\n\t\tmessageLower.includes(\"server error\") ||\n\t\tmessageLower.includes(\"500\")\n\t) {\n\t\treturn ErrorType.API_ERROR;\n\t}\n\n\treturn ErrorType.UNKNOWN_ERROR;\n}\n\n/**\n * Wrap an async function with standardized error handling\n *\n * @param fn - The async function to wrap\n * @param context - Context information for error messages\n * @returns A function that catches errors and returns standardized error responses\n */\n// Define a more specific type for function parameters\ntype McpToolFunction = (\n\t...args: Record<string, unknown>[]\n) => Promise<McpToolResponse>;\n\n/**\n * Wrap an async function with standardized error handling\n *\n * @param fn - The async function to wrap\n * @param context - Context information for error messages\n * @returns A function that catches errors and returns standardized error responses\n */\nexport function withErrorHandling<T extends McpToolFunction>(\n\tfn: T,\n\tcontext: string,\n): T {\n\treturn (async (...args: Parameters<T>) => {\n\t\ttry {\n\t\t\treturn await fn(...args);\n\t\t} catch (error) {\n\t\t\treturn createErrorResponse(error, context);\n\t\t}\n\t}) as T;\n}\n","import type {\n\tExerciseTemplate,\n\tRoutine,\n\tRoutineFolder,\n\tWorkout,\n} from \"../generated/client/types/index.js\";\n\n/**\n * Formatted workout set interface\n */\nexport interface FormattedWorkoutSet {\n\tindex: number | undefined;\n\ttype: string | undefined;\n\tweight: number | undefined | null;\n\treps: number | undefined | null;\n\tdistance: number | undefined | null;\n\tduration: number | undefined | null;\n\trpe: number | undefined | null;\n\tcustomMetric: number | undefined | null;\n}\n\n/**\n * Formatted workout exercise interface\n */\nexport interface FormattedWorkoutExercise {\n\tindex: number | undefined;\n\tname: string | undefined;\n\texerciseTemplateId: string | undefined;\n\tnotes: string | undefined | null;\n\tsupersetsId: number | undefined | null;\n\tsets: FormattedWorkoutSet[] | undefined;\n}\n\n/**\n * Formatted workout interface\n */\nexport interface FormattedWorkout {\n\tid: string | undefined;\n\ttitle: string | undefined;\n\tdescription: string | undefined | null;\n\tstartTime: number | undefined;\n\tendTime: number | undefined;\n\tcreatedAt: string | undefined;\n\tupdatedAt: string | undefined;\n\tduration: string;\n\texercises: FormattedWorkoutExercise[] | undefined;\n}\n\n/**\n * Formatted routine set interface\n */\nexport interface FormattedRoutineSet {\n\tindex: number | undefined;\n\ttype: string | undefined;\n\tweight: number | undefined | null;\n\treps: number | undefined | null;\n\tdistance: number | undefined | null;\n\tduration: number | undefined | null;\n\tcustomMetric: number | undefined | null;\n\trepRange?: { start?: number | null; end?: number | null } | undefined | null;\n\trpe?: number | undefined | null;\n}\n\n/**\n * Formatted routine exercise interface\n */\nexport interface FormattedRoutineExercise {\n\tname: string | undefined;\n\tindex: number | undefined;\n\texerciseTemplateId: string | undefined;\n\tnotes: string | undefined | null;\n\tsupersetId: number | undefined | null;\n\trestSeconds: string | undefined;\n\tsets: FormattedRoutineSet[] | undefined;\n}\n\n/**\n * Formatted routine interface\n */\nexport interface FormattedRoutine {\n\tid: string | undefined;\n\ttitle: string | undefined;\n\tfolderId: number | undefined | null;\n\tcreatedAt: string | undefined;\n\tupdatedAt: string | undefined;\n\texercises: FormattedRoutineExercise[] | undefined;\n}\n\n/**\n * Formatted routine folder interface\n */\nexport interface FormattedRoutineFolder {\n\tid: number | undefined;\n\ttitle: string | undefined;\n\tcreatedAt: string | undefined;\n\tupdatedAt: string | undefined;\n}\n\n/**\n * Formatted exercise template interface\n */\nexport interface FormattedExerciseTemplate {\n\tid: string | undefined;\n\ttitle: string | undefined;\n\ttype: string | undefined;\n\tprimaryMuscleGroup: string | undefined;\n\tsecondaryMuscleGroups: string[] | undefined;\n\tisCustom: boolean | undefined;\n}\n\n/**\n * Format a workout object for consistent presentation\n *\n * @param workout - The workout object from the API\n * @returns A formatted workout object with standardized properties\n */\nexport function formatWorkout(workout: Workout): FormattedWorkout {\n\treturn {\n\t\tid: workout.id,\n\t\ttitle: workout.title,\n\t\tdescription: workout.description,\n\t\tstartTime: workout.start_time,\n\t\tendTime: workout.end_time,\n\t\tcreatedAt: workout.created_at,\n\t\tupdatedAt: workout.updated_at,\n\t\tduration: calculateDuration(workout.start_time, workout.end_time),\n\t\texercises: workout.exercises?.map((exercise) => {\n\t\t\treturn {\n\t\t\t\tindex: exercise.index,\n\t\t\t\tname: exercise.title,\n\t\t\t\texerciseTemplateId: exercise.exercise_template_id,\n\t\t\t\tnotes: exercise.notes,\n\t\t\t\tsupersetsId: exercise.supersets_id,\n\t\t\t\tsets: exercise.sets?.map((set) => ({\n\t\t\t\t\tindex: set.index,\n\t\t\t\t\ttype: set.type,\n\t\t\t\t\tweight: set.weight_kg,\n\t\t\t\t\treps: set.reps,\n\t\t\t\t\tdistance: set.distance_meters,\n\t\t\t\t\tduration: set.duration_seconds,\n\t\t\t\t\trpe: set.rpe,\n\t\t\t\t\tcustomMetric: set.custom_metric,\n\t\t\t\t})),\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/**\n * Format a routine object for consistent presentation\n *\n * @param routine - The routine object from the API\n * @returns A formatted routine object with standardized properties\n */\nexport function formatRoutine(routine: Routine): FormattedRoutine {\n\treturn {\n\t\tid: routine.id,\n\t\ttitle: routine.title,\n\t\tfolderId: routine.folder_id,\n\t\tcreatedAt: routine.created_at,\n\t\tupdatedAt: routine.updated_at,\n\t\texercises: routine.exercises?.map((exercise) => {\n\t\t\treturn {\n\t\t\t\tname: exercise.title,\n\t\t\t\tindex: exercise.index,\n\t\t\t\texerciseTemplateId: exercise.exercise_template_id,\n\t\t\t\tnotes: exercise.notes,\n\t\t\t\tsupersetId: exercise.supersets_id,\n\t\t\t\trestSeconds: exercise.rest_seconds,\n\t\t\t\tsets: exercise.sets?.map((set) => ({\n\t\t\t\t\tindex: set.index,\n\t\t\t\t\ttype: set.type,\n\t\t\t\t\tweight: set.weight_kg,\n\t\t\t\t\treps: set.reps,\n\t\t\t\t\t...(set.rep_range !== undefined && { repRange: set.rep_range }),\n\t\t\t\t\tdistance: set.distance_meters,\n\t\t\t\t\tduration: set.duration_seconds,\n\t\t\t\t\t...(set.rpe !== undefined && { rpe: set.rpe }),\n\t\t\t\t\tcustomMetric: set.custom_metric,\n\t\t\t\t})),\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/**\n * Format a routine folder object for consistent presentation\n *\n * @param folder - The routine folder object from the API\n * @returns A formatted routine folder object with standardized properties\n */\nexport function formatRoutineFolder(\n\tfolder: RoutineFolder,\n): FormattedRoutineFolder {\n\treturn {\n\t\tid: folder.id,\n\t\ttitle: folder.title,\n\t\tcreatedAt: folder.created_at,\n\t\tupdatedAt: folder.updated_at,\n\t};\n}\n\n/**\n * Calculate duration between two ISO timestamp strings\n *\n * @param startTime - The start time as ISO string or timestamp\n * @param endTime - The end time as ISO string or timestamp\n * @returns A formatted duration string (e.g. \"1h 30m 45s\") or \"Unknown duration\" if inputs are invalid\n */\nexport function calculateDuration(\n\tstartTime: string | number | null | undefined,\n\tendTime: string | number | null | undefined,\n): string {\n\tif (!startTime || !endTime) return \"Unknown duration\";\n\n\ttry {\n\t\tconst start = new Date(startTime);\n\t\tconst end = new Date(endTime);\n\n\t\t// Validate dates\n\t\tif (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {\n\t\t\treturn \"Unknown duration\";\n\t\t}\n\n\t\tconst durationMs = end.getTime() - start.getTime();\n\n\t\t// Handle negative durations\n\t\tif (durationMs < 0) {\n\t\t\treturn \"Invalid duration (end time before start time)\";\n\t\t}\n\n\t\tconst hours = Math.floor(durationMs / (1000 * 60 * 60));\n\t\tconst minutes = Math.floor((durationMs % (1000 * 60 * 60)) / (1000 * 60));\n\t\tconst seconds = Math.floor((durationMs % (1000 * 60)) / 1000);\n\n\t\treturn `${hours}h ${minutes}m ${seconds}s`;\n\t} catch (error) {\n\t\tconsole.error(\"Error calculating duration:\", error);\n\t\treturn \"Unknown duration\";\n\t}\n}\n\n/**\n * Format an exercise template object for consistent presentation\n *\n * @param template - The exercise template object from the API\n * @returns A formatted exercise template object with standardized properties\n */\nexport function formatExerciseTemplate(\n\ttemplate: ExerciseTemplate,\n): FormattedExerciseTemplate {\n\treturn {\n\t\tid: template.id,\n\t\ttitle: template.title,\n\t\ttype: template.type,\n\t\tprimaryMuscleGroup: template.primary_muscle_group,\n\t\tsecondaryMuscleGroups: template.secondary_muscle_groups,\n\t\tisCustom: template.is_custom,\n\t};\n}\n","/**\n * Centralized response formatting utility for MCP tools\n */\n\nimport type { McpToolResponse } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\n/**\n * Format options for JSON responses\n */\nexport interface JsonFormatOptions {\n\t/** Whether to pretty-print the JSON with indentation */\n\tpretty?: boolean;\n\t/** Indentation spaces for pretty-printing (default: 2) */\n\tindent?: number;\n}\n\n/**\n * Create a standardized success response with JSON data\n *\n * @param data - The data to include in the response\n * @param options - Formatting options\n * @returns A formatted MCP tool response with the data as JSON\n */\nexport function createJsonResponse(\n\tdata: unknown,\n\toptions: JsonFormatOptions = { pretty: true, indent: 2 },\n): McpToolResponse {\n\tconst jsonString = options.pretty\n\t\t? JSON.stringify(data, null, options.indent)\n\t\t: JSON.stringify(data);\n\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: jsonString,\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Create a standardized success response with text data\n *\n * @param message - The text message to include in the response\n * @returns A formatted MCP tool response with the text message\n */\nexport function createTextResponse(message: string): McpToolResponse {\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: message,\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Create a standardized success response for empty or null results\n *\n * @param message - Optional message to include (default: \"No data found\")\n * @returns A formatted MCP tool response for empty results\n */\nexport function createEmptyResponse(\n\tmessage = \"No data found\",\n): McpToolResponse {\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: message,\n\t\t\t},\n\t\t],\n\t};\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n// Import types from generated client\nimport type {\n\tPostRoutinesRequestExercise,\n\tPostRoutinesRequestSet,\n\tPostRoutinesRequestSetTypeEnum,\n\tPutRoutinesRequestExercise,\n\tPutRoutinesRequestSet,\n\tPutRoutinesRequestSetTypeEnum,\n\tRoutine,\n} from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatRoutine } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n// Type definitions for the routine operations\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n// Define types for the routine operations based on Zod schemas\ntype CreateRoutineParams = {\n\ttitle: string;\n\tfolderId?: number | null;\n\tnotes?: string;\n\texercises: Array<{\n\t\texerciseTemplateId: string;\n\t\tsupersetId?: number | null;\n\t\trestSeconds?: number;\n\t\tnotes?: string;\n\t\tsets: Array<{\n\t\t\ttype: \"warmup\" | \"normal\" | \"failure\" | \"dropset\";\n\t\t\tweightKg?: number;\n\t\t\treps?: number;\n\t\t\tdistanceMeters?: number;\n\t\t\tdurationSeconds?: number;\n\t\t\tcustomMetric?: number;\n\t\t}>;\n\t}>;\n};\n\ntype UpdateRoutineParams = {\n\troutineId: string;\n\ttitle: string;\n\tnotes?: string;\n\texercises: Array<{\n\t\texerciseTemplateId: string;\n\t\tsupersetId?: number | null;\n\t\trestSeconds?: number;\n\t\tnotes?: string;\n\t\tsets: Array<{\n\t\t\ttype: \"warmup\" | \"normal\" | \"failure\" | \"dropset\";\n\t\t\tweightKg?: number;\n\t\t\treps?: number;\n\t\t\tdistanceMeters?: number;\n\t\t\tdurationSeconds?: number;\n\t\t\tcustomMetric?: number;\n\t\t}>;\n\t}>;\n};\n\n/**\n * Register all routine-related tools with the MCP server\n */\nexport function registerRoutineTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get routines\n\tserver.tool(\n\t\t\"get-routines\",\n\t\t\"Get a paginated list of your workout routines, including custom and default routines. Useful for browsing or searching your available routines.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t},\n\t\twithErrorHandling(async (args) => {\n\t\t\tconst { page, pageSize } = args as { page: number; pageSize: number };\n\t\t\tconst data = await hevyClient.getRoutines({\n\t\t\t\tpage,\n\t\t\t\tpageSize,\n\t\t\t});\n\n\t\t\t// Process routines to extract relevant information\n\t\t\tconst routines =\n\t\t\t\tdata?.routines?.map((routine: Routine) => formatRoutine(routine)) || [];\n\n\t\t\tif (routines.length === 0) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"No routines found for the specified parameters\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn createJsonResponse(routines);\n\t\t}, \"get-routines\"),\n\t);\n\n\t// Get single routine by ID (new, direct endpoint)\n\tserver.tool(\n\t\t\"get-routine\",\n\t\t\"Get a routine by its ID using the direct endpoint. Returns all details for the specified routine.\",\n\t\t{\n\t\t\troutineId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ routineId }) => {\n\t\t\tconst data = await hevyClient.getRoutineById(String(routineId));\n\t\t\tif (!data || !data.routine) {\n\t\t\t\treturn createEmptyResponse(`Routine with ID ${routineId} not found`);\n\t\t\t}\n\t\t\tconst routine = formatRoutine(data.routine);\n\t\t\treturn createJsonResponse(routine);\n\t\t}, \"get-routine\"),\n\t);\n\n\t// Create new routine\n\tserver.tool(\n\t\t\"create-routine\",\n\t\t\"Create a new workout routine in your Hevy account. Requires a title and at least one exercise with sets. Optionally assign to a folder. Returns the full routine details including the new routine ID.\",\n\t\t{\n\t\t\ttitle: z.string().min(1),\n\t\t\tfolderId: z.coerce.number().nullable().optional(),\n\t\t\tnotes: z.string().optional(),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\trestSeconds: z.coerce.number().int().min(0).optional(),\n\t\t\t\t\tnotes: z.string().optional(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(async (args) => {\n\t\t\tconst { title, folderId, notes, exercises } = args as CreateRoutineParams;\n\t\t\tconst data = await hevyClient.createRoutine({\n\t\t\t\troutine: {\n\t\t\t\t\ttitle,\n\t\t\t\t\tfolder_id: folderId ?? null,\n\t\t\t\t\tnotes: notes ?? \"\",\n\t\t\t\t\texercises: exercises.map(\n\t\t\t\t\t\t(exercise): PostRoutinesRequestExercise => ({\n\t\t\t\t\t\t\texercise_template_id: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsuperset_id: exercise.supersetId ?? null,\n\t\t\t\t\t\t\trest_seconds: exercise.restSeconds ?? null,\n\t\t\t\t\t\t\tnotes: exercise.notes ?? null,\n\t\t\t\t\t\t\tsets: exercise.sets.map(\n\t\t\t\t\t\t\t\t(set): PostRoutinesRequestSet => ({\n\t\t\t\t\t\t\t\t\ttype: set.type as PostRoutinesRequestSetTypeEnum,\n\t\t\t\t\t\t\t\t\tweight_kg: set.weightKg ?? null,\n\t\t\t\t\t\t\t\t\treps: set.reps ?? null,\n\t\t\t\t\t\t\t\t\tdistance_meters: set.distanceMeters ?? null,\n\t\t\t\t\t\t\t\t\tduration_seconds: set.durationSeconds ?? null,\n\t\t\t\t\t\t\t\t\tcustom_metric: set.customMetric ?? null,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to create routine: Server returned no data\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst routine = formatRoutine(data);\n\t\t\treturn createJsonResponse(routine, {\n\t\t\t\tpretty: true,\n\t\t\t\tindent: 2,\n\t\t\t});\n\t\t}, \"create-routine\"),\n\t);\n\n\t// Update existing routine\n\tserver.tool(\n\t\t\"update-routine\",\n\t\t\"Update an existing routine by ID. You can modify the title, notes, and exercise configurations. Returns the updated routine with all changes applied.\",\n\t\t{\n\t\t\troutineId: z.string().min(1),\n\t\t\ttitle: z.string().min(1),\n\t\t\tnotes: z.string().optional(),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\trestSeconds: z.coerce.number().int().min(0).optional(),\n\t\t\t\t\tnotes: z.string().optional(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(async (args) => {\n\t\t\tconst { routineId, title, notes, exercises } =\n\t\t\t\targs as UpdateRoutineParams;\n\t\t\tconst data = await hevyClient.updateRoutine(routineId, {\n\t\t\t\troutine: {\n\t\t\t\t\ttitle,\n\t\t\t\t\tnotes: notes ?? null,\n\t\t\t\t\texercises: exercises.map(\n\t\t\t\t\t\t(exercise): PutRoutinesRequestExercise => ({\n\t\t\t\t\t\t\texercise_template_id: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsuperset_id: exercise.supersetId ?? null,\n\t\t\t\t\t\t\trest_seconds: exercise.restSeconds ?? null,\n\t\t\t\t\t\t\tnotes: exercise.notes ?? null,\n\t\t\t\t\t\t\tsets: exercise.sets.map(\n\t\t\t\t\t\t\t\t(set): PutRoutinesRequestSet => ({\n\t\t\t\t\t\t\t\t\ttype: set.type as PutRoutinesRequestSetTypeEnum,\n\t\t\t\t\t\t\t\t\tweight_kg: set.weightKg ?? null,\n\t\t\t\t\t\t\t\t\treps: set.reps ?? null,\n\t\t\t\t\t\t\t\t\tdistance_meters: set.distanceMeters ?? null,\n\t\t\t\t\t\t\t\t\tduration_seconds: set.durationSeconds ?? null,\n\t\t\t\t\t\t\t\t\tcustom_metric: set.customMetric ?? null,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t`Failed to update routine with ID ${routineId}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst routine = formatRoutine(data);\n\t\t\treturn createJsonResponse(routine, {\n\t\t\t\tpretty: true,\n\t\t\t\tindent: 2,\n\t\t\t});\n\t\t}, \"update-routine\"),\n\t);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n// Import types from generated client\nimport type { ExerciseTemplate } from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatExerciseTemplate } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n// Type definitions for the template operations\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n/**\n * Register all exercise template-related tools with the MCP server\n */\nexport function registerTemplateTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get exercise templates\n\tserver.tool(\n\t\t\"get-exercise-templates\",\n\t\t\"Get a paginated list of exercise templates (default and custom) with details like name, category, equipment, and muscle groups. Useful for browsing or searching available exercises.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(100).default(5),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({ page, pageSize }: { page: number; pageSize: number }) => {\n\t\t\t\tconst data = await hevyClient.getExerciseTemplates({\n\t\t\t\t\tpage,\n\t\t\t\t\tpageSize,\n\t\t\t\t});\n\n\t\t\t\t// Process exercise templates to extract relevant information\n\t\t\t\tconst templates =\n\t\t\t\t\tdata?.exercise_templates?.map((template: ExerciseTemplate) =>\n\t\t\t\t\t\tformatExerciseTemplate(template),\n\t\t\t\t\t) || [];\n\n\t\t\t\tif (templates.length === 0) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t\"No exercise templates found for the specified parameters\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn createJsonResponse(templates);\n\t\t\t},\n\t\t\t\"get-exercise-templates\",\n\t\t),\n\t);\n\n\t// Get single exercise template by ID\n\tserver.tool(\n\t\t\"get-exercise-template\",\n\t\t\"Get complete details of a specific exercise template by its ID, including name, category, equipment, muscle groups, and notes.\",\n\t\t{\n\t\t\texerciseTemplateId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({ exerciseTemplateId }: { exerciseTemplateId: string }) => {\n\t\t\t\tconst data = await hevyClient.getExerciseTemplate(exerciseTemplateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t`Exercise template with ID ${exerciseTemplateId} not found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst template = formatExerciseTemplate(data);\n\t\t\t\treturn createJsonResponse(template);\n\t\t\t},\n\t\t\t\"get-exercise-template\",\n\t\t),\n\t);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { webhookRequestBodySchema } from \"../generated/client/schemas/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n// Enhanced webhook URL validation\nconst webhookUrlSchema = z\n\t.string()\n\t.url()\n\t.refine(\n\t\t(url) => {\n\t\t\ttry {\n\t\t\t\tconst parsed = new URL(url);\n\t\t\t\treturn parsed.protocol === \"https:\" || parsed.protocol === \"http:\";\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: \"Webhook URL must be a valid HTTP or HTTPS URL\",\n\t\t},\n\t)\n\t.refine(\n\t\t(url) => {\n\t\t\ttry {\n\t\t\t\tconst parsed = new URL(url);\n\t\t\t\treturn (\n\t\t\t\t\tparsed.hostname !== \"localhost\" && !parsed.hostname.startsWith(\"127.\")\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: \"Webhook URL cannot be localhost or loopback address\",\n\t\t},\n\t);\n\nexport function registerWebhookTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get webhook subscription\n\tserver.tool(\n\t\t\"get-webhook-subscription\",\n\t\t\"Get the current webhook subscription for this account. Returns the webhook URL and auth token if a subscription exists.\",\n\t\t{},\n\t\twithErrorHandling(async () => {\n\t\t\tconst data = await hevyClient.getWebhookSubscription();\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"No webhook subscription found for this account\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createJsonResponse(data);\n\t\t}, \"get-webhook-subscription\"),\n\t);\n\n\t// Create webhook subscription\n\tserver.tool(\n\t\t\"create-webhook-subscription\",\n\t\t\"Create a new webhook subscription for this account. The webhook will receive POST requests when workouts are created. Your endpoint must respond with 200 OK within 5 seconds.\",\n\t\t{\n\t\t\turl: webhookUrlSchema.describe(\n\t\t\t\t\"The webhook URL that will receive POST requests when workouts are created\",\n\t\t\t),\n\t\t\tauthToken: z\n\t\t\t\t.string()\n\t\t\t\t.optional()\n\t\t\t\t.describe(\n\t\t\t\t\t\"Optional auth token that will be sent as Authorization header in webhook requests\",\n\t\t\t\t),\n\t\t},\n\t\twithErrorHandling(async ({ url, authToken }) => {\n\t\t\t// Validate the request body using the generated schema\n\t\t\tconst requestBody = webhookRequestBodySchema.parse({\n\t\t\t\turl,\n\t\t\t\tauthToken,\n\t\t\t});\n\n\t\t\tconst data = await hevyClient.createWebhookSubscription(requestBody);\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to create webhook subscription - please check your URL and try again\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createJsonResponse(data);\n\t\t}, \"create-webhook-subscription\"),\n\t);\n\n\t// Delete webhook subscription\n\tserver.tool(\n\t\t\"delete-webhook-subscription\",\n\t\t\"Delete the current webhook subscription for this account. This will stop all webhook notifications.\",\n\t\t{},\n\t\twithErrorHandling(async () => {\n\t\t\tconst data = await hevyClient.deleteWebhookSubscription();\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to delete webhook subscription - no subscription may exist or there was a server error\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createJsonResponse(data);\n\t\t}, \"delete-webhook-subscription\"),\n\t);\n}\n","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const deletedWorkoutSchema = z.object({\n type: z.string().describe('Indicates the type of the event (deleted)'),\n id: z.string().describe('The unique identifier of the deleted workout'),\n deleted_at: z.string().describe('A date string indicating when the workout was deleted').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const deleteV1WebhookSubscriptionHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid().describe('Your API key'),\n})\n\n/**\n * @description The webhook subscription was successfully deleted\n */\nexport const deleteV1WebhookSubscription200Schema = z.any()\n\nexport const deleteV1WebhookSubscriptionMutationResponseSchema = z.lazy(() => deleteV1WebhookSubscription200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const exerciseTemplateSchema = z.object({\n id: z.string().describe('The exercise template ID.').optional(),\n title: z.string().describe('The exercise title.').optional(),\n type: z.string().describe('The exercise type.').optional(),\n primary_muscle_group: z.string().describe('The primary muscle group of the exercise.').optional(),\n secondary_muscle_groups: z.array(z.string()).describe('The secondary muscle groups of the exercise.').optional(),\n is_custom: z.boolean().describe('A boolean indicating whether the exercise is a custom exercise.').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { exerciseTemplateSchema } from './exerciseTemplateSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1ExerciseTemplatesExercisetemplateidPathParamsSchema = z.object({\n exerciseTemplateId: z.any(),\n})\n\nexport const getV1ExerciseTemplatesExercisetemplateidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description Success\n */\nexport const getV1ExerciseTemplatesExercisetemplateid200Schema = z.lazy(() => exerciseTemplateSchema)\n\n/**\n * @description Exercise template not found\n */\nexport const getV1ExerciseTemplatesExercisetemplateid404Schema = z.any()\n\nexport const getV1ExerciseTemplatesExercisetemplateidQueryResponseSchema = z.lazy(() => getV1ExerciseTemplatesExercisetemplateid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { exerciseTemplateSchema } from './exerciseTemplateSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1ExerciseTemplatesQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 100)'),\n})\n\nexport const getV1ExerciseTemplatesHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of exercise templates\n */\nexport const getV1ExerciseTemplates200Schema = z.object({\n page: z.number().int().default(1).describe('Current page number'),\n page_count: z.number().int().default(5).describe('Total number of pages'),\n exercise_templates: z.array(z.lazy(() => exerciseTemplateSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1ExerciseTemplates400Schema = z.any()\n\nexport const getV1ExerciseTemplatesQueryResponseSchema = z.lazy(() => getV1ExerciseTemplates200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const routineFolderSchema = z.object({\n id: z.number().describe('The routine folder ID.').optional(),\n index: z.number().describe('The routine folder index. Describes the order of the folder in the list.').optional(),\n title: z.string().describe('The routine folder title.').optional(),\n updated_at: z.string().describe('ISO 8601 timestamp of when the folder was last updated.').optional(),\n created_at: z.string().describe('ISO 8601 timestamp of when the folder was created.').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineFolderSchema } from './routineFolderSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutineFoldersFolderidPathParamsSchema = z.object({\n folderId: z.any(),\n})\n\nexport const getV1RoutineFoldersFolderidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description Success\n */\nexport const getV1RoutineFoldersFolderid200Schema = z.lazy(() => routineFolderSchema)\n\n/**\n * @description Routine folder not found\n */\nexport const getV1RoutineFoldersFolderid404Schema = z.any()\n\nexport const getV1RoutineFoldersFolderidQueryResponseSchema = z.lazy(() => getV1RoutineFoldersFolderid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineFolderSchema } from './routineFolderSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutineFoldersQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n})\n\nexport const getV1RoutineFoldersHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of routine folders\n */\nexport const getV1RoutineFolders200Schema = z.object({\n page: z.number().int().default(1).describe('Current page number'),\n page_count: z.number().int().default(5).describe('Total number of pages'),\n routine_folders: z.array(z.lazy(() => routineFolderSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1RoutineFolders400Schema = z.any()\n\nexport const getV1RoutineFoldersQueryResponseSchema = z.lazy(() => getV1RoutineFolders200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const routineSchema = z.object({\n id: z.string().describe('The routine ID.').optional(),\n title: z.string().describe('The routine title.').optional(),\n folder_id: z.number().describe('The routine folder ID.').nullable().nullish(),\n updated_at: z.string().describe('ISO 8601 timestamp of when the routine was last updated.').optional(),\n created_at: z.string().describe('ISO 8601 timestamp of when the routine was created.').optional(),\n exercises: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the exercise in the routine.').optional(),\n title: z.string().describe('Title of the exercise').optional(),\n rest_seconds: z.string().describe('The rest time in seconds between sets of the exercise').optional(),\n notes: z.string().describe('Routine notes on the exercise').optional(),\n exercise_template_id: z.string().describe('The id of the exercise template. This can be used to fetch the exercise template.').optional(),\n supersets_id: z\n .number()\n .describe('The id of the superset that the exercise belongs to. A value of null indicates the exercise is not part of a superset.')\n .nullable()\n .nullish(),\n sets: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the set in the routine.').optional(),\n type: z.string().describe(\"The type of set. This can be one of 'normal', 'warmup', 'dropset', 'failure'\").optional(),\n weight_kg: z.number().describe('Weight lifted in kilograms.').nullable().nullish(),\n reps: z.number().describe('Number of reps logged for the set').nullable().nullish(),\n rep_range: z\n .object({\n start: z.number().describe('Starting rep count for the range').nullable().nullish(),\n end: z.number().describe('Ending rep count for the range').nullable().nullish(),\n })\n .describe('Range of reps for the set, if applicable')\n .nullable()\n .nullish(),\n distance_meters: z.number().describe('Number of meters logged for the set').nullable().nullish(),\n duration_seconds: z.number().describe('Number of seconds logged for the set').nullable().nullish(),\n rpe: z.number().describe('RPE (Relative perceived exertion) value logged for the set').nullable().nullish(),\n custom_metric: z\n .number()\n .describe('Custom metric logged for the set (Currently only used to log floors or steps for stair machine exercises)')\n .nullable()\n .nullish(),\n }),\n )\n .optional(),\n }),\n )\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutinesRoutineidPathParamsSchema = z.object({\n routineId: z.any(),\n})\n\nexport const getV1RoutinesRoutineidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine with the provided id\n */\nexport const getV1RoutinesRoutineid200Schema = z.object({\n routine: z.lazy(() => routineSchema).optional(),\n})\n\n/**\n * @description Invalid request body\n */\nexport const getV1RoutinesRoutineid400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const getV1RoutinesRoutineidQueryResponseSchema = z.lazy(() => getV1RoutinesRoutineid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutinesQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n})\n\nexport const getV1RoutinesHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of routines\n */\nexport const getV1Routines200Schema = z.object({\n page: z.number().int().describe('Current page number').optional(),\n page_count: z.number().int().describe('Total number of pages').optional(),\n routines: z.array(z.lazy(() => routineSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1Routines400Schema = z.any()\n\nexport const getV1RoutinesQueryResponseSchema = z.lazy(() => getV1Routines200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const getV1WebhookSubscriptionHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid().describe('Your API key'),\n})\n\n/**\n * @description The current webhook subscription\n */\nexport const getV1WebhookSubscription200Schema = z.object({\n url: z.string().describe('The webhook URL').optional(),\n auth_token: z.string().describe('The auth token for the webhook').optional(),\n})\n\n/**\n * @description No webhook subscription found\n */\nexport const getV1WebhookSubscription404Schema = z.any()\n\nexport const getV1WebhookSubscriptionQueryResponseSchema = z.lazy(() => getV1WebhookSubscription200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const getV1WorkoutsCountHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The total count of workouts\n */\nexport const getV1WorkoutsCount200Schema = z.object({\n workout_count: z.number().int().default(42).describe('The total number of workouts'),\n})\n\nexport const getV1WorkoutsCountQueryResponseSchema = z.lazy(() => getV1WorkoutsCount200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const workoutSchema = z.object({\n id: z.string().describe('The workout ID.').optional(),\n title: z.string().describe('The workout title.').optional(),\n description: z.string().describe('The workout description.').optional(),\n start_time: z.number().describe('ISO 8601 timestamp of when the workout was recorded to have started.').optional(),\n end_time: z.number().describe('ISO 8601 timestamp of when the workout was recorded to have ended.').optional(),\n updated_at: z.string().describe('ISO 8601 timestamp of when the workout was last updated.').optional(),\n created_at: z.string().describe('ISO 8601 timestamp of when the workout was created.').optional(),\n exercises: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the exercise in the workout.').optional(),\n title: z.string().describe('Title of the exercise').optional(),\n notes: z.string().describe('Notes on the exercise').optional(),\n exercise_template_id: z.string().describe('The id of the exercise template. This can be used to fetch the exercise template.').optional(),\n supersets_id: z\n .number()\n .describe('The id of the superset that the exercise belongs to. A value of null indicates the exercise is not part of a superset.')\n .nullable()\n .nullish(),\n sets: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the set in the workout.').optional(),\n type: z.string().describe(\"The type of set. This can be one of 'normal', 'warmup', 'dropset', 'failure'\").optional(),\n weight_kg: z.number().describe('Weight lifted in kilograms.').nullable().nullish(),\n reps: z.number().describe('Number of reps logged for the set').nullable().nullish(),\n distance_meters: z.number().describe('Number of meters logged for the set').nullable().nullish(),\n duration_seconds: z.number().describe('Number of seconds logged for the set').nullable().nullish(),\n rpe: z.number().describe('RPE (Relative perceived exertion) value logged for the set').nullable().nullish(),\n custom_metric: z\n .number()\n .describe('Custom metric logged for the set (Currently only used to log floors or steps for stair machine exercises)')\n .nullable()\n .nullish(),\n }),\n )\n .optional(),\n }),\n )\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const updatedWorkoutSchema = z.object({\n type: z.string().describe('Indicates the type of the event (updated)'),\n workout: z.lazy(() => workoutSchema),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { deletedWorkoutSchema } from './deletedWorkoutSchema.ts'\nimport { updatedWorkoutSchema } from './updatedWorkoutSchema.ts'\nimport { z } from 'zod'\n\nexport const paginatedWorkoutEventsSchema = z.object({\n page: z.number().int().describe('The current page number'),\n page_count: z.number().int().describe('The total number of pages available'),\n events: z\n .array(z.union([z.lazy(() => updatedWorkoutSchema), z.lazy(() => deletedWorkoutSchema)]))\n .describe('An array of workout events (either updated or deleted)'),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { paginatedWorkoutEventsSchema } from './paginatedWorkoutEventsSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1WorkoutsEventsQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n since: z.string().default('1970-01-01T00:00:00Z'),\n})\n\nexport const getV1WorkoutsEventsHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of workout events\n */\nexport const getV1WorkoutsEvents200Schema = z.lazy(() => paginatedWorkoutEventsSchema)\n\n/**\n * @description Internal Server Error\n */\nexport const getV1WorkoutsEvents500Schema = z.any()\n\nexport const getV1WorkoutsEventsQueryResponseSchema = z.lazy(() => getV1WorkoutsEvents200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1WorkoutsQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n})\n\nexport const getV1WorkoutsHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of workouts\n */\nexport const getV1Workouts200Schema = z.object({\n page: z.number().int().describe('Current page number').optional(),\n page_count: z.number().int().describe('Total number of pages').optional(),\n workouts: z.array(z.lazy(() => workoutSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1Workouts400Schema = z.any()\n\nexport const getV1WorkoutsQueryResponseSchema = z.lazy(() => getV1Workouts200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1WorkoutsWorkoutidPathParamsSchema = z.object({\n workoutId: z.any(),\n})\n\nexport const getV1WorkoutsWorkoutidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description Success\n */\nexport const getV1WorkoutsWorkoutid200Schema = z.lazy(() => workoutSchema)\n\n/**\n * @description Workout not found\n */\nexport const getV1WorkoutsWorkoutid404Schema = z.any()\n\nexport const getV1WorkoutsWorkoutidQueryResponseSchema = z.lazy(() => getV1WorkoutsWorkoutid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const postRoutineFolderRequestBodySchema = z.object({\n routine_folder: z\n .object({\n title: z.string().describe('The title of the routine folder.').optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const postRoutinesRequestSetSchema = z.object({\n type: z.enum(['warmup', 'normal', 'failure', 'dropset']).describe('The type of the set.').optional(),\n weight_kg: z.number().describe('The weight in kilograms.').nullable().nullish(),\n reps: z.number().int().describe('The number of repetitions.').nullable().nullish(),\n distance_meters: z.number().int().describe('The distance in meters.').nullable().nullish(),\n duration_seconds: z.number().int().describe('The duration in seconds.').nullable().nullish(),\n custom_metric: z.number().describe('A custom metric for the set. Currently used for steps and floors.').nullable().nullish(),\n rep_range: z\n .object({\n start: z.number().describe('Starting rep count for the range').nullable().nullish(),\n end: z.number().describe('Ending rep count for the range').nullable().nullish(),\n })\n .describe('Range of reps for the set, if applicable')\n .nullable()\n .nullish(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutinesRequestSetSchema } from './postRoutinesRequestSetSchema.ts'\nimport { z } from 'zod'\n\nexport const postRoutinesRequestExerciseSchema = z.object({\n exercise_template_id: z.string().describe('The ID of the exercise template.').optional(),\n superset_id: z.number().int().describe('The ID of the superset.').nullable().nullish(),\n rest_seconds: z.number().int().describe('The rest time in seconds.').nullable().nullish(),\n notes: z.string().describe('Additional notes for the exercise.').nullable().nullish(),\n sets: z.array(z.lazy(() => postRoutinesRequestSetSchema)).optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutinesRequestExerciseSchema } from './postRoutinesRequestExerciseSchema.ts'\nimport { z } from 'zod'\n\nexport const postRoutinesRequestBodySchema = z.object({\n routine: z\n .object({\n title: z.string().describe('The title of the routine.').optional(),\n folder_id: z\n .number()\n .describe('The folder id the routine should be added to. Pass null to insert the routine into default \"My Routines\" folder')\n .nullable()\n .nullish(),\n notes: z.string().describe('Additional notes for the routine.').optional(),\n exercises: z.array(z.lazy(() => postRoutinesRequestExerciseSchema)).optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutineFolderRequestBodySchema } from './postRoutineFolderRequestBodySchema.ts'\nimport { routineFolderSchema } from './routineFolderSchema.ts'\nimport { z } from 'zod'\n\nexport const postV1RoutineFoldersHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine folder was successfully created\n */\nexport const postV1RoutineFolders201Schema = z.lazy(() => routineFolderSchema)\n\n/**\n * @description Invalid request body\n */\nexport const postV1RoutineFolders400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1RoutineFoldersMutationRequestSchema = z.lazy(() => postRoutineFolderRequestBodySchema)\n\nexport const postV1RoutineFoldersMutationResponseSchema = z.lazy(() => postV1RoutineFolders201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutinesRequestBodySchema } from './postRoutinesRequestBodySchema.ts'\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const postV1RoutinesHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine was successfully created\n */\nexport const postV1Routines201Schema = z.lazy(() => routineSchema)\n\n/**\n * @description Invalid request body\n */\nexport const postV1Routines400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\n/**\n * @description Routine limit exceeded\n */\nexport const postV1Routines403Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1RoutinesMutationRequestSchema = z.lazy(() => postRoutinesRequestBodySchema)\n\nexport const postV1RoutinesMutationResponseSchema = z.lazy(() => postV1Routines201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const webhookRequestBodySchema = z.object({\n authToken: z.string().describe('The auth token that will be send as Authorization header in the webhook.').optional(),\n url: z.string().describe('The webhook URL.').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { webhookRequestBodySchema } from './webhookRequestBodySchema.ts'\nimport { z } from 'zod'\n\nexport const postV1WebhookSubscriptionHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The webhook subscription was successfully created\n */\nexport const postV1WebhookSubscription201Schema = z.any()\n\n/**\n * @description Invalid request body\n */\nexport const postV1WebhookSubscription400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1WebhookSubscriptionMutationRequestSchema = z.lazy(() => webhookRequestBodySchema)\n\nexport const postV1WebhookSubscriptionMutationResponseSchema = z.lazy(() => postV1WebhookSubscription201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const postWorkoutsRequestSetSchema = z.object({\n type: z.enum(['warmup', 'normal', 'failure', 'dropset']).describe('The type of the set.').optional(),\n weight_kg: z.number().describe('The weight in kilograms.').nullable().nullish(),\n reps: z.number().int().describe('The number of repetitions.').nullable().nullish(),\n distance_meters: z.number().int().describe('The distance in meters.').nullable().nullish(),\n duration_seconds: z.number().int().describe('The duration in seconds.').nullable().nullish(),\n custom_metric: z.number().describe('A custom metric for the set. Currently used for steps and floors.').nullable().nullish(),\n rpe: z\n .union([z.literal(6), z.literal(7), z.literal(7.5), z.literal(8), z.literal(8.5), z.literal(9), z.literal(9.5), z.literal(10)])\n .describe('The Rating of Perceived Exertion (RPE).')\n .nullable()\n .nullish(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestSetSchema } from './postWorkoutsRequestSetSchema.ts'\nimport { z } from 'zod'\n\nexport const postWorkoutsRequestExerciseSchema = z.object({\n exercise_template_id: z.string().describe('The ID of the exercise template.').optional(),\n superset_id: z.number().int().describe('The ID of the superset.').nullable().nullish(),\n notes: z.string().describe('Additional notes for the exercise.').nullable().nullish(),\n sets: z.array(z.lazy(() => postWorkoutsRequestSetSchema)).optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestExerciseSchema } from './postWorkoutsRequestExerciseSchema.ts'\nimport { z } from 'zod'\n\nexport const postWorkoutsRequestBodySchema = z.object({\n workout: z\n .object({\n title: z.string().describe('The title of the workout.').optional(),\n description: z.string().describe('A description for the workout workout.').nullable().nullish(),\n start_time: z.string().describe('The time the workout started.').optional(),\n end_time: z.string().describe('The time the workout ended.').optional(),\n is_private: z.boolean().describe('A boolean indicating if the workout is private.').optional(),\n exercises: z.array(z.lazy(() => postWorkoutsRequestExerciseSchema)).optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestBodySchema } from './postWorkoutsRequestBodySchema.ts'\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const postV1WorkoutsHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The workout was successfully created\n */\nexport const postV1Workouts201Schema = z.lazy(() => workoutSchema)\n\n/**\n * @description Invalid request body\n */\nexport const postV1Workouts400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1WorkoutsMutationRequestSchema = z.lazy(() => postWorkoutsRequestBodySchema)\n\nexport const postV1WorkoutsMutationResponseSchema = z.lazy(() => postV1Workouts201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const putRoutinesRequestSetSchema = z.object({\n type: z.enum(['warmup', 'normal', 'failure', 'dropset']).describe('The type of the set.').optional(),\n weight_kg: z.number().describe('The weight in kilograms.').nullable().nullish(),\n reps: z.number().int().describe('The number of repetitions.').nullable().nullish(),\n distance_meters: z.number().int().describe('The distance in meters.').nullable().nullish(),\n duration_seconds: z.number().int().describe('The duration in seconds.').nullable().nullish(),\n custom_metric: z.number().describe('A custom metric for the set. Currently used for steps and floors.').nullable().nullish(),\n rep_range: z\n .object({\n start: z.number().describe('Starting rep count for the range').nullable().nullish(),\n end: z.number().describe('Ending rep count for the range').nullable().nullish(),\n })\n .describe('Range of reps for the set, if applicable')\n .nullable()\n .nullish(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { putRoutinesRequestSetSchema } from './putRoutinesRequestSetSchema.ts'\nimport { z } from 'zod'\n\nexport const putRoutinesRequestExerciseSchema = z.object({\n exercise_template_id: z.string().describe('The ID of the exercise template.').optional(),\n superset_id: z.number().int().describe('The ID of the superset.').nullable().nullish(),\n rest_seconds: z.number().int().describe('The rest time in seconds.').nullable().nullish(),\n notes: z.string().describe('Additional notes for the exercise.').nullable().nullish(),\n sets: z.array(z.lazy(() => putRoutinesRequestSetSchema)).optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { putRoutinesRequestExerciseSchema } from './putRoutinesRequestExerciseSchema.ts'\nimport { z } from 'zod'\n\nexport const putRoutinesRequestBodySchema = z.object({\n routine: z\n .object({\n title: z.string().describe('The title of the routine.').optional(),\n notes: z.string().describe('Additional notes for the routine.').nullable().nullish(),\n exercises: z.array(z.lazy(() => putRoutinesRequestExerciseSchema)).optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { putRoutinesRequestBodySchema } from './putRoutinesRequestBodySchema.ts'\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const putV1RoutinesRoutineidPathParamsSchema = z.object({\n routineId: z.any(),\n})\n\nexport const putV1RoutinesRoutineidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine was successfully updated\n */\nexport const putV1RoutinesRoutineid200Schema = z.lazy(() => routineSchema)\n\n/**\n * @description Invalid request body\n */\nexport const putV1RoutinesRoutineid400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\n/**\n * @description Routine doesn\\'t exist or doesn\\'t belong to the user\n */\nexport const putV1RoutinesRoutineid404Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const putV1RoutinesRoutineidMutationRequestSchema = z.lazy(() => putRoutinesRequestBodySchema)\n\nexport const putV1RoutinesRoutineidMutationResponseSchema = z.lazy(() => putV1RoutinesRoutineid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestBodySchema } from './postWorkoutsRequestBodySchema.ts'\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const putV1WorkoutsWorkoutidPathParamsSchema = z.object({\n workoutId: z.any(),\n})\n\nexport const putV1WorkoutsWorkoutidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The workout was successfully updated\n */\nexport const putV1WorkoutsWorkoutid200Schema = z.lazy(() => workoutSchema)\n\n/**\n * @description Invalid request body\n */\nexport const putV1WorkoutsWorkoutid400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const putV1WorkoutsWorkoutidMutationRequestSchema = z.lazy(() => postWorkoutsRequestBodySchema)\n\nexport const putV1WorkoutsWorkoutidMutationResponseSchema = z.lazy(() => putV1WorkoutsWorkoutid200Schema)","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { HevyClient } from \"../generated/client/hevyClient.js\";\nimport type { PostWorkoutsRequestBody } from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatWorkout } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n/**\n * Type definition for exercise set types\n */\ntype SetType = \"warmup\" | \"normal\" | \"failure\" | \"dropset\";\n\n/**\n * Interface for exercise set input\n */\ninterface ExerciseSetInput {\n\ttype: SetType;\n\tweightKg?: number | null;\n\treps?: number | null;\n\tdistanceMeters?: number | null;\n\tdurationSeconds?: number | null;\n\trpe?: number | null;\n\tcustomMetric?: number | null;\n}\n\n/**\n * Interface for exercise input\n */\ninterface ExerciseInput {\n\texerciseTemplateId: string;\n\tsupersetId?: number | null;\n\tnotes?: string | null;\n\tsets: ExerciseSetInput[];\n}\n\n/**\n * Register all workout-related tools with the MCP server\n */\nexport function registerWorkoutTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get workouts\n\tserver.tool(\n\t\t\"get-workouts\",\n\t\t\"Get a paginated list of workouts. Returns workout details including title, description, start/end times, and exercises performed. Results are ordered from newest to oldest.\",\n\t\t{\n\t\t\tpage: z.coerce.number().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t},\n\t\twithErrorHandling(async ({ page, pageSize }) => {\n\t\t\tconst data = await hevyClient.getWorkouts({\n\t\t\t\tpage,\n\t\t\t\tpageSize,\n\t\t\t});\n\n\t\t\t// Process workouts to extract relevant information\n\t\t\tconst workouts =\n\t\t\t\tdata?.workouts?.map((workout) => formatWorkout(workout)) || [];\n\n\t\t\tif (workouts.length === 0) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"No workouts found for the specified parameters\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn createJsonResponse(workouts);\n\t\t}, \"get-workouts\"),\n\t);\n\n\t// Get single workout by ID\n\tserver.tool(\n\t\t\"get-workout\",\n\t\t\"Get complete details of a specific workout by ID. Returns all workout information including title, description, start/end times, and detailed exercise data.\",\n\t\t{\n\t\t\tworkoutId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ workoutId }) => {\n\t\t\tconst data = await hevyClient.getWorkout(workoutId);\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(`Workout with ID ${workoutId} not found`);\n\t\t\t}\n\n\t\t\tconst workout = formatWorkout(data);\n\t\t\treturn createJsonResponse(workout);\n\t\t}, \"get-workout\"),\n\t);\n\n\t// Get workout count\n\tserver.tool(\n\t\t\"get-workout-count\",\n\t\t\"Get the total number of workouts on the account. Useful for pagination or statistics.\",\n\t\t{},\n\t\twithErrorHandling(async () => {\n\t\t\tconst data = await hevyClient.getWorkoutCount();\n\t\t\t// Use type assertion to access count property\n\t\t\tconst count = data\n\t\t\t\t? (data as { workoutCount?: number }).workoutCount || 0\n\t\t\t\t: 0;\n\t\t\treturn createJsonResponse({ count });\n\t\t}, \"get-workout-count\"),\n\t);\n\n\t// Get workout events (updates/deletes)\n\tserver.tool(\n\t\t\"get-workout-events\",\n\t\t\"Retrieve a paged list of workout events (updates or deletes) since a given date. Events are ordered from newest to oldest. The intention is to allow clients to keep their local cache of workouts up to date without having to fetch the entire list of workouts.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t\tsince: z.string().default(\"1970-01-01T00:00:00Z\"),\n\t\t},\n\t\twithErrorHandling(async ({ page, pageSize, since }) => {\n\t\t\tconst data = await hevyClient.getWorkoutEvents({\n\t\t\t\tpage,\n\t\t\t\tpageSize,\n\t\t\t\tsince,\n\t\t\t});\n\n\t\t\tconst events = data?.events || [];\n\n\t\t\tif (events.length === 0) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t`No workout events found for the specified parameters since ${since}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn createJsonResponse(events);\n\t\t}, \"get-workout-events\"),\n\t);\n\n\t// Create workout\n\tserver.tool(\n\t\t\"create-workout\",\n\t\t\"Create a new workout in your Hevy account. Requires title, start/end times, and at least one exercise with sets. Returns the complete workout details upon successful creation including the newly assigned workout ID.\",\n\t\t{\n\t\t\ttitle: z.string().min(1),\n\t\t\tdescription: z.string().optional().nullable(),\n\t\t\tstartTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tendTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tisPrivate: z.boolean().default(false),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\tnotes: z.string().optional().nullable(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\trpe: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tstartTime,\n\t\t\t\tendTime,\n\t\t\t\tisPrivate,\n\t\t\t\texercises,\n\t\t\t}) => {\n\t\t\t\tconst requestBody: PostWorkoutsRequestBody = {\n\t\t\t\t\tworkout: {\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription: description || null,\n\t\t\t\t\t\tstartTime,\n\t\t\t\t\t\tendTime,\n\t\t\t\t\t\tisPrivate,\n\t\t\t\t\t\texercises: exercises.map((exercise: ExerciseInput) => ({\n\t\t\t\t\t\t\texerciseTemplateId: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsupersetId: exercise.supersetId || null,\n\t\t\t\t\t\t\tnotes: exercise.notes || null,\n\t\t\t\t\t\t\tsets: exercise.sets.map((set: ExerciseSetInput) => ({\n\t\t\t\t\t\t\t\ttype: set.type,\n\t\t\t\t\t\t\t\tweightKg: set.weightKg || null,\n\t\t\t\t\t\t\t\treps: set.reps || null,\n\t\t\t\t\t\t\t\tdistanceMeters: set.distanceMeters || null,\n\t\t\t\t\t\t\t\tdurationSeconds: set.durationSeconds || null,\n\t\t\t\t\t\t\t\trpe: set.rpe || null,\n\t\t\t\t\t\t\t\tcustomMetric: set.customMetric || null,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t})),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst data = await hevyClient.createWorkout(requestBody);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t\"Failed to create workout: Server returned no data\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst workout = formatWorkout(data);\n\t\t\t\treturn createJsonResponse(workout, {\n\t\t\t\t\tpretty: true,\n\t\t\t\t\tindent: 2,\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"create-workout\",\n\t\t),\n\t);\n\n\t// Update workout\n\tserver.tool(\n\t\t\"update-workout\",\n\t\t\"Update an existing workout by ID. You can modify the title, description, start/end times, privacy setting, and exercise data. Returns the updated workout with all changes applied.\",\n\t\t{\n\t\t\tworkoutId: z.string().min(1),\n\t\t\ttitle: z.string().min(1),\n\t\t\tdescription: z.string().optional().nullable(),\n\t\t\tstartTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tendTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tisPrivate: z.boolean().default(false),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\tnotes: z.string().optional().nullable(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\trpe: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({\n\t\t\t\tworkoutId,\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tstartTime,\n\t\t\t\tendTime,\n\t\t\t\tisPrivate,\n\t\t\t\texercises,\n\t\t\t}) => {\n\t\t\t\tconst requestBody: PostWorkoutsRequestBody = {\n\t\t\t\t\tworkout: {\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription: description || null,\n\t\t\t\t\t\tstartTime,\n\t\t\t\t\t\tendTime,\n\t\t\t\t\t\tisPrivate,\n\t\t\t\t\t\texercises: exercises.map((exercise: ExerciseInput) => ({\n\t\t\t\t\t\t\texerciseTemplateId: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsupersetId: exercise.supersetId || null,\n\t\t\t\t\t\t\tnotes: exercise.notes || null,\n\t\t\t\t\t\t\tsets: exercise.sets.map((set: ExerciseSetInput) => ({\n\t\t\t\t\t\t\t\ttype: set.type,\n\t\t\t\t\t\t\t\tweightKg: set.weightKg || null,\n\t\t\t\t\t\t\t\treps: set.reps || null,\n\t\t\t\t\t\t\t\tdistanceMeters: set.distanceMeters || null,\n\t\t\t\t\t\t\t\tdurationSeconds: set.durationSeconds || null,\n\t\t\t\t\t\t\t\trpe: set.rpe || null,\n\t\t\t\t\t\t\t\tcustomMetric: set.customMetric || null,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t})),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst data = await hevyClient.updateWorkout(workoutId, requestBody);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t`Failed to update workout with ID ${workoutId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst workout = formatWorkout(data);\n\t\t\t\treturn createJsonResponse(workout, {\n\t\t\t\t\tpretty: true,\n\t\t\t\t\tindent: 2,\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"update-workout-operation\",\n\t\t),\n\t);\n}\n","import type {\n\tRequestConfig,\n\tResponseConfig,\n} from \"@kubb/plugin-client/clients/axios\";\nimport axios from \"axios\";\nimport * as api from \"../generated/client/api\";\nimport type {\n\tGetV1ExerciseTemplatesQueryParams,\n\tGetV1RoutineFoldersQueryParams,\n\tGetV1RoutinesQueryParams,\n\tGetV1WorkoutsEventsQueryParams,\n\tGetV1WorkoutsQueryParams,\n\tPostV1RoutineFoldersMutationRequest,\n\tPostV1RoutinesMutationRequest,\n\tPostV1WorkoutsMutationRequest,\n\tPutV1RoutinesRoutineidMutationRequest,\n\tPutV1WorkoutsWorkoutidMutationRequest,\n} from \"../generated/client/types\";\n\n// Define a proper client type that matches the Kubb client interface\ntype KubbClient = {\n\t<TData, _TError = unknown, TVariables = unknown>(\n\t\tconfig: RequestConfig<TVariables>,\n\t): Promise<ResponseConfig<TData>>;\n\tgetConfig: () => Partial<RequestConfig<unknown>>;\n\tsetConfig: (config: RequestConfig) => Partial<RequestConfig<unknown>>;\n};\n\nexport function createClient(\n\tapiKey: string,\n\tbaseUrl = \"https://api.hevyapp.com\",\n) {\n\t// Create an axios instance with the API key\n\tconst axiosInstance = axios.create({\n\t\tbaseURL: baseUrl,\n\t\theaders: {\n\t\t\t\"api-key\": apiKey,\n\t\t},\n\t});\n\n\t// Create headers object with API key\n\tconst headers = {\n\t\t\"api-key\": apiKey,\n\t};\n\n\t// Cast axios instance to the expected client type\n\tconst client = axiosInstance as unknown as KubbClient;\n\n\t// Return an object with all the API methods using ReturnType for automatic type inference\n\treturn {\n\t\t// Workouts\n\t\tgetWorkouts: (\n\t\t\tparams?: GetV1WorkoutsQueryParams,\n\t\t): ReturnType<typeof api.getV1Workouts> =>\n\t\t\tapi.getV1Workouts(headers, params, { client }),\n\t\tgetWorkout: (\n\t\t\tworkoutId: string,\n\t\t): ReturnType<typeof api.getV1WorkoutsWorkoutid> =>\n\t\t\tapi.getV1WorkoutsWorkoutid(workoutId, headers, { client }),\n\t\tcreateWorkout: (\n\t\t\tdata: PostV1WorkoutsMutationRequest,\n\t\t): ReturnType<typeof api.postV1Workouts> =>\n\t\t\tapi.postV1Workouts(headers, data, { client }),\n\t\tupdateWorkout: (\n\t\t\tworkoutId: string,\n\t\t\tdata: PutV1WorkoutsWorkoutidMutationRequest,\n\t\t): ReturnType<typeof api.putV1WorkoutsWorkoutid> =>\n\t\t\tapi.putV1WorkoutsWorkoutid(workoutId, headers, data, {\n\t\t\t\tclient,\n\t\t\t}),\n\t\tgetWorkoutCount: (): ReturnType<typeof api.getV1WorkoutsCount> =>\n\t\t\tapi.getV1WorkoutsCount(headers, { client }),\n\t\tgetWorkoutEvents: (\n\t\t\tparams?: GetV1WorkoutsEventsQueryParams,\n\t\t): ReturnType<typeof api.getV1WorkoutsEvents> =>\n\t\t\tapi.getV1WorkoutsEvents(headers, params, { client }),\n\n\t\t// Routines\n\t\tgetRoutines: (\n\t\t\tparams?: GetV1RoutinesQueryParams,\n\t\t): ReturnType<typeof api.getV1Routines> =>\n\t\t\tapi.getV1Routines(headers, params, { client }),\n\t\tgetRoutineById: (\n\t\t\troutineId: string,\n\t\t): ReturnType<typeof api.getV1RoutinesRoutineid> =>\n\t\t\tapi.getV1RoutinesRoutineid(routineId, headers, { client }),\n\t\tcreateRoutine: (\n\t\t\tdata: PostV1RoutinesMutationRequest,\n\t\t): ReturnType<typeof api.postV1Routines> =>\n\t\t\tapi.postV1Routines(headers, data, { client }),\n\t\tupdateRoutine: (\n\t\t\troutineId: string,\n\t\t\tdata: PutV1RoutinesRoutineidMutationRequest,\n\t\t): ReturnType<typeof api.putV1RoutinesRoutineid> =>\n\t\t\tapi.putV1RoutinesRoutineid(routineId, headers, data, {\n\t\t\t\tclient,\n\t\t\t}),\n\n\t\t// Exercise Templates\n\t\tgetExerciseTemplates: (\n\t\t\tparams?: GetV1ExerciseTemplatesQueryParams,\n\t\t): ReturnType<typeof api.getV1ExerciseTemplates> =>\n\t\t\tapi.getV1ExerciseTemplates(headers, params, { client }),\n\t\tgetExerciseTemplate: (\n\t\t\ttemplateId: string,\n\t\t): ReturnType<typeof api.getV1ExerciseTemplatesExercisetemplateid> =>\n\t\t\tapi.getV1ExerciseTemplatesExercisetemplateid(templateId, headers, {\n\t\t\t\tclient,\n\t\t\t}),\n\n\t\t// Routine Folders\n\t\tgetRoutineFolders: (\n\t\t\tparams?: GetV1RoutineFoldersQueryParams,\n\t\t): ReturnType<typeof api.getV1RoutineFolders> =>\n\t\t\tapi.getV1RoutineFolders(headers, params, { client }),\n\t\tcreateRoutineFolder: (\n\t\t\tdata: PostV1RoutineFoldersMutationRequest,\n\t\t): ReturnType<typeof api.postV1RoutineFolders> =>\n\t\t\tapi.postV1RoutineFolders(headers, data, { client }),\n\t\tgetRoutineFolder: (\n\t\t\tfolderId: string,\n\t\t): ReturnType<typeof api.getV1RoutineFoldersFolderid> =>\n\t\t\tapi.getV1RoutineFoldersFolderid(folderId, headers, {\n\t\t\t\tclient,\n\t\t\t}),\n\n\t\t// Webhooks\n\t\tgetWebhookSubscription: (): ReturnType<\n\t\t\ttypeof api.getV1WebhookSubscription\n\t\t> => api.getV1WebhookSubscription(headers, { client }),\n\t\tcreateWebhookSubscription: (\n\t\t\tdata: import(\"../generated/client/types\").PostV1WebhookSubscriptionMutationRequest,\n\t\t): ReturnType<typeof api.postV1WebhookSubscription> =>\n\t\t\tapi.postV1WebhookSubscription(headers, data, { client }),\n\t\tdeleteWebhookSubscription: (): ReturnType<\n\t\t\ttypeof api.deleteV1WebhookSubscription\n\t\t> => api.deleteV1WebhookSubscription(headers, { client }),\n\t};\n}\n","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { DeleteV1WebhookSubscriptionMutationResponse, DeleteV1WebhookSubscriptionHeaderParams } from '../types/DeleteV1WebhookSubscription.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getDeleteV1WebhookSubscriptionUrl() {\n return `/v1/webhook-subscription` as const\n}\n\n/**\n * @summary Delete a webhook subscription.\n * {@link /v1/webhook-subscription}\n */\nexport async function deleteV1WebhookSubscription(\n headers: DeleteV1WebhookSubscriptionHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<DeleteV1WebhookSubscriptionMutationResponse, ResponseErrorConfig<Error>, unknown>({\n method: 'DELETE',\n url: getDeleteV1WebhookSubscriptionUrl().toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1ExerciseTemplatesQueryResponse,\n GetV1ExerciseTemplatesQueryParams,\n GetV1ExerciseTemplatesHeaderParams,\n GetV1ExerciseTemplates400,\n} from '../types/GetV1ExerciseTemplates.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1ExerciseTemplatesUrl() {\n return `/v1/exercise_templates` as const\n}\n\n/**\n * @summary Get a paginated list of exercise templates available on the account.\n * {@link /v1/exercise_templates}\n */\nexport async function getV1ExerciseTemplates(\n headers: GetV1ExerciseTemplatesHeaderParams,\n params?: GetV1ExerciseTemplatesQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1ExerciseTemplatesQueryResponse, ResponseErrorConfig<GetV1ExerciseTemplates400>, unknown>({\n method: 'GET',\n url: getGetV1ExerciseTemplatesUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1ExerciseTemplatesExercisetemplateidQueryResponse,\n GetV1ExerciseTemplatesExercisetemplateidPathParams,\n GetV1ExerciseTemplatesExercisetemplateidHeaderParams,\n GetV1ExerciseTemplatesExercisetemplateid404,\n} from '../types/GetV1ExerciseTemplatesExercisetemplateid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1ExerciseTemplatesExercisetemplateidUrl(exerciseTemplateId: GetV1ExerciseTemplatesExercisetemplateidPathParams['exerciseTemplateId']) {\n return `/v1/exercise_templates/${exerciseTemplateId}` as const\n}\n\n/**\n * @summary Get a single exercise template by id.\n * {@link /v1/exercise_templates/:exerciseTemplateId}\n */\nexport async function getV1ExerciseTemplatesExercisetemplateid(\n exerciseTemplateId: GetV1ExerciseTemplatesExercisetemplateidPathParams['exerciseTemplateId'],\n headers: GetV1ExerciseTemplatesExercisetemplateidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1ExerciseTemplatesExercisetemplateidQueryResponse, ResponseErrorConfig<GetV1ExerciseTemplatesExercisetemplateid404>, unknown>({\n method: 'GET',\n url: getGetV1ExerciseTemplatesExercisetemplateidUrl(exerciseTemplateId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1RoutineFoldersQueryResponse,\n GetV1RoutineFoldersQueryParams,\n GetV1RoutineFoldersHeaderParams,\n GetV1RoutineFolders400,\n} from '../types/GetV1RoutineFolders.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutineFoldersUrl() {\n return `/v1/routine_folders` as const\n}\n\n/**\n * @summary Get a paginated list of routine folders available on the account.\n * {@link /v1/routine_folders}\n */\nexport async function getV1RoutineFolders(\n headers: GetV1RoutineFoldersHeaderParams,\n params?: GetV1RoutineFoldersQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutineFoldersQueryResponse, ResponseErrorConfig<GetV1RoutineFolders400>, unknown>({\n method: 'GET',\n url: getGetV1RoutineFoldersUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1RoutineFoldersFolderidQueryResponse,\n GetV1RoutineFoldersFolderidPathParams,\n GetV1RoutineFoldersFolderidHeaderParams,\n GetV1RoutineFoldersFolderid404,\n} from '../types/GetV1RoutineFoldersFolderid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutineFoldersFolderidUrl(folderId: GetV1RoutineFoldersFolderidPathParams['folderId']) {\n return `/v1/routine_folders/${folderId}` as const\n}\n\n/**\n * @summary Get a single routine folder by id.\n * {@link /v1/routine_folders/:folderId}\n */\nexport async function getV1RoutineFoldersFolderid(\n folderId: GetV1RoutineFoldersFolderidPathParams['folderId'],\n headers: GetV1RoutineFoldersFolderidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutineFoldersFolderidQueryResponse, ResponseErrorConfig<GetV1RoutineFoldersFolderid404>, unknown>({\n method: 'GET',\n url: getGetV1RoutineFoldersFolderidUrl(folderId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { GetV1RoutinesQueryResponse, GetV1RoutinesQueryParams, GetV1RoutinesHeaderParams, GetV1Routines400 } from '../types/GetV1Routines.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutinesUrl() {\n return `/v1/routines` as const\n}\n\n/**\n * @summary Get a paginated list of routines\n * {@link /v1/routines}\n */\nexport async function getV1Routines(\n headers: GetV1RoutinesHeaderParams,\n params?: GetV1RoutinesQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutinesQueryResponse, ResponseErrorConfig<GetV1Routines400>, unknown>({\n method: 'GET',\n url: getGetV1RoutinesUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1RoutinesRoutineidQueryResponse,\n GetV1RoutinesRoutineidPathParams,\n GetV1RoutinesRoutineidHeaderParams,\n GetV1RoutinesRoutineid400,\n} from '../types/GetV1RoutinesRoutineid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutinesRoutineidUrl(routineId: GetV1RoutinesRoutineidPathParams['routineId']) {\n return `/v1/routines/${routineId}` as const\n}\n\n/**\n * @summary Get a routine by its Id\n * {@link /v1/routines/:routineId}\n */\nexport async function getV1RoutinesRoutineid(\n routineId: GetV1RoutinesRoutineidPathParams['routineId'],\n headers: GetV1RoutinesRoutineidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutinesRoutineidQueryResponse, ResponseErrorConfig<GetV1RoutinesRoutineid400>, unknown>({\n method: 'GET',\n url: getGetV1RoutinesRoutineidUrl(routineId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1WebhookSubscriptionQueryResponse,\n GetV1WebhookSubscriptionHeaderParams,\n GetV1WebhookSubscription404,\n} from '../types/GetV1WebhookSubscription.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WebhookSubscriptionUrl() {\n return `/v1/webhook-subscription` as const\n}\n\n/**\n * @summary Get the current webhook subscription.\n * {@link /v1/webhook-subscription}\n */\nexport async function getV1WebhookSubscription(headers: GetV1WebhookSubscriptionHeaderParams, config: Partial<RequestConfig> & { client?: typeof fetch } = {}) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WebhookSubscriptionQueryResponse, ResponseErrorConfig<GetV1WebhookSubscription404>, unknown>({\n method: 'GET',\n url: getGetV1WebhookSubscriptionUrl().toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { GetV1WorkoutsQueryResponse, GetV1WorkoutsQueryParams, GetV1WorkoutsHeaderParams, GetV1Workouts400 } from '../types/GetV1Workouts.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsUrl() {\n return `/v1/workouts` as const\n}\n\n/**\n * @summary Get a paginated list of workouts\n * {@link /v1/workouts}\n */\nexport async function getV1Workouts(\n headers: GetV1WorkoutsHeaderParams,\n params?: GetV1WorkoutsQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsQueryResponse, ResponseErrorConfig<GetV1Workouts400>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { GetV1WorkoutsCountQueryResponse, GetV1WorkoutsCountHeaderParams } from '../types/GetV1WorkoutsCount.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsCountUrl() {\n return `/v1/workouts/count` as const\n}\n\n/**\n * @summary Get the total number of workouts on the account\n * {@link /v1/workouts/count}\n */\nexport async function getV1WorkoutsCount(headers: GetV1WorkoutsCountHeaderParams, config: Partial<RequestConfig> & { client?: typeof fetch } = {}) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsCountQueryResponse, ResponseErrorConfig<Error>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsCountUrl().toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1WorkoutsEventsQueryResponse,\n GetV1WorkoutsEventsQueryParams,\n GetV1WorkoutsEventsHeaderParams,\n GetV1WorkoutsEvents500,\n} from '../types/GetV1WorkoutsEvents.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsEventsUrl() {\n return `/v1/workouts/events` as const\n}\n\n/**\n * @description Returns a paginated array of workout events, indicating updates or deletions.\n * @summary Retrieve a paged list of workout events (updates or deletes) since a given date. Events are ordered from newest to oldest. The intention is to allow clients to keep their local cache of workouts up to date without having to fetch the entire list of workouts.\n * {@link /v1/workouts/events}\n */\nexport async function getV1WorkoutsEvents(\n headers: GetV1WorkoutsEventsHeaderParams,\n params?: GetV1WorkoutsEventsQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsEventsQueryResponse, ResponseErrorConfig<GetV1WorkoutsEvents500>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsEventsUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1WorkoutsWorkoutidQueryResponse,\n GetV1WorkoutsWorkoutidPathParams,\n GetV1WorkoutsWorkoutidHeaderParams,\n GetV1WorkoutsWorkoutid404,\n} from '../types/GetV1WorkoutsWorkoutid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsWorkoutidUrl(workoutId: GetV1WorkoutsWorkoutidPathParams['workoutId']) {\n return `/v1/workouts/${workoutId}` as const\n}\n\n/**\n * @summary Get a single workout’s complete details by the workoutId\n * {@link /v1/workouts/:workoutId}\n */\nexport async function getV1WorkoutsWorkoutid(\n workoutId: GetV1WorkoutsWorkoutidPathParams['workoutId'],\n headers: GetV1WorkoutsWorkoutidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsWorkoutidQueryResponse, ResponseErrorConfig<GetV1WorkoutsWorkoutid404>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsWorkoutidUrl(workoutId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PostV1RoutineFoldersMutationRequest,\n PostV1RoutineFoldersMutationResponse,\n PostV1RoutineFoldersHeaderParams,\n PostV1RoutineFolders400,\n} from '../types/PostV1RoutineFolders.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1RoutineFoldersUrl() {\n return `/v1/routine_folders` as const\n}\n\n/**\n * @summary Create a new routine folder. The folder will be created at index 0, and all other folders will have their indexes incremented.\n * {@link /v1/routine_folders}\n */\nexport async function postV1RoutineFolders(\n headers: PostV1RoutineFoldersHeaderParams,\n data?: PostV1RoutineFoldersMutationRequest,\n config: Partial<RequestConfig<PostV1RoutineFoldersMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PostV1RoutineFoldersMutationResponse, ResponseErrorConfig<PostV1RoutineFolders400>, PostV1RoutineFoldersMutationRequest>({\n method: 'POST',\n url: getPostV1RoutineFoldersUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PostV1RoutinesMutationRequest,\n PostV1RoutinesMutationResponse,\n PostV1RoutinesHeaderParams,\n PostV1Routines400,\n PostV1Routines403,\n} from '../types/PostV1Routines.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1RoutinesUrl() {\n return `/v1/routines` as const\n}\n\n/**\n * @summary Create a new routine\n * {@link /v1/routines}\n */\nexport async function postV1Routines(\n headers: PostV1RoutinesHeaderParams,\n data?: PostV1RoutinesMutationRequest,\n config: Partial<RequestConfig<PostV1RoutinesMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PostV1RoutinesMutationResponse, ResponseErrorConfig<PostV1Routines400 | PostV1Routines403>, PostV1RoutinesMutationRequest>({\n method: 'POST',\n url: getPostV1RoutinesUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PostV1WebhookSubscriptionMutationRequest,\n PostV1WebhookSubscriptionMutationResponse,\n PostV1WebhookSubscriptionHeaderParams,\n PostV1WebhookSubscription400,\n} from '../types/PostV1WebhookSubscription.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1WebhookSubscriptionUrl() {\n return `/v1/webhook-subscription` as const\n}\n\n/**\n * @description This endpoint allows you to create a webhook subscription that will notify your application when a workout is created. Your endpoint must respond with a `200 OK` status within **5 seconds**, otherwise the delivery will be retried.When a new workout is created, we will send a POST request to your provided URL with the following JSON payload:```json { \"id\": \"00000000-0000-0000-0000-000000000001\", \"payload\": { \"workoutId\": \"f1085cdb-32b2-4003-967d-53a3af8eaecb\" }}\n * @summary Create a new webhook subscription.\n * {@link /v1/webhook-subscription}\n */\nexport async function postV1WebhookSubscription(\n headers: PostV1WebhookSubscriptionHeaderParams,\n data?: PostV1WebhookSubscriptionMutationRequest,\n config: Partial<RequestConfig<PostV1WebhookSubscriptionMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<\n PostV1WebhookSubscriptionMutationResponse,\n ResponseErrorConfig<PostV1WebhookSubscription400>,\n PostV1WebhookSubscriptionMutationRequest\n >({\n method: 'POST',\n url: getPostV1WebhookSubscriptionUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { PostV1WorkoutsMutationRequest, PostV1WorkoutsMutationResponse, PostV1WorkoutsHeaderParams, PostV1Workouts400 } from '../types/PostV1Workouts.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1WorkoutsUrl() {\n return `/v1/workouts` as const\n}\n\n/**\n * @summary Create a new workout\n * {@link /v1/workouts}\n */\nexport async function postV1Workouts(\n headers: PostV1WorkoutsHeaderParams,\n data?: PostV1WorkoutsMutationRequest,\n config: Partial<RequestConfig<PostV1WorkoutsMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PostV1WorkoutsMutationResponse, ResponseErrorConfig<PostV1Workouts400>, PostV1WorkoutsMutationRequest>({\n method: 'POST',\n url: getPostV1WorkoutsUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PutV1RoutinesRoutineidMutationRequest,\n PutV1RoutinesRoutineidMutationResponse,\n PutV1RoutinesRoutineidPathParams,\n PutV1RoutinesRoutineidHeaderParams,\n PutV1RoutinesRoutineid400,\n PutV1RoutinesRoutineid404,\n} from '../types/PutV1RoutinesRoutineid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPutV1RoutinesRoutineidUrl(routineId: PutV1RoutinesRoutineidPathParams['routineId']) {\n return `/v1/routines/${routineId}` as const\n}\n\n/**\n * @summary Update an existing routine\n * {@link /v1/routines/:routineId}\n */\nexport async function putV1RoutinesRoutineid(\n routineId: PutV1RoutinesRoutineidPathParams['routineId'],\n headers: PutV1RoutinesRoutineidHeaderParams,\n data?: PutV1RoutinesRoutineidMutationRequest,\n config: Partial<RequestConfig<PutV1RoutinesRoutineidMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<\n PutV1RoutinesRoutineidMutationResponse,\n ResponseErrorConfig<PutV1RoutinesRoutineid400 | PutV1RoutinesRoutineid404>,\n PutV1RoutinesRoutineidMutationRequest\n >({\n method: 'PUT',\n url: getPutV1RoutinesRoutineidUrl(routineId).toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PutV1WorkoutsWorkoutidMutationRequest,\n PutV1WorkoutsWorkoutidMutationResponse,\n PutV1WorkoutsWorkoutidPathParams,\n PutV1WorkoutsWorkoutidHeaderParams,\n PutV1WorkoutsWorkoutid400,\n} from '../types/PutV1WorkoutsWorkoutid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPutV1WorkoutsWorkoutidUrl(workoutId: PutV1WorkoutsWorkoutidPathParams['workoutId']) {\n return `/v1/workouts/${workoutId}` as const\n}\n\n/**\n * @summary Update an existing workout\n * {@link /v1/workouts/:workoutId}\n */\nexport async function putV1WorkoutsWorkoutid(\n workoutId: PutV1WorkoutsWorkoutidPathParams['workoutId'],\n headers: PutV1WorkoutsWorkoutidHeaderParams,\n data?: PutV1WorkoutsWorkoutidMutationRequest,\n config: Partial<RequestConfig<PutV1WorkoutsWorkoutidMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PutV1WorkoutsWorkoutidMutationResponse, ResponseErrorConfig<PutV1WorkoutsWorkoutid400>, PutV1WorkoutsWorkoutidMutationRequest>({\n method: 'PUT',\n url: getPutV1WorkoutsWorkoutidUrl(workoutId).toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","// Import the Kubb-based client\nimport { createClient as createKubbClient } from \"./hevyClientKubb.js\";\n\nexport function createClient(apiKey: string, baseUrl: string) {\n\treturn createKubbClient(apiKey, baseUrl);\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport express from \"express\";\n\n// Map to store transports by session ID\nconst transports = new Map<\n string,\n {\n transport: StreamableHTTPServerTransport;\n lastActivity: number;\n }\n>();\n\n// Session timeout in milliseconds (30 minutes)\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\n\n// Periodic cleanup of abandoned sessions\nsetInterval(() => {\n const now = Date.now();\n for (const [sessionId, session] of transports) {\n if (now - session.lastActivity > SESSION_TIMEOUT) {\n console.log(`Cleaning up abandoned session: ${sessionId}`);\n session.transport.close?.();\n transports.delete(sessionId);\n }\n }\n}, 5 * 60 * 1000); // Run cleanup every 5 minutes\n\n/**\n * Create and configure Express server for MCP HTTP transport\n */\nexport function createHttpServer(\n\tserver: McpServer,\n\toptions?: {\n\t\tport?: number;\n\t\thost?: string;\n\t\tenableDnsRebindingProtection?: boolean;\n\t\tallowedHosts?: string[];\n\t},\n) {\n\tconst app = express();\n\tconst port = options?.port || 3000;\n\tconst host = options?.host || \"127.0.0.1\";\n\n\tapp.use(express.json());\n\n\t// Handle POST requests for client-to-server communication\n\tapp.post(\"/mcp\", async (req, res) => {\n\t\t// Check for existing session ID\n\t\tconst sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\t\tlet transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports.has(sessionId)) {\n // Reuse existing transport\n transport = transports.get(sessionId)!.transport;\n transports.get(sessionId)!.lastActivity = Date.now();\n\t\t} else if (!sessionId && isInitializeRequest(req.body)) {\n\t\t\t// New initialization request\n\t\t\ttransport = new StreamableHTTPServerTransport({\n\t\t\t\tsessionIdGenerator: () => randomUUID(),\n\t\t\t\tonsessioninitialized: (sessionId) => {\n\t\t\t\t\t// Store the transport by session ID\n transports.set(sessionId, { transport, lastActivity: Date.now() });\n\t\t\t\t},\n\t\t\t\t// DNS rebinding protection configuration\n\t\t\t\tenableDnsRebindingProtection:\n\t\t\t\t\toptions?.enableDnsRebindingProtection ?? false,\n\t\t\t\tallowedHosts: options?.allowedHosts || [\"127.0.0.1\"],\n\t\t\t});\n\n\t\t\t// Clean up transport when closed\n\t\t\ttransport.onclose = () => {\n\t\t\t\tif (transport.sessionId) {\n\t\t\t\t\ttransports.delete(transport.sessionId!);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Connect to the MCP server\n\t\t\tawait server.connect(transport);\n\t\t} else {\n\t\t\t// Invalid request\n\t\t\tres.status(400).json({\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\terror: {\n\t\t\t\t\tcode: -32000,\n\t\t\t\t\tmessage: \"Bad Request: No valid session ID provided\",\n\t\t\t\t},\n\t\t\t\tid: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle the request\n\t\tawait transport.handleRequest(req, res, req.body);\n\t});\n\n\t// Reusable handler for GET and DELETE requests\n\tconst handleSessionRequest = async (\n\t\treq: express.Request,\n\t\tres: express.Response,\n\t) => {\n\t\tconst sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\t\tif (!sessionId || !transports.has(sessionId)) {\n\t\t\tres.status(400).send(\"Invalid or missing session ID\");\n\t\t\treturn;\n\t\t}\n\n const transport = transports.get(sessionId)!.transport;\n await transport.handleRequest(req, res);\n };\n\n\t// Handle GET requests for server-to-client notifications via SSE\n\tapp.get(\"/mcp\", handleSessionRequest);\n\n\t// Handle DELETE requests for session termination\n\tapp.delete(\"/mcp\", handleSessionRequest);\n\n\t// Health check endpoint\n\tapp.get(\"/health\", (_req, res) => {\n\t\tres.json({ status: \"ok\", timestamp: new Date().toISOString() });\n\t});\n\n\t// Start the server\n\tconst startServer = () => {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst httpServer = app.listen(port, host, () => {\n\t\t\t\tconsole.log(`MCP HTTP server listening on http://${host}:${port}`);\n\t\t\t\tconsole.log(`MCP endpoint: http://${host}:${port}/mcp`);\n\t\t\t\tconsole.log(`Health check: http://${host}:${port}/health`);\n\t\t\t\tresolve();\n\t\t\t});\n\n\t\t\thttpServer.on(\"error\", (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t};\n\n\treturn {\n\t\tapp,\n\t\tstartServer,\n\t\tgetActiveSessionsCount: () => transports.size,\n\t\tcloseAllSessions: () => {\n\t\t\tfor (const session of transports.values()) {\n\t\t\t\tsession.transport.close?.();\n\t\t\t}\n\t\t\ttransports.clear();\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["args","server","hevyClient","name","z","server","hevyClient","z","args","z","server","hevyClient","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","server","hevyClient","z","server","hevyClient","z","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","apiKey","createClient","apiKey","server","sessionId","createClient"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/tools/folders.ts","../src/utils/error-handler.ts","../src/utils/formatters.ts","../src/utils/response-formatter.ts","../src/tools/routines.ts","../src/tools/templates.ts","../src/tools/webhooks.ts","../src/generated/client/schemas/deletedWorkoutSchema.ts","../src/generated/client/schemas/deleteV1WebhookSubscriptionSchema.ts","../src/generated/client/schemas/exerciseTemplateSchema.ts","../src/generated/client/schemas/getV1ExerciseTemplatesExercisetemplateidSchema.ts","../src/generated/client/schemas/getV1ExerciseTemplatesSchema.ts","../src/generated/client/schemas/routineFolderSchema.ts","../src/generated/client/schemas/getV1RoutineFoldersFolderidSchema.ts","../src/generated/client/schemas/getV1RoutineFoldersSchema.ts","../src/generated/client/schemas/routineSchema.ts","../src/generated/client/schemas/getV1RoutinesRoutineidSchema.ts","../src/generated/client/schemas/getV1RoutinesSchema.ts","../src/generated/client/schemas/getV1WebhookSubscriptionSchema.ts","../src/generated/client/schemas/getV1WorkoutsCountSchema.ts","../src/generated/client/schemas/workoutSchema.ts","../src/generated/client/schemas/updatedWorkoutSchema.ts","../src/generated/client/schemas/paginatedWorkoutEventsSchema.ts","../src/generated/client/schemas/getV1WorkoutsEventsSchema.ts","../src/generated/client/schemas/getV1WorkoutsSchema.ts","../src/generated/client/schemas/getV1WorkoutsWorkoutidSchema.ts","../src/generated/client/schemas/postRoutineFolderRequestBodySchema.ts","../src/generated/client/schemas/postRoutinesRequestSetSchema.ts","../src/generated/client/schemas/postRoutinesRequestExerciseSchema.ts","../src/generated/client/schemas/postRoutinesRequestBodySchema.ts","../src/generated/client/schemas/postV1RoutineFoldersSchema.ts","../src/generated/client/schemas/postV1RoutinesSchema.ts","../src/generated/client/schemas/webhookRequestBodySchema.ts","../src/generated/client/schemas/postV1WebhookSubscriptionSchema.ts","../src/generated/client/schemas/postWorkoutsRequestSetSchema.ts","../src/generated/client/schemas/postWorkoutsRequestExerciseSchema.ts","../src/generated/client/schemas/postWorkoutsRequestBodySchema.ts","../src/generated/client/schemas/postV1WorkoutsSchema.ts","../src/generated/client/schemas/putRoutinesRequestSetSchema.ts","../src/generated/client/schemas/putRoutinesRequestExerciseSchema.ts","../src/generated/client/schemas/putRoutinesRequestBodySchema.ts","../src/generated/client/schemas/putV1RoutinesRoutineidSchema.ts","../src/generated/client/schemas/putV1WorkoutsWorkoutidSchema.ts","../src/tools/workouts.ts","../src/utils/hevyClientKubb.ts","../src/generated/client/api/deleteV1WebhookSubscription.ts","../src/generated/client/api/getV1ExerciseTemplates.ts","../src/generated/client/api/getV1ExerciseTemplatesExercisetemplateid.ts","../src/generated/client/api/getV1RoutineFolders.ts","../src/generated/client/api/getV1RoutineFoldersFolderid.ts","../src/generated/client/api/getV1Routines.ts","../src/generated/client/api/getV1RoutinesRoutineid.ts","../src/generated/client/api/getV1WebhookSubscription.ts","../src/generated/client/api/getV1Workouts.ts","../src/generated/client/api/getV1WorkoutsCount.ts","../src/generated/client/api/getV1WorkoutsEvents.ts","../src/generated/client/api/getV1WorkoutsWorkoutid.ts","../src/generated/client/api/postV1RoutineFolders.ts","../src/generated/client/api/postV1Routines.ts","../src/generated/client/api/postV1WebhookSubscription.ts","../src/generated/client/api/postV1Workouts.ts","../src/generated/client/api/putV1RoutinesRoutineid.ts","../src/generated/client/api/putV1WorkoutsWorkoutid.ts","../src/utils/hevyClient.ts","../src/utils/httpServer.ts"],"sourcesContent":["#!/usr/bin/env node\nimport \"@dotenvx/dotenvx/config\";\nimport { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\nimport { name, version } from \"../package.json\";\nimport { registerFolderTools } from \"./tools/folders.js\";\nimport { registerRoutineTools } from \"./tools/routines.js\";\nimport { registerTemplateTools } from \"./tools/templates.js\";\nimport { registerWebhookTools } from \"./tools/webhooks.js\";\n// Import tool registration functions\nimport { registerWorkoutTools } from \"./tools/workouts.js\";\nimport { createClient } from \"./utils/hevyClient.js\";\nimport { createHttpServer } from \"./utils/httpServer.js\";\n\nconst HEVY_API_BASEURL = \"https://api.hevyapp.com\";\n\n// Parse command line arguments\nconst args = process.argv.slice(2);\nconst transportMode =\n\targs.includes(\"--http\") || process.env.MCP_TRANSPORT === \"http\"\n\t\t? \"http\"\n\t\t: \"stdio\";\nconst httpPort = Number.parseInt(process.env.MCP_HTTP_PORT || \"3000\", 10);\nconst httpHost = process.env.MCP_HTTP_HOST || \"127.0.0.1\";\nconst enableDnsRebindingProtection =\n\tprocess.env.MCP_DNS_REBINDING_PROTECTION === \"true\";\nconst allowedHosts = process.env.MCP_ALLOWED_HOSTS?.split(\",\") || [\"127.0.0.1\"];\n\n// Create server instance\nconst server = new McpServer({\n\tname,\n\tversion,\n});\n\n// Check for API key\nif (!process.env.HEVY_API_KEY) {\n\tconsole.error(\"HEVY_API_KEY environment variable is not set\");\n\tprocess.exit(1);\n}\n\n// Configure client\n// We've already checked for HEVY_API_KEY existence above, so it's safe to use here\nconst apiKey = process.env.HEVY_API_KEY || \"\";\nconst hevyClient = createClient(apiKey, HEVY_API_BASEURL);\n\n// Register all tools\nregisterWorkoutTools(server, hevyClient);\nregisterRoutineTools(server, hevyClient);\nregisterTemplateTools(server, hevyClient);\nregisterFolderTools(server, hevyClient);\nregisterWebhookTools(server, hevyClient);\n\n// Start the server\nasync function runServer() {\n\tif (transportMode === \"http\") {\n\t\tconsole.log(`Starting MCP server in HTTP mode on ${httpHost}:${httpPort}`);\n\t\tconst httpServer = createHttpServer(server, {\n\t\t\tport: httpPort,\n\t\t\thost: httpHost,\n\t\t\tenableDnsRebindingProtection,\n\t\t\tallowedHosts,\n\t\t});\n\t\tawait httpServer.startServer();\n\t} else {\n\t\tconsole.log(\"Starting MCP server in stdio mode\");\n\t\tconst transport = new StdioServerTransport();\n\t\tawait server.connect(transport);\n\t}\n}\n\nrunServer().catch((error) => {\n\tconsole.error(\"Fatal error in main():\", error);\n\tprocess.exit(1);\n});\n","{\n\t\"name\": \"hevy-mcp\",\n\t\"version\": \"1.8.7\",\n\t\"main\": \"dist/index.js\",\n\t\"module\": \"dist/index.js\",\n\t\"types\": \"dist/index.d.ts\",\n\t\"files\": [\n\t\t\"dist\",\n\t\t\"README.md\"\n\t],\n\t\"access\": \"public\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/chrisdoc/hevy-mcp/issues\"\n\t},\n\t\"homepage\": \"https://github.com/chrisdoc/hevy-mcp#readme\",\n\t\"bin\": {\n\t\t\"hevy-mcp\": \"dist/index.js\"\n\t},\n\t\"scripts\": {\n\t\t\"inspect\": \"npm run build && npx -y @modelcontextprotocol/inspector@latest node dist/index.js\",\n\t\t\"test\": \"vitest --run\",\n\t\t\"export-specs\": \"node ./scripts/export-openapi-spec.js\",\n\t\t\"build\": \"tsup\",\n\t\t\"build:client\": \"kubb generate\",\n\t\t\"start\": \"node dist/index.js\",\n\t\t\"start:http\": \"node dist/index.js --http\",\n\t\t\"dev\": \"tsx watch --clear-screen=false src/index.ts\",\n\t\t\"dev:http\": \"MCP_TRANSPORT=http tsx watch --clear-screen=false src/index.ts\",\n\t\t\"check\": \"biome check --write --unsafe\",\n\t\t\"check:types\": \"tsc --noEmit\",\n\t\t\"version:patch\": \"npm version patch\",\n\t\t\"version:minor\": \"npm version minor\",\n\t\t\"version:major\": \"npm version major\",\n\t\t\"release\": \"semantic-release\",\n\t\t\"commit\": \"commit\"\n\t},\n\t\"type\": \"module\",\n\t\"keywords\": [\n\t\t\"mcp\",\n\t\t\"hevy\",\n\t\t\"fitness\",\n\t\t\"api\",\n\t\t\"model context protocol\"\n\t],\n\t\"author\": \"Christoph Kieslich\",\n\t\"license\": \"MIT\",\n\t\"description\": \"A Model Context Protocol (MCP) server implementation that interfaces with the Hevy fitness tracking app and its API.\",\n\t\"dependencies\": {\n\t\t\"@dotenvx/dotenvx\": \"^1.49.0\",\n\t\t\"@kubb/cli\": \"^3.18.1\",\n\t\t\"@kubb/core\": \"^3.18.1\",\n\t\t\"@kubb/plugin-client\": \"^3.18.1\",\n\t\t\"@kubb/plugin-faker\": \"^3.18.1\",\n\t\t\"@kubb/plugin-oas\": \"^3.18.1\",\n\t\t\"@kubb/plugin-ts\": \"^3.18.1\",\n\t\t\"@kubb/plugin-zod\": \"^3.18.1\",\n\t\t\"@modelcontextprotocol/sdk\": \"^1.17.4\",\n\t\t\"axios\": \"^1.11.0\",\n\t\t\"uuid\": \"^11.1.0\",\n\t\t\"zod\": \"^3.25.75\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@biomejs/biome\": \"2.2.4\",\n\t\t\"@commitlint/cli\": \"^19.8.1\",\n\t\t\"@commitlint/config-conventional\": \"^19.8.1\",\n\t\t\"@commitlint/prompt-cli\": \"^19.8.1\",\n\t\t\"@semantic-release/changelog\": \"^6.0.3\",\n\t\t\"@semantic-release/commit-analyzer\": \"^13.0.1\",\n\t\t\"@semantic-release/git\": \"^10.0.1\",\n\t\t\"@semantic-release/npm\": \"^12.0.2\",\n\t\t\"@semantic-release/release-notes-generator\": \"^14.0.3\",\n\t\t\"@types/express\": \"^5.0.3\",\n\t\t\"@types/node\": \"^24.3.0\",\n\t\t\"@types/uuid\": \"^10.0.0\",\n\t\t\"@vitest/coverage-v8\": \"^3.2.4\",\n\t\t\"abstract-syntax-tree\": \"^2.22.0\",\n\t\t\"lefthook\": \"^1.12.3\",\n\t\t\"semantic-release\": \"^24.2.7\",\n\t\t\"tsup\": \"^8.5.0\",\n\t\t\"tsx\": \"^4.20.5\",\n\t\t\"typescript\": \"^5.9.2\",\n\t\t\"vitest\": \"^3.2.4\"\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=20.0.0\"\n\t}\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n// Import types from generated client\nimport type { RoutineFolder } from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatRoutineFolder } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n// Type definitions for the folder operations\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n/**\n * Register all routine folder-related tools with the MCP server\n */\nexport function registerFolderTools(server: McpServer, hevyClient: HevyClient) {\n\t// Get routine folders\n\tserver.tool(\n\t\t\"get-routine-folders\",\n\t\t\"Get a paginated list of your routine folders, including both default and custom folders. Useful for organizing and browsing your workout routines.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({ page, pageSize }: { page: number; pageSize: number }) => {\n\t\t\t\tconst data = await hevyClient.getRoutineFolders({\n\t\t\t\t\tpage,\n\t\t\t\t\tpageSize,\n\t\t\t\t});\n\n\t\t\t\t// Process routine folders to extract relevant information\n\t\t\t\tconst folders =\n\t\t\t\t\tdata?.routine_folders?.map((folder: RoutineFolder) =>\n\t\t\t\t\t\tformatRoutineFolder(folder),\n\t\t\t\t\t) || [];\n\n\t\t\t\tif (folders.length === 0) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t\"No routine folders found for the specified parameters\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn createJsonResponse(folders);\n\t\t\t},\n\t\t\t\"get-routine-folders\",\n\t\t),\n\t);\n\n\t// Get single routine folder by ID\n\tserver.tool(\n\t\t\"get-routine-folder\",\n\t\t\"Get complete details of a specific routine folder by its ID, including name, creation date, and associated routines.\",\n\t\t{\n\t\t\tfolderId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ folderId }: { folderId: string }) => {\n\t\t\tconst data = await hevyClient.getRoutineFolder(folderId);\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t`Routine folder with ID ${folderId} not found`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst folder = formatRoutineFolder(data);\n\t\t\treturn createJsonResponse(folder);\n\t\t}, \"get-routine-folder\"),\n\t);\n\n\t// Create new routine folder\n\tserver.tool(\n\t\t\"create-routine-folder\",\n\t\t\"Create a new routine folder in your Hevy account. Requires a name for the folder. Returns the full folder details including the new folder ID.\",\n\t\t{\n\t\t\tname: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ name }: { name: string }) => {\n\t\t\tconst data = await hevyClient.createRoutineFolder({\n\t\t\t\troutine_folder: {\n\t\t\t\t\ttitle: name,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to create routine folder: Server returned no data\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst folder = formatRoutineFolder(data);\n\t\t\treturn createJsonResponse(folder, {\n\t\t\t\tpretty: true,\n\t\t\t\tindent: 2,\n\t\t\t});\n\t\t}, \"create-routine-folder\"),\n\t);\n}\n","/**\n * Centralized error handling utility for MCP tools\n */\n\n// Define the McpToolResponse interface based on the SDK's structure\ninterface McpToolResponse {\n\tcontent: Array<{ type: string; text: string }>;\n\tisError?: boolean;\n}\n\n/**\n * Standard error response interface\n */\nexport interface ErrorResponse {\n\tmessage: string;\n\tcode?: string;\n\tdetails?: unknown;\n}\n\n/**\n * Specific error types for better categorization\n */\nexport enum ErrorType {\n\tAPI_ERROR = \"API_ERROR\",\n\tVALIDATION_ERROR = \"VALIDATION_ERROR\",\n\tNOT_FOUND = \"NOT_FOUND\",\n\tNETWORK_ERROR = \"NETWORK_ERROR\",\n\tUNKNOWN_ERROR = \"UNKNOWN_ERROR\",\n}\n\n/**\n * Enhanced error response with type categorization\n */\nexport interface EnhancedErrorResponse extends ErrorResponse {\n\ttype: ErrorType;\n}\n\n/**\n * Create a standardized error response for MCP tools\n *\n * @param error - The error object or message\n * @param context - Optional context information about where the error occurred\n * @returns A formatted MCP tool response with error information\n */\nexport function createErrorResponse(\n\terror: unknown,\n\tcontext?: string,\n): McpToolResponse {\n\tconst errorMessage = error instanceof Error ? error.message : String(error);\n\t// Extract error code if available (for logging purposes)\n\tconst errorCode =\n\t\terror instanceof Error && \"code\" in error\n\t\t\t? (error as { code?: string }).code\n\t\t\t: undefined;\n\n\t// Determine error type based on error characteristics\n\tconst errorType = determineErrorType(error, errorMessage);\n\n\t// Include error code in logs if available\n\tif (errorCode) {\n\t\tconsole.debug(`Error code: ${errorCode}`);\n\t}\n\n\tconst contextPrefix = context ? `[${context}] ` : \"\";\n\tconst formattedMessage = `${contextPrefix}Error: ${errorMessage}`;\n\n\t// Log the error for server-side debugging with type information\n\tconsole.error(`${formattedMessage} (Type: ${errorType})`, error);\n\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: formattedMessage,\n\t\t\t},\n\t\t],\n\t\tisError: true,\n\t};\n}\n\n/**\n * Determine the type of error based on error characteristics\n */\nfunction determineErrorType(error: unknown, message: string): ErrorType {\n\tconst messageLower = message.toLowerCase();\n\tconst nameLower = error instanceof Error ? error.name.toLowerCase() : \"\";\n\n\tif (\n\t\tnameLower.includes(\"network\") ||\n\t\tmessageLower.includes(\"network\") ||\n\t\tnameLower.includes(\"fetch\") ||\n\t\tmessageLower.includes(\"fetch\") ||\n\t\tnameLower.includes(\"timeout\") ||\n\t\tmessageLower.includes(\"timeout\")\n\t) {\n\t\treturn ErrorType.NETWORK_ERROR;\n\t}\n\n\tif (\n\t\tnameLower.includes(\"validation\") ||\n\t\tmessageLower.includes(\"validation\") ||\n\t\tmessageLower.includes(\"invalid\") ||\n\t\tmessageLower.includes(\"required\")\n\t) {\n\t\treturn ErrorType.VALIDATION_ERROR;\n\t}\n\n\tif (\n\t\tmessageLower.includes(\"not found\") ||\n\t\tmessageLower.includes(\"404\") ||\n\t\tmessageLower.includes(\"does not exist\")\n\t) {\n\t\treturn ErrorType.NOT_FOUND;\n\t}\n\n\tif (\n\t\tnameLower.includes(\"api\") ||\n\t\tmessageLower.includes(\"api\") ||\n\t\tmessageLower.includes(\"server error\") ||\n\t\tmessageLower.includes(\"500\")\n\t) {\n\t\treturn ErrorType.API_ERROR;\n\t}\n\n\treturn ErrorType.UNKNOWN_ERROR;\n}\n\n/**\n * Wrap an async function with standardized error handling\n *\n * @param fn - The async function to wrap\n * @param context - Context information for error messages\n * @returns A function that catches errors and returns standardized error responses\n */\n// Define a more specific type for function parameters\ntype McpToolFunction = (\n\t...args: Record<string, unknown>[]\n) => Promise<McpToolResponse>;\n\n/**\n * Wrap an async function with standardized error handling\n *\n * @param fn - The async function to wrap\n * @param context - Context information for error messages\n * @returns A function that catches errors and returns standardized error responses\n */\nexport function withErrorHandling<T extends McpToolFunction>(\n\tfn: T,\n\tcontext: string,\n): T {\n\treturn (async (...args: Parameters<T>) => {\n\t\ttry {\n\t\t\treturn await fn(...args);\n\t\t} catch (error) {\n\t\t\treturn createErrorResponse(error, context);\n\t\t}\n\t}) as T;\n}\n","import type {\n\tExerciseTemplate,\n\tRoutine,\n\tRoutineFolder,\n\tWorkout,\n} from \"../generated/client/types/index.js\";\n\n/**\n * Formatted workout set interface\n */\nexport interface FormattedWorkoutSet {\n\tindex: number | undefined;\n\ttype: string | undefined;\n\tweight: number | undefined | null;\n\treps: number | undefined | null;\n\tdistance: number | undefined | null;\n\tduration: number | undefined | null;\n\trpe: number | undefined | null;\n\tcustomMetric: number | undefined | null;\n}\n\n/**\n * Formatted workout exercise interface\n */\nexport interface FormattedWorkoutExercise {\n\tindex: number | undefined;\n\tname: string | undefined;\n\texerciseTemplateId: string | undefined;\n\tnotes: string | undefined | null;\n\tsupersetsId: number | undefined | null;\n\tsets: FormattedWorkoutSet[] | undefined;\n}\n\n/**\n * Formatted workout interface\n */\nexport interface FormattedWorkout {\n\tid: string | undefined;\n\ttitle: string | undefined;\n\tdescription: string | undefined | null;\n\tstartTime: number | undefined;\n\tendTime: number | undefined;\n\tcreatedAt: string | undefined;\n\tupdatedAt: string | undefined;\n\tduration: string;\n\texercises: FormattedWorkoutExercise[] | undefined;\n}\n\n/**\n * Formatted routine set interface\n */\nexport interface FormattedRoutineSet {\n\tindex: number | undefined;\n\ttype: string | undefined;\n\tweight: number | undefined | null;\n\treps: number | undefined | null;\n\tdistance: number | undefined | null;\n\tduration: number | undefined | null;\n\tcustomMetric: number | undefined | null;\n\trepRange?: { start?: number | null; end?: number | null } | undefined | null;\n\trpe?: number | undefined | null;\n}\n\n/**\n * Formatted routine exercise interface\n */\nexport interface FormattedRoutineExercise {\n\tname: string | undefined;\n\tindex: number | undefined;\n\texerciseTemplateId: string | undefined;\n\tnotes: string | undefined | null;\n\tsupersetId: number | undefined | null;\n\trestSeconds: string | undefined;\n\tsets: FormattedRoutineSet[] | undefined;\n}\n\n/**\n * Formatted routine interface\n */\nexport interface FormattedRoutine {\n\tid: string | undefined;\n\ttitle: string | undefined;\n\tfolderId: number | undefined | null;\n\tcreatedAt: string | undefined;\n\tupdatedAt: string | undefined;\n\texercises: FormattedRoutineExercise[] | undefined;\n}\n\n/**\n * Formatted routine folder interface\n */\nexport interface FormattedRoutineFolder {\n\tid: number | undefined;\n\ttitle: string | undefined;\n\tcreatedAt: string | undefined;\n\tupdatedAt: string | undefined;\n}\n\n/**\n * Formatted exercise template interface\n */\nexport interface FormattedExerciseTemplate {\n\tid: string | undefined;\n\ttitle: string | undefined;\n\ttype: string | undefined;\n\tprimaryMuscleGroup: string | undefined;\n\tsecondaryMuscleGroups: string[] | undefined;\n\tisCustom: boolean | undefined;\n}\n\n/**\n * Format a workout object for consistent presentation\n *\n * @param workout - The workout object from the API\n * @returns A formatted workout object with standardized properties\n */\nexport function formatWorkout(workout: Workout): FormattedWorkout {\n\treturn {\n\t\tid: workout.id,\n\t\ttitle: workout.title,\n\t\tdescription: workout.description,\n\t\tstartTime: workout.start_time,\n\t\tendTime: workout.end_time,\n\t\tcreatedAt: workout.created_at,\n\t\tupdatedAt: workout.updated_at,\n\t\tduration: calculateDuration(workout.start_time, workout.end_time),\n\t\texercises: workout.exercises?.map((exercise) => {\n\t\t\treturn {\n\t\t\t\tindex: exercise.index,\n\t\t\t\tname: exercise.title,\n\t\t\t\texerciseTemplateId: exercise.exercise_template_id,\n\t\t\t\tnotes: exercise.notes,\n\t\t\t\tsupersetsId: exercise.supersets_id,\n\t\t\t\tsets: exercise.sets?.map((set) => ({\n\t\t\t\t\tindex: set.index,\n\t\t\t\t\ttype: set.type,\n\t\t\t\t\tweight: set.weight_kg,\n\t\t\t\t\treps: set.reps,\n\t\t\t\t\tdistance: set.distance_meters,\n\t\t\t\t\tduration: set.duration_seconds,\n\t\t\t\t\trpe: set.rpe,\n\t\t\t\t\tcustomMetric: set.custom_metric,\n\t\t\t\t})),\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/**\n * Format a routine object for consistent presentation\n *\n * @param routine - The routine object from the API\n * @returns A formatted routine object with standardized properties\n */\nexport function formatRoutine(routine: Routine): FormattedRoutine {\n\treturn {\n\t\tid: routine.id,\n\t\ttitle: routine.title,\n\t\tfolderId: routine.folder_id,\n\t\tcreatedAt: routine.created_at,\n\t\tupdatedAt: routine.updated_at,\n\t\texercises: routine.exercises?.map((exercise) => {\n\t\t\treturn {\n\t\t\t\tname: exercise.title,\n\t\t\t\tindex: exercise.index,\n\t\t\t\texerciseTemplateId: exercise.exercise_template_id,\n\t\t\t\tnotes: exercise.notes,\n\t\t\t\tsupersetId: exercise.supersets_id,\n\t\t\t\trestSeconds: exercise.rest_seconds,\n\t\t\t\tsets: exercise.sets?.map((set) => ({\n\t\t\t\t\tindex: set.index,\n\t\t\t\t\ttype: set.type,\n\t\t\t\t\tweight: set.weight_kg,\n\t\t\t\t\treps: set.reps,\n\t\t\t\t\t...(set.rep_range !== undefined && { repRange: set.rep_range }),\n\t\t\t\t\tdistance: set.distance_meters,\n\t\t\t\t\tduration: set.duration_seconds,\n\t\t\t\t\t...(set.rpe !== undefined && { rpe: set.rpe }),\n\t\t\t\t\tcustomMetric: set.custom_metric,\n\t\t\t\t})),\n\t\t\t};\n\t\t}),\n\t};\n}\n\n/**\n * Format a routine folder object for consistent presentation\n *\n * @param folder - The routine folder object from the API\n * @returns A formatted routine folder object with standardized properties\n */\nexport function formatRoutineFolder(\n\tfolder: RoutineFolder,\n): FormattedRoutineFolder {\n\treturn {\n\t\tid: folder.id,\n\t\ttitle: folder.title,\n\t\tcreatedAt: folder.created_at,\n\t\tupdatedAt: folder.updated_at,\n\t};\n}\n\n/**\n * Calculate duration between two ISO timestamp strings\n *\n * @param startTime - The start time as ISO string or timestamp\n * @param endTime - The end time as ISO string or timestamp\n * @returns A formatted duration string (e.g. \"1h 30m 45s\") or \"Unknown duration\" if inputs are invalid\n */\nexport function calculateDuration(\n\tstartTime: string | number | null | undefined,\n\tendTime: string | number | null | undefined,\n): string {\n\tif (!startTime || !endTime) return \"Unknown duration\";\n\n\ttry {\n\t\tconst start = new Date(startTime);\n\t\tconst end = new Date(endTime);\n\n\t\t// Validate dates\n\t\tif (Number.isNaN(start.getTime()) || Number.isNaN(end.getTime())) {\n\t\t\treturn \"Unknown duration\";\n\t\t}\n\n\t\tconst durationMs = end.getTime() - start.getTime();\n\n\t\t// Handle negative durations\n\t\tif (durationMs < 0) {\n\t\t\treturn \"Invalid duration (end time before start time)\";\n\t\t}\n\n\t\tconst hours = Math.floor(durationMs / (1000 * 60 * 60));\n\t\tconst minutes = Math.floor((durationMs % (1000 * 60 * 60)) / (1000 * 60));\n\t\tconst seconds = Math.floor((durationMs % (1000 * 60)) / 1000);\n\n\t\treturn `${hours}h ${minutes}m ${seconds}s`;\n\t} catch (error) {\n\t\tconsole.error(\"Error calculating duration:\", error);\n\t\treturn \"Unknown duration\";\n\t}\n}\n\n/**\n * Format an exercise template object for consistent presentation\n *\n * @param template - The exercise template object from the API\n * @returns A formatted exercise template object with standardized properties\n */\nexport function formatExerciseTemplate(\n\ttemplate: ExerciseTemplate,\n): FormattedExerciseTemplate {\n\treturn {\n\t\tid: template.id,\n\t\ttitle: template.title,\n\t\ttype: template.type,\n\t\tprimaryMuscleGroup: template.primary_muscle_group,\n\t\tsecondaryMuscleGroups: template.secondary_muscle_groups,\n\t\tisCustom: template.is_custom,\n\t};\n}\n","/**\n * Centralized response formatting utility for MCP tools\n */\n\nimport type { McpToolResponse } from \"@modelcontextprotocol/sdk/server/mcp.js\";\n\n/**\n * Format options for JSON responses\n */\nexport interface JsonFormatOptions {\n\t/** Whether to pretty-print the JSON with indentation */\n\tpretty?: boolean;\n\t/** Indentation spaces for pretty-printing (default: 2) */\n\tindent?: number;\n}\n\n/**\n * Create a standardized success response with JSON data\n *\n * @param data - The data to include in the response\n * @param options - Formatting options\n * @returns A formatted MCP tool response with the data as JSON\n */\nexport function createJsonResponse(\n\tdata: unknown,\n\toptions: JsonFormatOptions = { pretty: true, indent: 2 },\n): McpToolResponse {\n\tconst jsonString = options.pretty\n\t\t? JSON.stringify(data, null, options.indent)\n\t\t: JSON.stringify(data);\n\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: jsonString,\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Create a standardized success response with text data\n *\n * @param message - The text message to include in the response\n * @returns A formatted MCP tool response with the text message\n */\nexport function createTextResponse(message: string): McpToolResponse {\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: message,\n\t\t\t},\n\t\t],\n\t};\n}\n\n/**\n * Create a standardized success response for empty or null results\n *\n * @param message - Optional message to include (default: \"No data found\")\n * @returns A formatted MCP tool response for empty results\n */\nexport function createEmptyResponse(\n\tmessage = \"No data found\",\n): McpToolResponse {\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: message,\n\t\t\t},\n\t\t],\n\t};\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n// Import types from generated client\nimport type {\n\tPostRoutinesRequestExercise,\n\tPostRoutinesRequestSet,\n\tPostRoutinesRequestSetTypeEnum,\n\tPutRoutinesRequestExercise,\n\tPutRoutinesRequestSet,\n\tPutRoutinesRequestSetTypeEnum,\n\tRoutine,\n} from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatRoutine } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n// Type definitions for the routine operations\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n// Define types for the routine operations based on Zod schemas\ntype CreateRoutineParams = {\n\ttitle: string;\n\tfolderId?: number | null;\n\tnotes?: string;\n\texercises: Array<{\n\t\texerciseTemplateId: string;\n\t\tsupersetId?: number | null;\n\t\trestSeconds?: number;\n\t\tnotes?: string;\n\t\tsets: Array<{\n\t\t\ttype: \"warmup\" | \"normal\" | \"failure\" | \"dropset\";\n\t\t\tweightKg?: number;\n\t\t\treps?: number;\n\t\t\tdistanceMeters?: number;\n\t\t\tdurationSeconds?: number;\n\t\t\tcustomMetric?: number;\n\t\t}>;\n\t}>;\n};\n\ntype UpdateRoutineParams = {\n\troutineId: string;\n\ttitle: string;\n\tnotes?: string;\n\texercises: Array<{\n\t\texerciseTemplateId: string;\n\t\tsupersetId?: number | null;\n\t\trestSeconds?: number;\n\t\tnotes?: string;\n\t\tsets: Array<{\n\t\t\ttype: \"warmup\" | \"normal\" | \"failure\" | \"dropset\";\n\t\t\tweightKg?: number;\n\t\t\treps?: number;\n\t\t\tdistanceMeters?: number;\n\t\t\tdurationSeconds?: number;\n\t\t\tcustomMetric?: number;\n\t\t}>;\n\t}>;\n};\n\n/**\n * Register all routine-related tools with the MCP server\n */\nexport function registerRoutineTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get routines\n\tserver.tool(\n\t\t\"get-routines\",\n\t\t\"Get a paginated list of your workout routines, including custom and default routines. Useful for browsing or searching your available routines.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t},\n\t\twithErrorHandling(async (args) => {\n\t\t\tconst { page, pageSize } = args as { page: number; pageSize: number };\n\t\t\tconst data = await hevyClient.getRoutines({\n\t\t\t\tpage,\n\t\t\t\tpageSize,\n\t\t\t});\n\n\t\t\t// Process routines to extract relevant information\n\t\t\tconst routines =\n\t\t\t\tdata?.routines?.map((routine: Routine) => formatRoutine(routine)) || [];\n\n\t\t\tif (routines.length === 0) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"No routines found for the specified parameters\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn createJsonResponse(routines);\n\t\t}, \"get-routines\"),\n\t);\n\n\t// Get single routine by ID (new, direct endpoint)\n\tserver.tool(\n\t\t\"get-routine\",\n\t\t\"Get a routine by its ID using the direct endpoint. Returns all details for the specified routine.\",\n\t\t{\n\t\t\troutineId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ routineId }) => {\n\t\t\tconst data = await hevyClient.getRoutineById(String(routineId));\n\t\t\tif (!data || !data.routine) {\n\t\t\t\treturn createEmptyResponse(`Routine with ID ${routineId} not found`);\n\t\t\t}\n\t\t\tconst routine = formatRoutine(data.routine);\n\t\t\treturn createJsonResponse(routine);\n\t\t}, \"get-routine\"),\n\t);\n\n\t// Create new routine\n\tserver.tool(\n\t\t\"create-routine\",\n\t\t\"Create a new workout routine in your Hevy account. Requires a title and at least one exercise with sets. Optionally assign to a folder. Returns the full routine details including the new routine ID.\",\n\t\t{\n\t\t\ttitle: z.string().min(1),\n\t\t\tfolderId: z.coerce.number().nullable().optional(),\n\t\t\tnotes: z.string().optional(),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\trestSeconds: z.coerce.number().int().min(0).optional(),\n\t\t\t\t\tnotes: z.string().optional(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(async (args) => {\n\t\t\tconst { title, folderId, notes, exercises } = args as CreateRoutineParams;\n\t\t\tconst data = await hevyClient.createRoutine({\n\t\t\t\troutine: {\n\t\t\t\t\ttitle,\n\t\t\t\t\tfolder_id: folderId ?? null,\n\t\t\t\t\tnotes: notes ?? \"\",\n\t\t\t\t\texercises: exercises.map(\n\t\t\t\t\t\t(exercise): PostRoutinesRequestExercise => ({\n\t\t\t\t\t\t\texercise_template_id: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsuperset_id: exercise.supersetId ?? null,\n\t\t\t\t\t\t\trest_seconds: exercise.restSeconds ?? null,\n\t\t\t\t\t\t\tnotes: exercise.notes ?? null,\n\t\t\t\t\t\t\tsets: exercise.sets.map(\n\t\t\t\t\t\t\t\t(set): PostRoutinesRequestSet => ({\n\t\t\t\t\t\t\t\t\ttype: set.type as PostRoutinesRequestSetTypeEnum,\n\t\t\t\t\t\t\t\t\tweight_kg: set.weightKg ?? null,\n\t\t\t\t\t\t\t\t\treps: set.reps ?? null,\n\t\t\t\t\t\t\t\t\tdistance_meters: set.distanceMeters ?? null,\n\t\t\t\t\t\t\t\t\tduration_seconds: set.durationSeconds ?? null,\n\t\t\t\t\t\t\t\t\tcustom_metric: set.customMetric ?? null,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to create routine: Server returned no data\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst routine = formatRoutine(data);\n\t\t\treturn createJsonResponse(routine, {\n\t\t\t\tpretty: true,\n\t\t\t\tindent: 2,\n\t\t\t});\n\t\t}, \"create-routine\"),\n\t);\n\n\t// Update existing routine\n\tserver.tool(\n\t\t\"update-routine\",\n\t\t\"Update an existing routine by ID. You can modify the title, notes, and exercise configurations. Returns the updated routine with all changes applied.\",\n\t\t{\n\t\t\troutineId: z.string().min(1),\n\t\t\ttitle: z.string().min(1),\n\t\t\tnotes: z.string().optional(),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\trestSeconds: z.coerce.number().int().min(0).optional(),\n\t\t\t\t\tnotes: z.string().optional(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(async (args) => {\n\t\t\tconst { routineId, title, notes, exercises } =\n\t\t\t\targs as UpdateRoutineParams;\n\t\t\tconst data = await hevyClient.updateRoutine(routineId, {\n\t\t\t\troutine: {\n\t\t\t\t\ttitle,\n\t\t\t\t\tnotes: notes ?? null,\n\t\t\t\t\texercises: exercises.map(\n\t\t\t\t\t\t(exercise): PutRoutinesRequestExercise => ({\n\t\t\t\t\t\t\texercise_template_id: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsuperset_id: exercise.supersetId ?? null,\n\t\t\t\t\t\t\trest_seconds: exercise.restSeconds ?? null,\n\t\t\t\t\t\t\tnotes: exercise.notes ?? null,\n\t\t\t\t\t\t\tsets: exercise.sets.map(\n\t\t\t\t\t\t\t\t(set): PutRoutinesRequestSet => ({\n\t\t\t\t\t\t\t\t\ttype: set.type as PutRoutinesRequestSetTypeEnum,\n\t\t\t\t\t\t\t\t\tweight_kg: set.weightKg ?? null,\n\t\t\t\t\t\t\t\t\treps: set.reps ?? null,\n\t\t\t\t\t\t\t\t\tdistance_meters: set.distanceMeters ?? null,\n\t\t\t\t\t\t\t\t\tduration_seconds: set.durationSeconds ?? null,\n\t\t\t\t\t\t\t\t\tcustom_metric: set.customMetric ?? null,\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t`Failed to update routine with ID ${routineId}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst routine = formatRoutine(data);\n\t\t\treturn createJsonResponse(routine, {\n\t\t\t\tpretty: true,\n\t\t\t\tindent: 2,\n\t\t\t});\n\t\t}, \"update-routine\"),\n\t);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\n// Import types from generated client\nimport type { ExerciseTemplate } from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatExerciseTemplate } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n// Type definitions for the template operations\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n/**\n * Register all exercise template-related tools with the MCP server\n */\nexport function registerTemplateTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get exercise templates\n\tserver.tool(\n\t\t\"get-exercise-templates\",\n\t\t\"Get a paginated list of exercise templates (default and custom) with details like name, category, equipment, and muscle groups. Useful for browsing or searching available exercises.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(100).default(5),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({ page, pageSize }: { page: number; pageSize: number }) => {\n\t\t\t\tconst data = await hevyClient.getExerciseTemplates({\n\t\t\t\t\tpage,\n\t\t\t\t\tpageSize,\n\t\t\t\t});\n\n\t\t\t\t// Process exercise templates to extract relevant information\n\t\t\t\tconst templates =\n\t\t\t\t\tdata?.exercise_templates?.map((template: ExerciseTemplate) =>\n\t\t\t\t\t\tformatExerciseTemplate(template),\n\t\t\t\t\t) || [];\n\n\t\t\t\tif (templates.length === 0) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t\"No exercise templates found for the specified parameters\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn createJsonResponse(templates);\n\t\t\t},\n\t\t\t\"get-exercise-templates\",\n\t\t),\n\t);\n\n\t// Get single exercise template by ID\n\tserver.tool(\n\t\t\"get-exercise-template\",\n\t\t\"Get complete details of a specific exercise template by its ID, including name, category, equipment, muscle groups, and notes.\",\n\t\t{\n\t\t\texerciseTemplateId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({ exerciseTemplateId }: { exerciseTemplateId: string }) => {\n\t\t\t\tconst data = await hevyClient.getExerciseTemplate(exerciseTemplateId);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t`Exercise template with ID ${exerciseTemplateId} not found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst template = formatExerciseTemplate(data);\n\t\t\t\treturn createJsonResponse(template);\n\t\t\t},\n\t\t\t\"get-exercise-template\",\n\t\t),\n\t);\n}\n","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { webhookRequestBodySchema } from \"../generated/client/schemas/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\ntype HevyClient = ReturnType<\n\ttypeof import(\"../utils/hevyClientKubb.js\").createClient\n>;\n\n// Enhanced webhook URL validation\nconst webhookUrlSchema = z\n\t.string()\n\t.url()\n\t.refine(\n\t\t(url) => {\n\t\t\ttry {\n\t\t\t\tconst parsed = new URL(url);\n\t\t\t\treturn parsed.protocol === \"https:\" || parsed.protocol === \"http:\";\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: \"Webhook URL must be a valid HTTP or HTTPS URL\",\n\t\t},\n\t)\n\t.refine(\n\t\t(url) => {\n\t\t\ttry {\n\t\t\t\tconst parsed = new URL(url);\n\t\t\t\treturn (\n\t\t\t\t\tparsed.hostname !== \"localhost\" && !parsed.hostname.startsWith(\"127.\")\n\t\t\t\t);\n\t\t\t} catch {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\tmessage: \"Webhook URL cannot be localhost or loopback address\",\n\t\t},\n\t);\n\nexport function registerWebhookTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get webhook subscription\n\tserver.tool(\n\t\t\"get-webhook-subscription\",\n\t\t\"Get the current webhook subscription for this account. Returns the webhook URL and auth token if a subscription exists.\",\n\t\t{},\n\t\twithErrorHandling(async () => {\n\t\t\tconst data = await hevyClient.getWebhookSubscription();\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"No webhook subscription found for this account\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createJsonResponse(data);\n\t\t}, \"get-webhook-subscription\"),\n\t);\n\n\t// Create webhook subscription\n\tserver.tool(\n\t\t\"create-webhook-subscription\",\n\t\t\"Create a new webhook subscription for this account. The webhook will receive POST requests when workouts are created. Your endpoint must respond with 200 OK within 5 seconds.\",\n\t\t{\n\t\t\turl: webhookUrlSchema.describe(\n\t\t\t\t\"The webhook URL that will receive POST requests when workouts are created\",\n\t\t\t),\n\t\t\tauthToken: z\n\t\t\t\t.string()\n\t\t\t\t.optional()\n\t\t\t\t.describe(\n\t\t\t\t\t\"Optional auth token that will be sent as Authorization header in webhook requests\",\n\t\t\t\t),\n\t\t},\n\t\twithErrorHandling(async ({ url, authToken }) => {\n\t\t\t// Validate the request body using the generated schema\n\t\t\tconst requestBody = webhookRequestBodySchema.parse({\n\t\t\t\turl,\n\t\t\t\tauthToken,\n\t\t\t});\n\n\t\t\tconst data = await hevyClient.createWebhookSubscription(requestBody);\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to create webhook subscription - please check your URL and try again\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createJsonResponse(data);\n\t\t}, \"create-webhook-subscription\"),\n\t);\n\n\t// Delete webhook subscription\n\tserver.tool(\n\t\t\"delete-webhook-subscription\",\n\t\t\"Delete the current webhook subscription for this account. This will stop all webhook notifications.\",\n\t\t{},\n\t\twithErrorHandling(async () => {\n\t\t\tconst data = await hevyClient.deleteWebhookSubscription();\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"Failed to delete webhook subscription - no subscription may exist or there was a server error\",\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn createJsonResponse(data);\n\t\t}, \"delete-webhook-subscription\"),\n\t);\n}\n","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const deletedWorkoutSchema = z.object({\n type: z.string().describe('Indicates the type of the event (deleted)'),\n id: z.string().describe('The unique identifier of the deleted workout'),\n deleted_at: z.string().describe('A date string indicating when the workout was deleted').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const deleteV1WebhookSubscriptionHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid().describe('Your API key'),\n})\n\n/**\n * @description The webhook subscription was successfully deleted\n */\nexport const deleteV1WebhookSubscription200Schema = z.any()\n\nexport const deleteV1WebhookSubscriptionMutationResponseSchema = z.lazy(() => deleteV1WebhookSubscription200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const exerciseTemplateSchema = z.object({\n id: z.string().describe('The exercise template ID.').optional(),\n title: z.string().describe('The exercise title.').optional(),\n type: z.string().describe('The exercise type.').optional(),\n primary_muscle_group: z.string().describe('The primary muscle group of the exercise.').optional(),\n secondary_muscle_groups: z.array(z.string()).describe('The secondary muscle groups of the exercise.').optional(),\n is_custom: z.boolean().describe('A boolean indicating whether the exercise is a custom exercise.').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { exerciseTemplateSchema } from './exerciseTemplateSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1ExerciseTemplatesExercisetemplateidPathParamsSchema = z.object({\n exerciseTemplateId: z.any(),\n})\n\nexport const getV1ExerciseTemplatesExercisetemplateidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description Success\n */\nexport const getV1ExerciseTemplatesExercisetemplateid200Schema = z.lazy(() => exerciseTemplateSchema)\n\n/**\n * @description Exercise template not found\n */\nexport const getV1ExerciseTemplatesExercisetemplateid404Schema = z.any()\n\nexport const getV1ExerciseTemplatesExercisetemplateidQueryResponseSchema = z.lazy(() => getV1ExerciseTemplatesExercisetemplateid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { exerciseTemplateSchema } from './exerciseTemplateSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1ExerciseTemplatesQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 100)'),\n})\n\nexport const getV1ExerciseTemplatesHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of exercise templates\n */\nexport const getV1ExerciseTemplates200Schema = z.object({\n page: z.number().int().default(1).describe('Current page number'),\n page_count: z.number().int().default(5).describe('Total number of pages'),\n exercise_templates: z.array(z.lazy(() => exerciseTemplateSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1ExerciseTemplates400Schema = z.any()\n\nexport const getV1ExerciseTemplatesQueryResponseSchema = z.lazy(() => getV1ExerciseTemplates200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const routineFolderSchema = z.object({\n id: z.number().describe('The routine folder ID.').optional(),\n index: z.number().describe('The routine folder index. Describes the order of the folder in the list.').optional(),\n title: z.string().describe('The routine folder title.').optional(),\n updated_at: z.string().describe('ISO 8601 timestamp of when the folder was last updated.').optional(),\n created_at: z.string().describe('ISO 8601 timestamp of when the folder was created.').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineFolderSchema } from './routineFolderSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutineFoldersFolderidPathParamsSchema = z.object({\n folderId: z.any(),\n})\n\nexport const getV1RoutineFoldersFolderidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description Success\n */\nexport const getV1RoutineFoldersFolderid200Schema = z.lazy(() => routineFolderSchema)\n\n/**\n * @description Routine folder not found\n */\nexport const getV1RoutineFoldersFolderid404Schema = z.any()\n\nexport const getV1RoutineFoldersFolderidQueryResponseSchema = z.lazy(() => getV1RoutineFoldersFolderid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineFolderSchema } from './routineFolderSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutineFoldersQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n})\n\nexport const getV1RoutineFoldersHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of routine folders\n */\nexport const getV1RoutineFolders200Schema = z.object({\n page: z.number().int().default(1).describe('Current page number'),\n page_count: z.number().int().default(5).describe('Total number of pages'),\n routine_folders: z.array(z.lazy(() => routineFolderSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1RoutineFolders400Schema = z.any()\n\nexport const getV1RoutineFoldersQueryResponseSchema = z.lazy(() => getV1RoutineFolders200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const routineSchema = z.object({\n id: z.string().describe('The routine ID.').optional(),\n title: z.string().describe('The routine title.').optional(),\n folder_id: z.number().describe('The routine folder ID.').nullable().nullish(),\n updated_at: z.string().describe('ISO 8601 timestamp of when the routine was last updated.').optional(),\n created_at: z.string().describe('ISO 8601 timestamp of when the routine was created.').optional(),\n exercises: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the exercise in the routine.').optional(),\n title: z.string().describe('Title of the exercise').optional(),\n rest_seconds: z.string().describe('The rest time in seconds between sets of the exercise').optional(),\n notes: z.string().describe('Routine notes on the exercise').optional(),\n exercise_template_id: z.string().describe('The id of the exercise template. This can be used to fetch the exercise template.').optional(),\n supersets_id: z\n .number()\n .describe('The id of the superset that the exercise belongs to. A value of null indicates the exercise is not part of a superset.')\n .nullable()\n .nullish(),\n sets: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the set in the routine.').optional(),\n type: z.string().describe(\"The type of set. This can be one of 'normal', 'warmup', 'dropset', 'failure'\").optional(),\n weight_kg: z.number().describe('Weight lifted in kilograms.').nullable().nullish(),\n reps: z.number().describe('Number of reps logged for the set').nullable().nullish(),\n rep_range: z\n .object({\n start: z.number().describe('Starting rep count for the range').nullable().nullish(),\n end: z.number().describe('Ending rep count for the range').nullable().nullish(),\n })\n .describe('Range of reps for the set, if applicable')\n .nullable()\n .nullish(),\n distance_meters: z.number().describe('Number of meters logged for the set').nullable().nullish(),\n duration_seconds: z.number().describe('Number of seconds logged for the set').nullable().nullish(),\n rpe: z.number().describe('RPE (Relative perceived exertion) value logged for the set').nullable().nullish(),\n custom_metric: z\n .number()\n .describe('Custom metric logged for the set (Currently only used to log floors or steps for stair machine exercises)')\n .nullable()\n .nullish(),\n }),\n )\n .optional(),\n }),\n )\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutinesRoutineidPathParamsSchema = z.object({\n routineId: z.any(),\n})\n\nexport const getV1RoutinesRoutineidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine with the provided id\n */\nexport const getV1RoutinesRoutineid200Schema = z.object({\n routine: z.lazy(() => routineSchema).optional(),\n})\n\n/**\n * @description Invalid request body\n */\nexport const getV1RoutinesRoutineid400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const getV1RoutinesRoutineidQueryResponseSchema = z.lazy(() => getV1RoutinesRoutineid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1RoutinesQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n})\n\nexport const getV1RoutinesHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of routines\n */\nexport const getV1Routines200Schema = z.object({\n page: z.number().int().describe('Current page number').optional(),\n page_count: z.number().int().describe('Total number of pages').optional(),\n routines: z.array(z.lazy(() => routineSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1Routines400Schema = z.any()\n\nexport const getV1RoutinesQueryResponseSchema = z.lazy(() => getV1Routines200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const getV1WebhookSubscriptionHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid().describe('Your API key'),\n})\n\n/**\n * @description The current webhook subscription\n */\nexport const getV1WebhookSubscription200Schema = z.object({\n url: z.string().describe('The webhook URL').optional(),\n auth_token: z.string().describe('The auth token for the webhook').optional(),\n})\n\n/**\n * @description No webhook subscription found\n */\nexport const getV1WebhookSubscription404Schema = z.any()\n\nexport const getV1WebhookSubscriptionQueryResponseSchema = z.lazy(() => getV1WebhookSubscription200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const getV1WorkoutsCountHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The total count of workouts\n */\nexport const getV1WorkoutsCount200Schema = z.object({\n workout_count: z.number().int().default(42).describe('The total number of workouts'),\n})\n\nexport const getV1WorkoutsCountQueryResponseSchema = z.lazy(() => getV1WorkoutsCount200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const workoutSchema = z.object({\n id: z.string().describe('The workout ID.').optional(),\n title: z.string().describe('The workout title.').optional(),\n description: z.string().describe('The workout description.').optional(),\n start_time: z.number().describe('ISO 8601 timestamp of when the workout was recorded to have started.').optional(),\n end_time: z.number().describe('ISO 8601 timestamp of when the workout was recorded to have ended.').optional(),\n updated_at: z.string().describe('ISO 8601 timestamp of when the workout was last updated.').optional(),\n created_at: z.string().describe('ISO 8601 timestamp of when the workout was created.').optional(),\n exercises: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the exercise in the workout.').optional(),\n title: z.string().describe('Title of the exercise').optional(),\n notes: z.string().describe('Notes on the exercise').optional(),\n exercise_template_id: z.string().describe('The id of the exercise template. This can be used to fetch the exercise template.').optional(),\n supersets_id: z\n .number()\n .describe('The id of the superset that the exercise belongs to. A value of null indicates the exercise is not part of a superset.')\n .nullable()\n .nullish(),\n sets: z\n .array(\n z.object({\n index: z.number().describe('Index indicating the order of the set in the workout.').optional(),\n type: z.string().describe(\"The type of set. This can be one of 'normal', 'warmup', 'dropset', 'failure'\").optional(),\n weight_kg: z.number().describe('Weight lifted in kilograms.').nullable().nullish(),\n reps: z.number().describe('Number of reps logged for the set').nullable().nullish(),\n distance_meters: z.number().describe('Number of meters logged for the set').nullable().nullish(),\n duration_seconds: z.number().describe('Number of seconds logged for the set').nullable().nullish(),\n rpe: z.number().describe('RPE (Relative perceived exertion) value logged for the set').nullable().nullish(),\n custom_metric: z\n .number()\n .describe('Custom metric logged for the set (Currently only used to log floors or steps for stair machine exercises)')\n .nullable()\n .nullish(),\n }),\n )\n .optional(),\n }),\n )\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const updatedWorkoutSchema = z.object({\n type: z.string().describe('Indicates the type of the event (updated)'),\n workout: z.lazy(() => workoutSchema),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { deletedWorkoutSchema } from './deletedWorkoutSchema.ts'\nimport { updatedWorkoutSchema } from './updatedWorkoutSchema.ts'\nimport { z } from 'zod'\n\nexport const paginatedWorkoutEventsSchema = z.object({\n page: z.number().int().describe('The current page number'),\n page_count: z.number().int().describe('The total number of pages available'),\n events: z\n .array(z.union([z.lazy(() => updatedWorkoutSchema), z.lazy(() => deletedWorkoutSchema)]))\n .describe('An array of workout events (either updated or deleted)'),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { paginatedWorkoutEventsSchema } from './paginatedWorkoutEventsSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1WorkoutsEventsQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n since: z.string().default('1970-01-01T00:00:00Z'),\n})\n\nexport const getV1WorkoutsEventsHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of workout events\n */\nexport const getV1WorkoutsEvents200Schema = z.lazy(() => paginatedWorkoutEventsSchema)\n\n/**\n * @description Internal Server Error\n */\nexport const getV1WorkoutsEvents500Schema = z.any()\n\nexport const getV1WorkoutsEventsQueryResponseSchema = z.lazy(() => getV1WorkoutsEvents200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1WorkoutsQueryParamsSchema = z.object({\n page: z.coerce.number().int().default(1).describe('Page number (Must be 1 or greater)'),\n pageSize: z.coerce.number().int().default(5).describe('Number of items on the requested page (Max 10)'),\n})\n\nexport const getV1WorkoutsHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description A paginated list of workouts\n */\nexport const getV1Workouts200Schema = z.object({\n page: z.number().int().describe('Current page number').optional(),\n page_count: z.number().int().describe('Total number of pages').optional(),\n workouts: z.array(z.lazy(() => workoutSchema)).optional(),\n})\n\n/**\n * @description Invalid page size\n */\nexport const getV1Workouts400Schema = z.any()\n\nexport const getV1WorkoutsQueryResponseSchema = z.lazy(() => getV1Workouts200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const getV1WorkoutsWorkoutidPathParamsSchema = z.object({\n workoutId: z.any(),\n})\n\nexport const getV1WorkoutsWorkoutidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description Success\n */\nexport const getV1WorkoutsWorkoutid200Schema = z.lazy(() => workoutSchema)\n\n/**\n * @description Workout not found\n */\nexport const getV1WorkoutsWorkoutid404Schema = z.any()\n\nexport const getV1WorkoutsWorkoutidQueryResponseSchema = z.lazy(() => getV1WorkoutsWorkoutid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const postRoutineFolderRequestBodySchema = z.object({\n routine_folder: z\n .object({\n title: z.string().describe('The title of the routine folder.').optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const postRoutinesRequestSetSchema = z.object({\n type: z.enum(['warmup', 'normal', 'failure', 'dropset']).describe('The type of the set.').optional(),\n weight_kg: z.number().describe('The weight in kilograms.').nullable().nullish(),\n reps: z.number().int().describe('The number of repetitions.').nullable().nullish(),\n distance_meters: z.number().int().describe('The distance in meters.').nullable().nullish(),\n duration_seconds: z.number().int().describe('The duration in seconds.').nullable().nullish(),\n custom_metric: z.number().describe('A custom metric for the set. Currently used for steps and floors.').nullable().nullish(),\n rep_range: z\n .object({\n start: z.number().describe('Starting rep count for the range').nullable().nullish(),\n end: z.number().describe('Ending rep count for the range').nullable().nullish(),\n })\n .describe('Range of reps for the set, if applicable')\n .nullable()\n .nullish(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutinesRequestSetSchema } from './postRoutinesRequestSetSchema.ts'\nimport { z } from 'zod'\n\nexport const postRoutinesRequestExerciseSchema = z.object({\n exercise_template_id: z.string().describe('The ID of the exercise template.').optional(),\n superset_id: z.number().int().describe('The ID of the superset.').nullable().nullish(),\n rest_seconds: z.number().int().describe('The rest time in seconds.').nullable().nullish(),\n notes: z.string().describe('Additional notes for the exercise.').nullable().nullish(),\n sets: z.array(z.lazy(() => postRoutinesRequestSetSchema)).optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutinesRequestExerciseSchema } from './postRoutinesRequestExerciseSchema.ts'\nimport { z } from 'zod'\n\nexport const postRoutinesRequestBodySchema = z.object({\n routine: z\n .object({\n title: z.string().describe('The title of the routine.').optional(),\n folder_id: z\n .number()\n .describe('The folder id the routine should be added to. Pass null to insert the routine into default \"My Routines\" folder')\n .nullable()\n .nullish(),\n notes: z.string().describe('Additional notes for the routine.').optional(),\n exercises: z.array(z.lazy(() => postRoutinesRequestExerciseSchema)).optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutineFolderRequestBodySchema } from './postRoutineFolderRequestBodySchema.ts'\nimport { routineFolderSchema } from './routineFolderSchema.ts'\nimport { z } from 'zod'\n\nexport const postV1RoutineFoldersHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine folder was successfully created\n */\nexport const postV1RoutineFolders201Schema = z.lazy(() => routineFolderSchema)\n\n/**\n * @description Invalid request body\n */\nexport const postV1RoutineFolders400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1RoutineFoldersMutationRequestSchema = z.lazy(() => postRoutineFolderRequestBodySchema)\n\nexport const postV1RoutineFoldersMutationResponseSchema = z.lazy(() => postV1RoutineFolders201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postRoutinesRequestBodySchema } from './postRoutinesRequestBodySchema.ts'\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const postV1RoutinesHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine was successfully created\n */\nexport const postV1Routines201Schema = z.lazy(() => routineSchema)\n\n/**\n * @description Invalid request body\n */\nexport const postV1Routines400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\n/**\n * @description Routine limit exceeded\n */\nexport const postV1Routines403Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1RoutinesMutationRequestSchema = z.lazy(() => postRoutinesRequestBodySchema)\n\nexport const postV1RoutinesMutationResponseSchema = z.lazy(() => postV1Routines201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const webhookRequestBodySchema = z.object({\n authToken: z.string().describe('The auth token that will be send as Authorization header in the webhook.').optional(),\n url: z.string().describe('The webhook URL.').optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { webhookRequestBodySchema } from './webhookRequestBodySchema.ts'\nimport { z } from 'zod'\n\nexport const postV1WebhookSubscriptionHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The webhook subscription was successfully created\n */\nexport const postV1WebhookSubscription201Schema = z.any()\n\n/**\n * @description Invalid request body\n */\nexport const postV1WebhookSubscription400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1WebhookSubscriptionMutationRequestSchema = z.lazy(() => webhookRequestBodySchema)\n\nexport const postV1WebhookSubscriptionMutationResponseSchema = z.lazy(() => postV1WebhookSubscription201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const postWorkoutsRequestSetSchema = z.object({\n type: z.enum(['warmup', 'normal', 'failure', 'dropset']).describe('The type of the set.').optional(),\n weight_kg: z.number().describe('The weight in kilograms.').nullable().nullish(),\n reps: z.number().int().describe('The number of repetitions.').nullable().nullish(),\n distance_meters: z.number().int().describe('The distance in meters.').nullable().nullish(),\n duration_seconds: z.number().int().describe('The duration in seconds.').nullable().nullish(),\n custom_metric: z.number().describe('A custom metric for the set. Currently used for steps and floors.').nullable().nullish(),\n rpe: z\n .union([z.literal(6), z.literal(7), z.literal(7.5), z.literal(8), z.literal(8.5), z.literal(9), z.literal(9.5), z.literal(10)])\n .describe('The Rating of Perceived Exertion (RPE).')\n .nullable()\n .nullish(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestSetSchema } from './postWorkoutsRequestSetSchema.ts'\nimport { z } from 'zod'\n\nexport const postWorkoutsRequestExerciseSchema = z.object({\n exercise_template_id: z.string().describe('The ID of the exercise template.').optional(),\n superset_id: z.number().int().describe('The ID of the superset.').nullable().nullish(),\n notes: z.string().describe('Additional notes for the exercise.').nullable().nullish(),\n sets: z.array(z.lazy(() => postWorkoutsRequestSetSchema)).optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestExerciseSchema } from './postWorkoutsRequestExerciseSchema.ts'\nimport { z } from 'zod'\n\nexport const postWorkoutsRequestBodySchema = z.object({\n workout: z\n .object({\n title: z.string().describe('The title of the workout.').optional(),\n description: z.string().describe('A description for the workout workout.').nullable().nullish(),\n start_time: z.string().describe('The time the workout started.').optional(),\n end_time: z.string().describe('The time the workout ended.').optional(),\n is_private: z.boolean().describe('A boolean indicating if the workout is private.').optional(),\n exercises: z.array(z.lazy(() => postWorkoutsRequestExerciseSchema)).optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestBodySchema } from './postWorkoutsRequestBodySchema.ts'\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const postV1WorkoutsHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The workout was successfully created\n */\nexport const postV1Workouts201Schema = z.lazy(() => workoutSchema)\n\n/**\n * @description Invalid request body\n */\nexport const postV1Workouts400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const postV1WorkoutsMutationRequestSchema = z.lazy(() => postWorkoutsRequestBodySchema)\n\nexport const postV1WorkoutsMutationResponseSchema = z.lazy(() => postV1Workouts201Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { z } from 'zod'\n\nexport const putRoutinesRequestSetSchema = z.object({\n type: z.enum(['warmup', 'normal', 'failure', 'dropset']).describe('The type of the set.').optional(),\n weight_kg: z.number().describe('The weight in kilograms.').nullable().nullish(),\n reps: z.number().int().describe('The number of repetitions.').nullable().nullish(),\n distance_meters: z.number().int().describe('The distance in meters.').nullable().nullish(),\n duration_seconds: z.number().int().describe('The duration in seconds.').nullable().nullish(),\n custom_metric: z.number().describe('A custom metric for the set. Currently used for steps and floors.').nullable().nullish(),\n rep_range: z\n .object({\n start: z.number().describe('Starting rep count for the range').nullable().nullish(),\n end: z.number().describe('Ending rep count for the range').nullable().nullish(),\n })\n .describe('Range of reps for the set, if applicable')\n .nullable()\n .nullish(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { putRoutinesRequestSetSchema } from './putRoutinesRequestSetSchema.ts'\nimport { z } from 'zod'\n\nexport const putRoutinesRequestExerciseSchema = z.object({\n exercise_template_id: z.string().describe('The ID of the exercise template.').optional(),\n superset_id: z.number().int().describe('The ID of the superset.').nullable().nullish(),\n rest_seconds: z.number().int().describe('The rest time in seconds.').nullable().nullish(),\n notes: z.string().describe('Additional notes for the exercise.').nullable().nullish(),\n sets: z.array(z.lazy(() => putRoutinesRequestSetSchema)).optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { putRoutinesRequestExerciseSchema } from './putRoutinesRequestExerciseSchema.ts'\nimport { z } from 'zod'\n\nexport const putRoutinesRequestBodySchema = z.object({\n routine: z\n .object({\n title: z.string().describe('The title of the routine.').optional(),\n notes: z.string().describe('Additional notes for the routine.').nullable().nullish(),\n exercises: z.array(z.lazy(() => putRoutinesRequestExerciseSchema)).optional(),\n })\n .optional(),\n})","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { putRoutinesRequestBodySchema } from './putRoutinesRequestBodySchema.ts'\nimport { routineSchema } from './routineSchema.ts'\nimport { z } from 'zod'\n\nexport const putV1RoutinesRoutineidPathParamsSchema = z.object({\n routineId: z.any(),\n})\n\nexport const putV1RoutinesRoutineidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The routine was successfully updated\n */\nexport const putV1RoutinesRoutineid200Schema = z.lazy(() => routineSchema)\n\n/**\n * @description Invalid request body\n */\nexport const putV1RoutinesRoutineid400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\n/**\n * @description Routine doesn\\'t exist or doesn\\'t belong to the user\n */\nexport const putV1RoutinesRoutineid404Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const putV1RoutinesRoutineidMutationRequestSchema = z.lazy(() => putRoutinesRequestBodySchema)\n\nexport const putV1RoutinesRoutineidMutationResponseSchema = z.lazy(() => putV1RoutinesRoutineid200Schema)","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport { postWorkoutsRequestBodySchema } from './postWorkoutsRequestBodySchema.ts'\nimport { workoutSchema } from './workoutSchema.ts'\nimport { z } from 'zod'\n\nexport const putV1WorkoutsWorkoutidPathParamsSchema = z.object({\n workoutId: z.any(),\n})\n\nexport const putV1WorkoutsWorkoutidHeaderParamsSchema = z.object({\n 'api-key': z.string().uuid(),\n})\n\n/**\n * @description The workout was successfully updated\n */\nexport const putV1WorkoutsWorkoutid200Schema = z.lazy(() => workoutSchema)\n\n/**\n * @description Invalid request body\n */\nexport const putV1WorkoutsWorkoutid400Schema = z.object({\n error: z.string().describe('Error message').optional(),\n})\n\nexport const putV1WorkoutsWorkoutidMutationRequestSchema = z.lazy(() => postWorkoutsRequestBodySchema)\n\nexport const putV1WorkoutsWorkoutidMutationResponseSchema = z.lazy(() => putV1WorkoutsWorkoutid200Schema)","import type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport type { HevyClient } from \"../generated/client/hevyClient.js\";\nimport type { PostWorkoutsRequestBody } from \"../generated/client/types/index.js\";\nimport { withErrorHandling } from \"../utils/error-handler.js\";\nimport { formatWorkout } from \"../utils/formatters.js\";\nimport {\n\tcreateEmptyResponse,\n\tcreateJsonResponse,\n} from \"../utils/response-formatter.js\";\n\n/**\n * Type definition for exercise set types\n */\ntype SetType = \"warmup\" | \"normal\" | \"failure\" | \"dropset\";\n\n/**\n * Interface for exercise set input\n */\ninterface ExerciseSetInput {\n\ttype: SetType;\n\tweightKg?: number | null;\n\treps?: number | null;\n\tdistanceMeters?: number | null;\n\tdurationSeconds?: number | null;\n\trpe?: number | null;\n\tcustomMetric?: number | null;\n}\n\n/**\n * Interface for exercise input\n */\ninterface ExerciseInput {\n\texerciseTemplateId: string;\n\tsupersetId?: number | null;\n\tnotes?: string | null;\n\tsets: ExerciseSetInput[];\n}\n\n/**\n * Register all workout-related tools with the MCP server\n */\nexport function registerWorkoutTools(\n\tserver: McpServer,\n\thevyClient: HevyClient,\n) {\n\t// Get workouts\n\tserver.tool(\n\t\t\"get-workouts\",\n\t\t\"Get a paginated list of workouts. Returns workout details including title, description, start/end times, and exercises performed. Results are ordered from newest to oldest.\",\n\t\t{\n\t\t\tpage: z.coerce.number().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t},\n\t\twithErrorHandling(async ({ page, pageSize }) => {\n\t\t\tconst data = await hevyClient.getWorkouts({\n\t\t\t\tpage,\n\t\t\t\tpageSize,\n\t\t\t});\n\n\t\t\t// Process workouts to extract relevant information\n\t\t\tconst workouts =\n\t\t\t\tdata?.workouts?.map((workout) => formatWorkout(workout)) || [];\n\n\t\t\tif (workouts.length === 0) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\"No workouts found for the specified parameters\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn createJsonResponse(workouts);\n\t\t}, \"get-workouts\"),\n\t);\n\n\t// Get single workout by ID\n\tserver.tool(\n\t\t\"get-workout\",\n\t\t\"Get complete details of a specific workout by ID. Returns all workout information including title, description, start/end times, and detailed exercise data.\",\n\t\t{\n\t\t\tworkoutId: z.string().min(1),\n\t\t},\n\t\twithErrorHandling(async ({ workoutId }) => {\n\t\t\tconst data = await hevyClient.getWorkout(workoutId);\n\n\t\t\tif (!data) {\n\t\t\t\treturn createEmptyResponse(`Workout with ID ${workoutId} not found`);\n\t\t\t}\n\n\t\t\tconst workout = formatWorkout(data);\n\t\t\treturn createJsonResponse(workout);\n\t\t}, \"get-workout\"),\n\t);\n\n\t// Get workout count\n\tserver.tool(\n\t\t\"get-workout-count\",\n\t\t\"Get the total number of workouts on the account. Useful for pagination or statistics.\",\n\t\t{},\n\t\twithErrorHandling(async () => {\n\t\t\tconst data = await hevyClient.getWorkoutCount();\n\t\t\t// Use type assertion to access count property\n\t\t\tconst count = data\n\t\t\t\t? (data as { workoutCount?: number }).workoutCount || 0\n\t\t\t\t: 0;\n\t\t\treturn createJsonResponse({ count });\n\t\t}, \"get-workout-count\"),\n\t);\n\n\t// Get workout events (updates/deletes)\n\tserver.tool(\n\t\t\"get-workout-events\",\n\t\t\"Retrieve a paged list of workout events (updates or deletes) since a given date. Events are ordered from newest to oldest. The intention is to allow clients to keep their local cache of workouts up to date without having to fetch the entire list of workouts.\",\n\t\t{\n\t\t\tpage: z.coerce.number().int().gte(1).default(1),\n\t\t\tpageSize: z.coerce.number().int().gte(1).lte(10).default(5),\n\t\t\tsince: z.string().default(\"1970-01-01T00:00:00Z\"),\n\t\t},\n\t\twithErrorHandling(async ({ page, pageSize, since }) => {\n\t\t\tconst data = await hevyClient.getWorkoutEvents({\n\t\t\t\tpage,\n\t\t\t\tpageSize,\n\t\t\t\tsince,\n\t\t\t});\n\n\t\t\tconst events = data?.events || [];\n\n\t\t\tif (events.length === 0) {\n\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t`No workout events found for the specified parameters since ${since}`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn createJsonResponse(events);\n\t\t}, \"get-workout-events\"),\n\t);\n\n\t// Create workout\n\tserver.tool(\n\t\t\"create-workout\",\n\t\t\"Create a new workout in your Hevy account. Requires title, start/end times, and at least one exercise with sets. Returns the complete workout details upon successful creation including the newly assigned workout ID.\",\n\t\t{\n\t\t\ttitle: z.string().min(1),\n\t\t\tdescription: z.string().optional().nullable(),\n\t\t\tstartTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tendTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tisPrivate: z.boolean().default(false),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\tnotes: z.string().optional().nullable(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\trpe: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tstartTime,\n\t\t\t\tendTime,\n\t\t\t\tisPrivate,\n\t\t\t\texercises,\n\t\t\t}) => {\n\t\t\t\tconst requestBody: PostWorkoutsRequestBody = {\n\t\t\t\t\tworkout: {\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription: description || null,\n\t\t\t\t\t\tstartTime,\n\t\t\t\t\t\tendTime,\n\t\t\t\t\t\tisPrivate,\n\t\t\t\t\t\texercises: exercises.map((exercise: ExerciseInput) => ({\n\t\t\t\t\t\t\texerciseTemplateId: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsupersetId: exercise.supersetId || null,\n\t\t\t\t\t\t\tnotes: exercise.notes || null,\n\t\t\t\t\t\t\tsets: exercise.sets.map((set: ExerciseSetInput) => ({\n\t\t\t\t\t\t\t\ttype: set.type,\n\t\t\t\t\t\t\t\tweightKg: set.weightKg || null,\n\t\t\t\t\t\t\t\treps: set.reps || null,\n\t\t\t\t\t\t\t\tdistanceMeters: set.distanceMeters || null,\n\t\t\t\t\t\t\t\tdurationSeconds: set.durationSeconds || null,\n\t\t\t\t\t\t\t\trpe: set.rpe || null,\n\t\t\t\t\t\t\t\tcustomMetric: set.customMetric || null,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t})),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst data = await hevyClient.createWorkout(requestBody);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t\"Failed to create workout: Server returned no data\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst workout = formatWorkout(data);\n\t\t\t\treturn createJsonResponse(workout, {\n\t\t\t\t\tpretty: true,\n\t\t\t\t\tindent: 2,\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"create-workout\",\n\t\t),\n\t);\n\n\t// Update workout\n\tserver.tool(\n\t\t\"update-workout\",\n\t\t\"Update an existing workout by ID. You can modify the title, description, start/end times, privacy setting, and exercise data. Returns the updated workout with all changes applied.\",\n\t\t{\n\t\t\tworkoutId: z.string().min(1),\n\t\t\ttitle: z.string().min(1),\n\t\t\tdescription: z.string().optional().nullable(),\n\t\t\tstartTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tendTime: z.string().regex(/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$/),\n\t\t\tisPrivate: z.boolean().default(false),\n\t\t\texercises: z.array(\n\t\t\t\tz.object({\n\t\t\t\t\texerciseTemplateId: z.string().min(1),\n\t\t\t\t\tsupersetId: z.coerce.number().nullable().optional(),\n\t\t\t\t\tnotes: z.string().optional().nullable(),\n\t\t\t\t\tsets: z.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\ttype: z\n\t\t\t\t\t\t\t\t.enum([\"warmup\", \"normal\", \"failure\", \"dropset\"])\n\t\t\t\t\t\t\t\t.default(\"normal\"),\n\t\t\t\t\t\t\tweightKg: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\treps: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdistanceMeters: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\tdurationSeconds: z.coerce.number().int().optional().nullable(),\n\t\t\t\t\t\t\trpe: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t\tcustomMetric: z.coerce.number().optional().nullable(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t),\n\t\t},\n\t\twithErrorHandling(\n\t\t\tasync ({\n\t\t\t\tworkoutId,\n\t\t\t\ttitle,\n\t\t\t\tdescription,\n\t\t\t\tstartTime,\n\t\t\t\tendTime,\n\t\t\t\tisPrivate,\n\t\t\t\texercises,\n\t\t\t}) => {\n\t\t\t\tconst requestBody: PostWorkoutsRequestBody = {\n\t\t\t\t\tworkout: {\n\t\t\t\t\t\ttitle,\n\t\t\t\t\t\tdescription: description || null,\n\t\t\t\t\t\tstartTime,\n\t\t\t\t\t\tendTime,\n\t\t\t\t\t\tisPrivate,\n\t\t\t\t\t\texercises: exercises.map((exercise: ExerciseInput) => ({\n\t\t\t\t\t\t\texerciseTemplateId: exercise.exerciseTemplateId,\n\t\t\t\t\t\t\tsupersetId: exercise.supersetId || null,\n\t\t\t\t\t\t\tnotes: exercise.notes || null,\n\t\t\t\t\t\t\tsets: exercise.sets.map((set: ExerciseSetInput) => ({\n\t\t\t\t\t\t\t\ttype: set.type,\n\t\t\t\t\t\t\t\tweightKg: set.weightKg || null,\n\t\t\t\t\t\t\t\treps: set.reps || null,\n\t\t\t\t\t\t\t\tdistanceMeters: set.distanceMeters || null,\n\t\t\t\t\t\t\t\tdurationSeconds: set.durationSeconds || null,\n\t\t\t\t\t\t\t\trpe: set.rpe || null,\n\t\t\t\t\t\t\t\tcustomMetric: set.customMetric || null,\n\t\t\t\t\t\t\t})),\n\t\t\t\t\t\t})),\n\t\t\t\t\t},\n\t\t\t\t};\n\n\t\t\t\tconst data = await hevyClient.updateWorkout(workoutId, requestBody);\n\n\t\t\t\tif (!data) {\n\t\t\t\t\treturn createEmptyResponse(\n\t\t\t\t\t\t`Failed to update workout with ID ${workoutId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst workout = formatWorkout(data);\n\t\t\t\treturn createJsonResponse(workout, {\n\t\t\t\t\tpretty: true,\n\t\t\t\t\tindent: 2,\n\t\t\t\t});\n\t\t\t},\n\t\t\t\"update-workout-operation\",\n\t\t),\n\t);\n}\n","import type {\n\tRequestConfig,\n\tResponseConfig,\n} from \"@kubb/plugin-client/clients/axios\";\nimport axios from \"axios\";\nimport * as api from \"../generated/client/api\";\nimport type {\n\tGetV1ExerciseTemplatesQueryParams,\n\tGetV1RoutineFoldersQueryParams,\n\tGetV1RoutinesQueryParams,\n\tGetV1WorkoutsEventsQueryParams,\n\tGetV1WorkoutsQueryParams,\n\tPostV1RoutineFoldersMutationRequest,\n\tPostV1RoutinesMutationRequest,\n\tPostV1WorkoutsMutationRequest,\n\tPutV1RoutinesRoutineidMutationRequest,\n\tPutV1WorkoutsWorkoutidMutationRequest,\n} from \"../generated/client/types\";\n\n// Define a proper client type that matches the Kubb client interface\ntype KubbClient = {\n\t<TData, _TError = unknown, TVariables = unknown>(\n\t\tconfig: RequestConfig<TVariables>,\n\t): Promise<ResponseConfig<TData>>;\n\tgetConfig: () => Partial<RequestConfig<unknown>>;\n\tsetConfig: (config: RequestConfig) => Partial<RequestConfig<unknown>>;\n};\n\nexport function createClient(\n\tapiKey: string,\n\tbaseUrl = \"https://api.hevyapp.com\",\n) {\n\t// Create an axios instance with the API key\n\tconst axiosInstance = axios.create({\n\t\tbaseURL: baseUrl,\n\t\theaders: {\n\t\t\t\"api-key\": apiKey,\n\t\t},\n\t});\n\n\t// Create headers object with API key\n\tconst headers = {\n\t\t\"api-key\": apiKey,\n\t};\n\n\t// Cast axios instance to the expected client type\n\tconst client = axiosInstance as unknown as KubbClient;\n\n\t// Return an object with all the API methods using ReturnType for automatic type inference\n\treturn {\n\t\t// Workouts\n\t\tgetWorkouts: (\n\t\t\tparams?: GetV1WorkoutsQueryParams,\n\t\t): ReturnType<typeof api.getV1Workouts> =>\n\t\t\tapi.getV1Workouts(headers, params, { client }),\n\t\tgetWorkout: (\n\t\t\tworkoutId: string,\n\t\t): ReturnType<typeof api.getV1WorkoutsWorkoutid> =>\n\t\t\tapi.getV1WorkoutsWorkoutid(workoutId, headers, { client }),\n\t\tcreateWorkout: (\n\t\t\tdata: PostV1WorkoutsMutationRequest,\n\t\t): ReturnType<typeof api.postV1Workouts> =>\n\t\t\tapi.postV1Workouts(headers, data, { client }),\n\t\tupdateWorkout: (\n\t\t\tworkoutId: string,\n\t\t\tdata: PutV1WorkoutsWorkoutidMutationRequest,\n\t\t): ReturnType<typeof api.putV1WorkoutsWorkoutid> =>\n\t\t\tapi.putV1WorkoutsWorkoutid(workoutId, headers, data, {\n\t\t\t\tclient,\n\t\t\t}),\n\t\tgetWorkoutCount: (): ReturnType<typeof api.getV1WorkoutsCount> =>\n\t\t\tapi.getV1WorkoutsCount(headers, { client }),\n\t\tgetWorkoutEvents: (\n\t\t\tparams?: GetV1WorkoutsEventsQueryParams,\n\t\t): ReturnType<typeof api.getV1WorkoutsEvents> =>\n\t\t\tapi.getV1WorkoutsEvents(headers, params, { client }),\n\n\t\t// Routines\n\t\tgetRoutines: (\n\t\t\tparams?: GetV1RoutinesQueryParams,\n\t\t): ReturnType<typeof api.getV1Routines> =>\n\t\t\tapi.getV1Routines(headers, params, { client }),\n\t\tgetRoutineById: (\n\t\t\troutineId: string,\n\t\t): ReturnType<typeof api.getV1RoutinesRoutineid> =>\n\t\t\tapi.getV1RoutinesRoutineid(routineId, headers, { client }),\n\t\tcreateRoutine: (\n\t\t\tdata: PostV1RoutinesMutationRequest,\n\t\t): ReturnType<typeof api.postV1Routines> =>\n\t\t\tapi.postV1Routines(headers, data, { client }),\n\t\tupdateRoutine: (\n\t\t\troutineId: string,\n\t\t\tdata: PutV1RoutinesRoutineidMutationRequest,\n\t\t): ReturnType<typeof api.putV1RoutinesRoutineid> =>\n\t\t\tapi.putV1RoutinesRoutineid(routineId, headers, data, {\n\t\t\t\tclient,\n\t\t\t}),\n\n\t\t// Exercise Templates\n\t\tgetExerciseTemplates: (\n\t\t\tparams?: GetV1ExerciseTemplatesQueryParams,\n\t\t): ReturnType<typeof api.getV1ExerciseTemplates> =>\n\t\t\tapi.getV1ExerciseTemplates(headers, params, { client }),\n\t\tgetExerciseTemplate: (\n\t\t\ttemplateId: string,\n\t\t): ReturnType<typeof api.getV1ExerciseTemplatesExercisetemplateid> =>\n\t\t\tapi.getV1ExerciseTemplatesExercisetemplateid(templateId, headers, {\n\t\t\t\tclient,\n\t\t\t}),\n\n\t\t// Routine Folders\n\t\tgetRoutineFolders: (\n\t\t\tparams?: GetV1RoutineFoldersQueryParams,\n\t\t): ReturnType<typeof api.getV1RoutineFolders> =>\n\t\t\tapi.getV1RoutineFolders(headers, params, { client }),\n\t\tcreateRoutineFolder: (\n\t\t\tdata: PostV1RoutineFoldersMutationRequest,\n\t\t): ReturnType<typeof api.postV1RoutineFolders> =>\n\t\t\tapi.postV1RoutineFolders(headers, data, { client }),\n\t\tgetRoutineFolder: (\n\t\t\tfolderId: string,\n\t\t): ReturnType<typeof api.getV1RoutineFoldersFolderid> =>\n\t\t\tapi.getV1RoutineFoldersFolderid(folderId, headers, {\n\t\t\t\tclient,\n\t\t\t}),\n\n\t\t// Webhooks\n\t\tgetWebhookSubscription: (): ReturnType<\n\t\t\ttypeof api.getV1WebhookSubscription\n\t\t> => api.getV1WebhookSubscription(headers, { client }),\n\t\tcreateWebhookSubscription: (\n\t\t\tdata: import(\"../generated/client/types\").PostV1WebhookSubscriptionMutationRequest,\n\t\t): ReturnType<typeof api.postV1WebhookSubscription> =>\n\t\t\tapi.postV1WebhookSubscription(headers, data, { client }),\n\t\tdeleteWebhookSubscription: (): ReturnType<\n\t\t\ttypeof api.deleteV1WebhookSubscription\n\t\t> => api.deleteV1WebhookSubscription(headers, { client }),\n\t};\n}\n","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { DeleteV1WebhookSubscriptionMutationResponse, DeleteV1WebhookSubscriptionHeaderParams } from '../types/DeleteV1WebhookSubscription.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getDeleteV1WebhookSubscriptionUrl() {\n return `/v1/webhook-subscription` as const\n}\n\n/**\n * @summary Delete a webhook subscription.\n * {@link /v1/webhook-subscription}\n */\nexport async function deleteV1WebhookSubscription(\n headers: DeleteV1WebhookSubscriptionHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<DeleteV1WebhookSubscriptionMutationResponse, ResponseErrorConfig<Error>, unknown>({\n method: 'DELETE',\n url: getDeleteV1WebhookSubscriptionUrl().toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1ExerciseTemplatesQueryResponse,\n GetV1ExerciseTemplatesQueryParams,\n GetV1ExerciseTemplatesHeaderParams,\n GetV1ExerciseTemplates400,\n} from '../types/GetV1ExerciseTemplates.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1ExerciseTemplatesUrl() {\n return `/v1/exercise_templates` as const\n}\n\n/**\n * @summary Get a paginated list of exercise templates available on the account.\n * {@link /v1/exercise_templates}\n */\nexport async function getV1ExerciseTemplates(\n headers: GetV1ExerciseTemplatesHeaderParams,\n params?: GetV1ExerciseTemplatesQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1ExerciseTemplatesQueryResponse, ResponseErrorConfig<GetV1ExerciseTemplates400>, unknown>({\n method: 'GET',\n url: getGetV1ExerciseTemplatesUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1ExerciseTemplatesExercisetemplateidQueryResponse,\n GetV1ExerciseTemplatesExercisetemplateidPathParams,\n GetV1ExerciseTemplatesExercisetemplateidHeaderParams,\n GetV1ExerciseTemplatesExercisetemplateid404,\n} from '../types/GetV1ExerciseTemplatesExercisetemplateid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1ExerciseTemplatesExercisetemplateidUrl(exerciseTemplateId: GetV1ExerciseTemplatesExercisetemplateidPathParams['exerciseTemplateId']) {\n return `/v1/exercise_templates/${exerciseTemplateId}` as const\n}\n\n/**\n * @summary Get a single exercise template by id.\n * {@link /v1/exercise_templates/:exerciseTemplateId}\n */\nexport async function getV1ExerciseTemplatesExercisetemplateid(\n exerciseTemplateId: GetV1ExerciseTemplatesExercisetemplateidPathParams['exerciseTemplateId'],\n headers: GetV1ExerciseTemplatesExercisetemplateidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1ExerciseTemplatesExercisetemplateidQueryResponse, ResponseErrorConfig<GetV1ExerciseTemplatesExercisetemplateid404>, unknown>({\n method: 'GET',\n url: getGetV1ExerciseTemplatesExercisetemplateidUrl(exerciseTemplateId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1RoutineFoldersQueryResponse,\n GetV1RoutineFoldersQueryParams,\n GetV1RoutineFoldersHeaderParams,\n GetV1RoutineFolders400,\n} from '../types/GetV1RoutineFolders.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutineFoldersUrl() {\n return `/v1/routine_folders` as const\n}\n\n/**\n * @summary Get a paginated list of routine folders available on the account.\n * {@link /v1/routine_folders}\n */\nexport async function getV1RoutineFolders(\n headers: GetV1RoutineFoldersHeaderParams,\n params?: GetV1RoutineFoldersQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutineFoldersQueryResponse, ResponseErrorConfig<GetV1RoutineFolders400>, unknown>({\n method: 'GET',\n url: getGetV1RoutineFoldersUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1RoutineFoldersFolderidQueryResponse,\n GetV1RoutineFoldersFolderidPathParams,\n GetV1RoutineFoldersFolderidHeaderParams,\n GetV1RoutineFoldersFolderid404,\n} from '../types/GetV1RoutineFoldersFolderid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutineFoldersFolderidUrl(folderId: GetV1RoutineFoldersFolderidPathParams['folderId']) {\n return `/v1/routine_folders/${folderId}` as const\n}\n\n/**\n * @summary Get a single routine folder by id.\n * {@link /v1/routine_folders/:folderId}\n */\nexport async function getV1RoutineFoldersFolderid(\n folderId: GetV1RoutineFoldersFolderidPathParams['folderId'],\n headers: GetV1RoutineFoldersFolderidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutineFoldersFolderidQueryResponse, ResponseErrorConfig<GetV1RoutineFoldersFolderid404>, unknown>({\n method: 'GET',\n url: getGetV1RoutineFoldersFolderidUrl(folderId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { GetV1RoutinesQueryResponse, GetV1RoutinesQueryParams, GetV1RoutinesHeaderParams, GetV1Routines400 } from '../types/GetV1Routines.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutinesUrl() {\n return `/v1/routines` as const\n}\n\n/**\n * @summary Get a paginated list of routines\n * {@link /v1/routines}\n */\nexport async function getV1Routines(\n headers: GetV1RoutinesHeaderParams,\n params?: GetV1RoutinesQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutinesQueryResponse, ResponseErrorConfig<GetV1Routines400>, unknown>({\n method: 'GET',\n url: getGetV1RoutinesUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1RoutinesRoutineidQueryResponse,\n GetV1RoutinesRoutineidPathParams,\n GetV1RoutinesRoutineidHeaderParams,\n GetV1RoutinesRoutineid400,\n} from '../types/GetV1RoutinesRoutineid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1RoutinesRoutineidUrl(routineId: GetV1RoutinesRoutineidPathParams['routineId']) {\n return `/v1/routines/${routineId}` as const\n}\n\n/**\n * @summary Get a routine by its Id\n * {@link /v1/routines/:routineId}\n */\nexport async function getV1RoutinesRoutineid(\n routineId: GetV1RoutinesRoutineidPathParams['routineId'],\n headers: GetV1RoutinesRoutineidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1RoutinesRoutineidQueryResponse, ResponseErrorConfig<GetV1RoutinesRoutineid400>, unknown>({\n method: 'GET',\n url: getGetV1RoutinesRoutineidUrl(routineId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1WebhookSubscriptionQueryResponse,\n GetV1WebhookSubscriptionHeaderParams,\n GetV1WebhookSubscription404,\n} from '../types/GetV1WebhookSubscription.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WebhookSubscriptionUrl() {\n return `/v1/webhook-subscription` as const\n}\n\n/**\n * @summary Get the current webhook subscription.\n * {@link /v1/webhook-subscription}\n */\nexport async function getV1WebhookSubscription(headers: GetV1WebhookSubscriptionHeaderParams, config: Partial<RequestConfig> & { client?: typeof fetch } = {}) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WebhookSubscriptionQueryResponse, ResponseErrorConfig<GetV1WebhookSubscription404>, unknown>({\n method: 'GET',\n url: getGetV1WebhookSubscriptionUrl().toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { GetV1WorkoutsQueryResponse, GetV1WorkoutsQueryParams, GetV1WorkoutsHeaderParams, GetV1Workouts400 } from '../types/GetV1Workouts.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsUrl() {\n return `/v1/workouts` as const\n}\n\n/**\n * @summary Get a paginated list of workouts\n * {@link /v1/workouts}\n */\nexport async function getV1Workouts(\n headers: GetV1WorkoutsHeaderParams,\n params?: GetV1WorkoutsQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsQueryResponse, ResponseErrorConfig<GetV1Workouts400>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { GetV1WorkoutsCountQueryResponse, GetV1WorkoutsCountHeaderParams } from '../types/GetV1WorkoutsCount.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsCountUrl() {\n return `/v1/workouts/count` as const\n}\n\n/**\n * @summary Get the total number of workouts on the account\n * {@link /v1/workouts/count}\n */\nexport async function getV1WorkoutsCount(headers: GetV1WorkoutsCountHeaderParams, config: Partial<RequestConfig> & { client?: typeof fetch } = {}) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsCountQueryResponse, ResponseErrorConfig<Error>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsCountUrl().toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1WorkoutsEventsQueryResponse,\n GetV1WorkoutsEventsQueryParams,\n GetV1WorkoutsEventsHeaderParams,\n GetV1WorkoutsEvents500,\n} from '../types/GetV1WorkoutsEvents.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsEventsUrl() {\n return `/v1/workouts/events` as const\n}\n\n/**\n * @description Returns a paginated array of workout events, indicating updates or deletions.\n * @summary Retrieve a paged list of workout events (updates or deletes) since a given date. Events are ordered from newest to oldest. The intention is to allow clients to keep their local cache of workouts up to date without having to fetch the entire list of workouts.\n * {@link /v1/workouts/events}\n */\nexport async function getV1WorkoutsEvents(\n headers: GetV1WorkoutsEventsHeaderParams,\n params?: GetV1WorkoutsEventsQueryParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsEventsQueryResponse, ResponseErrorConfig<GetV1WorkoutsEvents500>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsEventsUrl().toString(),\n params,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n GetV1WorkoutsWorkoutidQueryResponse,\n GetV1WorkoutsWorkoutidPathParams,\n GetV1WorkoutsWorkoutidHeaderParams,\n GetV1WorkoutsWorkoutid404,\n} from '../types/GetV1WorkoutsWorkoutid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getGetV1WorkoutsWorkoutidUrl(workoutId: GetV1WorkoutsWorkoutidPathParams['workoutId']) {\n return `/v1/workouts/${workoutId}` as const\n}\n\n/**\n * @summary Get a single workout’s complete details by the workoutId\n * {@link /v1/workouts/:workoutId}\n */\nexport async function getV1WorkoutsWorkoutid(\n workoutId: GetV1WorkoutsWorkoutidPathParams['workoutId'],\n headers: GetV1WorkoutsWorkoutidHeaderParams,\n config: Partial<RequestConfig> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const res = await request<GetV1WorkoutsWorkoutidQueryResponse, ResponseErrorConfig<GetV1WorkoutsWorkoutid404>, unknown>({\n method: 'GET',\n url: getGetV1WorkoutsWorkoutidUrl(workoutId).toString(),\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PostV1RoutineFoldersMutationRequest,\n PostV1RoutineFoldersMutationResponse,\n PostV1RoutineFoldersHeaderParams,\n PostV1RoutineFolders400,\n} from '../types/PostV1RoutineFolders.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1RoutineFoldersUrl() {\n return `/v1/routine_folders` as const\n}\n\n/**\n * @summary Create a new routine folder. The folder will be created at index 0, and all other folders will have their indexes incremented.\n * {@link /v1/routine_folders}\n */\nexport async function postV1RoutineFolders(\n headers: PostV1RoutineFoldersHeaderParams,\n data?: PostV1RoutineFoldersMutationRequest,\n config: Partial<RequestConfig<PostV1RoutineFoldersMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PostV1RoutineFoldersMutationResponse, ResponseErrorConfig<PostV1RoutineFolders400>, PostV1RoutineFoldersMutationRequest>({\n method: 'POST',\n url: getPostV1RoutineFoldersUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PostV1RoutinesMutationRequest,\n PostV1RoutinesMutationResponse,\n PostV1RoutinesHeaderParams,\n PostV1Routines400,\n PostV1Routines403,\n} from '../types/PostV1Routines.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1RoutinesUrl() {\n return `/v1/routines` as const\n}\n\n/**\n * @summary Create a new routine\n * {@link /v1/routines}\n */\nexport async function postV1Routines(\n headers: PostV1RoutinesHeaderParams,\n data?: PostV1RoutinesMutationRequest,\n config: Partial<RequestConfig<PostV1RoutinesMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PostV1RoutinesMutationResponse, ResponseErrorConfig<PostV1Routines400 | PostV1Routines403>, PostV1RoutinesMutationRequest>({\n method: 'POST',\n url: getPostV1RoutinesUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PostV1WebhookSubscriptionMutationRequest,\n PostV1WebhookSubscriptionMutationResponse,\n PostV1WebhookSubscriptionHeaderParams,\n PostV1WebhookSubscription400,\n} from '../types/PostV1WebhookSubscription.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1WebhookSubscriptionUrl() {\n return `/v1/webhook-subscription` as const\n}\n\n/**\n * @description This endpoint allows you to create a webhook subscription that will notify your application when a workout is created. Your endpoint must respond with a `200 OK` status within **5 seconds**, otherwise the delivery will be retried.When a new workout is created, we will send a POST request to your provided URL with the following JSON payload:```json { \"id\": \"00000000-0000-0000-0000-000000000001\", \"payload\": { \"workoutId\": \"f1085cdb-32b2-4003-967d-53a3af8eaecb\" }}\n * @summary Create a new webhook subscription.\n * {@link /v1/webhook-subscription}\n */\nexport async function postV1WebhookSubscription(\n headers: PostV1WebhookSubscriptionHeaderParams,\n data?: PostV1WebhookSubscriptionMutationRequest,\n config: Partial<RequestConfig<PostV1WebhookSubscriptionMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<\n PostV1WebhookSubscriptionMutationResponse,\n ResponseErrorConfig<PostV1WebhookSubscription400>,\n PostV1WebhookSubscriptionMutationRequest\n >({\n method: 'POST',\n url: getPostV1WebhookSubscriptionUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type { PostV1WorkoutsMutationRequest, PostV1WorkoutsMutationResponse, PostV1WorkoutsHeaderParams, PostV1Workouts400 } from '../types/PostV1Workouts.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPostV1WorkoutsUrl() {\n return `/v1/workouts` as const\n}\n\n/**\n * @summary Create a new workout\n * {@link /v1/workouts}\n */\nexport async function postV1Workouts(\n headers: PostV1WorkoutsHeaderParams,\n data?: PostV1WorkoutsMutationRequest,\n config: Partial<RequestConfig<PostV1WorkoutsMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PostV1WorkoutsMutationResponse, ResponseErrorConfig<PostV1Workouts400>, PostV1WorkoutsMutationRequest>({\n method: 'POST',\n url: getPostV1WorkoutsUrl().toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PutV1RoutinesRoutineidMutationRequest,\n PutV1RoutinesRoutineidMutationResponse,\n PutV1RoutinesRoutineidPathParams,\n PutV1RoutinesRoutineidHeaderParams,\n PutV1RoutinesRoutineid400,\n PutV1RoutinesRoutineid404,\n} from '../types/PutV1RoutinesRoutineid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPutV1RoutinesRoutineidUrl(routineId: PutV1RoutinesRoutineidPathParams['routineId']) {\n return `/v1/routines/${routineId}` as const\n}\n\n/**\n * @summary Update an existing routine\n * {@link /v1/routines/:routineId}\n */\nexport async function putV1RoutinesRoutineid(\n routineId: PutV1RoutinesRoutineidPathParams['routineId'],\n headers: PutV1RoutinesRoutineidHeaderParams,\n data?: PutV1RoutinesRoutineidMutationRequest,\n config: Partial<RequestConfig<PutV1RoutinesRoutineidMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<\n PutV1RoutinesRoutineidMutationResponse,\n ResponseErrorConfig<PutV1RoutinesRoutineid400 | PutV1RoutinesRoutineid404>,\n PutV1RoutinesRoutineidMutationRequest\n >({\n method: 'PUT',\n url: getPutV1RoutinesRoutineidUrl(routineId).toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","/**\n * Generated by Kubb (https://kubb.dev/).\n * Do not edit manually.\n */\n\nimport fetch from '@kubb/plugin-client/clients/axios'\nimport type {\n PutV1WorkoutsWorkoutidMutationRequest,\n PutV1WorkoutsWorkoutidMutationResponse,\n PutV1WorkoutsWorkoutidPathParams,\n PutV1WorkoutsWorkoutidHeaderParams,\n PutV1WorkoutsWorkoutid400,\n} from '../types/PutV1WorkoutsWorkoutid.ts'\nimport type { RequestConfig, ResponseErrorConfig } from '@kubb/plugin-client/clients/axios'\n\nfunction getPutV1WorkoutsWorkoutidUrl(workoutId: PutV1WorkoutsWorkoutidPathParams['workoutId']) {\n return `/v1/workouts/${workoutId}` as const\n}\n\n/**\n * @summary Update an existing workout\n * {@link /v1/workouts/:workoutId}\n */\nexport async function putV1WorkoutsWorkoutid(\n workoutId: PutV1WorkoutsWorkoutidPathParams['workoutId'],\n headers: PutV1WorkoutsWorkoutidHeaderParams,\n data?: PutV1WorkoutsWorkoutidMutationRequest,\n config: Partial<RequestConfig<PutV1WorkoutsWorkoutidMutationRequest>> & { client?: typeof fetch } = {},\n) {\n const { client: request = fetch, ...requestConfig } = config\n\n const requestData = data\n const res = await request<PutV1WorkoutsWorkoutidMutationResponse, ResponseErrorConfig<PutV1WorkoutsWorkoutid400>, PutV1WorkoutsWorkoutidMutationRequest>({\n method: 'PUT',\n url: getPutV1WorkoutsWorkoutidUrl(workoutId).toString(),\n data: requestData,\n ...requestConfig,\n headers: { ...headers, ...requestConfig.headers },\n })\n return res.data\n}","// Import the Kubb-based client\nimport { createClient as createKubbClient } from \"./hevyClientKubb.js\";\n\nexport function createClient(apiKey: string, baseUrl: string) {\n\treturn createKubbClient(apiKey, baseUrl);\n}\n","import { randomUUID } from \"node:crypto\";\nimport type { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { StreamableHTTPServerTransport } from \"@modelcontextprotocol/sdk/server/streamableHttp.js\";\nimport { isInitializeRequest } from \"@modelcontextprotocol/sdk/types.js\";\nimport express from \"express\";\n\n// Map to store transports by session ID\nconst transports = new Map<\n string,\n {\n transport: StreamableHTTPServerTransport;\n lastActivity: number;\n }\n>();\n\n// Session timeout in milliseconds (30 minutes)\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\n\n// Periodic cleanup of abandoned sessions\nsetInterval(() => {\n const now = Date.now();\n for (const [sessionId, session] of transports) {\n if (now - session.lastActivity > SESSION_TIMEOUT) {\n console.log(`Cleaning up abandoned session: ${sessionId}`);\n session.transport.close?.();\n transports.delete(sessionId);\n }\n }\n}, 5 * 60 * 1000); // Run cleanup every 5 minutes\n\n/**\n * Create and configure Express server for MCP HTTP transport\n */\nexport function createHttpServer(\n\tserver: McpServer,\n\toptions?: {\n\t\tport?: number;\n\t\thost?: string;\n\t\tenableDnsRebindingProtection?: boolean;\n\t\tallowedHosts?: string[];\n\t},\n) {\n\tconst app = express();\n\tconst port = options?.port || 3000;\n\tconst host = options?.host || \"127.0.0.1\";\n\n\tapp.use(express.json());\n\n\t// Handle POST requests for client-to-server communication\n\tapp.post(\"/mcp\", async (req, res) => {\n\t\t// Check for existing session ID\n\t\tconst sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\t\tlet transport: StreamableHTTPServerTransport;\n\n if (sessionId && transports.has(sessionId)) {\n // Reuse existing transport\n transport = transports.get(sessionId)!.transport;\n transports.get(sessionId)!.lastActivity = Date.now();\n\t\t} else if (!sessionId && isInitializeRequest(req.body)) {\n\t\t\t// New initialization request\n\t\t\ttransport = new StreamableHTTPServerTransport({\n\t\t\t\tsessionIdGenerator: () => randomUUID(),\n\t\t\t\tonsessioninitialized: (sessionId) => {\n\t\t\t\t\t// Store the transport by session ID\n transports.set(sessionId, { transport, lastActivity: Date.now() });\n\t\t\t\t},\n\t\t\t\t// DNS rebinding protection configuration\n\t\t\t\tenableDnsRebindingProtection:\n\t\t\t\t\toptions?.enableDnsRebindingProtection ?? false,\n\t\t\t\tallowedHosts: options?.allowedHosts || [\"127.0.0.1\"],\n\t\t\t});\n\n\t\t\t// Clean up transport when closed\n\t\t\ttransport.onclose = () => {\n\t\t\t\tif (transport.sessionId) {\n\t\t\t\t\ttransports.delete(transport.sessionId!);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Connect to the MCP server\n\t\t\tawait server.connect(transport);\n\t\t} else {\n\t\t\t// Invalid request\n\t\t\tres.status(400).json({\n\t\t\t\tjsonrpc: \"2.0\",\n\t\t\t\terror: {\n\t\t\t\t\tcode: -32000,\n\t\t\t\t\tmessage: \"Bad Request: No valid session ID provided\",\n\t\t\t\t},\n\t\t\t\tid: null,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle the request\n\t\tawait transport.handleRequest(req, res, req.body);\n\t});\n\n\t// Reusable handler for GET and DELETE requests\n\tconst handleSessionRequest = async (\n\t\treq: express.Request,\n\t\tres: express.Response,\n\t) => {\n\t\tconst sessionId = req.headers[\"mcp-session-id\"] as string | undefined;\n\t\tif (!sessionId || !transports.has(sessionId)) {\n\t\t\tres.status(400).send(\"Invalid or missing session ID\");\n\t\t\treturn;\n\t\t}\n\n const transport = transports.get(sessionId)!.transport;\n await transport.handleRequest(req, res);\n };\n\n\t// Handle GET requests for server-to-client notifications via SSE\n\tapp.get(\"/mcp\", handleSessionRequest);\n\n\t// Handle DELETE requests for session termination\n\tapp.delete(\"/mcp\", handleSessionRequest);\n\n\t// Health check endpoint\n\tapp.get(\"/health\", (_req, res) => {\n\t\tres.json({ status: \"ok\", timestamp: new Date().toISOString() });\n\t});\n\n\t// Start the server\n\tconst startServer = () => {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst httpServer = app.listen(port, host, () => {\n\t\t\t\tconsole.log(`MCP HTTP server listening on http://${host}:${port}`);\n\t\t\t\tconsole.log(`MCP endpoint: http://${host}:${port}/mcp`);\n\t\t\t\tconsole.log(`Health check: http://${host}:${port}/health`);\n\t\t\t\tresolve();\n\t\t\t});\n\n\t\t\thttpServer.on(\"error\", (error) => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t});\n\t};\n\n\treturn {\n\t\tapp,\n\t\tstartServer,\n\t\tgetActiveSessionsCount: () => transports.size,\n\t\tcloseAllSessions: () => {\n\t\t\tfor (const session of transports.values()) {\n\t\t\t\tsession.transport.close?.();\n\t\t\t}\n\t\t\ttransports.clear();\n\t\t},\n\t};\n}\n"],"mappings":"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","names":["args","server","hevyClient","name","z","server","hevyClient","z","args","z","server","hevyClient","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","server","hevyClient","z","server","hevyClient","z","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","fetch","apiKey","createClient","apiKey","server","sessionId","createClient"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hevy-mcp",
3
- "version": "1.8.6",
3
+ "version": "1.8.8",
4
4
  "main": "dist/index.js",
5
5
  "module": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -60,7 +60,7 @@
60
60
  "zod": "^3.25.75"
61
61
  },
62
62
  "devDependencies": {
63
- "@biomejs/biome": "2.2.3",
63
+ "@biomejs/biome": "2.2.4",
64
64
  "@commitlint/cli": "^19.8.1",
65
65
  "@commitlint/config-conventional": "^19.8.1",
66
66
  "@commitlint/prompt-cli": "^19.8.1",