{"record":{"id":"1d0ff4f13eebb3bb","repo":"mastra-ai/mastra","slug":"version-with-id-input-id-already-exists-1d0ff4","errorCode":null,"errorMessage":"Version with id ${input.id} already exists","messagePattern":"Version with id (.+?) already exists","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/storage/domains/mcp-servers/inmemory.ts","lineNumber":180,"sourceCode":"    const { offset, perPage: perPageForResponse } = calculatePagination(page, perPageInput, perPage);\n\n    return {\n      mcpServers: clonedConfigs.slice(offset, offset + perPage),\n      total: clonedConfigs.length,\n      page,\n      perPage: perPageForResponse,\n      hasMore: offset + perPage < clonedConfigs.length,\n    };\n  }\n\n  // ==========================================================================\n  // MCP Server Version Methods\n  // ==========================================================================\n\n  async createVersion(input: CreateMCPServerVersionInput): Promise<MCPServerVersion> {\n    // Check if version with this ID already exists\n    if (this.db.mcpServerVersions.has(input.id)) {\n      throw new Error(`Version with id ${input.id} already exists`);\n    }\n\n    // Check for duplicate (mcpServerId, versionNumber) pair\n    for (const version of this.db.mcpServerVersions.values()) {\n      if (version.mcpServerId === input.mcpServerId && version.versionNumber === input.versionNumber) {\n        throw new Error(`Version number ${input.versionNumber} already exists for MCP server ${input.mcpServerId}`);\n      }\n    }\n\n    const version: MCPServerVersion = {\n      ...input,\n      createdAt: new Date(),\n    };\n\n    // Deep clone before storing\n    this.db.mcpServerVersions.set(input.id, this.deepCopyVersion(version));\n    return this.deepCopyVersion(version);\n  }","sourceCodeStart":162,"sourceCodeEnd":198,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/mcp-servers/inmemory.ts#L162-L198","documentation":"createVersion() enforces primary-key uniqueness for MCP server versions: an entry with the same version id already exists in mcpServerVersions. Versions are keyed by explicit input.id, so re-submitting the same id collides.","triggerScenarios":"Calling createVersion() (directly or via create()) with an input.id that already exists in the store, e.g. re-running an import/seed script or retrying a request without a fresh unique id.","commonSituations":"Idempotency mistakes in seed scripts; retry logic reusing the request body without generating a new id; importing the same MCP server definition twice.","solutions":["Generate a fresh unique id (crypto.randomUUID()) per version","Check existence first via listVersions and skip or update instead of insert","Catch the error and treat it as an idempotent no-op if the existing version matches"],"exampleFix":"// before\nawait storage.createVersion({ id: 'v1', mcpServerId: id, versionNumber: 1 });\nawait storage.createVersion({ id: 'v1', mcpServerId: id, versionNumber: 1 }); // throws\n// after\nawait storage.createVersion({ id: crypto.randomUUID(), mcpServerId: id, versionNumber: 1 });","handlingStrategy":"try-catch","validationCode":"const { versions } = await storage.listVersions(mcpServerId);\nif (versions.some(v => v.id === input.id)) {\n  throw new ConflictError(`version ${input.id} already exists`);\n}","typeGuard":null,"tryCatchPattern":"try {\n  await storage.createVersion(input);\n} catch (e) {\n  if (e instanceof Error && e.message.startsWith('Version with id')) {\n    return; // idempotent no-op: already registered\n  }\n  throw e;\n}","preventionTips":["Always generate ids with crypto.randomUUID(), never reuse client ids","Make seed/import scripts idempotent by checking existence first","On retry, reuse the same id and treat duplicates as success"],"tags":["duplicate-key","storage","uniqueness"],"backgroundTag":"duplicate-key-conflict","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}