Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

GridPath

NPM · GRIDPATH

Edit real .xlsx files with your agent: live formulas, and you review every change before it saves.

Available components

63 Trust /100

Last scanned (9 hours ago)

Scores higher than 37% of npm servers

Category Data and Analytics

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security98
  • No malware found by supply-chain analysis.Pass
  • No known CVEs affecting this package version or its production dependencies.Pass
  • No install/post-install scripts declared.Pass
  • 31 of 93 dependencies flagged as unhealthy. View diagnostics → Partial
Provenance & Transparency32
Schema Quality & AI Usability58
  • AI-judged instruction clarity (good).Pass
  • Context-footprint check failed: tool/resource definitions use about 5408 tokens (~169/item across 32 items; 32 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
  • Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management0
  • Stability not yet verified: not enough scan history yet (needs a 30-day window).Unverified
Tool Coverage89
  • 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
  • 68% of tool parameters carry a description.Partial
Tool Safety100
  • No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
  • All 8 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation.Pass
  • An AI judge read all 33 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
  • Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

Changelog

Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.

  • 14 Oct 26 +27
    • Injection markers: unverified → pass ▲ security
    • First check of Judged manipulation: pass security
    • Stability: Stability not yet verified: not enough scan history yet (needs a 30-day window). security
    • Tool coverage: unverified → 100 ▲ functional
    • MCP protocol: unverified → pass ▲ functional
    • First check of Schema quality: fail functional
    • First check of Schema quality: fail functional
    • First check of Destructive annotations: 100 functional
    • First check of Tool coverage: 68 functional
    • First check of Schema quality: good functional
  • 12 Oct 26 36

    First indexed and scored.

Diagnostics

Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.

Captured 18 Oct 2026 · Analysed npm/gridpath@0.1.9

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem npm

Background: How many MCP packages publish verified provenance →

Dependencies 93 packages
Packages resolved 93
Stale 31
Tree resolution Complete

Background: SBOMs and build attestations, explained →

MCP tools · 32 exposed · ~5,209 tokens

The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →

Tool Tokens
clear_range ~106

Empty the values AND formulas of cells in `range`. Use this when you want to delete content (not just overwrite with new values). `range` is an A1 range like "A1", "A1:F1", or "B2:D10". Cell formatting is preserved.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rangestringyes–
sheetstringyes–

No output schema declared.

No examples provided.

copy_range ~370

Copy a rectangular range to another location with Excel copy/paste semantics, executed against the LIVE grid: relative formula references shift by the paste offset exactly like Excel ($ anchors are respected — `$B$5` stays put, `B5` shifts), and cell formatting (number format, font, fill, alignment) travels with the cells. STRONGLY PREFER this over reading a range and re-typing shifted formulas yourself — it cannot make off-by-one mistakes and costs a fraction of the tokens. Ideal for: extending a projection by one more period (copy the last full year column block to the next column), duplicating a section as a template, or seeding a new sheet from an existing block. Blank source cells leave the destination untouched (they do NOT clear it). Result reports the evaluated destination values so you can verify. Limited to 5000 cells per call.

NameTypeReqDescription
deststringyesA1 address of the destination TOP-LEFT cell, e.g. "BU5". The copy lands in a rectangle of the same size starting here.
dest_sheetstring|null–Destination sheet if different from `sheet`. Formula references shift the same way; sheet-qualified refs keep pointing at their original sheets.
modestring–"all" (default): shifted formulas + values + formats. "values": paste evaluated values only — use to freeze a calculation as hardcodes. "formats": formatting only, contents untouched.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyesSource sheet name (case-sensitive).
sourcestringyesA1 range to copy, e.g. "BT5:BT120" or a single cell "C7".

No output schema declared.

No examples provided.

create_sheet ~164

Create a new sheet (worksheet tab) in the workbook. Use a clear human-readable name like "Assumptions", "Q4 2024", "Inputs". The new sheet starts empty — write cells with set_cell / set_range afterwards. NOTE: writes to a not-yet-existing sheet name auto-create it, so an explicit create_sheet is only needed when you want to set a tab_color or create an empty tab ahead of time.

NameTypeReqDescription
namestringyesSheet name (must be unique in the workbook).
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
tab_colorstring|null–Optional CSS color for the tab, e.g. "#22c55e".

No output schema declared.

No examples provided.

define_name ~261

Create (or replace) a workbook-scoped named range so formulas can reference a cell/range by a readable name instead of a raw address — e.g. name `GrowthRate` for the assumption cell, then write `=Revenue*(1+GrowthRate)`. The name persists in the saved .xlsx. `name` must be a valid Excel name (letters, digits, underscores; can't look like a cell reference such as "A1"). `ref` must be sheet-qualified, e.g. "Model!B22" or "Model!B5:B12" (absolute `$` signs optional — they're added automatically). Calling again with the same `name` replaces its target.

NameTypeReqDescription
namestringyesDefined name, e.g. "GrowthRate" or "Revenue". Must not look like a cell address.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
refstringyesSheet-qualified target, e.g. "Model!B22" or "Assumptions!B5:B12".
sheetstring–Optional. Only needed if `ref` is a bare range without a sheet prefix; supplies the sheet for it.

No output schema declared.

No examples provided.

delete_columns ~82

Delete `count` columns starting at column `start` (column letter like "C"). Content to the right shifts left. Permanent.

NameTypeReqDescription
countinteger––
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–
startstringyes–

No output schema declared.

No examples provided.

delete_note ~78

Remove a cell's note, if it has one. No-op if the cell has no note.

NameTypeReqDescription
cellstringyesA1 address, e.g. "B7".
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

delete_rows ~84

Delete `count` rows starting at row `start` (1-indexed). Content below shifts up. Permanent — the removed rows are gone.

NameTypeReqDescription
countinteger––
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–
startintegeryes–

No output schema declared.

No examples provided.

delete_sheet ~69

Remove a sheet from the workbook. Permanent — every cell on this sheet is lost. Cross-sheet references in other sheets will become #REF!.

NameTypeReqDescription
namestringyes–
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).

No output schema declared.

No examples provided.

describe_workbook ~187

Get a structural map of the ACTIVE workbook without reading cell data. Per sheet: the used range, the detected header row with its period/column headers mapped to column letters (e.g. {"BU": "FY2026E"}), and a table of contents of sections — contiguous row bands with their titles, like {"rows": "5-42", "title": "Revenue build"}. Also lists workbook defined names. Served from an in-memory index, so it's near-instant and returns in ONE call what would take many read_range probes. Call it once to orient on any sheet whose preview is truncated. Optional `sheet` filters to a single sheet.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstring–Optional: limit the map to this sheet (case-sensitive).

No output schema declared.

No examples provided.

find_rows ~230

Search the ACTIVE workbook's row labels and column headers by name and get exact positions back — e.g. query "total revenue" returns each matching row's sheet, 1-indexed row number, containing section, and one evaluated sample cell ("BT209 = =BT194 → 39001.1") read live from the grid. Matching is case-insensitive substring plus word-prefix ("tot rev" matches "Total revenue"). Near-instant. Use this — NOT exploratory read_range probes — whenever you need to LOCATE a row or header ("where is Subscriber ARPU?", "which column is FY2027E?"); then read_range the exact range you need. Searches only the active workbook, not reference workbooks.

NameTypeReqDescription
max_resultsinteger–Max matches to return (default 20).
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
querystringyesLabel text to find, e.g. "total revenue".
sheetstring–Optional: search only this sheet (case-sensitive).

No output schema declared.

No examples provided.

freeze_panes ~128

Freeze the top `rows` rows and left `cols` columns of a sheet so they stay visible while scrolling. Classic financial-model setup is `freeze_rows: 1, freeze_cols: 1` (lock the header row and label column). Pass 0 to disable that axis.

NameTypeReqDescription
freeze_colsintegeryesNumber of left columns to freeze.
freeze_rowsintegeryesNumber of top rows to freeze.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

hide_columns ~83

Hide one or more columns. `columns` is a comma-separated list of column letters (e.g. "D" or "D,F,H").

NameTypeReqDescription
columnsstringyesComma-separated column letters.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

hide_rows ~105

Hide one or more rows. `rows` is a comma-separated list of 1-indexed row numbers (e.g. "3" or "3,5,12"). Hidden rows still hold data but don't display in the workbook.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rowsstringyesComma-separated 1-indexed row numbers.
sheetstringyes–

No output schema declared.

No examples provided.

insert_columns ~96

Insert `count` empty columns starting at (and shifting right from) column `before` (column letter like "C"). Existing content shifts right.

NameTypeReqDescription
beforestringyesColumn letter to insert before, e.g. "C".
countinteger––
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

insert_rows ~135

Insert `count` empty rows starting at (and shifting down from) row `before` (1-indexed Excel row number). Existing content at row `before` and below shifts down. Use this to make space in the middle of a model. Charts and conditional-formatting references in unrelated areas of the workbook may not auto-adjust to the new layout.

NameTypeReqDescription
beforeintegeryes1-indexed row number to insert before.
countinteger––
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

list_batches ~55

List this workbook's pending (unsaved) change batches with their mutation counts, and the review link.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).

No output schema declared.

No examples provided.

merge_cells ~80

Merge a rectangular range into a single visible cell (e.g. for section headers). `range` is an A1 range like "A1:F1".

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rangestringyes–
sheetstringyes–

No output schema declared.

No examples provided.

read_range ~216

Read evaluated cell values from a specific A1 range WITHOUT modifying anything. Use this to verify your own work, confirm where the assumption block actually landed before composing dependent formulas, or pull current values you need to reference. Returns each non-empty cell's value AND formula (if any) in `A1 = value` form. Costs one tool turn but is the cheapest way to prevent the formula-pointing-at-wrong-row class of bug on long sheets. Range limited to 500 cells per call. To LOCATE a row/section/header by NAME, don't probe with this — use `find_rows` or `describe_workbook` first, then read the exact range.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rangestringyesA1 range, e.g. "G45:K45", "A1:Z10", or a single cell "B7".
sheetstringyesSheet name (case-sensitive).

No output schema declared.

No examples provided.

reject_batch ~68

Drop one pending batch. The remaining batches are replayed onto a fresh model, so later edits that depended on it may change.

NameTypeReqDescription
batch_idstringyes–
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).

No output schema declared.

No examples provided.

rename_sheet ~70

Rename a sheet. Cross-sheet formula references in other sheets will be updated automatically by the workbook engine.

NameTypeReqDescription
new_namestringyes–
old_namestringyes–
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).

No output schema declared.

No examples provided.

run_script ~698

Execute a short JavaScript program against the workbook and land ALL its writes as one reviewable batch. STRONGLY PREFER this over long set_range payloads or many tool turns whenever the edit is loop-shaped: per-row conditional transforms ("for every row where margin < 0 …"), repeating formula patterns across many rows/columns, address arithmetic, or edits that depend on reading existing cells first. One run_script call replaces dozens of tool turns and cannot drift out of alignment mid-payload, because it computes addresses programmatically. API (plain synchronous JavaScript, strict mode — no async/await, no imports, no network, no DOM): sheets() -> array of sheet names sheet(name) -> handle for one sheet (name must match exactly; the name arg may be omitted ONLY if the workbook has a single sheet). Handle methods: .get("B7") -> {value, formula} — evaluated value as of BEFORE this script, overlaid with your own literal writes .values("A2:C50") -> 2D array of values (rows × cols) .set("B7", x) — write a value; strings starting with '=' are formulas; null clears the cell's content .setValues("A9", [[...],[...]]) — bulk write with set_range semantics: null / "" preserve the existing cell .format("A1:F1", {bold: true, number_format: "0.0%", background_color: "#1F4E79", font_color: "#FFFFFF"}) — same keys as set_format .clear("B2:D10") — empty values + formulas, formatting preserved .usedRange() -> "A1:Q48" or null log(...) — up to 100 entries, returned to you in the result as `script_logs` for debugging Rules: formulas you write are NOT evaluated during the script — .get on a cell you just wrote a formula into returns {value: null, formula}; the automatic readback after the script (cells + row_map) carries the evaluated results, so verify there. Follow the same conventions as set_range: write raw numbers (never pre-formatted strings), write formulas for derived values, compose against row_map. Limits: 5-second CPU cap, 20,000 touche…

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
scriptstringyesJavaScript source, executed as a function body. Example: const s = sheet("Model"); const rows = s.values("A2:C50"); rows.forEach((r, i) => { if (r[2] !== null && r[2] < 0) s.set("D" + (i + 2), "=C" +…

No output schema declared.

No examples provided.

save_workbook ~131

Write every pending batch into the .xlsx on disk through the surgical patcher: only the parts an edit touched are rewritten, everything else stays byte-identical. This is the ONLY tool that modifies the file. When the server runs with --review-required, this returns the review link instead and the user saves from there.

NameTypeReqDescription
asstring–Optional: write the result to this path instead (a copy), leaving the original untouched. Pending batches stay pending against the original.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).

No output schema declared.

No examples provided.

set_cell ~196

Set the value or formula of a single cell. `cell` is an Excel A1-style address (case-insensitive, e.g. "A1", "B17", "AA42"). For formulas, pass them in `formula` starting with '=' (e.g. "=SUM(A1:A10)") — do NOT put formulas in `value`.

NameTypeReqDescription
cellstringyesA1 address. Examples: "A1", "B17", "AA42".
formulastring|null–Excel-style formula starting with '='. References inside use A1 notation. Example: "=SUM(A1:A10)".
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyesSheet name (case-sensitive).
value––Literal value (string, number, boolean, or null). Leave null when using `formula`.

No output schema declared.

No examples provided.

set_column_width ~182

Set the pixel width of one or more columns. **Always prefer the bulk `operations` form when you need multiple widths** (e.g. label column A wide, data columns narrower) — one call instead of N. The flat single-width form is kept for trivial cases. Default Excel column is ~64px; a wide column for labels is typically 180–220.

NameTypeReqDescription
columnsstring–Single-op form (omit `operations`). Comma-separated column letters.
operationsarray–Bulk form. Each entry sets a width on a group of columns. Use this when you need different widths for different column groups.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–
widthnumber–Single-op form pixel width.

No output schema declared.

No examples provided.

set_format ~379

Apply formatting to one OR MANY cell ranges in a single call. STRONGLY PREFER the bulk `operations` form when you have more than one format to apply — it's one tool call instead of N, dramatically faster. Each operation's `format` is a partial object; only specified properties are applied, others are left as-is. Use this for: bold headers, currency / percent / number formatting on data columns, italic notes, alignment, font color/size/family, **text wrap via `wrap_text`** (long methodology notes / descriptions in a fixed-width column — wrap beats restructuring the layout around overflow), and **cell fill via `background_color`** (e.g. dark-blue header bars, yellow assumption highlights — see the financial-model color conventions). v1 limitation: cell borders are not yet supported. Two equivalent shapes: • Single range: { sheet, range, format } • Bulk: { sheet, operations: [ { range, format }, ... ] }

NameTypeReqDescription
formatobject–Partial format (only when using single-range form).
operationsarray–Bulk form — array of {range, format} pairs. Use this whenever you have ≥2 formats to apply. Example: [{"range":"A1","format":{"bold":true,"font_size":16}},{"range":"B8:F8","format":{"number_format":"…
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rangestring–A1 range (only when using single-range form). Examples: "A1", "B2:B10", "A1:F1".
sheetstringyes–

No output schema declared.

No examples provided.

set_note ~121

Attach a note (Excel-style cell comment) to a single cell — a small indicator that shows the given text on hover. Use this for methodology callouts, source citations, or caveats that would clutter the cell's own value. Overwrites any existing note on that cell.

NameTypeReqDescription
cellstringyesA1 address, e.g. "B7".
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–
textstringyes–

No output schema declared.

No examples provided.

set_range ~441

Set a rectangular block of values starting at `top_left` (A1 address). `values` is a 2D array — outer rows, inner cells. Strings starting with '=' inside `values` are treated as formulas; formula references must use A1 notation pointing at the FINAL placement of cells (e.g. if `top_left` is "A9" and the value at row index 2 / col 0 should reference the data row just above your block at A8, write "=A8" — not "=A1" or "=A11"). **Off-by-one guard: if formulas will reference rows created by THIS call, split the work — write labels + hardcoded values first, read the `row_map` in this call's result, then write formulas in a second set_range against those verified row numbers.** Composing formulas in the same call that lays out their target rows is the top source of off-by-one references. Use this for bulk writes; prefer it over many set_cell calls. **`null` and empty string `""` inside `values` are treated as PRESERVE — the cell is left untouched, NOT cleared.** This means you can ship `[["Gross Profit", "", "", ""]]` to set only the label in column A without wiping the data in B–D. To actually clear cells, use `clear_range`. **Writing to a sheet name that doesn't exist CREATES that sheet automatically** (near-miss spellings of an existing sheet are rejected as probable typos) — so organize multi-section builds across purposefully named sheets (e.g. Data / Assumptions / Model / Notes) instead of piling everything onto one long sheet; a new tab costs nothing.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–
top_leftstringyesA1 address of the top-left cell, e.g. "A9".
valuesarrayyes2D array — outer = rows, inner = cells. Strings beginning with '=' are formulas.

No output schema declared.

No examples provided.

set_row_height ~159

Set the pixel height of one or more rows. **Always prefer the bulk `operations` form when you need multiple heights** (e.g. title row tall, body rows short) — one call instead of N. The flat single-height form is kept for trivial cases. Default row is ~24.

NameTypeReqDescription
heightnumber–Single-op form pixel height.
operationsarray–Bulk form. Each entry sets a height on a group of rows.
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rowsstring–Single-op form (omit `operations`). Comma-separated 1-indexed row numbers.
sheetstringyes–

No output schema declared.

No examples provided.

show_columns ~64

Unhide one or more columns. Same `columns` format as hide_columns.

NameTypeReqDescription
columnsstringyes–
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

show_rows ~64

Unhide one or more rows. Same `rows` format as hide_rows.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rowsstringyes–
sheetstringyes–

No output schema declared.

No examples provided.

unfreeze_panes ~51

Remove any freeze panes from a sheet.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
sheetstringyes–

No output schema declared.

No examples provided.

unmerge_cells ~56

Unmerge a previously merged range.

NameTypeReqDescription
pathstringyesPath of the .xlsx to operate on (absolute, or ~/… for the user's home directory).
rangestringyes–
sheetstringyes–

No output schema declared.

No examples provided.

Install

How do I install the GridPath MCP server?

GridPath runs locally as an npm package, launched with npx -y gridpath. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

npm · gridpath

# add to Claude Code
claude mcp add pixelsmasher13-gridpath -- npx -y gridpath
Common questions

What is the GridPath MCP server?

GridPath is an MCP server listed in the public MCP registry as io.github.pixelsmasher13/gridpath. Edit real .xlsx files with your agent: live formulas, and you review every change before it saves. This page covers its npm package (gridpath).

Is the GridPath MCP server safe to use?

GridPath scores 63 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 18 October 2026. It declares no install or post-install scripts. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

What tools does the GridPath MCP server expose?

GridPath exposes 32 tools: set_cell, set_range, copy_range, run_script, set_format, and 27 more. Their descriptions and schemas cost roughly 5,209 tokens of context every time the server is loaded.

Is the GridPath MCP server still maintained?

GridPath is still listed as active in the MCP registry. We last reached this channel on 18 October 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

What licence is the GridPath MCP server under?

GridPath declares the FSL-1.1-Apache-2.0 licence, which is not on the OSI-approved list. Read the terms before using it at work, and note this covers the source only, not the cost of any service it calls.