Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

iWork Studio

PYPI · IWORK-STUDIO

Create, edit, design and export Apple Numbers, Keynote and Pages files. Verified and Arabic-safe.

Available components

+18 this week 96 Trust /100

Last scanned (1 day ago)

Scores higher than 99% of PyPI servers

Category Documents and Files

Trust breakdown (7 categories)

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
Changelog

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.

Diagnostics

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 →

MCP tools · 65 exposed · ~13,026 tokens

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 →

Tool Tokens
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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .numbers file (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
cellsstringyesA cell or range in A1 notation, e.g. "B2" or "A1:D1".
colorstring–Line colour "#RRGGBB".
dry_runboolean–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.
pathstringyesPath to the .numbers file (absolute, or starting with ~).
sheet––Sheet name. Omit when the file has one sheet (iwork_read lists sheets and tables).
sidesstring–all | outline | inner | top | right | bottom | left.
stylestring–solid | dashes | dots | none (none removes the border).
table––Table name on that sheet. Omit when the sheet has one table.
widthnumber–Line width in points.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
align––Horizontal: left | center | right | justify | auto.
bold––true/false; omit to leave as is.
cellsstringyesA cell or range in A1 notation, e.g. "B2" or "A1:D1".
dry_runboolean–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.
pathstringyesPath 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 ~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.

NameTypeReqDescription
columns––Column widths in points by letter, e.g. {"A": 160, "C": 90}.
dry_runboolean–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.
pathstringyesPath 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 ~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.

NameTypeReqDescription
dry_runboolean–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.
formulastringyesThe formula, starting with "=", e.g. "=SUM(B2:B9)".
pathstringyesPath to the .numbers file (absolute, or starting with ~).
refstringyesOne 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 ~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).

NameTypeReqDescription
dry_runboolean–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).
pathstringyesPath 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 ~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.

NameTypeReqDescription
accounting––true = accounting style (symbol aligned left) for currency.
cellsstringyesA 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_runboolean–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.
formatstringyesnumber | currency | percentage | scientific | fraction | datetime | text.
negative_style––minus | red | parentheses | red_parentheses.
pathstringyesPath 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 ~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.

NameTypeReqDescription
columnstringyesColumn letter to sort by, e.g. "C".
descendingboolean–true = largest/last first.
dry_runboolean–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".
pathstringyesPath 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_tableboolean–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 ~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.

NameTypeReqDescription
dry_runboolean–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.
pathstringyesPath to the .pages document (absolute, or starting with ~).
valuesobjectyesPlaceholder 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 ~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.

NameTypeReqDescription
pathstringyesPath to the .pages document (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

pages_preflight ~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 ~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.

NameTypeReqDescription
pathstringyesPath to the .pages document (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
dry_runboolean–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.
findstringyesText to find, exactly.
pathstringyesPath to the .pages document (absolute, or starting with ~).
replacestringyesReplacement text.

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
bodystringyesThe new body text; paragraphs separated by newlines. Resets body formatting.
dry_runboolean–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.
pathstringyesPath to the .pages document (absolute, or starting with ~).

Structured output declared, but exposes no named fields.

No examples provided.

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.

NameTypeReqDescription
cellsobjectyes{"B2": 1200, "C3": "تم", "D9": "=SUM(D2:D8)"}: numbers stay numbers, "=…" is a formula, null clears.
dry_runboolean–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.
pathstringyesPath to the .pages document (absolute, or starting with ~).
tablestringyesThe table's name or number (from pages_read_tables).

Structured output declared, but exposes no named fields.

No examples provided.

Install

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

# add to Claude Code
claude mcp add arkanji-iwork-studio -- uvx iwork-studio
Common questions

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.