{"record":{"id":"4397cf6f5c6aea9b","repo":"mastra-ai/mastra","slug":"page-value-too-large-4397cf","errorCode":null,"errorMessage":"page value too large","messagePattern":"page value too large","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/storage/domains/mcp-servers/inmemory.ts","lineNumber":132,"sourceCode":"    // Also delete all versions for this server\n    await this.deleteVersionsByParentId(id);\n  }\n\n  async list(args?: StorageListMCPServersInput): Promise<StorageListMCPServersOutput> {\n    const { page = 0, perPage: perPageInput, orderBy, authorId, metadata, status = 'published' } = args || {};\n    const { field, direction } = this.parseOrderBy(orderBy);\n\n    // Normalize perPage for query (false → MAX_SAFE_INTEGER, 0 → 0, undefined → 100)\n    const perPage = normalizePerPage(perPageInput, 100);\n\n    if (page < 0) {\n      throw new Error('page must be >= 0');\n    }\n\n    // Prevent unreasonably large page values\n    const maxOffset = Number.MAX_SAFE_INTEGER / 2;\n    if (page * perPage > maxOffset) {\n      throw new Error('page value too large');\n    }\n\n    // Get all MCP servers and apply filters\n    let configs = Array.from(this.db.mcpServers.values());\n\n    // Filter by status\n    if (status) {\n      configs = configs.filter(config => config.status === status);\n    }\n\n    // Filter by authorId if provided\n    if (authorId !== undefined) {\n      configs = configs.filter(config => config.authorId === authorId);\n    }\n\n    // Filter by metadata if provided (AND logic)\n    if (metadata && Object.keys(metadata).length > 0) {\n      configs = configs.filter(config => {","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/mcp-servers/inmemory.ts#L114-L150","documentation":"list() rejects page values whose computed offset (page * perPage) exceeds Number.MAX_SAFE_INTEGER / 2. Multiplying an enormous page by perPage would produce an unsafe offset, so the adapter refuses it rather than silently corrupting slicing math.","triggerScenarios":"Calling list() with a page so large that page * perPage > Number.MAX_SAFE_INTEGER / 2, e.g. page: Number.MAX_SAFE_INTEGER, or a huge page combined with perPage: false (which normalizes to MAX_SAFE_INTEGER).","commonSituations":"Clients sending garbage or adversarial page values in query strings; defaulting page from an unbounded number input; combining perPage:false with a large page.","solutions":["Use realistic page numbers (iterate pages starting at 0)","Cap page at a sane maximum at your API boundary","If you need everything, use perPage:false with page 0 instead of a huge page"],"exampleFix":"// before\nawait storage.listMCPServers({ page: 9e15 });\n// after\nconst MAX_PAGE = 1_000_000;\nawait storage.listMCPServers({ page: Math.min(Number(input.page ?? 0), MAX_PAGE) });","handlingStrategy":"validation","validationCode":"function safePage(page: unknown, perPage: number | false | undefined): number {\n  const n = Number(page ?? 0);\n  const eff = perPage === false ? Number.MAX_SAFE_INTEGER : perPage ?? 100;\n  if (n * eff > Number.MAX_SAFE_INTEGER / 2) throw new RangeError('page value too large');\n  return n;\n}","typeGuard":"const isBoundedPage = (p: unknown, perPage: number): p is number => typeof p === 'number' && Number.isInteger(p) && p >= 0 && p * perPage <= Number.MAX_SAFE_INTEGER / 2;","tryCatchPattern":"try {\n  return await storage.listMCPServers({ page, perPage });\n} catch (e) {\n  if (e instanceof Error && e.message === 'page value too large') {\n    return await storage.listMCPServers({ page: 0, perPage });\n  }\n  throw e;\n}","preventionTips":["Cap page at a sane maximum in your own API layer","Never combine perPage:false with a non-zero page","Treat untrusted page inputs as user data and bound them"],"tags":["pagination","validation","storage"],"backgroundTag":"invalid-pagination-arguments","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}