Bilig WorkPaper

Formula-backed WorkPaper tools for workbook readback, input edits, and JSON persistence.

사용해야 할까요

품질 및 안전성

A
설명 품질
98%
스키마 완전성
90%
이름 품질
100%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~3,382토큰 (도구 정의)
~4.9 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 2.64%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "bilig-workpaper": {
      "command": "npx",
      "args": [
        "@bilig/workpaper"
      ]
    }
  }
}

실행 가능한 패키지

npm@bilig/workpaper0.164.11stdio

원격 엔드포인트

https://bilig.proompteng.ai/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (8)

🟢 읽기 전용🟡 쓰기🔴 삭제⚪ 알 수 없음
🟢list_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",
  "properties": {
    "sourcePath": {
      "type": "string",
      "description": "Absolute JSON file path when the server was started with --workpaper."
    },
    "writable": {
      "type": "boolean",
      "description": "Whether set_cell_contents persists edits back to the source JSON file."
    },
    "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."
          }
        }
      }
    }
  },
  "required": [
    "writable",
    "sheets"
  ],
  "additionalProperties": false
}
🟢read_range(range, sheetName)

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",
  "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."
    }
  },
  "required": [
    "range"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "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."
    }
  },
  "required": [
    "range",
    "values",
    "serialized"
  ],
  "additionalProperties": false
}
🟢read_cell(sheetName, address)

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",
  "properties": {
    "sheetName": {
      "type": "string",
      "description": "Existing sheet name."
    },
    "address": {
      "type": "string",
      "description": "Single A1 cell address such as B3."
    }
  },
  "required": [
    "sheetName",
    "address"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string",
      "description": "Canonical sheet-qualified A1 address."
    },
    "value": {
      "description": "Calculated cell value."
    },
    "serialized": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "number"
        },
        {
          "type": "boolean"
        },
        {
          "type": "null"
        }
      ],
      "description": "Raw serialized cell content; formulas are strings that start with =."
    },
    "formula": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Formula text without losing the original calculated value context, or null for literal cells."
    },
    "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."
    }
  },
  "required": [
    "address",
    "value",
    "serialized",
    "formula",
    "displayValue",
    "formulaDiagnostics"
  ],
  "additionalProperties": false
}
🟡set_cell_contents(sheetName, address, value)

Write raw content to one cell and recalculate dependents in memory only. Start with --writable when the edit should persist to JSON.

입력 스키마

{
  "type": "object",
  "properties": {
    "sheetName": {
      "type": "string",
      "description": "Existing sheet name, for example Inputs."
    },
    "address": {
      "type": "string",
      "description": "Single A1 cell address such as B3. Ranges are not accepted."
    },
    "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."
    }
  },
  "required": [
    "sheetName",
    "address",
    "value"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "properties": {
    "editedCell": {
      "type": "string",
      "description": "Canonical sheet-qualified address that was edited."
    },
    "before": {
      "type": "object",
      "required": [
        "address",
        "value",
        "serialized",
        "formula",
        "displayValue",
        "formulaDiagnostics"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Canonical sheet-qualified A1 address."
        },
        "value": {
          "description": "Calculated cell value."
        },
        "serialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Formula text without losing the original calculated value context, or null for literal cells."
        },
        "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
    },
    "after": {
      "type": "object",
      "required": [
        "address",
        "value",
        "serialized",
        "formula",
        "displayValue",
        "formulaDiagnostics"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Canonical sheet-qualified A1 address."
        },
        "value": {
          "description": "Calculated cell value."
        },
        "serialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Formula text without losing the original calculated value context, or null for literal cells."
        },
        "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
    },
    "restored": {
      "type": "object",
      "required": [
        "address",
        "value",
        "serialized",
        "formula",
        "displayValue",
        "formulaDiagnostics"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Canonical sheet-qualified A1 address."
        },
        "value": {
          "description": "Calculated cell value."
        },
        "serialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Formula text without losing the original calculated value context, or null for literal cells."
        },
        "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
    },
    "persistence": {
      "type": "object",
      "required": [
        "persisted",
        "serializedBytes"
      ],
      "properties": {
        "persisted": {
          "type": "boolean"
        },
        "path": {
          "type": "string"
        },
        "serializedBytes": {
          "type": "number"
        }
      }
    },
    "checks": {
      "type": "object",
      "required": [
        "persisted",
        "restoredMatchesAfter",
        "previousSerialized",
        "newSerialized"
      ],
      "properties": {
        "persisted": {
          "type": "boolean"
        },
        "restoredMatchesAfter": {
          "type": "boolean",
          "description": "True when exported and re-imported JSON preserves the edited cell readback."
        },
        "previousSerialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "newSerialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        }
      }
    }
  },
  "required": [
    "editedCell",
    "before",
    "after",
    "restored",
    "persistence",
    "checks"
  ],
  "additionalProperties": false
}
🟡set_cell_contents_and_readback(sheetName, address, value, readbackRange, readbackSheetName)

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",
  "properties": {
    "sheetName": {
      "type": "string",
      "description": "Existing sheet name for the cell to edit, for example Inputs."
    },
    "address": {
      "type": "string",
      "description": "Single A1 cell address to edit, such as B3. Ranges are not accepted."
    },
    "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."
    },
    "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."
    }
  },
  "required": [
    "sheetName",
    "address",
    "value",
    "readbackRange"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "properties": {
    "editedCell": {
      "type": "string",
      "description": "Canonical sheet-qualified address that was edited."
    },
    "readbackRange": {
      "type": "string",
      "description": "Canonical sheet-qualified range read before and after the edit."
    },
    "before": {
      "type": "object",
      "required": [
        "address",
        "value",
        "serialized",
        "formula",
        "displayValue",
        "formulaDiagnostics"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Canonical sheet-qualified A1 address."
        },
        "value": {
          "description": "Calculated cell value."
        },
        "serialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Formula text without losing the original calculated value context, or null for literal cells."
        },
        "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
    },
    "after": {
      "type": "object",
      "required": [
        "address",
        "value",
        "serialized",
        "formula",
        "displayValue",
        "formulaDiagnostics"
      ],
      "properties": {
        "address": {
          "type": "string",
          "description": "Canonical sheet-qualified A1 address."
        },
        "value": {
          "description": "Calculated cell value."
        },
        "serialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "formula": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "Formula text without losing the original calculated value context, or null for literal cells."
        },
        "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
    },
    "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
    },
    "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
    },
    "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
    },
    "persistence": {
      "type": "object",
      "required": [
        "persisted",
        "serializedBytes"
      ],
      "properties": {
        "persisted": {
          "type": "boolean"
        },
        "path": {
          "type": "string"
        },
        "serializedBytes": {
          "type": "number"
        }
      }
    },
    "checks": {
      "type": "object",
      "required": [
        "persisted",
        "readbackChanged",
        "restoredReadbackMatchesAfter",
        "previousSerialized",
        "newSerialized"
      ],
      "properties": {
        "persisted": {
          "type": "boolean"
        },
        "readbackChanged": {
          "type": "boolean",
          "description": "True when the dependent readback values differ after the edit."
        },
        "restoredReadbackMatchesAfter": {
          "type": "boolean",
          "description": "True when exported and re-imported JSON preserves the dependent readback range."
        },
        "previousSerialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        },
        "newSerialized": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "number"
            },
            {
              "type": "boolean"
            },
            {
              "type": "null"
            }
          ],
          "description": "Raw serialized cell content; formulas are strings that start with =."
        }
      }
    }
  },
  "required": [
    "editedCell",
    "readbackRange",
    "before",
    "after",
    "beforeReadback",
    "afterReadback",
    "restoredReadback",
    "persistence",
    "checks"
  ],
  "additionalProperties": false
}
🟢get_cell_display_value(sheetName, address)

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",
  "properties": {
    "sheetName": {
      "type": "string",
      "description": "Existing sheet name."
    },
    "address": {
      "type": "string",
      "description": "Single A1 cell address such as B3."
    }
  },
  "required": [
    "sheetName",
    "address"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "properties": {
    "address": {
      "type": "string"
    },
    "displayValue": {
      "type": "string"
    }
  },
  "required": [
    "address",
    "displayValue"
  ],
  "additionalProperties": false
}
🟢export_workpaper_document(includeConfig)

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",
  "properties": {
    "sourcePath": {
      "type": "string"
    },
    "document": {
      "type": "object",
      "description": "Persisted WorkPaper JSON document."
    },
    "serializedBytes": {
      "type": "number"
    }
  },
  "required": [
    "document",
    "serializedBytes"
  ],
  "additionalProperties": false
}
🟢validate_formula(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",
  "properties": {
    "formula": {
      "type": "string",
      "description": "Formula string including the leading =, for example =SUM(Inputs!B2:B4)."
    }
  },
  "required": [
    "formula"
  ],
  "additionalProperties": false
}

출력 스키마

{
  "type": "object",
  "properties": {
    "formula": {
      "type": "string"
    },
    "valid": {
      "type": "boolean"
    }
  },
  "required": [
    "formula",
    "valid"
  ],
  "additionalProperties": false
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 8개
검증됨버전이 기록되지 않음도구 8개