Apple numbers
Use this skill when the user wants to work with Apple Numbers spreadsheets on macOS - reading tables and cells, searching, creating files, writing or formatting cells, managing sheets and tables, writing formulas, importing CSV/TSV/JSON, or exporting data. This skill provides access to the apple-numbers MCP server.From its SKILL.md
npx -y skills add sweetrb/apple-numbers-mcp --skill apple-numbersAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 6 stars6 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.9 KB, as published. Nobody here has run it
Apple Numbers Skill
This skill enables you to read and write Apple Numbers (.numbers) spreadsheets through natural language. Use it whenever the user mentions a Numbers file, a spreadsheet, or wants to read, search, edit, format, or convert tabular data stored in Numbers.
When to Use This Skill
Use this skill when the user:
- Wants to read what is in a
.numbersfile (tables, cells, sheet structure) - Asks to find or search for a value across a spreadsheet
- Wants to create a new Numbers spreadsheet
- Needs to set or update cell values, append rows, or delete rows
- Wants to write live formulas or format cells (font, color, number format, alignment)
- Wants to add, rename, or organize sheets and tables
- Wants to import a CSV/TSV/JSON file into Numbers, or export a table out
- Mentions Apple Numbers, the Numbers app, or "my spreadsheet"
Two backends: values vs. formatting
This server has two backends and the split matters. It is a values vs. formatting split, not a read vs. write one:
- Reads and value/structure writes use the
numbers-parserPython library. They open the.numbersfile directly off disk, offline, with no app and no special permission. This coversset-cell,add-rows,create-spreadsheet,import-csvand the rest — not just reads. - Formulas and formatting drive Numbers.app via AppleScript. Only these
eight tools require Numbers.app installed and the Automation permission (a
one-time prompt the first time one of them runs):
set-formula,set-formulas-batch,set-cell-style,set-cells-style-batch,set-column-width,set-row-height,merge-cells,unmerge-cells.
So you can inspect, search, export and edit a file with no setup beyond the
Python sidecar. Don't gate a set-cell, add-rows or import-csv on Numbers.app
or an Automation grant — those calls never send an Apple event.
Available Tools
Read (numbers-parser — no Numbers.app, no Automation permission)
| Tool | Purpose |
|---|---|
health-check | Verify Python 3 + numbers-parser are installed; report version |
doctor | Full setup diagnostic - Python interpreter (path+version), read sidecar, Numbers.app, Automation permission |
get-file-info | List sheets, tables, dimensions, header rows |
read-table | Read rows (optional row range + column filter); defaults to first sheet/table |
get-cell | One cell by 0-based row/col; verbose: true adds formula/format/merge |
search | Case-insensitive substring search across every cell, optionally one sheet |
export-table | Export a table to CSV / TSV / JSON |
Write values and structure (numbers-parser — no Numbers.app, no Automation permission)
| Tool | Purpose |
|---|---|
create-spreadsheet | New .numbers file with headers + optional rows |
set-cell / set-cells-batch | Write one cell / many cells (computed values) |
add-rows | Append rows after the last existing row |
update-rows | Replace whole rows by index ({row, values} entries) |
delete-rows | Delete a 0-based inclusive row range |
add-sheet / add-table | Add a sheet, or a table to a sheet |
rename-sheet / rename-table | Rename a sheet or table |
import-csv | Convert a CSV/TSV/JSON file into a new .numbers spreadsheet |
Formulas and formatting (AppleScript -> Numbers.app — needs Numbers.app installed + Automation permission)
| Tool | Purpose |
|---|---|
set-formula / set-formulas-batch | Write live formula(s) (leading =) |
set-cell-style / set-cells-style-batch | Font, color, number format, alignment |
set-column-width / set-row-height | Dimensions in pixels (0-based index) |
merge-cells / unmerge-cells | Merge / undo-merge a 0-based inclusive range |
These eight open the file in Numbers.app (launching it if it isn't running), save the whole document — including any unsaved hand edits the user has open — and leave it open afterwards.
Conventions to know
pathis a file path with~expansion. Every tool takes an explicitpathto the.numbersfile; a leading~expands to the home directory. Files must end in.numbers.- Sheet/table default to the first. Most read and value-write tools accept
optional
sheet/table; omit them to target the first sheet and first table. The AppleScript tools generally require explicitsheetandtable. - Indexing is 0-based, ranges inclusive. Header is row 0, so the first data row is row 1. A "row 5" a human sees in Numbers is index 4 here.
- Dates are ISO 8601. Dates come back as ISO 8601; to write a date, type the
value as
dateand pass an ISO 8601 string. - Values vs. formulas.
set-cell/set-cells-batch/add-rows/update-rowswrite computed values - passing"=SUM(...)"writes the literal text. Useset-formula/set-formulas-batchfor live formulas. - Prefer batch tools. Each formula/format call spins up Numbers.app scripting,
and each sidecar call is its own Python process plus a full document load and
save, so batching is much faster either way:
set-cells-batchover manyset-cell,set-formulas-batchover manyset-formula,update-rowsover per-row writes. add-sheet/add-tablegeometry depends onheaders. Withheadersthe new table is 1 row ×headers.lengthcolumns; without them it is a 12 × 8 grid of empty cells. The response reports the dimensions either way.import-csvauto-types CSV/TSV fields.01234becomes the number1234and1e5becomes the number100000, so zero-padded identifiers lose their leading zeros. JSON input is passed through untouched.
Core workflow: inspect, then act
The reliable pattern is to inspect first, then act against exact names:
1. get-file-info path="~/x.numbers" -> sheet & table names, sizes
2. read-table / search / get-cell -> see the data (header is row 0)
3. set-cells-batch / update-rows / ... -> write values (no Numbers.app needed)
4. set-formula / set-cell-style / ... -> formulas & formatting (needs Numbers.app)
Sheet/table parameters are matched by name, so guessing leads to "not found"
errors. Call get-file-info first when unsure of names.
Important Guidelines
- macOS only. The package is macOS-only (it declares
os: ["darwin"]). Reads and value/structure writes need just the Python sidecar; only formulas and formatting also require Numbers.app and the Automation permission. - Run
doctorwhen something fails. It reports the resolved Python interpreter (path + version), the read sidecar, Numbers.app presence, and Automation permission as ok/warn/fail. .numbersextension required. Every path must end in.numbers.
Error Handling
- "numbers-parser not installed": the Python read sidecar/venv is missing.
Most often
python3is older than 3.11 (stock macOS ships 3.9): install a newer Python (brew install [email protected]) and retry - the venv rebuilds automatically. Otherwisepip3 install numbers-parser(global install) or runscripts/setup.shfrom a repo checkout. Thedoctortool reports the resolved interpreter path + version. - "Not authorized to send Apple events to Numbers.": the host app lacks the
Automation permission for Numbers - grant it in System Settings -> Privacy &
Security -> Automation, or reset with
tccutil reset AppleEvents. Only the eight formula/format tools can produce this; if aset-cellorimport-csvfails, the cause is something else. - Numbers can't be found / isn't running: install Numbers.app, then retry. Only the formula/format tools need it, and they launch it themselves - it does not have to already be running. Reads and value/structure writes work without Numbers.app entirely.
- "File not found": check the path and that it ends in
.numbers. - "Sheet not found" / "Table not found": call
get-file-infofirst to get exact names, or omitsheet/tableto use the first.
Examples
Read and total a column
User: "What's the total of column B in my budget spreadsheet?"
-> 1. get-file-info to learn sheet/table names
-> 2. read-table to read the rows
-> 3. sum column B (header is row 0, first data row is row 1)
Find a value
User: "Where does 'overdue' appear in this file?"
-> search query="overdue" path="~/invoices.numbers"
Import a CSV
User: "Turn this CSV into a Numbers spreadsheet"
-> import-csv inputPath="~/data.csv" outputPath="~/data.numbers"
(both paths are required; the output file is created, overwriting any
existing file at that path)