Bilig WorkPaper MCP
An MCP server providing formula-backed WorkPaper tools for Node services. It allows agents to edit inputs, recalculate formulas, read outputs, and persist WorkPaper JSON. It exposes tools for list_sheets, read_range, read_cell, set_cell_contents, and export_workpaper_document, enabling spreadsheet-like automation without a visual UI.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://bilig.proompteng.ai/mcpWhat its tools do
8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Read-only (6)
Can change data (2)
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Warning Advertises resources/templates/list but does not implement it
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Edit workbook inputs and recalculate formulas
- Read cell values and ranges from workbooks
- Persist WorkPaper state to JSON files
- Validate formulas and export documents
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- bilig-workpaper-remote-demo 1.1.2
- MCP protocol negotiated in check
- 2025-03-26
- Tools
- 8 advertised
- Resources
- 4 advertised
- Resource templates
- Not advertised
- Prompts
- 2 advertised
{
"tools": {
"listChanged": false
},
"prompts": {
"listChanged": false
},
"resources": {
"subscribe": false,
"listChanged": false
}
}Tools
8 advertised
list_sheets — List WorkPaper Sheets
Discover sheet names and used dimensions before reading or editing a WorkPaper. Returns metadata only; use read_range or read_cell for values.
{
"type": "object",
"additionalProperties": false
}{
"type": "object",
"required": [
"writable",
"sheets"
],
"properties": {
"sheets": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"dimensions"
],
"properties": {
"id": {
"type": "number"
},
"name": {
"type": "string"
},
"dimensions": {
"type": "object",
"description": "Current used rows and columns for the sheet."
}
}
}
},
"writable": {
"type": "boolean",
"description": "Whether set_cell_contents persists edits back to the source JSON file."
},
"sourcePath": {
"type": "string",
"description": "Absolute JSON file path when the server was started with --workpaper."
}
},
"additionalProperties": false
}{
"title": "List WorkPaper Sheets",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_range — Read WorkPaper Range
Read calculated values plus serialized formulas/inputs for an A1 range. Use for audit readback after edits; use read_cell for one address.
{
"type": "object",
"required": [
"range"
],
"properties": {
"range": {
"type": "string",
"description": "A1 range such as Summary!A1:B5. If omitted from the range, pass sheetName separately."
},
"sheetName": {
"type": "string",
"description": "Default sheet name when range omits a sheet name, for example Summary."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"range",
"values",
"serialized"
],
"properties": {
"range": {
"type": "string",
"description": "Canonical A1 range including the sheet name."
},
"values": {
"type": "array",
"description": "Two-dimensional array of evaluated cell values."
},
"serialized": {
"type": "array",
"description": "Two-dimensional array of raw serialized cell contents, including formulas."
}
},
"additionalProperties": false
}{
"title": "Read WorkPaper Range",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}read_cell — Read WorkPaper Cell
Read one cell with calculated value, display text, formula text, formula diagnostics, and serialized content. Use after set_cell_contents to verify readback.
{
"type": "object",
"required": [
"sheetName",
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Single A1 cell address such as B3."
},
"sheetName": {
"type": "string",
"description": "Existing sheet name."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"address",
"value",
"serialized",
"formula",
"displayValue",
"formulaDiagnostics"
],
"properties": {
"value": {
"description": "Calculated cell value."
},
"address": {
"type": "string",
"description": "Canonical sheet-qualified A1 address."
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Formula text without losing the original calculated value context, or null for literal cells."
},
"serialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"displayValue": {
"type": "string",
"description": "Formatted value as a user would see it."
},
"formulaDiagnostics": {
"type": "array",
"description": "Structured formula diagnostics. Empty when the cell has no formula error."
}
},
"additionalProperties": false
}{
"title": "Read WorkPaper Cell",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}set_cell_contents — Set WorkPaper Cell Contents
Write raw content to one cell and recalculate dependents in memory only. Start with --writable when the edit should persist to JSON.
{
"type": "object",
"required": [
"sheetName",
"address",
"value"
],
"properties": {
"value": {
"type": "string",
"description": "Raw cell content. Formula strings must start with =; plain strings are stored as literals. Strict MCP hosts such as Semantic Kernel require a single parameter type, so pass evaluated numbers/booleans as formulas such as =0.4 or =TRUE(). The server still accepts JSON number, boolean, or null arguments from clients that support them."
},
"address": {
"type": "string",
"description": "Single A1 cell address such as B3. Ranges are not accepted."
},
"sheetName": {
"type": "string",
"description": "Existing sheet name, for example Inputs."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"editedCell",
"before",
"after",
"restored",
"persistence",
"checks"
],
"properties": {
"after": {
"type": "object",
"required": [
"address",
"value",
"serialized",
"formula",
"displayValue",
"formulaDiagnostics"
],
"properties": {
"value": {
"description": "Calculated cell value."
},
"address": {
"type": "string",
"description": "Canonical sheet-qualified A1 address."
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Formula text without losing the original calculated value context, or null for literal cells."
},
"serialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"displayValue": {
"type": "string",
"description": "Formatted value as a user would see it."
},
"formulaDiagnostics": {
"type": "array",
"description": "Structured formula diagnostics. Empty when the cell has no formula error."
}
},
"additionalProperties": false
},
"before": {
"type": "object",
"required": [
"address",
"value",
"serialized",
"formula",
"displayValue",
"formulaDiagnostics"
],
"properties": {
"value": {
"description": "Calculated cell value."
},
"address": {
"type": "string",
"description": "Canonical sheet-qualified A1 address."
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Formula text without losing the original calculated value context, or null for literal cells."
},
"serialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"displayValue": {
"type": "string",
"description": "Formatted value as a user would see it."
},
"formulaDiagnostics": {
"type": "array",
"description": "Structured formula diagnostics. Empty when the cell has no formula error."
}
},
"additionalProperties": false
},
"checks": {
"type": "object",
"required": [
"persisted",
"restoredMatchesAfter",
"previousSerialized",
"newSerialized"
],
"properties": {
"persisted": {
"type": "boolean"
},
"newSerialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"previousSerialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"restoredMatchesAfter": {
"type": "boolean",
"description": "True when exported and re-imported JSON preserves the edited cell readback."
}
}
},
"restored": {
"type": "object",
"required": [
"address",
"value",
"serialized",
"formula",
"displayValue",
"formulaDiagnostics"
],
"properties": {
"value": {
"description": "Calculated cell value."
},
"address": {
"type": "string",
"description": "Canonical sheet-qualified A1 address."
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Formula text without losing the original calculated value context, or null for literal cells."
},
"serialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"displayValue": {
"type": "string",
"description": "Formatted value as a user would see it."
},
"formulaDiagnostics": {
"type": "array",
"description": "Structured formula diagnostics. Empty when the cell has no formula error."
}
},
"additionalProperties": false
},
"editedCell": {
"type": "string",
"description": "Canonical sheet-qualified address that was edited."
},
"persistence": {
"type": "object",
"required": [
"persisted",
"serializedBytes"
],
"properties": {
"path": {
"type": "string"
},
"persisted": {
"type": "boolean"
},
"serializedBytes": {
"type": "number"
}
}
}
},
"additionalProperties": false
}{
"title": "Set WorkPaper Cell Contents",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}set_cell_contents_and_readback — Set WorkPaper Cell Contents And Read Back
Write raw content to one cell, recalculate dependents, read a dependent range in the same tool call, and return persistence proof. Use this for stateless MCP clients such as hosted Open WebUI integrations.
{
"type": "object",
"required": [
"sheetName",
"address",
"value",
"readbackRange"
],
"properties": {
"value": {
"type": "string",
"description": "Raw cell content. Formula strings must start with =; plain strings are stored as literals. Strict MCP hosts require a single parameter type, so pass evaluated numbers/booleans as formulas such as =0.4 or =TRUE(). The server still accepts JSON number, boolean, or null arguments from clients that support them."
},
"address": {
"type": "string",
"description": "Single A1 cell address to edit, such as B3. Ranges are not accepted."
},
"sheetName": {
"type": "string",
"description": "Existing sheet name for the cell to edit, for example Inputs."
},
"readbackRange": {
"type": "string",
"description": "Dependent A1 range to read before and after the edit, for example Summary!A1:B5."
},
"readbackSheetName": {
"type": "string",
"description": "Default sheet name when readbackRange omits a sheet name."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"editedCell",
"readbackRange",
"before",
"after",
"beforeReadback",
"afterReadback",
"restoredReadback",
"persistence",
"checks"
],
"properties": {
"after": {
"type": "object",
"required": [
"address",
"value",
"serialized",
"formula",
"displayValue",
"formulaDiagnostics"
],
"properties": {
"value": {
"description": "Calculated cell value."
},
"address": {
"type": "string",
"description": "Canonical sheet-qualified A1 address."
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Formula text without losing the original calculated value context, or null for literal cells."
},
"serialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"displayValue": {
"type": "string",
"description": "Formatted value as a user would see it."
},
"formulaDiagnostics": {
"type": "array",
"description": "Structured formula diagnostics. Empty when the cell has no formula error."
}
},
"additionalProperties": false
},
"before": {
"type": "object",
"required": [
"address",
"value",
"serialized",
"formula",
"displayValue",
"formulaDiagnostics"
],
"properties": {
"value": {
"description": "Calculated cell value."
},
"address": {
"type": "string",
"description": "Canonical sheet-qualified A1 address."
},
"formula": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"description": "Formula text without losing the original calculated value context, or null for literal cells."
},
"serialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"displayValue": {
"type": "string",
"description": "Formatted value as a user would see it."
},
"formulaDiagnostics": {
"type": "array",
"description": "Structured formula diagnostics. Empty when the cell has no formula error."
}
},
"additionalProperties": false
},
"checks": {
"type": "object",
"required": [
"persisted",
"readbackChanged",
"restoredReadbackMatchesAfter",
"previousSerialized",
"newSerialized"
],
"properties": {
"persisted": {
"type": "boolean"
},
"newSerialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"readbackChanged": {
"type": "boolean",
"description": "True when the dependent readback values differ after the edit."
},
"previousSerialized": {
"anyOf": [
{
"type": "string"
},
{
"type": "number"
},
{
"type": "boolean"
},
{
"type": "null"
}
],
"description": "Raw serialized cell content; formulas are strings that start with =."
},
"restoredReadbackMatchesAfter": {
"type": "boolean",
"description": "True when exported and re-imported JSON preserves the dependent readback range."
}
}
},
"editedCell": {
"type": "string",
"description": "Canonical sheet-qualified address that was edited."
},
"persistence": {
"type": "object",
"required": [
"persisted",
"serializedBytes"
],
"properties": {
"path": {
"type": "string"
},
"persisted": {
"type": "boolean"
},
"serializedBytes": {
"type": "number"
}
}
},
"afterReadback": {
"type": "object",
"required": [
"range",
"values",
"serialized"
],
"properties": {
"range": {
"type": "string",
"description": "Canonical A1 range including the sheet name."
},
"values": {
"type": "array",
"description": "Two-dimensional array of evaluated cell values."
},
"serialized": {
"type": "array",
"description": "Two-dimensional array of raw serialized cell contents, including formulas."
}
},
"additionalProperties": false
},
"readbackRange": {
"type": "string",
"description": "Canonical sheet-qualified range read before and after the edit."
},
"beforeReadback": {
"type": "object",
"required": [
"range",
"values",
"serialized"
],
"properties": {
"range": {
"type": "string",
"description": "Canonical A1 range including the sheet name."
},
"values": {
"type": "array",
"description": "Two-dimensional array of evaluated cell values."
},
"serialized": {
"type": "array",
"description": "Two-dimensional array of raw serialized cell contents, including formulas."
}
},
"additionalProperties": false
},
"restoredReadback": {
"type": "object",
"required": [
"range",
"values",
"serialized"
],
"properties": {
"range": {
"type": "string",
"description": "Canonical A1 range including the sheet name."
},
"values": {
"type": "array",
"description": "Two-dimensional array of evaluated cell values."
},
"serialized": {
"type": "array",
"description": "Two-dimensional array of raw serialized cell contents, including formulas."
}
},
"additionalProperties": false
}
},
"additionalProperties": false
}{
"title": "Set WorkPaper Cell Contents And Read Back",
"readOnlyHint": false,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}get_cell_display_value — Get WorkPaper Cell Display Value
Return the formatted display string for one cell. Use when an agent needs what a user would see, not the raw numeric value.
{
"type": "object",
"required": [
"sheetName",
"address"
],
"properties": {
"address": {
"type": "string",
"description": "Single A1 cell address such as B3."
},
"sheetName": {
"type": "string",
"description": "Existing sheet name."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"address",
"displayValue"
],
"properties": {
"address": {
"type": "string"
},
"displayValue": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Get WorkPaper Cell Display Value",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}export_workpaper_document — Export WorkPaper Document
Export the current WorkPaper JSON document for persistence, review, or handoff to another agent. Does not write files by itself.
{
"type": "object",
"properties": {
"includeConfig": {
"type": "boolean",
"default": true,
"description": "Include workbook configuration metadata in the exported JSON. Defaults to true."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"document",
"serializedBytes"
],
"properties": {
"document": {
"type": "object",
"description": "Persisted WorkPaper JSON document."
},
"sourcePath": {
"type": "string"
},
"serializedBytes": {
"type": "number"
}
},
"additionalProperties": false
}{
"title": "Export WorkPaper Document",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}validate_formula — Validate WorkPaper Formula
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.
{
"type": "object",
"required": [
"formula"
],
"properties": {
"formula": {
"type": "string",
"description": "Formula string including the leading =, for example =SUM(Inputs!B2:B4)."
}
},
"additionalProperties": false
}{
"type": "object",
"required": [
"formula",
"valid"
],
"properties": {
"valid": {
"type": "boolean"
},
"formula": {
"type": "string"
}
},
"additionalProperties": false
}{
"title": "Validate WorkPaper Formula",
"readOnlyHint": true,
"openWorldHint": false,
"idempotentHint": true,
"destructiveHint": false
}Prompts
2 advertised
edit_and_verify_workpaper — Edit And Verify WorkPaper
Guide an agent through a safe WorkPaper edit: read before, validate target, write one cell, read computed output, export JSON, and report proof.
- task
- Human-readable workbook edit request.
- target_cell
- Optional sheet-qualified A1 target such as Inputs!B3.
- output_range
- Optional dependent output range to read after recalculation, such as Summary!A1:B5.
debug_workpaper_formula — Debug WorkPaper Formula
Guide an agent through formula validation and readback when a WorkPaper formula or dependent output looks wrong.
- formula
- Optional formula text, including the leading =.
- cell
- Optional sheet-qualified A1 cell that contains or should contain the formula.
- symptom
- Optional description of the wrong value, parse failure, or behavior being debugged.
Resources
4 advertised
workpaper_manifest — WorkPaper MCP Manifest
Live manifest of the current WorkPaper file, available tools, prompts, resources, and verification contract.
bilig://workpaper/manifestworkpaper_agent_handoff — WorkPaper Agent Handoff
Compact instructions for agents that need to edit workbook formulas without spreadsheet UI automation.
bilig://workpaper/agent-handoffworkpaper_sheets — WorkPaper Sheets
Current sheet names and used dimensions for the loaded WorkPaper document.
bilig://workpaper/sheetsworkpaper_current_document — Current WorkPaper Document
Current persisted WorkPaper JSON document as exported from the in-memory engine.
bilig://workpaper/current-document90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 1 of 1 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 523 ms
- 95th percentile latency
- 523 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 523 ms · metadata changed · 8 tool(s), 4 resource(s), 2 prompt(s); warnings: Advertises resources/templates/list but does not implement it
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http bilig-workpaper-mcp https://bilig.proompteng.ai/mcpCodex
codex mcp add bilig-workpaper-mcp --url https://bilig.proompteng.ai/mcpCursor
{
"mcpServers": {
"bilig-workpaper-mcp": {
"url": "https://bilig.proompteng.ai/mcp"
}
}
}Cline
{
"mcpServers": {
"bilig-workpaper-mcp": {
"type": "streamableHttp",
"url": "https://bilig.proompteng.ai/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"bilig-workpaper-mcp": {
"type": "http",
"url": "https://bilig.proompteng.ai/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http bilig-workpaper-mcp https://bilig.proompteng.ai/mcpClaude Desktop
https://bilig.proompteng.ai/mcpWindsurf
{
"mcpServers": {
"bilig-workpaper-mcp": {
"serverUrl": "https://bilig.proompteng.ai/mcp"
}
}
}Let your agent find its tools
Find servers like Bilig WorkPaper MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.