Koskamo

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.

Bilig WorkPaper MCP logo, by proomptengCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-06Published by proompteng
MCP endpoint (Streamable HTTP)
https://bilig.proompteng.ai/mcp
Vendor documentation

What its tools do

8 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

8 of 8 have a description · 8 of 8 declare behavior hints · 7 of 7 with parameters document them all

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

Community listingRegistry 1.1.0
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
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  }
}

Tools

8 advertised

list_sheets — List WorkPaper Sheets
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

list_sheets input schema
{
  "type": "object",
  "additionalProperties": false
}
list_sheets output schema
{
  "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
}
list_sheets annotations
{
  "title": "List WorkPaper Sheets",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
read_range — Read WorkPaper Range
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

read_range input schema
{
  "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
}
read_range output schema
{
  "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
}
read_range annotations
{
  "title": "Read WorkPaper Range",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
read_cell — Read WorkPaper Cell
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

read_cell input schema
{
  "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
}
read_cell output schema
{
  "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
}
read_cell annotations
{
  "title": "Read WorkPaper Cell",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
set_cell_contents — Set WorkPaper Cell Contents
Advertised by the server during the last successful anonymous check.

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

set_cell_contents input schema
{
  "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
}
set_cell_contents output schema
{
  "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
}
set_cell_contents annotations
{
  "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
Advertised by the server during the last successful anonymous check.

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.

set_cell_contents_and_readback input schema
{
  "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
}
set_cell_contents_and_readback output schema
{
  "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
}
set_cell_contents_and_readback annotations
{
  "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
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

get_cell_display_value input schema
{
  "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
}
get_cell_display_value output schema
{
  "type": "object",
  "required": [
    "address",
    "displayValue"
  ],
  "properties": {
    "address": {
      "type": "string"
    },
    "displayValue": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
get_cell_display_value annotations
{
  "title": "Get WorkPaper Cell Display Value",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
export_workpaper_document — Export WorkPaper Document
Advertised by the server during the last successful anonymous check.
Advertised read-only

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

export_workpaper_document input schema
{
  "type": "object",
  "properties": {
    "includeConfig": {
      "type": "boolean",
      "default": true,
      "description": "Include workbook configuration metadata in the exported JSON. Defaults to true."
    }
  },
  "additionalProperties": false
}
export_workpaper_document output schema
{
  "type": "object",
  "required": [
    "document",
    "serializedBytes"
  ],
  "properties": {
    "document": {
      "type": "object",
      "description": "Persisted WorkPaper JSON document."
    },
    "sourcePath": {
      "type": "string"
    },
    "serializedBytes": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
export_workpaper_document annotations
{
  "title": "Export WorkPaper Document",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
validate_formula — Validate WorkPaper Formula
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

validate_formula input schema
{
  "type": "object",
  "required": [
    "formula"
  ],
  "properties": {
    "formula": {
      "type": "string",
      "description": "Formula string including the leading =, for example =SUM(Inputs!B2:B4)."
    }
  },
  "additionalProperties": false
}
validate_formula output schema
{
  "type": "object",
  "required": [
    "formula",
    "valid"
  ],
  "properties": {
    "valid": {
      "type": "boolean"
    },
    "formula": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
validate_formula annotations
{
  "title": "Validate WorkPaper Formula",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

2 advertised

edit_and_verify_workpaper — Edit And Verify WorkPaper

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

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

Advertised by the server during the last successful anonymous check.

Live manifest of the current WorkPaper file, available tools, prompts, resources, and verification contract.

workpaper_manifest URI
bilig://workpaper/manifest

MIME type: application/json

workpaper_agent_handoff — WorkPaper Agent Handoff

Advertised by the server during the last successful anonymous check.

Compact instructions for agents that need to edit workbook formulas without spreadsheet UI automation.

workpaper_agent_handoff URI
bilig://workpaper/agent-handoff

MIME type: text/markdown

workpaper_sheets — WorkPaper Sheets

Advertised by the server during the last successful anonymous check.

Current sheet names and used dimensions for the loaded WorkPaper document.

workpaper_sheets URI
bilig://workpaper/sheets

MIME type: application/json

workpaper_current_document — Current WorkPaper Document

Advertised by the server during the last successful anonymous check.

Current persisted WorkPaper JSON document as exported from the in-memory engine.

workpaper_current_document URI
bilig://workpaper/current-document

MIME type: application/json

90-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.

Too few checks for a percentage yet (1 of 1 answered).

  1. 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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http bilig-workpaper-mcp https://bilig.proompteng.ai/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add bilig-workpaper-mcp --url https://bilig.proompteng.ai/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable bilig-workpaper-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "bilig-workpaper-mcp": {
      "url": "https://bilig.proompteng.ai/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "bilig-workpaper-mcp": {
      "type": "streamableHttp",
      "url": "https://bilig.proompteng.ai/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start bilig-workpaper-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "bilig-workpaper-mcp": {
      "type": "http",
      "url": "https://bilig.proompteng.ai/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http bilig-workpaper-mcp https://bilig.proompteng.ai/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://bilig.proompteng.ai/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.