@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.
- package/README.md +111 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/tools/csv-to-json.d.ts +3 -0
- package/dist/tools/csv-to-json.d.ts.map +1 -0
- package/dist/tools/csv-to-json.js +69 -0
- package/dist/tools/csv-to-json.js.map +1 -0
- package/dist/tools/json-diff.d.ts +3 -0
- package/dist/tools/json-diff.d.ts.map +1 -0
- package/dist/tools/json-diff.js +123 -0
- package/dist/tools/json-diff.js.map +1 -0
- package/dist/tools/json-to-csv.d.ts +3 -0
- package/dist/tools/json-to-csv.d.ts.map +1 -0
- package/dist/tools/json-to-csv.js +97 -0
- package/dist/tools/json-to-csv.js.map +1 -0
- package/dist/tools/json-transform.d.ts +3 -0
- package/dist/tools/json-transform.d.ts.map +1 -0
- package/dist/tools/json-transform.js +176 -0
- package/dist/tools/json-transform.js.map +1 -0
- package/dist/tools/json-validator.d.ts +3 -0
- package/dist/tools/json-validator.d.ts.map +1 -0
- package/dist/tools/json-validator.js +68 -0
- package/dist/tools/json-validator.js.map +1 -0
- package/dist/tools/yaml-json.d.ts +3 -0
- package/dist/tools/yaml-json.d.ts.map +1 -0
- package/dist/tools/yaml-json.js +75 -0
- package/dist/tools/yaml-json.js.map +1 -0
- package/package.json +35 -0
- package/src/index.ts +32 -0
- package/src/tools/csv-to-json.ts +74 -0
- package/src/tools/json-diff.ts +151 -0
- package/src/tools/json-to-csv.ts +116 -0
- package/src/tools/json-transform.ts +223 -0
- package/src/tools/json-validator.ts +91 -0
- package/src/tools/yaml-json.ts +83 -0
- 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
|
package/dist/index.d.ts
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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"}
|