{"record":{"id":"e3ad551f44979efe","repo":"paperclipai/paperclip","slug":"at-least-one-allowed-spreadsheet-id-is-required-e3ad55","errorCode":null,"errorMessage":"At least one allowed spreadsheet ID is required.","messagePattern":"At least one allowed spreadsheet ID is required\\.","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/google-sheets-mcp-server/src/tools.ts","lineNumber":144,"sourceCode":"        return formatTextResponse(await execute(parsed));\n      } catch (error) {\n        return formatErrorResponse(error, options.secretRedactions ?? []);\n      }\n    },\n  };\n}\n\nfunction assertAllowed(allowedSpreadsheetIds: Set<string>, spreadsheetId: string) {\n  if (!allowedSpreadsheetIds.has(spreadsheetId)) {\n    throw new Error(`Spreadsheet ${spreadsheetId} is not in the configured allowlist.`);\n  }\n}\n\nexport function createToolDefinitions(options: GoogleSheetsToolOptions): GoogleSheetsToolDefinition[] {\n  const allowedSpreadsheetIds = Array.from(new Set(options.allowedSpreadsheetIds.map((id) => id.trim()).filter(Boolean)));\n  const allowedSpreadsheetIdSet = new Set(allowedSpreadsheetIds);\n  if (allowedSpreadsheetIds.length === 0) {\n    throw new Error(\"At least one allowed spreadsheet ID is required.\");\n  }\n\n  return [\n    makeTool(\n      options,\n      \"list_spreadsheets\",\n      \"List the Google Sheets spreadsheets configured in this connection allowlist.\",\n      \"read\",\n      z.object({}),\n      async () => options.client.listSpreadsheets(allowedSpreadsheetIds),\n    ),\n    makeTool(\n      options,\n      \"get_spreadsheet_info\",\n      \"Get spreadsheet metadata and sheet tab information for an allowlisted spreadsheet.\",\n      \"read\",\n      spreadsheetToolSchema,\n      async ({ spreadsheetId }) => {","sourceCodeStart":126,"sourceCodeEnd":162,"githubUrl":"https://github.com/paperclipai/paperclip/blob/a7e689b3c35347b529cb9f54c9b9a8575a3dcab6/packages/google-sheets-mcp-server/src/tools.ts#L126-L162","documentation":"Configuration guard in createToolDefinitions: the Google Sheets MCP server was constructed with an empty/absent allowedSpreadsheetIds list. The allowlist is the server's security boundary (assertAllowed rejects any spreadsheet outside it), so with zero IDs no tool could ever execute safely; the constructor fails fast instead of producing tools that can never pass the allowlist check.","triggerScenarios":"Thrown at packages/google-sheets-mcp-server/src/tools.ts:144 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Configure at least one spreadsheet ID in the allowed-spreadsheets list before calling tools."],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"a7e689b3c35347b529cb9f54c9b9a8575a3dcab6","analyzedAt":"2026-08-18T22:49:45.177Z","contentChangedAt":"2026-08-18T22:49:45.177Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}