Bilig WorkPaper
The Bilig WorkPaper server provides a headless spreadsheet runtime for programmatically reading, writing, and recalculating formula-driven workbooks via MCP tools.
Discover sheets (
list_sheets): Retrieve all sheet names, dimensions, writable status, and the source JSON file path.Read a range (
read_range): Fetch calculated values and raw serialized content (including formulas) for an A1-style range.Read a single cell (
read_cell): Get a cell's calculated value, display text, formula, and raw serialized content.Write to a cell (
set_cell_contents): Set literal values or formulas, trigger automatic recalculation of all dependents, atomically persist the workbook, and receive a before/after/restored diff with integrity checks.Get display value (
get_cell_display_value): Retrieve the human-readable formatted string for a cell (e.g., currency formatting).Validate formula syntax (
validate_formula): Check a formula string for syntax errors before writing it to a cell.Export the workbook (
export_workpaper_document): Serialize the full workbook state to JSON for backup, persistence, or handoff.
Provides tools for integrating spreadsheet formula evaluation into LangChain agents, enabling agent tool-calling for workbook operations such as reading and writing cells.
Enables serverless API routes that use headless spreadsheet formulas, with integration examples for Vercel AI SDK and serverless deployment.
Bilig
Keep the workbook model. Run the rule in Node.
Bilig is a TypeScript-native, headless WorkPaper runtime for Node.js services, tests, and AI agents. Set inputs, recalculate formulas, read computed outputs, persist WorkPaper JSON, restore it, and verify the result—without driving Excel or a browser grid.
Docs · Quick start · TypeScript API · MCP · Examples · Discussions
Bilig is a headless workbook runtime, not a visual spreadsheet app or a claim
of full Excel compatibility. If an.xlsx file is your contract, start with
the compatibility report.
Quick Start
Prove the published package before installing it:
npm exec --yes --package @bilig/workpaper@latest -- bilig-evaluate --door workpaper-service --jsonThe evaluator edits Inputs!B2, recalculates Summary!B2, saves the WorkPaper,
restores it, and compares the restored value:
{
"schemaVersion": "bilig-evaluator.v1",
"door": "workpaper-service",
"evidence": {
"editedCell": "Inputs!B2",
"dependentCell": "Summary!B2",
"before": 24000,
"after": 38400,
"afterRestore": 38400
},
"verified": true
}verified: true means the write, formula readback, JSON export, and restored
readback all passed. It is stronger evidence than a successful write call.
Related MCP server: animus-document-engine
Use It From TypeScript
npm install @bilig/workpaperimport { buildA1WorkPaper } from "@bilig/workpaper";
const pricing = buildA1WorkPaper({
Inputs: [
["Metric", "Value"],
["Units", 20],
["Price", 1200],
],
Summary: [
["Metric", "Value"],
["Revenue", "=Inputs!B2*Inputs!B3"],
],
});
const proof = pricing.editAndReadback("Inputs!B2", 32, {
readbackRange: "Summary!B2",
});
console.log(proof.afterReadback.displayValues[0]?.[0]); // 38400
console.log(proof.verified); // true
pricing.dispose();For ordinary operations, use set(), setMany(), readMany(), display(),
and saveJson(). Use editManyAndReadback() when multiple inputs must be
committed and verified as one edit. The complete public API is documented in
packages/workpaper/README.md.
The lifecycle is deliberately small:
inputs → formula recalculation → typed readback → JSON persistence → restore verification
Why Bilig
Capability | What it gives you |
Workbook-shaped models | Sheets, A1 addresses, formulas, ranges, and named expressions without a spreadsheet UI. |
Verified mutations | Before/after computed values plus persistence and restore checks. |
Service-owned state | Portable WorkPaper JSON for routes, queues, tests, tools, and audit trails. |
Agent-safe tools | Narrow read/write tools with exact cells, computed readback, and writable-sheet boundaries. |
Explicit file boundaries | Separate XLSX import, export, risk inspection, and Excel-oracle workflows. |
Use Bilig for pricing, quote approval, payouts, forecasts, validation rules, formula-backed workflows, and tests where a service or tool should own the model. Choose a spreadsheet application or hosted spreadsheet API when you need visual editing, collaboration, macros, interactive pivots or charts, or desktop fidelity.
Agents And MCP
Agents should first ask which system owns state, then run the smallest matching proof. For a tool host or MCP client:
npm exec --yes --package @bilig/workpaper@latest -- bilig-agent-start --json
npm exec --yes --package @bilig/workpaper@latest -- bilig-evaluate --door agent-mcp --jsonThe MCP evaluator proves tool discovery, mutation, recalculated readback, JSON export, disk persistence, process restart, and restored readback. For a local, writable WorkPaper:
npm exec --yes --package @bilig/workpaper@latest -- bilig-workpaper-mcp --workpaper ./pricing.workpaper.json --init-demo-workpaper --writableUse that local stdio path for private or persistent project state. The hosted
https://bilig.proompteng.ai/mcp endpoint is request-local and only intended
for stateless connector discovery and smoke tests; do not send private workbook
data to it.
The server exposes list_sheets, read_range, read_cell,
set_cell_contents, set_cell_contents_and_readback,
get_cell_display_value, export_workpaper_document, and validate_formula.
It also publishes MCP resources and prompts so capable hosts can discover the
workflow before editing cells.
Machine-readable entry points:
Need | Entry point |
A compact routing card | |
A concise model index | |
Full agent documentation | |
Installation context | |
Structured capabilities | |
Reusable skill | |
Proof and host matrix |
The published package also carries AGENTS.md and SKILL.md, so an agent can
discover the same proof contract from node_modules. Install or inspect the
public skill with either source:
npx --yes skills@latest add https://bilig.proompteng.ai --list
npx --yes skills@latest add proompteng/bilig --skill bilig-workpaper --listUse the agent rule chooser or the
host handoff prompt.
The repository includes CLAUDE.md,
.claude/skills/bilig-workpaper/SKILL.md,
.claude/commands/bilig-workpaper-proof.md,
.cursor/rules/bilig-workpaper.mdc, .devin/rules/bilig-workpaper.md,
.windsurf/rules/bilig-workpaper.md, .clinerules/bilig-workpaper.md,
.continue/rules/bilig-workpaper.md, .zed/settings.json, opencode.jsonc,
and .opencode/agents/bilig-workpaper.md.
Integration Recipes After The Proof
Run an evaluator first, then use the recipe owned by your host:
OpenAI Agents SDK: direct tools,
MCPServerStdio, andMCPServerStreamableHttp.OpenAI Responses API: function-call readback with explicit before/after evidence.
Vercel AI SDK:
generateText()andstreamText()tool loops.Open WebUI: local or hosted MCP discovery.
n8n: the
@bilig/n8n-nodes-workpapercommunity node.
Choose An Evaluation Path
Your state owner | Start here | Evidence to require |
TypeScript application |
| direct A1 API and focused application tests |
Node service, route, queue, or test |
| edit, recalculation, JSON export, restore, |
MCP client or tool host |
| discovery, readback, disk persistence, restart |
Imported |
| unsupported formulas and workbook risk reasons for that file |
Cached |
| stale-cache diagnosis, recalculation, and readback for that file |
The workbook-compatibility and xlsx-cache evaluator doors use bundled demo
workbooks to smoke-test the published package; they do not inspect your file.
Do not treat any evaluator as proof of desktop Excel parity.
Examples And Deeper Guides
Start with one maintained example, not the whole monorepo:
examples/headless-workpaper: pricing, invoice, budget, fulfillment, subscription, persistence, and agent examples.examples/serverless-workpaper-api: quote approval through Hono, Next.js, and persistence adapters.examples/xlsx-recalculation-node: import, recalculate, export, reimport, and verify an XLSX workbook.examples/recalc-bridge-workflows: focused bridges for existing SheetJS, xlsx-populate, and ExcelJS workflows.
Useful decision guides:
pnpm --dir examples/headless-workpaper run agent:ai-sdk-generate-text
pnpm --dir examples/headless-workpaper run agent:ai-sdk-stream-text
pnpm --dir examples/headless-workpaper run agent:openai-responses
pnpm --dir examples/headless-workpaper run agent:mcp-xlsx-risk-preflight
pnpm --dir examples/serverless-workpaper-api run hono-route
pnpm --dir examples/serverless-workpaper-api run next-server-action
pnpm --dir examples/serverless-workpaper-api run next-server-action-formdataThe AI SDK generateText() smoke lives at
ai-sdk-generate-text-tool-smoke.ts.
The OpenAI example is documented in
openai-responses-workpaper-tool-call.
For a reduced formula or import bug:
npm exec --yes --package @bilig/workpaper@latest -- bilig-formula-clinic ./reduced.xlsx --cells "Summary!B7,Inputs!B2"XLSX And Excel Compatibility
Bilig can import and export workbook files, but cached formula values inside an
.xlsx are diagnostics—not an accuracy oracle. Inspect the file before trusting
it:
npm exec --yes --package @bilig/xlsx-formula-recalc@latest -- bilig-evaluate --door workbook-compatibility --json
npm exec --yes --package @bilig/xlsx-formula-recalc@latest -- workbook-compatibility-report workbook.xlsx --json
npm exec --yes --package @bilig/xlsx-formula-recalc@latest -- xlsx-cache-doctor workbook.xlsx --jsonThe first command is a package smoke test over a bundled demo. The next two inspect the named file. The compatibility report identifies unsupported functions, external links, macros, pivots, volatile formulas, and other risks; it does not certify Excel compatibility. When correctness matters, compare against a workbook freshly recalculated by Excel. See the compatibility limits and Excel oracle walkthrough.
Packages And Repository Map
Path | Role |
Recommended | |
Lower-level WorkPaper runtime and integration primitives. | |
Real-file compatibility and stale-cache diagnostics. | |
Formula parser, binder, compiler, and evaluator. | |
Workbook state, mutations, snapshots, and scheduling. | |
Browser spreadsheet shell. | |
Full-stack runtime, APIs, and static site host. |
The public package requires Node.js >=22. Local monorepo development uses
Node.js 24+, Bun, and pnpm@10.32.1.
Published releases include npm registry signatures and provenance attestations:
npm view @bilig/workpaper version dist.attestations dist.signatures --json
npm audit signaturesDevelopment
Choose one long-running development server:
pnpm dev:web
pnpm dev:web-localInstall and validate the repository with:
pnpm install
pnpm build
pnpm lint
pnpm typecheck
pnpm test
pnpm run ciArchitecture lives in docs/architecture.md. Read
CONTRIBUTING.md before opening a pull request; first-time
contributors can start with the new contributor guide
and starter issues. All participation follows the
CODE_OF_CONDUCT.md.
Support And Security
Ask adoption and design questions in Discussions.
Follow versioned changes through GitHub Releases.
Report reproducible bugs through Issues; reduced workbooks can use the formula bug clinic and fixture form.
Read
SUPPORT.mdfor the evidence that makes a report actionable.Follow
SECURITY.mdfor private vulnerability reporting. Never attach private workbook data, credentials, or tokens to a public issue.
If Bilig fits one of your services or agent workflows, star the repository to follow releases and help other Node developers find it. Tell us what proof or formula is still missing.
License
Available Tools
7 toolsexport_workpaper_documentExport WorkPaper DocumentARead-onlyIdempotentInspect
Export the current WorkPaper JSON document for persistence, review, or handoff to another agent. Does not write files by itself.
| Name | Required | Description | Default |
|---|---|---|---|
| includeConfig | No | Include workbook configuration metadata in the exported JSON. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| document | Yes | Persisted WorkPaper JSON document. |
| sourcePath | No | |
| serializedBytes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds a crucial behavioral nuance: 'Does not write files by itself', indicating the agent must handle persistence. This goes beyond the annotation hints and prevents a potential misuse.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences long, front-loaded with the primary action, and contains zero redundant content. Every phrase contributes to understanding the tool's purpose and a key behavioral caveat.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple export tool with one optional parameter, an output schema, and strong annotations, the description is complete. It covers the target resource, the use cases, and the non-persistence behavior, leaving no obvious gaps for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully describes the only parameter includeConfig with a clear description and default, achieving 100% coverage. The tool description adds no additional parameter semantics, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states the verb 'Export' and the resource 'current WorkPaper JSON document', clearly distinguishing it from the sibling cell-level operations. The addition of 'for persistence, review, or handoff' further clarifies the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool (obtaining a serialized snapshot for persistence, review, or handoff) and implies it is for the current document. It does not explicitly exclude alternatives, but the sibling tools are so obviously distinct that confusion is unlikely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cell_display_valueGet WorkPaper Cell Display ValueARead-onlyIdempotentInspect
Return the formatted display string for one cell. Use when an agent needs what a user would see, not the raw numeric value.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Single A1 cell address such as B3. | |
| sheetName | Yes | Existing sheet name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| address | Yes | |
| displayValue | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and destructiveHint, so the description adds value by explaining the display vs. raw distinction and that the result is formatted. It does not detail formatting behavior or edge cases, but for a simple read tool with strong annotations this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences pack the purpose and usage guidance with no filler. The key information is front-loaded in the first sentence, and the second sentence clarifies when to choose this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter read tool with rich annotations and an output schema, the description fully covers the tool's purpose, usage context, and distinction from siblings. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for 'address' and 'sheetName'. The description adds no extra parameter-level detail, so it relies on the schema as is appropriate. Baseline of 3 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Return' and identifies the resource as 'the formatted display string for one cell.' It clearly distinguishes from siblings by noting it returns what a user would see, not the raw numeric value, differentiating it from read_cell.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('Use when an agent needs what a user would see') and contrasts it with not wanting the raw numeric value, implying the alternative of read_cell. However, it does not name the alternative or provide explicit when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sheetsList WorkPaper SheetsARead-onlyIdempotentInspect
Discover sheet names and used dimensions before reading or editing a WorkPaper. Returns metadata only; use read_range or read_cell for values.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| sheets | Yes | |
| writable | Yes | Whether set_cell_contents persists edits back to the source JSON file. |
| sourcePath | No | Absolute JSON file path when the server was started with --workpaper. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds useful behavioral context by stating 'Returns metadata only,' which clarifies that no cell values are returned even though it is a read-only operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loaded with the primary action and purpose. Every clause adds value: the discovery intent, the timing cue, and the explicit pointer to value-returning siblings.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters, an output schema present, and rich annotations, the description provides complete context for an agent to invoke the tool correctly. It covers what the tool returns (metadata) and when to use it, and the sibling list provides additional disambiguation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, and the schema is empty, so there is little to document. The description reinforces the metadata-only nature and does not introduce any parameter expectations, matching the baseline for parameterless tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Discover') and clearly identifies the resource ('sheet names and used dimensions') of a WorkPaper. It explicitly distinguishes this metadata-only listing from the sibling tools that return cell values, such as read_range and read_cell.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool: 'before reading or editing a WorkPaper.' It also provides a direct alternative for actual values: 'use read_range or read_cell for values,' making the choice between tools unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_cellRead WorkPaper CellARead-onlyIdempotentInspect
Read one cell with calculated value, display text, formula text, and serialized content. Use after set_cell_contents to verify readback.
| Name | Required | Description | Default |
|---|---|---|---|
| address | Yes | Single A1 cell address such as B3. | |
| sheetName | Yes | Existing sheet name. |
Output Schema
| Name | Required | Description |
|---|---|---|
| value | Yes | Calculated cell value. |
| address | Yes | Canonical sheet-qualified A1 address. |
| formula | Yes | Formula text without losing the original calculated value context, or null for literal cells. |
| serialized | Yes | Raw serialized cell content; formulas are strings that start with =. |
| displayValue | Yes | Formatted value as a user would see it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint=true, destructiveHint=false, idempotentHint=true. The description adds what fields are returned (calculated value, display text, etc.) but does not add behavioral traits beyond annotations. No contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, no wasted words. Front-loaded with purpose and usage guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not explain return values. It covers usage context and differentiates from siblings. Could mention that address must be a single cell, but that is in the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear parameter descriptions. The description does not add additional meaning beyond the schema. Baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description explicitly states it reads a single cell and returns calculated value, display text, formula text, and serialized content. It distinguishes from siblings like `get_cell_display_value` (likely simpler) and `read_range` (reads range).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description recommends using this tool after `set_cell_contents` to verify readback, providing clear context. However, it does not mention when not to use it or suggest alternatives like `get_cell_display_value` for simpler needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_rangeRead WorkPaper RangeARead-onlyIdempotentInspect
Read calculated values plus serialized formulas/inputs for an A1 range. Use for audit readback after edits; use read_cell for one address.
| Name | Required | Description | Default |
|---|---|---|---|
| range | Yes | A1 range such as Summary!A1:B5. If omitted from the range, pass sheetName separately. | |
| sheetName | No | Default sheet name when range omits a sheet name, for example Summary. |
Output Schema
| Name | Required | Description |
|---|---|---|
| range | Yes | Canonical A1 range including the sheet name. |
| values | Yes | Two-dimensional array of evaluated cell values. |
| serialized | Yes | Two-dimensional array of raw serialized cell contents, including formulas. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds valuable context that the tool returns calculated values plus serialized formulas/inputs, revealing the output composition beyond a simple read, and its intended audit role. This exceeds annotation-only information without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a concise two-sentence structure: the first sentence states core functionality, the second provides usage context and alternative guidance. Every sentence earns its place with zero redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's low complexity (2 params, output schema present) and strong annotations, the description covers the what, when, why, and alternative. It also clarifies the output involves formulas/inputs and audit usage, making it complete for an agent to select and invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, with descriptions for 'range' and 'sheetName'. The tool description does not add new details about parameter syntax or behavior beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads calculated values plus serialized formulas/inputs for an A1 range, using a specific verb and resource. It explicitly distinguishes itself from the sibling read_cell tool by noting the latter is for a single address, leaving no ambiguity about scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides an explicit use case ('audit readback after edits') and directs users to the alternative read_cell for one-address reads. This gives clear guidance on when to use this tool versus its sibling, which is exemplary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_cell_contentsSet WorkPaper Cell ContentsADestructiveIdempotentInspect
Write raw content to one cell, recalculate dependents, atomically persist the WorkPaper JSON file, and return before/after/restored readback.
| Name | Required | Description | Default |
|---|---|---|---|
| value | Yes | Raw cell content. Formula strings must start with =; plain strings are stored as literals. | |
| address | Yes | Single A1 cell address such as B3. Ranges are not accepted. | |
| sheetName | Yes | Existing sheet name, for example Inputs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| after | Yes | |
| before | Yes | |
| checks | Yes | |
| restored | Yes | |
| editedCell | Yes | Canonical sheet-qualified address that was edited. |
| persistence | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behaviors beyond annotations: recalculation of dependents, atomic persistence, and return of before/after readback. Annotations already declare destructiveHint=true and idempotentHint=true, and description aligns without contradiction.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single sentence that efficiently conveys all key actions: write, recalculate, persist, return. Front-loaded with the main purpose. No extraneous words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of annotations, output schema, and sibling tools, the description adequately covers tool behavior and side effects. Minor omission of error handling or permission requirements, but acceptable for a focused write tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema has 100% description coverage for all three parameters. Description adds minimal extra meaning beyond 'Write raw content to one cell' and the note about formula strings, which is already in the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description starts with 'Write raw content to one cell,' which clearly states the verb and resource. It distinguishes from siblings like read_cell or read_range by specifying write, recalculate, persist, and return readback.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No explicit when-to-use or when-not-to-use guidance. Implies use for writing cell content, but lacks alternatives or prerequisites. Could benefit from mentioning when to use validate_formula or read_cell instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_formulaValidate WorkPaper FormulaARead-onlyIdempotentInspect
Validate formula syntax with the WorkPaper parser before writing it to a cell. This checks syntax only; use set_cell_contents plus readback to evaluate.
| Name | Required | Description | Default |
|---|---|---|---|
| formula | Yes | Formula string including the leading =, for example =SUM(Inputs!B2:B4). |
Output Schema
| Name | Required | Description |
|---|---|---|
| valid | Yes | |
| formula | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, establishing the safety profile. The description adds the critical limitation 'This checks syntax only,' clarifying that no evaluation or computation occurs, which is valuable beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences: the first states the primary purpose, the second clarifies the syntax-only scope and points to an alternative for evaluation. Every sentence serves a distinct purpose with no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter validator with rich annotations and an output schema, the description covers what the tool does, when to use it, and what it doesn't do. No critical missing information for an agent to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single parameter is fully specified in the schema with type, required, and a detailed description including a leading '=' example. The description doesn't need to add parameter details; schema coverage is 100%, matching the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Validate formula syntax with the WorkPaper parser before writing it to a cell,' specifying the verb (validate), resource (formula syntax with WorkPaper parser), and context (before writing). This distinguishes it from sibling tools that read or write cell contents.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to use this tool before writing a formula to a cell and names the alternative 'use set_cell_contents plus readback to evaluate' for evaluation cases. This gives clear when-to-use and when-not-to-use guidance, outscoring typical sibling differentiation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
TDQS
Scored across 7 tools
Tools are mostly distinct, but read_cell and read_range overlap somewhat; descriptions help differentiate them. get_cell_display_value and read_cell both retrieve cell content, albeit different aspects.
All tool names follow a consistent verb_noun pattern in snake_case, making them predictable and easy to understand.
7 tools is appropriate for a WorkPaper server, covering essential operations without being overwhelming or insufficient.
The tool set covers basic read/write and validation, but lacks batch operations (e.g., write range), sheet management (add/delete), or formatting, leaving notable gaps for complex workflows.
Maintenance
Related MCP Connectors
Fillo MCP server — provision, scaffold, publish, and query forms from your coding agent.
HTML-to-PDF MCP server — render pixel-faithful PDFs from HTML.
Headless API-first double-entry accounting & bookkeeping engine. 84 MCP tools over HTTP.
OAuth-protected, read-only-by-default MCP server for provenance-labeled QuillCaddie project memory.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for Excel-compatible formula evaluation and workbook operations, enabling agents to open, inspect, mutate, recalculate, and save .xlsx files in-memory over stdio.22Apache 2.0
- FlicenseAqualityCmaintenanceMCP server for rendering, parsing, converting, and editing Office documents (Excel, PowerPoint, Word) from a structured JSON spec, using LibreOffice WASM for conversion and preview.51-
- AlicenseNot gradedqualityBmaintenanceProvides full read and write access to Excel workbooks (sheets, cell ranges, tables, formulas, formatting, and cross-workbook references) via MCP, running locally or as an HTTP/SSE service.70MIT
- AlicenseCqualityAmaintenanceMCP server for regulated financial reporting on Workiva, enabling agents to search, read, and write to Workiva workbooks with policy-gated mutations, readback verification, and immutable receipts. Supports both a compact 3-tool facade and a full 117-tool catalog, plus a credential-free mock mode.100MIT