Koskamo

Zovo JSON to Spreadsheet MCP

This MCP server converts JSON data into Excel workbooks and CSV files. It handles nested keys as dotted columns, joins lists of plain values, and places lists of objects into linked sheets. It ensures data integrity by reading back files before download and preserves long numbers as text to prevent precision loss.

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.

Zovo JSON to Spreadsheet MCP logo, by ZovoCommunity listingStreamable HTTPNo sign-inEndpoint checked 2026-11-08Published by Zovo
MCP endpoint (Streamable HTTP)
https://json-to-excel.zovo.one/mcp
Vendor documentation

What its tools do

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

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

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Convert JSON array of orders to Excel
  • Turn attached API response into a spreadsheet
  • Inspect JSON keys and nesting before conversion

Source and maintenance

Community listingRegistry 1.0.0

Protocol and capabilities

Server
json-to-excel 1.0.0
MCP protocol negotiated in check
2025-11-25
Tools
2 advertised
Resources
1 advertised
Resource templates
1 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Zovo JSON to Spreadsheet turns one JSON document (a list of records, a single object, column lists or records keyed by id, nested or flat) into an Excel .xlsx workbook and a CSV. json_to_excel makes the files; inspect_json reports the structure (record count, key paths with types and fill rate, nesting depth, lists) without making a file. Nested keys become dotted columns such as address.city; lists of plain values are joined with "; "; lists of objects go to linked sheets. Numbers with more than 15 significant digits are kept as text so no digit is lost. Before the links are given, both files are read back and each cell is compared with the JSON. Files are processed in memory; the outputs are kept for 1 hour, then deleted.

Tools

2 advertised

json_to_excel — JSON to Excel
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user wants to convert JSON to Excel or CSV, turn an API response or a JSON export into a spreadsheet, or flatten nested JSON into columns. Takes one attached .json file or pasted json_text, an optional records_path (e.g. data.items) and orient (records, columns, index), and how to handle lists (scalar_arrays join or rows, object_arrays sheet or json). Returns an .xlsx and a .csv download (a ZIP of CSVs when there are linked sheets), the rows, columns and cells written, the numbers kept as text, formula-like text, and a check that each cell was read back from both files. Does not accept JSON with comments, trailing commas or JSON Lines, and does not turn date text into Excel dates. Do not use for Excel to JSON or for editing a JSON file.

json_to_excel input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "ChatGPT file id, e.g. file_abc123."
        },
        "file_name": {
          "type": "string",
          "description": "Original file name if known, e.g. statement.pdf."
        },
        "mime_type": {
          "type": "string",
          "description": "Media type if known, e.g. application/pdf."
        },
        "download_url": {
          "type": "string",
          "description": "Temporary download link for the file, supplied by ChatGPT."
        }
      },
      "description": "The JSON file to convert, e.g. orders.json (UTF-8, or UTF-16 with a byte order mark), up to 5 MB."
    },
    "orient": {
      "enum": [
        "records",
        "columns",
        "index"
      ],
      "type": "string",
      "description": "How records are laid out, e.g. records. records (default): a list of objects, one row each (a single object is one row). columns: an object of equal-length lists, {\"name\":[\"Ann\",\"Bo\"],\"age\":[31,40]}. index: an object of objects keyed by id, {\"u1\":{...},\"u2\":{...}}; the key goes in column _key."
    },
    "csv_bom": {
      "type": "boolean",
      "description": "true (default): the CSV starts with a UTF-8 byte order mark so Excel shows accents correctly. false: plain UTF-8."
    },
    "json_text": {
      "type": "string",
      "maxLength": 1000000,
      "description": "Instead of a file: the JSON itself, e.g. [{\"name\":\"Ann\",\"age\":31},{\"name\":\"Bo\",\"age\":40}]. Use either file or json_text."
    },
    "records_path": {
      "type": "string",
      "maxLength": 300,
      "description": "Dotted key path to the part that holds the records, e.g. \"data.items\" for {\"data\":{\"items\":[...]}}. Use a number for a list item, e.g. \"results.0.rows\". Default: the whole document."
    },
    "object_arrays": {
      "enum": [
        "sheet",
        "json"
      ],
      "type": "string",
      "description": "Lists that hold objects, such as order lines, e.g. sheet. sheet (default): a linked sheet with one row per item, linked by _parent_row. json: the list as compact JSON text in one cell."
    },
    "scalar_arrays": {
      "enum": [
        "join",
        "rows"
      ],
      "type": "string",
      "description": "Lists of plain values such as [\"red\",\"blue\"], e.g. join. join (default): one cell, values joined with \"; \". rows: one row per value in a linked sheet."
    }
  }
}
json_to_excel output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "source",
    "records_from",
    "records",
    "sheets",
    "cells",
    "columns",
    "preview",
    "numbers_as_text",
    "formula_like_text",
    "cut_cells",
    "removed_control_characters",
    "joined_cells",
    "json_cells",
    "duplicate_keys",
    "values_outside_records",
    "check",
    "notes",
    "output_name",
    "csv_name",
    "expires_in_hours",
    "downloads"
  ],
  "properties": {
    "cells": {
      "type": "object",
      "required": [
        "grid",
        "filled"
      ],
      "properties": {
        "grid": {
          "type": "number"
        },
        "filled": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "check": {
      "type": "object",
      "required": [
        "passed",
        "xlsx_cells_found",
        "xlsx_cells_expected",
        "csv_cells_found",
        "csv_cells_expected",
        "json_values",
        "values_placed",
        "what"
      ],
      "properties": {
        "what": {
          "type": "string"
        },
        "passed": {
          "type": "boolean"
        },
        "json_values": {
          "type": "number"
        },
        "values_placed": {
          "type": "number"
        },
        "csv_cells_found": {
          "type": "number"
        },
        "xlsx_cells_found": {
          "type": "number"
        },
        "csv_cells_expected": {
          "type": "number"
        },
        "xlsx_cells_expected": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "sheets": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "name",
          "rows",
          "columns"
        ],
        "properties": {
          "name": {
            "type": "string"
          },
          "rows": {
            "type": "number"
          },
          "columns": {
            "type": "number"
          },
          "parent_sheet": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "additionalProperties": false
      }
    },
    "source": {
      "type": "string"
    },
    "columns": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "preview": {
      "type": "array",
      "items": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    },
    "records": {
      "type": "number"
    },
    "csv_name": {
      "type": "string"
    },
    "csv_files": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "cut_cells": {
      "type": "object",
      "required": [
        "count",
        "cells"
      ],
      "properties": {
        "cells": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "count": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "downloads": {
      "type": "object",
      "required": [
        "xlsx",
        "csv"
      ],
      "properties": {
        "csv": {
          "type": "string"
        },
        "xlsx": {
          "type": "string"
        }
      },
      "additionalProperties": false
    },
    "json_cells": {
      "type": "number"
    },
    "output_name": {
      "type": "string"
    },
    "joined_cells": {
      "type": "number"
    },
    "records_from": {
      "type": "string"
    },
    "sheets_count": {
      "type": "object",
      "required": [
        "shown",
        "total"
      ],
      "properties": {
        "shown": {
          "type": "number"
        },
        "total": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "columns_count": {
      "type": "object",
      "required": [
        "shown",
        "total"
      ],
      "properties": {
        "shown": {
          "type": "number"
        },
        "total": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "preview_count": {
      "type": "object",
      "required": [
        "shown",
        "total"
      ],
      "properties": {
        "shown": {
          "type": "number"
        },
        "total": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "duplicate_keys": {
      "type": "number"
    },
    "numbers_as_text": {
      "type": "object",
      "required": [
        "count",
        "cells"
      ],
      "properties": {
        "cells": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "sheet",
              "ref",
              "column",
              "value"
            ],
            "properties": {
              "ref": {
                "type": "string"
              },
              "sheet": {
                "type": "string"
              },
              "value": {
                "type": "string"
              },
              "column": {
                "type": "string"
              }
            },
            "additionalProperties": false
          }
        },
        "count": {
          "type": "number"
        },
        "ranges": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "ranges_total": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "expires_in_hours": {
      "type": "number"
    },
    "formula_like_text": {
      "type": "object",
      "required": [
        "count",
        "cells"
      ],
      "properties": {
        "cells": {
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "count": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "values_outside_records": {
      "type": "number"
    },
    "removed_control_characters": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
json_to_excel annotations
{
  "title": "JSON to Excel",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
inspect_json — Inspect JSON structure
Advertised by the server during the last successful anonymous check.
Advertised read-only

Use this when the user asks what a JSON file contains, which keys or nesting it has, how many records it holds, or why it does not parse, before converting it. Takes the same file or json_text, records_path and orient as json_to_excel and returns the record count, the key paths with their types and fill rate, nesting depth, the lists inside the records, duplicate keys, an estimate of sheets, columns and cells, and suggestions (for example a records_path). Invalid JSON is reported with its line and column. Does not make a file and does not change the JSON.

inspect_json input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "file": {
      "type": "object",
      "required": [
        "download_url",
        "file_id"
      ],
      "properties": {
        "file_id": {
          "type": "string",
          "description": "ChatGPT file id, e.g. file_abc123."
        },
        "file_name": {
          "type": "string",
          "description": "Original file name if known, e.g. statement.pdf."
        },
        "mime_type": {
          "type": "string",
          "description": "Media type if known, e.g. application/pdf."
        },
        "download_url": {
          "type": "string",
          "description": "Temporary download link for the file, supplied by ChatGPT."
        }
      },
      "description": "The JSON file to convert, e.g. orders.json (UTF-8, or UTF-16 with a byte order mark), up to 5 MB."
    },
    "orient": {
      "enum": [
        "records",
        "columns",
        "index"
      ],
      "type": "string",
      "description": "How records are laid out, e.g. records. records (default): a list of objects, one row each (a single object is one row). columns: an object of equal-length lists, {\"name\":[\"Ann\",\"Bo\"],\"age\":[31,40]}. index: an object of objects keyed by id, {\"u1\":{...},\"u2\":{...}}; the key goes in column _key."
    },
    "json_text": {
      "type": "string",
      "maxLength": 1000000,
      "description": "Instead of a file: the JSON itself, e.g. [{\"name\":\"Ann\",\"age\":31},{\"name\":\"Bo\",\"age\":40}]. Use either file or json_text."
    },
    "records_path": {
      "type": "string",
      "maxLength": 300,
      "description": "Dotted key path to the part that holds the records, e.g. \"data.items\" for {\"data\":{\"items\":[...]}}. Use a number for a list item, e.g. \"results.0.rows\". Default: the whole document."
    }
  }
}
inspect_json output schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "source",
    "records_from",
    "shape",
    "records",
    "depth",
    "json_values",
    "paths",
    "paths_total",
    "lists",
    "estimate",
    "duplicate_keys",
    "suggestions",
    "notes"
  ],
  "properties": {
    "depth": {
      "type": "number"
    },
    "lists": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path",
          "kind",
          "lists",
          "items",
          "longest"
        ],
        "properties": {
          "kind": {
            "type": "string"
          },
          "path": {
            "type": "string"
          },
          "items": {
            "type": "number"
          },
          "lists": {
            "type": "number"
          },
          "longest": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "notes": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "paths": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "path",
          "types",
          "filled",
          "of"
        ],
        "properties": {
          "of": {
            "type": "number"
          },
          "path": {
            "type": "string"
          },
          "types": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "filled": {
            "type": "number"
          }
        },
        "additionalProperties": false
      }
    },
    "shape": {
      "type": "string"
    },
    "source": {
      "type": "string"
    },
    "records": {
      "type": "number"
    },
    "estimate": {
      "type": "object",
      "required": [
        "fits",
        "sheets",
        "columns",
        "grid_cells",
        "numbers_as_text",
        "reason"
      ],
      "properties": {
        "fits": {
          "type": "boolean"
        },
        "reason": {
          "type": "string"
        },
        "sheets": {
          "type": "number"
        },
        "columns": {
          "type": "number"
        },
        "grid_cells": {
          "type": "number"
        },
        "numbers_as_text": {
          "type": "number"
        }
      },
      "additionalProperties": false
    },
    "json_values": {
      "type": "number"
    },
    "paths_total": {
      "type": "number"
    },
    "suggestions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "records_from": {
      "type": "string"
    },
    "duplicate_keys": {
      "type": "number"
    }
  },
  "additionalProperties": false
}
inspect_json annotations
{
  "title": "Inspect JSON structure",
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

json-to-excel-widget — Zovo JSON to Spreadsheet view

Advertised by the server during the last successful anonymous check.

Interactive view for Zovo JSON to Spreadsheet.

json-to-excel-widget URI
ui://widget/json-to-excel-v1-1.0.0-0893318785295a3d9b28305c1e5b7921e25c619b24fdf717eb6434330205e1bd.html

MIME type: text/html;profile=mcp-app

json-to-excel-widget-legacy — Zovo JSON to Spreadsheet view (previous versions)

Advertised by the server during the last successful anonymous check.

json-to-excel-widget-legacy URI template
ui://widget/json-to-excel-{version}.html

MIME type: text/html;profile=mcp-app

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
949 ms
95th percentile latency
949 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 949 ms · metadata changed · 2 tool(s), 1 resource(s), 1 resource template(s)

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 zovo-json-to-spreadsheet-mcp https://json-to-excel.zovo.one/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 zovo-json-to-spreadsheet-mcp --url https://json-to-excel.zovo.one/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable zovo-json-to-spreadsheet-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "zovo-json-to-spreadsheet-mcp": {
      "url": "https://json-to-excel.zovo.one/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "zovo-json-to-spreadsheet-mcp": {
      "type": "streamableHttp",
      "url": "https://json-to-excel.zovo.one/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start zovo-json-to-spreadsheet-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "zovo-json-to-spreadsheet-mcp": {
      "type": "http",
      "url": "https://json-to-excel.zovo.one/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 zovo-json-to-spreadsheet-mcp https://json-to-excel.zovo.one/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://json-to-excel.zovo.one/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": {
    "zovo-json-to-spreadsheet-mcp": {
      "serverUrl": "https://json-to-excel.zovo.one/mcp"
    }
  }
}

Let your agent find its tools

Find servers like Zovo JSON to Spreadsheet MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.