{"ok":true,"site":{"host":"googlechromelabs.github.io","url":"https://googlechromelabs.github.io/webmcp-tools/demos/spreadsheet/","type":"live","desc":"A spreadsheet where people and AI agents share the same tools through WebMCP.","tools":[{"name":"get_workbook_info","kind":"answer","impl":"imperative","description":"Lists every sheet with its used range, size, frozen rows and columns, charts and conditional formats. Also returns the sheet on screen, what the person has selected, and the changes undo and redo would revert.","title":"Get workbook info","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"get_spreadsheet_selection","kind":"answer","impl":"imperative","description":"Returns the cells the person has selected, with their values, formulas and the count, sum and average of the numbers. Use it when the person refers to \"these cells\" or \"the selection\".","title":"Get spreadsheet selection","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"read_range","kind":"answer","impl":"imperative","description":"Reads cell values, formulas and formula errors, row by row from the top-left cell. Empty rows and columns after the sheet's data are left out. Dates read as text like 2026-10-13. Long ranges come back a page at a time; read next_range to continue.","title":"Read range","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Cells to read, like A1:G20, Sales!A:C or B2, or a sheet name to read all of it. Leave out to read all of the sheet on screen."},"include_formats":{"type":"boolean","description":"Also return each cell's formatting.","default":false}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"find_cells","kind":"answer","impl":"imperative","description":"Finds cells that contain some text, on one sheet or all of them. Returns the matches with their values and how many match in all. Many matches come back a page at a time, with next_start to continue.","title":"Find cells","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"query":{"type":"string","description":"Text to look for.","minLength":1},"sheet":{"type":"string","description":"Sheet to search. Leave out to search every sheet."},"match_case":{"type":"boolean","description":"Match upper and lower case exactly.","default":false},"entire_cell":{"type":"boolean","description":"Match only cells whose whole text is the query.","default":false},"search_formulas":{"type":"boolean","description":"Also look inside formulas.","default":false},"start":{"type":"integer","description":"Number of the first match to return, 1 for the first. Use next_start from the previous result.","default":1,"minimum":1}},"required":["query"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"set_values","kind":"act","impl":"imperative","description":"Types values and formulas into cells the way a person would: 42, 3.5%, $1,200, 2026-10-13, TRUE, or a formula like =SUM(B2:B9). Returns the resulting values and any formula errors.","title":"Set values","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Where to write: the top-left cell, like B2 or Sales!B2, or a range the same size as values."},"values":{"type":"array","items":{"type":"array","items":{"type":"string","description":"What to type in one cell."},"description":"One row of cells.","maxItems":52},"description":"Rows of cells. One value fills a larger range, with formulas adjusted like a fill. Start text with ' to keep it as typed. \"\" clears a cell.","minItems":1,"maxItems":1000}},"required":["range","values"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"clear_range","kind":"act","impl":"imperative","description":"Clears cells: their values and formulas, their formatting, or both.","title":"Clear range","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Cells to clear, like B2:D9, Sales!A:A or 5:5."},"what":{"type":"string","enum":["contents","formats","all"],"description":"What to clear.","default":"contents"}},"required":["range"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"autofill","kind":"act","impl":"imperative","description":"Continues a pattern into more cells, like dragging the fill handle: 1, 2 goes on 3, 4; Jan goes on Feb; Item 1 goes on Item 2; formulas adjust their references; other values repeat.","title":"Autofill","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"source":{"type":"string","description":"Cells with the pattern, like A2:A3 or Sales!B1:C1."},"target":{"type":"string","description":"The whole range to fill, source included, like A2:A13. It extends source up, down, left or right."}},"required":["source","target"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"copy_range","kind":"act","impl":"imperative","description":"Copies or moves cells to another place on the same sheet or another one. Copied formulas adjust their references like a paste. When moving, formulas that refer to the moved cells follow them.","title":"Copy range","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"source":{"type":"string","description":"Cells to copy, like A1:D9 or Sales!A1:D9."},"destination":{"type":"string","description":"Top-left cell to paste at, like F1 (on the source's sheet) or Summary!A1."},"paste":{"type":"string","enum":["all","values","formats","formulas"],"description":"What to paste. values pastes computed results without formulas; formulas pastes contents without formatting.","default":"all"},"move":{"type":"boolean","description":"Move the cells instead of copying them.","default":false}},"required":["source","destination"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"replace_text","kind":"act","impl":"imperative","description":"Replaces text in cell values, and optionally in formulas. The changed text is read again like typing, so replacing \"$\" with nothing in \"$1,200\" leaves the number 1200.","title":"Replace text","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"find":{"type":"string","description":"Text to find.","minLength":1},"replacement":{"type":"string","description":"Text to put in its place. An empty string deletes it."},"range":{"type":"string","description":"Where to replace, like A1:D20 or Sales!A:A. Leave out to replace on every sheet."},"match_case":{"type":"boolean","description":"Match upper and lower case exactly.","default":false},"entire_cell":{"type":"boolean","description":"Replace only in cells whose whole text is the find text.","default":false},"search_formulas":{"type":"boolean","description":"Also replace inside formulas.","default":false}},"required":["find","replacement"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"sort_range","kind":"act","impl":"imperative","description":"Sorts the rows of a range by one or more of its columns. Blank cells go last. Cells outside the range stay where they are.","title":"Sort range","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Rows to sort, like A2:G20 or Sales!A1:G20."},"by":{"type":"array","items":{"type":"object","properties":{"column":{"type":"string","description":"Column letter inside range, like C."},"descending":{"type":"boolean","description":"Sort from highest to lowest, or Z to A.","default":false}},"required":["column"]},"description":"Columns to sort by, most important first.","minItems":1,"maxItems":3},"has_header":{"type":"boolean","description":"The first row of range is a header and stays on top.","default":false}},"required":["range","by"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"select_range","kind":"act","impl":"imperative","description":"Selects cells for the person and scrolls them into view, switching sheets if needed. Use it to point at the cells you are talking about.","title":"Select range","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Cells to select, like B2:D9 or Sales!A1."}},"required":["range"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"insert_rows","kind":"act","impl":"imperative","description":"Inserts empty rows. Cells below move down, and formulas, charts and conditional formats follow them.","title":"Insert rows","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"row":{"type":"integer","description":"Row number the new rows go above. One past the last row adds them at the end.","minimum":1,"maximum":1000},"count":{"type":"integer","description":"How many rows to insert.","default":1,"minimum":1,"maximum":1000},"sheet":{"type":"string","description":"Sheet name. Leave out to use the sheet on screen."}},"required":["row"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"insert_columns","kind":"act","impl":"imperative","description":"Inserts empty columns. Cells to the right move over, and formulas, charts and conditional formats follow them.","title":"Insert columns","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"column":{"type":"string","description":"Column letter the new columns go left of, like C. One past the last column adds them at the end."},"count":{"type":"integer","description":"How many columns to insert.","default":1,"minimum":1,"maximum":52},"sheet":{"type":"string","description":"Sheet name. Leave out to use the sheet on screen."}},"required":["column"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"delete_rows","kind":"transact","impl":"imperative","description":"Deletes rows and everything in them. Cells below move up; ranges in formulas shrink, and references to deleted cells become #REF!.","title":"Delete rows","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"row":{"type":"integer","description":"First row number to delete.","minimum":1,"maximum":1000},"count":{"type":"integer","description":"How many rows to delete.","default":1,"minimum":1,"maximum":1000},"sheet":{"type":"string","description":"Sheet name. Leave out to use the sheet on screen."}},"required":["row"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"delete_columns","kind":"transact","impl":"imperative","description":"Deletes columns and everything in them. Cells to the right move over; ranges in formulas shrink, and references to deleted cells become #REF!.","title":"Delete columns","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"column":{"type":"string","description":"First column letter to delete, like C."},"count":{"type":"integer","description":"How many columns to delete.","default":1,"minimum":1,"maximum":52},"sheet":{"type":"string","description":"Sheet name. Leave out to use the sheet on screen."}},"required":["column"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"resize_columns","kind":"act","impl":"imperative","description":"Sets column widths in pixels, or fits columns to their widest value. New columns are 100 pixels wide.","title":"Resize columns","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"columns":{"type":"string","description":"Columns to resize, like B, B:E or Sales!A:C."},"width":{"type":"integer","description":"Width in pixels.","minimum":24,"maximum":600},"fit_to_content":{"type":"boolean","description":"Fit each column to its widest value instead of a fixed width."}},"required":["columns"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"format_cells","kind":"act","impl":"imperative","description":"Changes how cells look: bold, italic, colors, alignment and number format. Only the formats you pass change.","title":"Format cells","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Cells to format, like B2:E9 or Sales!A1:G1."},"bold":{"type":"boolean","description":"Bold text."},"italic":{"type":"boolean","description":"Italic text."},"underline":{"type":"boolean","description":"Underlined text."},"strikethrough":{"type":"boolean","description":"Struck-through text."},"text_color":{"type":"string","description":"Text color: a CSS color like #4d48d8 or red, or none to remove it."},"fill_color":{"type":"string","description":"Background color: a CSS color like #ffefc2, or none to remove it."},"align":{"type":"string","enum":["general","left","center","right"],"description":"Horizontal alignment. general puts numbers on the right and text on the left."},"number_format":{"type":"string","enum":["general","number","currency","percent","date","time","datetime","text"],"description":"How numbers show. general resets to automatic; text keeps what is typed as text."},"decimals":{"type":"integer","description":"Decimal places to show.","minimum":0,"maximum":10},"currency":{"type":"string","description":"Currency code for the currency format, like USD, EUR or JPY. Setting it also applies the currency format."}},"required":["range"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"add_conditional_format","kind":"act","impl":"imperative","description":"Adds a rule that styles cells by their values, like red text for negative numbers, and keeps applying as values change. It can also shade numbers across a color range instead of styling the cells that match.","title":"Add conditional format","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Cells the rule applies to, like G2:G20 or Sales!B2:E6."},"condition":{"type":"string","enum":["greater_than","less_than","between","equal_to","not_equal_to","text_contains","is_empty","not_empty","formula","color_scale"],"description":"When a cell gets the style."},"value":{"type":"string","description":"What to compare with; for between, the lower bound. Numbers compare as numbers."},"value2":{"type":"number","description":"The upper bound for between."},"formula":{"type":"string","description":"For the formula condition: a formula that is TRUE for cells to style, written for the range's top-left cell, like =$C2>100."},"text_color":{"type":"string","description":"Text color of matching cells, a CSS color like #b42318."},"fill_color":{"type":"string","description":"Background of matching cells, a CSS color like #fde3df. With no style at all, matching cells get a light amber fill."},"bold":{"type":"boolean","description":"Bold text in matching cells."},"italic":{"type":"boolean","description":"Italic text in matching cells."},"strikethrough":{"type":"boolean","description":"Struck-through text in matching cells."},"min_color":{"type":"string","description":"For color_scale, the color of the lowest number.","default":"#ffffff"},"max_color":{"type":"string","description":"For color_scale, the color of the highest number.","default":"#8c88f2"}},"required":["range","condition"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"delete_conditional_format","kind":"transact","impl":"imperative","description":"Removes conditional format rules: one by id, or every rule that overlaps a range.","title":"Delete conditional format","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Id of the rule to remove, like rule2. get_workbook_info lists the rules."},"range":{"type":"string","description":"Remove every rule that overlaps this range instead, like G2:G20 or Sales!A:Z."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"add_sheet","kind":"act","impl":"imperative","description":"Adds an empty sheet, at the end or at a given tab position. Write to it with references like Name!A1.","title":"Add sheet","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"name":{"type":"string","description":"Name for the sheet. Leave out for the next free name, like Sheet2."},"position":{"type":"integer","description":"Tab position, 1 for first. Leave out to add it at the end.","minimum":1}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"update_sheet","kind":"act","impl":"imperative","description":"Renames a sheet, moves its tab, or freezes rows and columns so they stay in view while scrolling. Formulas that refer to a renamed sheet are updated.","title":"Update sheet","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"sheet":{"type":"string","description":"Name of the sheet to change.","minLength":1},"name":{"type":"string","description":"New name."},"position":{"type":"integer","description":"New tab position, 1 for first.","minimum":1},"frozen_rows":{"type":"integer","description":"How many rows to keep in view at the top; 0 for none.","minimum":0},"frozen_columns":{"type":"integer","description":"How many columns to keep in view on the left; 0 for none.","minimum":0}},"required":["sheet"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"delete_sheet","kind":"transact","impl":"imperative","description":"Deletes a sheet and everything on it. Formulas on other sheets that refer to it become #REF!. Undo brings it back.","title":"Delete sheet","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"sheet":{"type":"string","description":"Name of the sheet to delete.","minLength":1}},"required":["sheet"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"add_chart","kind":"act","impl":"imperative","description":"Adds a chart of a range: one series per column, category labels down the first column and series names across the first row. The chart redraws when the data changes.","title":"Add chart","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"range":{"type":"string","description":"Data to chart, like A1:E6 or Sales!A1:E6."},"type":{"type":"string","enum":["column","bar","line","area","pie","scatter"],"description":"Chart type.","default":"column"},"title":{"type":"string","description":"Title above the chart."},"position":{"type":"string","description":"Cell for the chart's top-left corner, like H2. Leave out to place it to the right of the data."},"width":{"type":"integer","description":"Width in pixels.","default":480,"minimum":240,"maximum":1200},"height":{"type":"integer","description":"Height in pixels.","default":300,"minimum":160,"maximum":800},"header_row":{"type":"boolean","description":"Whether the first row holds series names. Leave out to detect it."},"label_column":{"type":"boolean","description":"Whether the first column holds category labels. Leave out to detect it."}},"required":["range"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"update_chart","kind":"act","impl":"imperative","description":"Changes a chart's type, title, data, position or size.","title":"Update chart","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Chart id, like chart1, from add_chart or get_workbook_info.","minLength":1},"type":{"type":"string","enum":["column","bar","line","area","pie","scatter"],"description":"Chart type."},"title":{"type":"string","description":"Title above the chart. An empty string removes it."},"range":{"type":"string","description":"New data range on the chart's sheet, like A1:C6."},"position":{"type":"string","description":"Cell for the chart's top-left corner, like H2."},"width":{"type":"integer","description":"Width in pixels.","minimum":240,"maximum":1200},"height":{"type":"integer","description":"Height in pixels.","minimum":160,"maximum":800},"header_row":{"type":"boolean","description":"Whether the first row holds series names."},"label_column":{"type":"boolean","description":"Whether the first column holds category labels."}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"delete_chart","kind":"transact","impl":"imperative","description":"Deletes a chart. Its data stays.","title":"Delete chart","annotations":{"untrustedContentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"Chart id, like chart1, from add_chart or get_workbook_info.","minLength":1}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"undo_spreadsheet_action","kind":"act","impl":"imperative","description":"Undoes the latest changes, whether a person or an agent made them.","title":"Undo spreadsheet action","inputSchema":{"type":"object","properties":{"steps":{"type":"integer","description":"How many changes to undo.","default":1,"minimum":1,"maximum":20}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"},{"name":"redo_spreadsheet_action","kind":"act","impl":"imperative","description":"Redoes changes that were just undone.","title":"Redo spreadsheet action","inputSchema":{"type":"object","properties":{"steps":{"type":"integer","description":"How many changes to redo.","default":1,"minimum":1,"maximum":20}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp-tools/demos/spreadsheet/"}],"category":"Developer Tools","favicon":"/favicons/googlechromelabs.github.io.svg","apiSurface":"spec","toolCount":27}}