That is the whole design: by routing through a web app you deployed, the Google authorisation stays with a script under your control and the assistant never receives a Google credential. The cost is a setup step nobody else asks for — you have to write and deploy the Apps Script first. Output as markdown tables is a small thing that matters, since a model reads a table far better than serialised cells.
A read path to Google Sheets that deliberately avoids the Google authentication dance. Instead of holding OAuth credentials, it calls a Google Apps Script web app you deploy yourself, which does the sheet access — so the permissions stay inside your own script and the server only holds its URL and key.
- A spreadsheet's basic information from its URL — name, id and the list of sheets with their row and column counts — `getSpreadsheet`
- One named sheet's data, returned formatted as a markdown table so the model reads a grid rather than a flat blob — `getSheetData`
- A mock mode that returns test data when the environment variables are unset, so the wiring can be exercised before any real sheet is connected
A Google Apps Script web app that you create and deploy, implementing the sheet-access API described in the repository, plus an access key you choose. Then two environment variables: `GAS_WEB_APP_URL` pointing at the deployment, and `GAS_API_KEY`. Node.js; install from a clone with `npm install` and `npm run build`, then point your client at `build/index.js`. With the variables unset the server runs in mock mode and does not touch any real spreadsheet.
