@rog0x/mcp-json-tools 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/README.md +111 -0
  2. package/dist/index.d.ts +3 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +30 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/tools/csv-to-json.d.ts +3 -0
  7. package/dist/tools/csv-to-json.d.ts.map +1 -0
  8. package/dist/tools/csv-to-json.js +69 -0
  9. package/dist/tools/csv-to-json.js.map +1 -0
  10. package/dist/tools/json-diff.d.ts +3 -0
  11. package/dist/tools/json-diff.d.ts.map +1 -0
  12. package/dist/tools/json-diff.js +123 -0
  13. package/dist/tools/json-diff.js.map +1 -0
  14. package/dist/tools/json-to-csv.d.ts +3 -0
  15. package/dist/tools/json-to-csv.d.ts.map +1 -0
  16. package/dist/tools/json-to-csv.js +97 -0
  17. package/dist/tools/json-to-csv.js.map +1 -0
  18. package/dist/tools/json-transform.d.ts +3 -0
  19. package/dist/tools/json-transform.d.ts.map +1 -0
  20. package/dist/tools/json-transform.js +176 -0
  21. package/dist/tools/json-transform.js.map +1 -0
  22. package/dist/tools/json-validator.d.ts +3 -0
  23. package/dist/tools/json-validator.d.ts.map +1 -0
  24. package/dist/tools/json-validator.js +68 -0
  25. package/dist/tools/json-validator.js.map +1 -0
  26. package/dist/tools/yaml-json.d.ts +3 -0
  27. package/dist/tools/yaml-json.d.ts.map +1 -0
  28. package/dist/tools/yaml-json.js +75 -0
  29. package/dist/tools/yaml-json.js.map +1 -0
  30. package/package.json +35 -0
  31. package/src/index.ts +32 -0
  32. package/src/tools/csv-to-json.ts +74 -0
  33. package/src/tools/json-diff.ts +151 -0
  34. package/src/tools/json-to-csv.ts +116 -0
  35. package/src/tools/json-transform.ts +223 -0
  36. package/src/tools/json-validator.ts +91 -0
  37. package/src/tools/yaml-json.ts +83 -0
  38. package/tsconfig.json +19 -0
package/README.md ADDED
@@ -0,0 +1,111 @@
1
+ # mcp-json-tools
2
+
3
+ An MCP (Model Context Protocol) server that provides JSON and data manipulation tools for AI agents. Designed for use with Claude Code, Claude Desktop, and any MCP-compatible client.
4
+
5
+ ## Tools
6
+
7
+ | Tool | Description |
8
+ |------|-------------|
9
+ | `json_validate` | Validate JSON data against a JSON Schema, returning detailed errors with paths |
10
+ | `json_diff` | Compare two JSON objects, showing additions, removals, and changes with paths |
11
+ | `json_transform` | Transform JSON with pick, rename, flatten, and unflatten operations |
12
+ | `csv_to_json` | Convert CSV text to a JSON array with configurable headers, delimiters, and type casting |
13
+ | `json_to_csv` | Convert a JSON array of objects to CSV text |
14
+ | `yaml_to_json` | Convert YAML text to JSON |
15
+ | `json_to_yaml` | Convert JSON text to YAML |
16
+
17
+ ## Installation
18
+
19
+ ```bash
20
+ npm install
21
+ npm run build
22
+ ```
23
+
24
+ ## Usage with Claude Code
25
+
26
+ ```bash
27
+ claude mcp add json-tools -- node D:/products/mcp-servers/mcp-json-tools/dist/index.js
28
+ ```
29
+
30
+ ## Usage with Claude Desktop
31
+
32
+ Add the following to your Claude Desktop configuration file:
33
+
34
+ **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
35
+ **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
36
+
37
+ ```json
38
+ {
39
+ "mcpServers": {
40
+ "json-tools": {
41
+ "command": "node",
42
+ "args": ["D:/products/mcp-servers/mcp-json-tools/dist/index.js"]
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ ## Tool Details
49
+
50
+ ### json_validate
51
+
52
+ Validate JSON data against a JSON Schema. Returns a `valid` boolean and an array of errors, each with the field path, message, and schema keyword that failed.
53
+
54
+ **Parameters:**
55
+ - `data` (string) — JSON data to validate
56
+ - `schema` (string) — JSON Schema to validate against
57
+
58
+ ### json_diff
59
+
60
+ Compare two JSON objects and produce a structured diff. Each difference includes the dot-notation path, the type of change (added, removed, or changed), and the old/new values.
61
+
62
+ **Parameters:**
63
+ - `original` (string) — Original JSON object
64
+ - `modified` (string) — Modified JSON object
65
+
66
+ ### json_transform
67
+
68
+ Apply transformations to JSON data. Supports four operations:
69
+
70
+ - **pick** — Extract specific fields by dot-notation paths
71
+ - **rename** — Rename top-level keys using a mapping object
72
+ - **flatten** — Flatten nested objects into dot-separated keys
73
+ - **unflatten** — Restore dot-separated keys into nested objects
74
+
75
+ **Parameters:**
76
+ - `data` (string) — JSON data to transform
77
+ - `operation` (string) — One of: pick, rename, flatten, unflatten
78
+ - `fields` (string[]) — For pick: field paths to extract
79
+ - `mapping` (object) — For rename: old-to-new key mapping
80
+ - `separator` (string) — For flatten/unflatten: separator character (default: ".")
81
+
82
+ ### csv_to_json
83
+
84
+ Parse CSV text into a JSON array of objects.
85
+
86
+ **Parameters:**
87
+ - `csv` (string) — CSV text to convert
88
+ - `hasHeaders` (boolean) — Whether the first row is headers (default: true)
89
+ - `delimiter` (string) — Column delimiter (default: ",")
90
+ - `castTypes` (boolean) — Auto-cast numbers and booleans (default: false)
91
+
92
+ ### json_to_csv
93
+
94
+ Convert a JSON array of objects to CSV text. Headers are derived from the union of all object keys.
95
+
96
+ **Parameters:**
97
+ - `data` (string) — JSON array to convert
98
+ - `delimiter` (string) — Column delimiter (default: ",")
99
+ - `includeHeaders` (boolean) — Include header row (default: true)
100
+
101
+ ### yaml_to_json / json_to_yaml
102
+
103
+ Convert between YAML and JSON formats.
104
+
105
+ **Parameters:**
106
+ - `yamlText` / `jsonText` (string) — Text to convert
107
+ - `indent` (number) — Indentation spaces (default: 2)
108
+
109
+ ## License
110
+
111
+ MIT
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
5
+ const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
6
+ const json_validator_js_1 = require("./tools/json-validator.js");
7
+ const json_diff_js_1 = require("./tools/json-diff.js");
8
+ const json_transform_js_1 = require("./tools/json-transform.js");
9
+ const csv_to_json_js_1 = require("./tools/csv-to-json.js");
10
+ const json_to_csv_js_1 = require("./tools/json-to-csv.js");
11
+ const yaml_json_js_1 = require("./tools/yaml-json.js");
12
+ async function main() {
13
+ const server = new mcp_js_1.McpServer({
14
+ name: "mcp-json-tools",
15
+ version: "1.0.0",
16
+ });
17
+ (0, json_validator_js_1.registerJsonValidator)(server);
18
+ (0, json_diff_js_1.registerJsonDiff)(server);
19
+ (0, json_transform_js_1.registerJsonTransform)(server);
20
+ (0, csv_to_json_js_1.registerCsvToJson)(server);
21
+ (0, json_to_csv_js_1.registerJsonToCsv)(server);
22
+ (0, yaml_json_js_1.registerYamlJson)(server);
23
+ const transport = new stdio_js_1.StdioServerTransport();
24
+ await server.connect(transport);
25
+ }
26
+ main().catch((error) => {
27
+ console.error("Fatal error:", error);
28
+ process.exit(1);
29
+ });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAEA,oEAAoE;AACpE,wEAAiF;AACjF,iEAAkE;AAClE,uDAAwD;AACxD,iEAAkE;AAClE,2DAA2D;AAC3D,2DAA2D;AAC3D,uDAAwD;AAExD,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;QAC3B,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,OAAO;KACjB,CAAC,CAAC;IAEH,IAAA,yCAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,+BAAgB,EAAC,MAAM,CAAC,CAAC;IACzB,IAAA,yCAAqB,EAAC,MAAM,CAAC,CAAC;IAC9B,IAAA,kCAAiB,EAAC,MAAM,CAAC,CAAC;IAC1B,IAAA,kCAAiB,EAAC,MAAM,CAAC,CAAC;IAC1B,IAAA,+BAAgB,EAAC,MAAM,CAAC,CAAC;IAEzB,MAAM,SAAS,GAAG,IAAI,+BAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerCsvToJson(server: McpServer): void;
3
+ //# sourceMappingURL=csv-to-json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-to-json.d.ts","sourceRoot":"","sources":["../../src/tools/csv-to-json.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAIpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqEzD"}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerCsvToJson = registerCsvToJson;
4
+ const zod_1 = require("zod");
5
+ const sync_1 = require("csv-parse/sync");
6
+ function registerCsvToJson(server) {
7
+ server.tool("csv_to_json", "Convert CSV text to a JSON array of objects. Supports custom delimiters, header row detection, and automatic type casting.", {
8
+ csv: zod_1.z.string().describe("The CSV text to convert"),
9
+ hasHeaders: zod_1.z
10
+ .boolean()
11
+ .optional()
12
+ .describe("Whether the first row contains column headers (default: true)"),
13
+ delimiter: zod_1.z
14
+ .string()
15
+ .optional()
16
+ .describe("Column delimiter character (default: ','"),
17
+ castTypes: zod_1.z
18
+ .boolean()
19
+ .optional()
20
+ .describe("Automatically cast numeric and boolean values from strings (default: false)"),
21
+ }, async ({ csv, hasHeaders, delimiter, castTypes }) => {
22
+ try {
23
+ const useHeaders = hasHeaders !== false;
24
+ const delim = delimiter || ",";
25
+ const shouldCast = castTypes === true;
26
+ const records = (0, sync_1.parse)(csv, {
27
+ columns: useHeaders ? true : undefined,
28
+ delimiter: delim,
29
+ trim: true,
30
+ skip_empty_lines: true,
31
+ cast: shouldCast
32
+ ? (value) => {
33
+ if (value === "")
34
+ return value;
35
+ if (value.toLowerCase() === "true")
36
+ return true;
37
+ if (value.toLowerCase() === "false")
38
+ return false;
39
+ const num = Number(value);
40
+ if (!isNaN(num) && value.trim() !== "")
41
+ return num;
42
+ return value;
43
+ }
44
+ : undefined,
45
+ });
46
+ return {
47
+ content: [
48
+ {
49
+ type: "text",
50
+ text: JSON.stringify(records, null, 2),
51
+ },
52
+ ],
53
+ };
54
+ }
55
+ catch (error) {
56
+ const message = error instanceof Error ? error.message : String(error);
57
+ return {
58
+ content: [
59
+ {
60
+ type: "text",
61
+ text: `Error converting CSV to JSON: ${message}`,
62
+ },
63
+ ],
64
+ isError: true,
65
+ };
66
+ }
67
+ });
68
+ }
69
+ //# sourceMappingURL=csv-to-json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv-to-json.js","sourceRoot":"","sources":["../../src/tools/csv-to-json.ts"],"names":[],"mappings":";;AAIA,8CAqEC;AAxED,6BAAwB;AACxB,yCAAuC;AAEvC,SAAgB,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,4HAA4H,EAC5H;QACE,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;QACnD,UAAU,EAAE,OAAC;aACV,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,+DAA+D,CAChE;QACH,SAAS,EAAE,OAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,0CAA0C,CAAC;QACvD,SAAS,EAAE,OAAC;aACT,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CACP,6EAA6E,CAC9E;KACJ,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE;QAClD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,UAAU,KAAK,KAAK,CAAC;YACxC,MAAM,KAAK,GAAG,SAAS,IAAI,GAAG,CAAC;YAC/B,MAAM,UAAU,GAAG,SAAS,KAAK,IAAI,CAAC;YAEtC,MAAM,OAAO,GAAG,IAAA,YAAK,EAAC,GAAG,EAAE;gBACzB,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;gBACtC,SAAS,EAAE,KAAK;gBAChB,IAAI,EAAE,IAAI;gBACV,gBAAgB,EAAE,IAAI;gBACtB,IAAI,EAAE,UAAU;oBACd,CAAC,CAAC,CAAC,KAAa,EAAE,EAAE;wBAChB,IAAI,KAAK,KAAK,EAAE;4BAAE,OAAO,KAAK,CAAC;wBAC/B,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,MAAM;4BAAE,OAAO,IAAI,CAAC;wBAChD,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO;4BAAE,OAAO,KAAK,CAAC;wBAClD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;wBAC1B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE;4BAAE,OAAO,GAAG,CAAC;wBACnD,OAAO,KAAK,CAAC;oBACf,CAAC;oBACH,CAAC,CAAC,SAAS;aACd,CAAc,CAAC;YAEhB,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;qBACvC;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iCAAiC,OAAO,EAAE;qBACjD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerJsonDiff(server: McpServer): void;
3
+ //# sourceMappingURL=json-diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-diff.d.ts","sourceRoot":"","sources":["../../src/tools/json-diff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAoFpE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkExD"}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerJsonDiff = registerJsonDiff;
4
+ const zod_1 = require("zod");
5
+ const json_diff_1 = require("json-diff");
6
+ function flattenDiff(obj, basePath = "") {
7
+ const entries = [];
8
+ if (obj === undefined || obj === null) {
9
+ return entries;
10
+ }
11
+ if (typeof obj !== "object") {
12
+ return entries;
13
+ }
14
+ const record = obj;
15
+ for (const key of Object.keys(record)) {
16
+ const value = record[key];
17
+ if (key.endsWith("__added")) {
18
+ const cleanKey = key.replace(/__added$/, "");
19
+ const path = basePath ? `${basePath}.${cleanKey}` : cleanKey;
20
+ entries.push({ path, type: "added", newValue: value });
21
+ }
22
+ else if (key.endsWith("__deleted")) {
23
+ const cleanKey = key.replace(/__deleted$/, "");
24
+ const path = basePath ? `${basePath}.${cleanKey}` : cleanKey;
25
+ entries.push({ path, type: "removed", oldValue: value });
26
+ }
27
+ else if (typeof value === "object" &&
28
+ value !== null &&
29
+ "__old" in value &&
30
+ "__new" in value) {
31
+ const path = basePath ? `${basePath}.${key}` : key;
32
+ const typedValue = value;
33
+ entries.push({
34
+ path,
35
+ type: "changed",
36
+ oldValue: typedValue.__old,
37
+ newValue: typedValue.__new,
38
+ });
39
+ }
40
+ else if (Array.isArray(value)) {
41
+ const path = basePath ? `${basePath}.${key}` : key;
42
+ for (let i = 0; i < value.length; i++) {
43
+ const item = value[i];
44
+ if (Array.isArray(item) && item.length === 2) {
45
+ const marker = item[0];
46
+ if (marker === "+") {
47
+ entries.push({
48
+ path: `${path}[${i}]`,
49
+ type: "added",
50
+ newValue: item[1],
51
+ });
52
+ }
53
+ else if (marker === "-") {
54
+ entries.push({
55
+ path: `${path}[${i}]`,
56
+ type: "removed",
57
+ oldValue: item[1],
58
+ });
59
+ }
60
+ else if (marker === "~") {
61
+ entries.push(...flattenDiff(item[1], `${path}[${i}]`));
62
+ }
63
+ }
64
+ }
65
+ }
66
+ else if (typeof value === "object" && value !== null) {
67
+ const path = basePath ? `${basePath}.${key}` : key;
68
+ entries.push(...flattenDiff(value, path));
69
+ }
70
+ }
71
+ return entries;
72
+ }
73
+ function registerJsonDiff(server) {
74
+ server.tool("json_diff", "Compare two JSON objects and show additions, removals, and changes with their paths.", {
75
+ original: zod_1.z
76
+ .string()
77
+ .describe("The original JSON object (as a JSON string)"),
78
+ modified: zod_1.z
79
+ .string()
80
+ .describe("The modified JSON object (as a JSON string)"),
81
+ }, async ({ original, modified }) => {
82
+ try {
83
+ const obj1 = JSON.parse(original);
84
+ const obj2 = JSON.parse(modified);
85
+ const rawDiff = (0, json_diff_1.diff)(obj1, obj2);
86
+ if (!rawDiff) {
87
+ return {
88
+ content: [
89
+ {
90
+ type: "text",
91
+ text: JSON.stringify({ identical: true, differences: [] }, null, 2),
92
+ },
93
+ ],
94
+ };
95
+ }
96
+ const differences = flattenDiff(rawDiff);
97
+ return {
98
+ content: [
99
+ {
100
+ type: "text",
101
+ text: JSON.stringify({
102
+ identical: differences.length === 0,
103
+ differences,
104
+ }, null, 2),
105
+ },
106
+ ],
107
+ };
108
+ }
109
+ catch (error) {
110
+ const message = error instanceof Error ? error.message : String(error);
111
+ return {
112
+ content: [
113
+ {
114
+ type: "text",
115
+ text: `Error comparing JSON: ${message}`,
116
+ },
117
+ ],
118
+ isError: true,
119
+ };
120
+ }
121
+ });
122
+ }
123
+ //# sourceMappingURL=json-diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-diff.js","sourceRoot":"","sources":["../../src/tools/json-diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerJsonToCsv(server: McpServer): void;
3
+ //# sourceMappingURL=json-to-csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-to-csv.d.ts","sourceRoot":"","sources":["../../src/tools/json-to-csv.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAyBpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0FzD"}
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerJsonToCsv = registerJsonToCsv;
4
+ const zod_1 = require("zod");
5
+ function escapeCell(value, delimiter) {
6
+ if (value.includes(delimiter) ||
7
+ value.includes('"') ||
8
+ value.includes("\n") ||
9
+ value.includes("\r")) {
10
+ return `"${value.replace(/"/g, '""')}"`;
11
+ }
12
+ return value;
13
+ }
14
+ function toCsvValue(value) {
15
+ if (value === null || value === undefined) {
16
+ return "";
17
+ }
18
+ if (typeof value === "object") {
19
+ return JSON.stringify(value);
20
+ }
21
+ return String(value);
22
+ }
23
+ function registerJsonToCsv(server) {
24
+ server.tool("json_to_csv", "Convert a JSON array of objects to CSV text. Automatically extracts headers from object keys.", {
25
+ data: zod_1.z
26
+ .string()
27
+ .describe("The JSON array to convert (as a JSON string)"),
28
+ delimiter: zod_1.z
29
+ .string()
30
+ .optional()
31
+ .describe("Column delimiter character (default: ',')"),
32
+ includeHeaders: zod_1.z
33
+ .boolean()
34
+ .optional()
35
+ .describe("Whether to include a header row (default: true)"),
36
+ }, async ({ data, delimiter, includeHeaders }) => {
37
+ try {
38
+ const parsed = JSON.parse(data);
39
+ if (!Array.isArray(parsed)) {
40
+ throw new Error("Input must be a JSON array");
41
+ }
42
+ if (parsed.length === 0) {
43
+ return {
44
+ content: [
45
+ {
46
+ type: "text",
47
+ text: "",
48
+ },
49
+ ],
50
+ };
51
+ }
52
+ const delim = delimiter || ",";
53
+ const withHeaders = includeHeaders !== false;
54
+ const headerSet = new Set();
55
+ for (const row of parsed) {
56
+ if (typeof row === "object" && row !== null && !Array.isArray(row)) {
57
+ for (const key of Object.keys(row)) {
58
+ headerSet.add(key);
59
+ }
60
+ }
61
+ }
62
+ const headers = Array.from(headerSet);
63
+ const lines = [];
64
+ if (withHeaders) {
65
+ lines.push(headers.map((h) => escapeCell(h, delim)).join(delim));
66
+ }
67
+ for (const row of parsed) {
68
+ if (typeof row === "object" && row !== null && !Array.isArray(row)) {
69
+ const record = row;
70
+ const cells = headers.map((h) => escapeCell(toCsvValue(record[h]), delim));
71
+ lines.push(cells.join(delim));
72
+ }
73
+ }
74
+ return {
75
+ content: [
76
+ {
77
+ type: "text",
78
+ text: lines.join("\n"),
79
+ },
80
+ ],
81
+ };
82
+ }
83
+ catch (error) {
84
+ const message = error instanceof Error ? error.message : String(error);
85
+ return {
86
+ content: [
87
+ {
88
+ type: "text",
89
+ text: `Error converting JSON to CSV: ${message}`,
90
+ },
91
+ ],
92
+ isError: true,
93
+ };
94
+ }
95
+ });
96
+ }
97
+ //# sourceMappingURL=json-to-csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-to-csv.js","sourceRoot":"","sources":["../../src/tools/json-to-csv.ts"],"names":[],"mappings":";;AAyBA,8CA0FC;AAlHD,6BAAwB;AAExB,SAAS,UAAU,CAAC,KAAa,EAAE,SAAiB;IAClD,IACE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;QACzB,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACnB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;QACpB,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EACpB,CAAC;QACD,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAgB,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,IAAI,CACT,aAAa,EACb,+FAA+F,EAC/F;QACE,IAAI,EAAE,OAAC;aACJ,MAAM,EAAE;aACR,QAAQ,CAAC,8CAA8C,CAAC;QAC3D,SAAS,EAAE,OAAC;aACT,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2CAA2C,CAAC;QACxD,cAAc,EAAE,OAAC;aACd,OAAO,EAAE;aACT,QAAQ,EAAE;aACV,QAAQ,CAAC,iDAAiD,CAAC;KAC/D,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,EAAE;QAC5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEhC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YAED,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,EAAE;yBACT;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,SAAS,IAAI,GAAG,CAAC;YAC/B,MAAM,WAAW,GAAG,cAAc,KAAK,KAAK,CAAC;YAE7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;YACpC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAA8B,CAAC,EAAE,CAAC;wBAC9D,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACrB,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEtC,MAAM,KAAK,GAAa,EAAE,CAAC;YAE3B,IAAI,WAAW,EAAE,CAAC;gBAChB,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CACrD,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;oBACnE,MAAM,MAAM,GAAG,GAA8B,CAAC;oBAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CACzC,CAAC;oBACF,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,iCAAiC,OAAO,EAAE;qBACjD;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerJsonTransform(server: McpServer): void;
3
+ //# sourceMappingURL=json-transform.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-transform.d.ts","sourceRoot":"","sources":["../../src/tools/json-transform.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AA4GpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAkH7D"}