@paretools/python 0.3.0 → 0.6.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 +45 -12
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/formatters.d.ts +89 -1
- package/dist/lib/formatters.d.ts.map +1 -1
- package/dist/lib/formatters.js +184 -0
- package/dist/lib/formatters.js.map +1 -1
- package/dist/lib/parsers.d.ts +13 -1
- package/dist/lib/parsers.d.ts.map +1 -1
- package/dist/lib/parsers.js +175 -4
- package/dist/lib/parsers.js.map +1 -1
- package/dist/lib/python-runner.d.ts +3 -0
- package/dist/lib/python-runner.d.ts.map +1 -1
- package/dist/lib/python-runner.js +9 -0
- package/dist/lib/python-runner.js.map +1 -1
- package/dist/schemas/index.d.ts +79 -195
- package/dist/schemas/index.d.ts.map +1 -1
- package/dist/schemas/index.js +49 -4
- package/dist/schemas/index.js.map +1 -1
- package/dist/tools/black.d.ts +3 -0
- package/dist/tools/black.d.ts.map +1 -0
- package/dist/tools/black.js +48 -0
- package/dist/tools/black.js.map +1 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mypy.d.ts.map +1 -1
- package/dist/tools/mypy.js +19 -6
- package/dist/tools/mypy.js.map +1 -1
- package/dist/tools/pip-audit.d.ts.map +1 -1
- package/dist/tools/pip-audit.js +21 -6
- package/dist/tools/pip-audit.js.map +1 -1
- package/dist/tools/pip-install.d.ts.map +1 -1
- package/dist/tools/pip-install.js +37 -8
- package/dist/tools/pip-install.js.map +1 -1
- package/dist/tools/pytest.d.ts +3 -0
- package/dist/tools/pytest.d.ts.map +1 -0
- package/dist/tools/pytest.js +57 -0
- package/dist/tools/pytest.js.map +1 -0
- package/dist/tools/ruff.d.ts.map +1 -1
- package/dist/tools/ruff.js +19 -6
- package/dist/tools/ruff.js.map +1 -1
- package/dist/tools/uv-install.d.ts +3 -0
- package/dist/tools/uv-install.d.ts.map +1 -0
- package/dist/tools/uv-install.js +66 -0
- package/dist/tools/uv-install.js.map +1 -0
- package/dist/tools/uv-run.d.ts +3 -0
- package/dist/tools/uv-run.d.ts.map +1 -0
- package/dist/tools/uv-run.js +40 -0
- package/dist/tools/uv-run.js.map +1 -0
- package/package.json +21 -9
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
|
+
import { uv } from "../lib/python-runner.js";
|
|
4
|
+
import { parseUvInstall } from "../lib/parsers.js";
|
|
5
|
+
import { formatUvInstall, compactUvInstallMap, formatUvInstallCompact } from "../lib/formatters.js";
|
|
6
|
+
import { UvInstallSchema } from "../schemas/index.js";
|
|
7
|
+
export function registerUvInstallTool(server) {
|
|
8
|
+
server.registerTool("uv-install", {
|
|
9
|
+
title: "uv Install",
|
|
10
|
+
description: "Runs uv pip install and returns a structured summary of installed packages. " +
|
|
11
|
+
"Use instead of running `uv pip install` in the terminal. " +
|
|
12
|
+
"WARNING: Installing packages may execute arbitrary setup.py code during build. " +
|
|
13
|
+
"Only install trusted packages. Use dryRun to preview what would be installed before committing.",
|
|
14
|
+
inputSchema: {
|
|
15
|
+
path: z
|
|
16
|
+
.string()
|
|
17
|
+
.max(INPUT_LIMITS.PATH_MAX)
|
|
18
|
+
.optional()
|
|
19
|
+
.describe("Working directory (default: cwd)"),
|
|
20
|
+
packages: z
|
|
21
|
+
.array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
|
|
22
|
+
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
23
|
+
.optional()
|
|
24
|
+
.describe("Packages to install"),
|
|
25
|
+
requirements: z
|
|
26
|
+
.string()
|
|
27
|
+
.max(INPUT_LIMITS.PATH_MAX)
|
|
28
|
+
.optional()
|
|
29
|
+
.describe("Path to requirements file"),
|
|
30
|
+
dryRun: z
|
|
31
|
+
.boolean()
|
|
32
|
+
.optional()
|
|
33
|
+
.default(false)
|
|
34
|
+
.describe("Preview what would be installed without actually installing (--dry-run)"),
|
|
35
|
+
compact: z
|
|
36
|
+
.boolean()
|
|
37
|
+
.optional()
|
|
38
|
+
.default(true)
|
|
39
|
+
.describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
|
|
40
|
+
},
|
|
41
|
+
outputSchema: UvInstallSchema,
|
|
42
|
+
}, async ({ path, packages, requirements, dryRun, compact }) => {
|
|
43
|
+
const cwd = path || process.cwd();
|
|
44
|
+
for (const p of packages ?? []) {
|
|
45
|
+
assertNoFlagInjection(p, "packages");
|
|
46
|
+
}
|
|
47
|
+
if (requirements)
|
|
48
|
+
assertNoFlagInjection(requirements, "requirements");
|
|
49
|
+
const args = ["pip", "install"];
|
|
50
|
+
if (dryRun)
|
|
51
|
+
args.push("--dry-run");
|
|
52
|
+
if (requirements) {
|
|
53
|
+
args.push("-r", requirements);
|
|
54
|
+
}
|
|
55
|
+
else if (packages && packages.length > 0) {
|
|
56
|
+
args.push(...packages);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
args.push("-r", "requirements.txt");
|
|
60
|
+
}
|
|
61
|
+
const result = await uv(args, cwd);
|
|
62
|
+
const data = parseUvInstall(result.stdout, result.stderr, result.exitCode);
|
|
63
|
+
return compactDualOutput(data, result.stdout, formatUvInstall, compactUvInstallMap, formatUvInstallCompact, compact === false);
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=uv-install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uv-install.js","sourceRoot":"","sources":["../../src/tools/uv-install.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uv-run.d.ts","sourceRoot":"","sources":["../../src/tools/uv-run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,QAgDlD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
|
|
3
|
+
import { uv } from "../lib/python-runner.js";
|
|
4
|
+
import { parseUvRun } from "../lib/parsers.js";
|
|
5
|
+
import { formatUvRun, compactUvRunMap, formatUvRunCompact } from "../lib/formatters.js";
|
|
6
|
+
import { UvRunSchema } from "../schemas/index.js";
|
|
7
|
+
export function registerUvRunTool(server) {
|
|
8
|
+
server.registerTool("uv-run", {
|
|
9
|
+
title: "uv Run",
|
|
10
|
+
description: "Runs a command in a uv-managed environment and returns structured output. Use instead of running `uv run` in the terminal.",
|
|
11
|
+
inputSchema: {
|
|
12
|
+
path: z
|
|
13
|
+
.string()
|
|
14
|
+
.max(INPUT_LIMITS.PATH_MAX)
|
|
15
|
+
.optional()
|
|
16
|
+
.describe("Working directory (default: cwd)"),
|
|
17
|
+
command: z
|
|
18
|
+
.array(z.string().max(INPUT_LIMITS.STRING_MAX))
|
|
19
|
+
.max(INPUT_LIMITS.ARRAY_MAX)
|
|
20
|
+
.min(1)
|
|
21
|
+
.describe("Command and arguments to run (e.g. ['python', 'script.py'])"),
|
|
22
|
+
compact: z
|
|
23
|
+
.boolean()
|
|
24
|
+
.optional()
|
|
25
|
+
.default(true)
|
|
26
|
+
.describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
|
|
27
|
+
},
|
|
28
|
+
outputSchema: UvRunSchema,
|
|
29
|
+
}, async ({ path, command, compact }) => {
|
|
30
|
+
const cwd = path || process.cwd();
|
|
31
|
+
assertNoFlagInjection(command[0], "command");
|
|
32
|
+
const args = ["run", ...command];
|
|
33
|
+
const start = Date.now();
|
|
34
|
+
const result = await uv(args, cwd);
|
|
35
|
+
const elapsed = Date.now() - start;
|
|
36
|
+
const data = parseUvRun(result.stdout, result.stderr, result.exitCode, elapsed);
|
|
37
|
+
return compactDualOutput(data, result.stdout, formatUvRun, compactUvRunMap, formatUvRunCompact, compact === false);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=uv-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uv-run.js","sourceRoot":"","sources":["../../src/tools/uv-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,QAAQ;QACf,WAAW,EACT,4HAA4H;QAC9H,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,OAAO,EAAE,CAAC;iBACP,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;iBAC9C,GAAG,CAAC,YAAY,CAAC,SAAS,CAAC;iBAC3B,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,6DAA6D,CAAC;YAC1E,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,WAAW;KAC1B,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAClC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;QAEjC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;QAEnC,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAChF,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@paretools/python",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"mcpName": "io.github.Dave-London/python",
|
|
5
5
|
"description": "MCP server for Python tools (pip, mypy, ruff) with structured, token-efficient output",
|
|
6
6
|
"license": "MIT",
|
|
@@ -9,13 +9,25 @@
|
|
|
9
9
|
"mcp-server",
|
|
10
10
|
"model-context-protocol",
|
|
11
11
|
"structured-output",
|
|
12
|
+
"ai",
|
|
13
|
+
"ai-agent",
|
|
14
|
+
"claude",
|
|
15
|
+
"cursor",
|
|
16
|
+
"copilot",
|
|
17
|
+
"token-efficient",
|
|
18
|
+
"devtools",
|
|
19
|
+
"cli",
|
|
12
20
|
"python",
|
|
13
21
|
"mypy",
|
|
14
|
-
"ruff"
|
|
22
|
+
"ruff",
|
|
23
|
+
"pytest",
|
|
24
|
+
"uv",
|
|
25
|
+
"black",
|
|
26
|
+
"pip"
|
|
15
27
|
],
|
|
16
|
-
"homepage": "https://github.com/Dave-London/
|
|
28
|
+
"homepage": "https://github.com/Dave-London/Pare/tree/main/packages/server-python",
|
|
17
29
|
"engines": {
|
|
18
|
-
"node": ">=
|
|
30
|
+
"node": ">=20"
|
|
19
31
|
},
|
|
20
32
|
"type": "module",
|
|
21
33
|
"bin": {
|
|
@@ -32,7 +44,7 @@
|
|
|
32
44
|
},
|
|
33
45
|
"repository": {
|
|
34
46
|
"type": "git",
|
|
35
|
-
"url": "https://github.com/Dave-London/
|
|
47
|
+
"url": "https://github.com/Dave-London/Pare.git",
|
|
36
48
|
"directory": "packages/server-python"
|
|
37
49
|
},
|
|
38
50
|
"files": [
|
|
@@ -40,13 +52,13 @@
|
|
|
40
52
|
],
|
|
41
53
|
"dependencies": {
|
|
42
54
|
"@modelcontextprotocol/sdk": "^1.26.0",
|
|
43
|
-
"zod": "^3.
|
|
44
|
-
"@paretools/shared": "0.
|
|
55
|
+
"zod": "^4.3.6",
|
|
56
|
+
"@paretools/shared": "0.6.0"
|
|
45
57
|
},
|
|
46
58
|
"devDependencies": {
|
|
47
|
-
"@types/node": "^
|
|
59
|
+
"@types/node": "^25.2.3",
|
|
48
60
|
"typescript": "^5.7.0",
|
|
49
|
-
"vitest": "^
|
|
61
|
+
"vitest": "^4.0.18",
|
|
50
62
|
"@paretools/tsconfig": "0.0.0"
|
|
51
63
|
},
|
|
52
64
|
"scripts": {
|