paperclipai/paperclip · error

At least one allowed spreadsheet ID is required.

Error message

At least one allowed spreadsheet ID is required.

What it means

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.

Solutions

  1. Configure at least one spreadsheet ID in the allowed-spreadsheets list before calling tools.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at packages/google-sheets-mcp-server/src/tools.ts:144 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of paperclipai/paperclip@a7e689b3c3 (2026-08-18). Data as JSON: /api/errors/e3ad551f44979efe. Report an issue: GitHub.

Appendix: source

Thrown at packages/google-sheets-mcp-server/src/tools.ts:144

        return formatTextResponse(await execute(parsed));
      } catch (error) {
        return formatErrorResponse(error, options.secretRedactions ?? []);
      }
    },
  };
}

function assertAllowed(allowedSpreadsheetIds: Set<string>, spreadsheetId: string) {
  if (!allowedSpreadsheetIds.has(spreadsheetId)) {
    throw new Error(`Spreadsheet ${spreadsheetId} is not in the configured allowlist.`);
  }
}

export function createToolDefinitions(options: GoogleSheetsToolOptions): GoogleSheetsToolDefinition[] {
  const allowedSpreadsheetIds = Array.from(new Set(options.allowedSpreadsheetIds.map((id) => id.trim()).filter(Boolean)));
  const allowedSpreadsheetIdSet = new Set(allowedSpreadsheetIds);
  if (allowedSpreadsheetIds.length === 0) {
    throw new Error("At least one allowed spreadsheet ID is required.");
  }

  return [
    makeTool(
      options,
      "list_spreadsheets",
      "List the Google Sheets spreadsheets configured in this connection allowlist.",
      "read",
      z.object({}),
      async () => options.client.listSpreadsheets(allowedSpreadsheetIds),
    ),
    makeTool(
      options,
      "get_spreadsheet_info",
      "Get spreadsheet metadata and sheet tab information for an allowlisted spreadsheet.",
      "read",
      spreadsheetToolSchema,
      async ({ spreadsheetId }) => {

View on GitHub (pinned to a7e689b3c3)