Service twin · API + UI
Google Sheets
Test spreadsheet agents through the Google Sheets API and an interactive grid editor.
API + UIspec-groundedREST · MCP · CLI
Terminal
$ uv tool install blobfish-cli
$ blobfish twin login
$ blobfish twin-runs create --twins googlesheets --ttl 60 --waitWhat’s inside
A deterministic, seeded, resettable replica: every operation below executes real state transitions against the twin’s own SQLite state — reads are hash-invariant, writes produce inspectable diffs, and reset restores the seed baseline.
Seeded entities
| Entity | Table | Fields | About |
|---|---|---|---|
| sheet_append_values_response | sheet_append_values_responses | 3 | The response when updating a range of values in a spreadsheet. |
| sheet_batch_clear_values_by_data_filter_response | sheet_batch_clear_values_by_data_filter_responses | 2 | The response when clearing a range of values selected with DataFilters in a spreadsheet. |
| sheet_batch_clear_values_response | sheet_batch_clear_values_responses | 2 | The response when clearing a range of values in a spreadsheet. |
| sheet_batch_get_values_by_data_filter_response | sheet_batch_get_values_by_data_filter_responses | 2 | The response when retrieving more than one range of values in a spreadsheet selected by DataFilters. |
| sheet_batch_get_values_response | sheet_batch_get_values_responses | 2 | The response when retrieving more than one range of values in a spreadsheet. |
| sheet_batch_update_spreadsheet_response | sheet_batch_update_spreadsheet_responses | 3 | The reply for batch updating a spreadsheet. |
| sheet_batch_update_values_by_data_filter_response | sheet_batch_update_values_by_data_filter_responses | 6 | The response when updating a range of values in a spreadsheet. |
| sheet_batch_update_values_response | sheet_batch_update_values_responses | 6 | The response when updating a range of values in a spreadsheet. |
| sheet_cell | sheet_cells | 10 | One addressed cell of a sheet tab (1-based row/col, plus its A1 column letter). This IS the grid: values.get/batchGet read it and values.update/append write it. |
| sheet_clear_values_response | sheet_clear_values_responses | 2 | The response when clearing a range of values in a spreadsheet. |
| sheet_developer_metadata | sheet_developer_metadatas | 6 | A developer metadata record attached to a spreadsheet. |
| sheet_search_developer_metadata_response | sheet_search_developer_metadata_responses | 2 | A reply to a developer metadata search request. |
| sheet_tab | sheet_tabs | 6 | One sheet (tab) inside a spreadsheet. |
| sheet_update_values_response | sheet_update_values_responses | 6 | The response when updating a range of values in a spreadsheet. |
| sheet_value_range | sheet_value_ranges | 4 | Data within a range of the spreadsheet. |
| spreadsheet | spreadsheets | 6 | A spreadsheet workbook: the document an agent opens by id. Grid content lives in sheet_tabs (tabs) and sheet_cells (addressed cells). |
Three surfaces, one state
Mount Google Sheets in a twin environment and the same seeded state serves vendor-shaped REST operations, an MCP endpoint for tool calling, and a generated bf-twin CLI — with copy-on-write sessions per rollout and a one-call reset to the seed baseline. Prefer raw HTTP? The same create works with curl:
API
$ curl -sS -X POST https://blobfish.ai/api/v1/twin/environments \
-H "X-API-Key: $BLOBFISH_API_KEY" -H "Content-Type: application/json" \
-d '{"services":["googlesheets"],"ttl_minutes":60}'Known limitations
Spec-grounded surface with synthetic seeded values; operations outside the spec are not mounted.