Skip to main content
Glama

Bilig

CI npm Node.js OpenSSF Scorecard License: MIT

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

NOTE

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 --json

The 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/workpaper
import { 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 --json

The 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 --writable

Use 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

docs/agent-start.txt

A concise model index

docs/llms.txt

Full agent documentation

docs/llms-full.txt

Installation context

docs/llms-install.md

Structured capabilities

docs/agent.json

Reusable skill

skills/bilig-workpaper/SKILL.md

Proof and host matrix

docs/agent-adoption-kit.md

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 --list

Use 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:

Choose An Evaluation Path

Your state owner

Start here

Evidence to require

TypeScript application

npm install @bilig/workpaper

direct A1 API and focused application tests

Node service, route, queue, or test

bilig-evaluate --door workpaper-service --json

edit, recalculation, JSON export, restore, verified: true

MCP client or tool host

bilig-evaluate --door agent-mcp --json

discovery, readback, disk persistence, restart

Imported .xlsx is the contract

workbook-compatibility-report workbook.xlsx --json

unsupported formulas and workbook risk reasons for that file

Cached .xlsx values look stale

xlsx-cache-doctor workbook.xlsx --json

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:

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-formdata

The 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 --json

The 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

packages/workpaper

Recommended @bilig/workpaper API, evaluators, AI SDK adapter, MCP server, and XLSX boundary.

packages/headless

Lower-level WorkPaper runtime and integration primitives.

packages/xlsx-formula-recalc

Real-file compatibility and stale-cache diagnostics.

packages/formula

Formula parser, binder, compiler, and evaluator.

packages/core

Workbook state, mutations, snapshots, and scheduling.

apps/web

Browser spreadsheet shell.

apps/bilig

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 signatures

Development

Choose one long-running development server:

pnpm dev:web
pnpm dev:web-local

Install and validate the repository with:

pnpm install
pnpm build
pnpm lint
pnpm typecheck
pnpm test
pnpm run ci

Architecture 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

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

MIT

Available Tools

7 tools
export_workpaper_documentExport WorkPaper DocumentA
Read-onlyIdempotent
Inspect

Export the current WorkPaper JSON document for persistence, review, or handoff to another agent. Does not write files by itself.

ParametersJSON Schema
NameRequiredDescriptionDefault
includeConfigNoInclude workbook configuration metadata in the exported JSON. Defaults to true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
documentYesPersisted WorkPaper JSON document.
sourcePathNo
serializedBytesYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ValueA
Read-onlyIdempotent
Inspect

Return the formatted display string for one cell. Use when an agent needs what a user would see, not the raw numeric value.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesSingle A1 cell address such as B3.
sheetNameYesExisting sheet name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
addressYes
displayValueYes

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 SheetsA
Read-onlyIdempotent
Inspect

Discover sheet names and used dimensions before reading or editing a WorkPaper. Returns metadata only; use read_range or read_cell for values.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
sheetsYes
writableYesWhether set_cell_contents persists edits back to the source JSON file.
sourcePathNoAbsolute JSON file path when the server was started with --workpaper.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 CellA
Read-onlyIdempotent
Inspect

Read one cell with calculated value, display text, formula text, and serialized content. Use after set_cell_contents to verify readback.

ParametersJSON Schema
NameRequiredDescriptionDefault
addressYesSingle A1 cell address such as B3.
sheetNameYesExisting sheet name.

Output Schema

ParametersJSON Schema
NameRequiredDescription
valueYesCalculated cell value.
addressYesCanonical sheet-qualified A1 address.
formulaYesFormula text without losing the original calculated value context, or null for literal cells.
serializedYesRaw serialized cell content; formulas are strings that start with =.
displayValueYesFormatted value as a user would see it.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 RangeA
Read-onlyIdempotent
Inspect

Read calculated values plus serialized formulas/inputs for an A1 range. Use for audit readback after edits; use read_cell for one address.

ParametersJSON Schema
NameRequiredDescriptionDefault
rangeYesA1 range such as Summary!A1:B5. If omitted from the range, pass sheetName separately.
sheetNameNoDefault sheet name when range omits a sheet name, for example Summary.

Output Schema

ParametersJSON Schema
NameRequiredDescription
rangeYesCanonical A1 range including the sheet name.
valuesYesTwo-dimensional array of evaluated cell values.
serializedYesTwo-dimensional array of raw serialized cell contents, including formulas.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ContentsA
DestructiveIdempotent
Inspect

Write raw content to one cell, recalculate dependents, atomically persist the WorkPaper JSON file, and return before/after/restored readback.

ParametersJSON Schema
NameRequiredDescriptionDefault
valueYesRaw cell content. Formula strings must start with =; plain strings are stored as literals.
addressYesSingle A1 cell address such as B3. Ranges are not accepted.
sheetNameYesExisting sheet name, for example Inputs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
afterYes
beforeYes
checksYes
restoredYes
editedCellYesCanonical sheet-qualified address that was edited.
persistenceYes

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 FormulaA
Read-onlyIdempotent
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
formulaYesFormula string including the leading =, for example =SUM(Inputs!B2:B4).

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYes
formulaYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

A4.2/5.0

Scored across 7 tools

Disambiguation4/5

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.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in snake_case, making them predictable and easy to understand.

Tool Count5/5

7 tools is appropriate for a WorkPaper server, covering essential operations without being overwhelming or insufficient.

Completeness3/5

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

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for Excel-compatible formula evaluation and workbook operations, enabling agents to open, inspect, mutate, recalculate, and save .xlsx files in-memory over stdio.
    22
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides 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.
    70
    MIT
  • A
    license
    C
    quality
    A
    maintenance
    MCP 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.
    100
    MIT