iWork Studio
PYPI · IWORK-STUDIO
Create, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe.
Available components
Last scanned (1 day ago)
Scores higher than 99% of PyPI servers
Category Documents and Files
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security99
- No malware found by supply-chain analysis.Pass
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised build step with no custom scripting around it. View diagnostics → Pass
- 7 of 59 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency97
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Cryptographically verified build provenance (signed, bound to Arkanji/iwork-studio). View diagnostics → Pass
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 21 days ago).Pass
- Disclosure check failed: no security disclosure policy was found in the source repository. See how to fix → Fail
Schema Quality & AI Usability81
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 13655 tokens (~210/item across 65 items; 65 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management100
- No destabilizing schema changes in the last 30 days.Pass
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
- Structured output schemas are declared (98% of tools); any adoption earns full credit.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- All 4 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
- An AI judge read all 66 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Nov 26 +1
- Stability: 0.97 → pass security
- 1 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 90 to 93. That category is still filling its 30-day observation window: 27 days of observed history at the previous scan, 28 at this one. The score rises as the window fills, whether or not the server changes.
- 30 Oct 26 +16
- Malware scan: unverified → pass ▲ security
- 28 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 77 to 80. That category is still filling its 30-day observation window: 23 days of observed history at the previous scan, 24 at this one. The score rises as the window fills, whether or not the server changes.
- 26 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 70 to 73. That category is still filling its 30-day observation window: 21 days of observed history at the previous scan, 22 at this one. The score rises as the window fills, whether or not the server changes.
- 23 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 60 to 63. That category is still filling its 30-day observation window: 18 days of observed history at the previous scan, 19 at this one. The score rises as the window fills, whether or not the server changes.
- 21 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 53 to 57. That category is still filling its 30-day observation window: 16 days of observed history at the previous scan, 17 at this one. The score rises as the window fills, whether or not the server changes.
- 19 Oct 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 4 Nov 2026 · Analysed pypi/iwork-studio@2.6.1
Provenance Verified
A signed build attestation was found and verified, binding this exact artifact to the source repository it claims to come from.
| Result | Verified |
|---|---|
| Ecosystem | pypi |
| Reason | Verified |
| Discovered via | Registry attestation endpoint |
| Source repo | Arkanji/iwork-studio |
| Certificate issuer | https://token.actions.githubusercontent.com |
| Certificate SAN | https://github.com/Arkanji/iwork-studio/.github/workflows/release.yml@refs/tags/v2.6.1 |
| Rekor log index | 3242531913 |
| Predicate type | PyPI publish attestation https://docs.pypi.org/attestations/publish/v1 |
| Subject digest | sha256:040fe65ce1d0faae24a28237cc903d48c669160fd6aa615fd0a845872814d7b3 |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 59 packages
| Packages resolved | 59 |
|---|---|
| Stale | 6 |
| No linked repository | 1 |
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
numbers_recalculate Numbers: recalculate ~192
Make Numbers recompute every formula from the current values. Numbers keeps showing a formula's old result after edits made without it (numbers_edit_cell, numbers_insert…), so run this after those when the file has formulas — their result says so (formulas_need_recalc). Formulas and inputs are verified unchanged. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file. Use only after a no-app edit returned formulas_need_recalc, so totals are current. Not needed after numbers_set_formula, which recalculates itself.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_set_borders Numbers: set borders ~291
Cell borders on a range: sides = all | outline | inner | top | right | bottom | left; width in points; color "#RRGGBB"; style = solid | dashes | dots | none. dry_run=true previews the change on a copy without touching the file. Use for lines around or inside a range. For fills and fonts use numbers_set_cell_style.
| Name | Type | Req | Description |
|---|---|---|---|
| cells | string | yes | A cell or range in A1 notation, e.g. "B2" or "A1:D1". |
| color | string | – | Line colour "#RRGGBB". |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| sides | string | – | all | outline | inner | top | right | bottom | left. |
| style | string | – | solid | dashes | dots | none (none removes the border). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| width | number | – | Line width in points. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_set_cell_style Numbers: set cell style ~430
Style a range ("A1:D1"): font_name, font_size, bold, italic, underline, strikethrough, font_color / fill_color as "#RRGGBB", align (left|center|right|justify|auto), valign (top|middle|bottom), wrap. Only the attributes you pass change; every other cell is verified untouched. dry_run=true previews the change on a copy without touching the file. Use for fonts, colours, fill or alignment on a few cells. For a whole table that should look designed use numbers_apply_design; for how numbers display use numbers_set_number_format.
| Name | Type | Req | Description |
|---|---|---|---|
| align | – | – | Horizontal: left | center | right | justify | auto. |
| bold | – | – | true/false; omit to leave as is. |
| cells | string | yes | A cell or range in A1 notation, e.g. "B2" or "A1:D1". |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| fill_color | – | – | Cell fill "#RRGGBB". |
| font_color | – | – | Text colour "#RRGGBB". |
| font_name | – | – | Font family, e.g. "Helvetica Neue" or "Geeza Pro". |
| font_size | – | – | Font size in points. |
| italic | – | – | true/false; omit to leave as is. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| strikethrough | – | – | true/false; omit to leave as is. |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| underline | – | – | true/false; omit to leave as is. |
| valign | – | – | Vertical: top | middle | bottom. |
| wrap | – | – | true = wrap text in the cell. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_set_dimensions Numbers: set dimensions ~247
Set column widths and/or row heights in points, e.g. columns={"A": 160, "C": 90}, rows={"1": 32} (rows are 1-based). Nothing else changes. dry_run=true previews the change on a copy without touching the file. Use for column widths and row heights. To change which rows count as headers use numbers_set_headers.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | – | – | Column widths in points by letter, e.g. {"A": 160, "C": 90}. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| rows | – | – | Row heights in points by 1-based row number, e.g. {"1": 32}. |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_set_formula Numbers: set formula ~257
Put a formula in one cell, e.g. ref "D10", formula "=SUM(D2:D9)"; Numbers computes it and the result is returned. Every other cell's input is verified unchanged. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file. Use for a cell that calculates (=SUM…); Numbers computes the result. For a plain value use numbers_edit_cell. Needs the Numbers app.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| formula | string | yes | The formula, starting with "=", e.g. "=SUM(B2:B9)". |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| ref | string | yes | One cell in A1 notation, e.g. "B2". |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_set_headers Numbers: set headers ~227
Set how many header rows / header columns a table has (0–5). dry_run=true previews the change on a copy without touching the file. Use when the user wants a different number of header rows or columns, e.g. to freeze a title row on top for sorting and styling. Not for sizes (numbers_set_dimensions) or header colours (numbers_set_cell_style or numbers_apply_design).
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| header_columns | – | – | Number of header columns (0 for none). |
| header_rows | – | – | Number of header rows (0 for none). |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_set_number_format Numbers: set number format ~399
How numbers display in a range ("B2:B9"): format = number | currency | percentage | scientific | fraction | datetime | text. Options: decimal_places, thousands_separator, negative_style (minus|red|parentheses|red_parentheses), currency_code (ISO, e.g. SAR, USD), accounting, date_format (e.g. "d MMM yyyy"). Values are not changed; the result shows how each cell now displays. dry_run=true previews the change on a copy without touching the file. Use for how numbers display (currency, %, dates, decimals); the values don't change. For fonts and colours use numbers_set_cell_style.
| Name | Type | Req | Description |
|---|---|---|---|
| accounting | – | – | true = accounting style (symbol aligned left) for currency. |
| cells | string | yes | A cell or range in A1 notation, e.g. "B2" or "A1:D1". |
| currency_code | – | – | ISO currency code for format=currency, e.g. "SAR" or "USD". |
| date_format | – | – | Date pattern for format=datetime, e.g. "d MMM yyyy". |
| decimal_places | – | – | Digits after the decimal point. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| format | string | yes | number | currency | percentage | scientific | fraction | datetime | text. |
| negative_style | – | – | minus | red | parentheses | red_parentheses. |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| thousands_separator | – | – | true = group thousands (1,234). |
Structured output declared, but exposes no named fields.
No examples provided.
numbers_sort Numbers: sort ~412
Sort a table's body rows by a column letter (header rows stay on top). Verified as a pure reorder. A table whose formulas read other rows (e.g. =B2*0.1 below a base-figure row) is refused, because Numbers' sort would break them; for it, to_new_table=true leaves the table, its formulas and its charts as they are and puts a sorted copy of its values (no formulas) in a new table on the same sheet (named new_table_name, default "<table> sorted"). Chart the copy with keynote_build_deck. Needs macOS + Numbers, file closed. dry_run=true previews the change on a copy without touching the file. Use to reorder body rows by one column; header rows stay on top. If it refuses because formulas read other rows, call it again with to_new_table=true for a sorted copy; never rewrite the formulas to force it. Needs the Numbers app.
| Name | Type | Req | Description |
|---|---|---|---|
| column | string | yes | Column letter to sort by, e.g. "C". |
| descending | boolean | – | true = largest/last first. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| new_table_name | – | – | Name for the new table (with to_new_table); default "<table> sorted". |
| path | string | yes | Path to the .numbers file (absolute, or starting with ~). |
| sheet | – | – | Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables). |
| table | – | – | Table name on that sheet. Omit when the sheet has one table. |
| to_new_table | boolean | – | true = leave the table as it is and put a sorted copy of its values (no formulas) in a new table on the same sheet. Use it when the table's formulas read other rows. |
Structured output declared, but exposes no named fields.
No examples provided.
pages_fill_placeholders Pages: fill placeholders ~196
Fill template placeholders by tag, e.g. {"Name": "Sara", "Date": "3 October"}. Formatting is kept; the body is verified to change only there. Needs macOS + Pages. dry_run=true previews the change on a copy without touching the file. Use for template fields (Name, Date). It's the only write for page-layout documents like letters and flyers, which have no body text.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .pages document (absolute, or starting with ~). |
| values | object | yes | Placeholder tag → text, e.g. {"Name": "Sara", "Date": "3 October"} (tags from pages_list_placeholders). |
Structured output declared, but exposes no named fields.
No examples provided.
pages_list_placeholders Pages: list placeholders ~78
Template placeholders in a .pages document (tag + current text), e.g. a letter's "Name" or "Date" fields. Needs macOS + Pages. Use before pages_fill_placeholders to see the template's field tags.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .pages document (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
pages_preflight Pages: check it can answer ~55
Check Pages can answer AppleEvents. Run once before any Pages op; never loop on failure. Call once before other Pages tools. A -1712 error means a dialog in Pages needs a human; don't retry until it's dismissed.
Input schema present but exposes no named parameters.
Structured output declared, but exposes no named fields.
No examples provided.
pages_read_tables Pages: read tables ~75
Every table in a .pages document: name, size, and each cell's value, shown text and formula. Needs macOS + Pages. Use before pages_set_table_cells to see the tables, their names and cell references.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Path to the .pages document (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
pages_replace_all Pages: replace all ~168
Replace every occurrence of `find` in a .pages body (needs Pages + GUI session). Rolled back if the readback disagrees. dry_run=true previews the change on a copy without touching the file. Use to change text everywhere while keeping formatting. To replace the whole body use pages_set_body; for template fields use pages_fill_placeholders.
| Name | Type | Req | Description |
|---|---|---|---|
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| find | string | yes | Text to find, exactly. |
| path | string | yes | Path to the .pages document (absolute, or starting with ~). |
| replace | string | yes | Replacement text. |
Structured output declared, but exposes no named fields.
No examples provided.
pages_set_body Pages: set body ~163
Replace the entire body text of a .pages document (needs Pages + GUI session). Body formatting is reset. dry_run=true previews the change on a copy without touching the file. Use only to replace the entire body text; it resets body formatting, so warn the user. Prefer pages_replace_all or pages_fill_placeholders.
| Name | Type | Req | Description |
|---|---|---|---|
| body | string | yes | The new body text; paragraphs separated by newlines. Resets body formatting. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .pages document (absolute, or starting with ~). |
Structured output declared, but exposes no named fields.
No examples provided.
pages_set_table_cells Pages: set table cells ~282
Write cells of an existing table in a .pages document. table = its name or number (from pages_read_tables); cells = {"B2": 1200, "C3": "تم", "D9": "=SUM(D2:D8)"} — numbers stay numbers, "=…" makes a formula, null clears. Every other cell and the body text are verified unchanged. New tables can't be created (Pages 15 doesn't script it). Needs macOS + Pages, document closed. dry_run=true previews the change on a copy without touching the file. Use to write into an existing Pages table. New tables can't be created in Pages; for text outside tables use pages_replace_all.
| Name | Type | Req | Description |
|---|---|---|---|
| cells | object | yes | {"B2": 1200, "C3": "تم", "D9": "=SUM(D2:D8)"}: numbers stay numbers, "=…" is a formula, null clears. |
| dry_run | boolean | – | true = make the change on a throwaway copy, run every check, and return what would change; the file itself is not touched. Use it before broad or risky edits and show the user. |
| path | string | yes | Path to the .pages document (absolute, or starting with ~). |
| table | string | yes | The table's name or number (from pages_read_tables). |
Structured output declared, but exposes no named fields.
No examples provided.
How do I install the iWork Studio MCP server?
iWork Studio runs locally as a PyPI package, launched with uvx iwork-studio. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · iwork-studio
claude mcp add arkanji-iwork-studio -- uvx iwork-studio
What is the iWork Studio MCP server?
iWork Studio is an MCP server listed in the public MCP registry as io.github.Arkanji/iwork-studio. Create, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe. This page covers its PyPI package (iwork-studio).
Is the iWork Studio MCP server safe to use?
iWork Studio scores 96 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 4 November 2026. Its build provenance is signed and verified. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the iWork Studio MCP server expose?
iWork Studio exposes 65 tools: iwork_capabilities, iwork_samples, iwork_read, iwork_list_backups, pages_preflight, and 60 more. Their descriptions and schemas cost roughly 13,026 tokens of context every time the server is loaded.
Is the iWork Studio MCP server still maintained?
iWork Studio is still listed as active in the MCP registry. We last reached this channel on 4 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the iWork Studio MCP server under?
iWork Studio declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.