@mcptoolshop/toolshopstudio 1.2.0-toolshop → 1.3.0-toolshop
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/.github/workflows/ci.yml +3 -3
- package/CHANGELOG.md +24 -0
- package/Dockerfile +7 -5
- package/README.es.md +115 -0
- package/README.fr.md +115 -0
- package/README.hi.md +115 -0
- package/README.it.md +115 -0
- package/README.ja.md +115 -0
- package/README.md +38 -7
- package/README.pt-BR.md +115 -0
- package/README.zh.md +115 -0
- package/dist/gdal/build-args.d.ts +20 -0
- package/dist/gdal/build-args.js +43 -0
- package/dist/gdal/crud.d.ts +10 -0
- package/dist/gdal/crud.js +80 -0
- package/dist/gdal/engine.test.d.ts +1 -0
- package/dist/gdal/engine.test.js +238 -0
- package/dist/gdal/exec.d.ts +10 -0
- package/dist/gdal/exec.js +46 -0
- package/dist/gdal/full.test.d.ts +1 -0
- package/dist/gdal/full.test.js +144 -0
- package/dist/gdal/index.d.ts +10 -0
- package/dist/gdal/index.js +11 -0
- package/dist/gdal/output-polish.d.ts +22 -0
- package/dist/gdal/output-polish.js +42 -0
- package/dist/gdal/pipeline.test.d.ts +1 -0
- package/dist/gdal/pipeline.test.js +112 -0
- package/dist/gdal/preflight.d.ts +47 -0
- package/dist/gdal/preflight.js +176 -0
- package/dist/gdal/preset-spec.d.ts +30 -0
- package/dist/gdal/preset-spec.js +50 -0
- package/dist/gdal/progress.d.ts +26 -0
- package/dist/gdal/progress.js +82 -0
- package/dist/gdal/schemas.d.ts +132 -0
- package/dist/gdal/schemas.js +46 -0
- package/dist/gdal/transform.d.ts +40 -0
- package/dist/gdal/transform.js +192 -0
- package/dist/gdal/types.d.ts +30 -0
- package/dist/gdal/types.js +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/package.json +3 -3
- package/scripts/release.mjs +1 -1
- package/smoke.mjs +84 -0
- package/src/gdal/build-args.ts +56 -0
- package/src/gdal/crud.ts +95 -0
- package/src/gdal/engine.test.ts +315 -0
- package/src/gdal/exec.ts +56 -0
- package/src/gdal/full.test.ts +209 -0
- package/src/gdal/index.ts +11 -0
- package/src/gdal/output-polish.ts +59 -0
- package/src/gdal/pipeline.test.ts +172 -0
- package/src/gdal/preflight.ts +238 -0
- package/src/gdal/preset-spec.ts +81 -0
- package/src/gdal/progress.ts +97 -0
- package/src/gdal/schemas.ts +58 -0
- package/src/gdal/transform.ts +303 -0
- package/src/gdal/types.ts +40 -0
- package/src/index.ts +1 -0
package/.github/workflows/ci.yml
CHANGED
|
@@ -23,7 +23,7 @@ concurrency:
|
|
|
23
23
|
|
|
24
24
|
jobs:
|
|
25
25
|
test:
|
|
26
|
-
name: Typecheck + Test + Smoke (FFmpeg + Pandoc + FreeCAD)
|
|
26
|
+
name: Typecheck + Test + Smoke (FFmpeg + Pandoc + FreeCAD + GDAL)
|
|
27
27
|
runs-on: ubuntu-latest
|
|
28
28
|
|
|
29
29
|
strategy:
|
|
@@ -43,11 +43,11 @@ jobs:
|
|
|
43
43
|
- name: Typecheck
|
|
44
44
|
run: npm run typecheck
|
|
45
45
|
|
|
46
|
-
- name: Unit tests (FFmpeg + Pandoc + FreeCAD)
|
|
46
|
+
- name: Unit tests (FFmpeg + Pandoc + FreeCAD + GDAL)
|
|
47
47
|
run: npm test
|
|
48
48
|
|
|
49
49
|
- name: Build
|
|
50
50
|
run: npm run build
|
|
51
51
|
|
|
52
|
-
- name: Smoke test (all
|
|
52
|
+
- name: Smoke test (all four tools)
|
|
53
53
|
run: npm run smoke
|
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,30 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.3.0-toolshop] - 2026-02-19
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
- **GDAL MCP**: full geospatial transform tool (5 presets: raster-wgs84-tiff, vector-geojson, raster-to-png, vector-shapefile, clip-raster)
|
|
9
|
+
- GDAL multi-binary dispatch: gdalwarp, ogr2ogr, gdal_translate selected per preset
|
|
10
|
+
- GDAL two-tier encoding: premium clip-raster with automatic fallback to raster-wgs84-tiff
|
|
11
|
+
- GDAL schema-first design: Zod schemas for TransformGeo, GDALGeoDataAsset, quality tiers
|
|
12
|
+
- buildGDALArgs pure function (deterministic $INPUT/$OUTPUT/$BBOX substitution)
|
|
13
|
+
- GDAL dual-mode progress parser (direct percent + step-counting fallback)
|
|
14
|
+
- GDAL pre/post-flight assertions (input validation, format compatibility, suspicious expansion detection)
|
|
15
|
+
- GDAL context DI pattern (TransformGeoContext) matching FreeCAD/Pandoc/FFmpeg
|
|
16
|
+
- GDALGeoDataCRUD with lazy hydration + optional JSON persistence
|
|
17
|
+
- GDAL output polish (auto-extension, typed output metadata, configurable expiry)
|
|
18
|
+
- Docker image now includes gdal-bin for geospatial transforms
|
|
19
|
+
- Quad-tool smoke test (FFmpeg + Pandoc + FreeCAD + GDAL, 10 end-to-end tests)
|
|
20
|
+
- 114 unit/integration tests (13 FFmpeg + 29 Pandoc + 33 FreeCAD + 39 GDAL)
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- Multilingual README: EN + 7 translations (JA, ZH, ES, FR, HI, IT, PT-BR)
|
|
24
|
+
- Docker image relabeled for v1.3.0-toolshop
|
|
25
|
+
- CI labels updated for all four tools
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
5
29
|
## [1.2.0-toolshop] - 2026-02-19
|
|
6
30
|
|
|
7
31
|
### Added
|
package/Dockerfile
CHANGED
|
@@ -12,15 +12,17 @@ RUN npm run build
|
|
|
12
12
|
# ── Production stage ───────────────────────────────────────────────
|
|
13
13
|
FROM node:22-slim
|
|
14
14
|
|
|
15
|
-
# Install all
|
|
16
|
-
# ffmpeg:
|
|
17
|
-
# pandoc:
|
|
15
|
+
# Install all four runtime binaries
|
|
16
|
+
# ffmpeg: video transcoding (FFmpeg YouTube MCP)
|
|
17
|
+
# pandoc: document conversion (Pandoc MCP)
|
|
18
18
|
# freecad-cmd: headless CAD export (FreeCAD MCP) — no GUI deps
|
|
19
|
+
# gdal-bin: geospatial transforms (GDAL MCP) — gdalwarp, ogr2ogr, gdal_translate
|
|
19
20
|
RUN apt-get update && \
|
|
20
21
|
apt-get install -y --no-install-recommends \
|
|
21
22
|
ffmpeg \
|
|
22
23
|
pandoc \
|
|
23
24
|
freecad-cmd \
|
|
25
|
+
gdal-bin \
|
|
24
26
|
&& rm -rf /var/lib/apt/lists/*
|
|
25
27
|
|
|
26
28
|
WORKDIR /app
|
|
@@ -43,8 +45,8 @@ ENV NODE_ENV=production
|
|
|
43
45
|
VOLUME ["/sandbox", "/tmp/toolshop"]
|
|
44
46
|
|
|
45
47
|
LABEL org.opencontainers.image.title="ToolShopStudio" \
|
|
46
|
-
org.opencontainers.image.description="FFmpeg YouTube + Pandoc + FreeCAD MCP tools —
|
|
47
|
-
org.opencontainers.image.version="1.
|
|
48
|
+
org.opencontainers.image.description="FFmpeg YouTube + Pandoc + FreeCAD + GDAL MCP tools — quad-tool kit for ordinary creators" \
|
|
49
|
+
org.opencontainers.image.version="1.3.0-toolshop" \
|
|
48
50
|
org.opencontainers.image.logo="assets/logo.png" \
|
|
49
51
|
org.opencontainers.image.source="https://github.com/mcp-tool-shop-org/ToolShopStudio" \
|
|
50
52
|
org.opencontainers.image.licenses="MIT"
|
package/README.es.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.png" width="400" alt="ToolShopStudio">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">ToolShopStudio</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
Una sola instalacion. Cuatro herramientas MCP de produccion para creadores.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="README.md">English</a> |
|
|
13
|
+
<a href="README.ja.md">日本語</a> |
|
|
14
|
+
<a href="README.zh.md">中文</a> |
|
|
15
|
+
<strong>Español</strong> |
|
|
16
|
+
<a href="README.fr.md">Français</a> |
|
|
17
|
+
<a href="README.hi.md">हिन्दी</a> |
|
|
18
|
+
<a href="README.it.md">Italiano</a> |
|
|
19
|
+
<a href="README.pt-BR.md">Português</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions"><img src="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
24
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/toolshopstudio"><img src="https://img.shields.io/npm/v/@mcptoolshop/toolshopstudio" alt="npm version"></a>
|
|
25
|
+
<img src="https://img.shields.io/badge/tools-FFmpeg%20%2B%20Pandoc%20%2B%20FreeCAD%20%2B%20GDAL-orange" alt="Tools">
|
|
26
|
+
<img src="https://img.shields.io/badge/tests-114%20passing-brightgreen" alt="Tests">
|
|
27
|
+
<img src="https://img.shields.io/badge/license-MIT-blue" alt="License">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Herramientas Incluidas
|
|
33
|
+
|
|
34
|
+
| Herramienta | Funcion |
|
|
35
|
+
|-------------|---------|
|
|
36
|
+
| **FFmpeg YouTube MCP** | Presets seguros para YouTube (garantizado + premium con fallback), GOP cerrado, miniaturas duales |
|
|
37
|
+
| **Pandoc MCP** | Conversion de documentos sin flags: blog, PDF academico, ebook, slides, newsletter |
|
|
38
|
+
| **FreeCAD MCP** | Exportacion 3D CAD segura: STL, STEP, GLB, 3MF, OBJ — sin interfaz, sin codigo de usuario |
|
|
39
|
+
| **GDAL MCP** | Transformaciones geoespaciales: reproyeccion raster, conversion vectorial, recorte de regiones — el FFmpeg del GIS |
|
|
40
|
+
|
|
41
|
+
Las cuatro herramientas comparten la misma superficie: **schema-first, sandbox, observable, DI por contexto, cero argumentos crudos**.
|
|
42
|
+
|
|
43
|
+
## Inicio Rapido
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @mcptoolshop/toolshopstudio
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import {
|
|
51
|
+
transcodeForYouTube,
|
|
52
|
+
createInMemoryCRUD,
|
|
53
|
+
pandoc,
|
|
54
|
+
freecad,
|
|
55
|
+
gdal,
|
|
56
|
+
} from "@mcptoolshop/toolshopstudio";
|
|
57
|
+
|
|
58
|
+
// ── FFmpeg: transcodificacion segura para YouTube ───────────────
|
|
59
|
+
const video = await transcodeForYouTube(
|
|
60
|
+
{ inputPath: "input.mp4", outputPath: "output.mp4", preset: "yt-1080p-h264" },
|
|
61
|
+
{ signal, userId, notify, createAsset, runFfmpeg, runProbe },
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// ── Pandoc: conversion de documentos ────────────────────────────
|
|
65
|
+
const doc = await pandoc.convertDocument(
|
|
66
|
+
{ inputPath: "thesis.md", outputPath: "thesis.pdf", preset: "academic-pdf" },
|
|
67
|
+
{ signal, userId, notify, createAsset, runPandoc, checkInput, assertOutput, statFile },
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// ── FreeCAD: exportacion 3D CAD ─────────────────────────────────
|
|
71
|
+
const part = await freecad.exportPart(
|
|
72
|
+
{ inputPath: "bracket.FCStd", outputPath: "bracket.stl", preset: "stl-print-ready" },
|
|
73
|
+
{ signal, userId, notify, createAsset, runFreeCAD, checkInput, assertOutput, statFile },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// ── GDAL: transformacion geoespacial ────────────────────────────
|
|
77
|
+
const geo = await gdal.transformGeo(
|
|
78
|
+
{ inputPath: "terrain.tif", outputPath: "terrain_wgs84.tif", preset: "raster-wgs84-tiff" },
|
|
79
|
+
{ signal, userId, notify, createAsset, runGDAL, checkInput, assertOutput, statFile },
|
|
80
|
+
);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Arquitectura
|
|
84
|
+
|
|
85
|
+
- **Schema-first**: Esquemas Zod para cada entrada/salida, totalmente tipado
|
|
86
|
+
- **Context DI**: Todos los efectos secundarios inyectados via objetos de contexto, 100% mockeable
|
|
87
|
+
- **Aislamiento sandbox**: Prevencion de path traversal en cada operacion de archivo
|
|
88
|
+
- **Observable**: Notificaciones tipadas (progreso, advertencias, listo) en cada etapa
|
|
89
|
+
- **Cancelacion**: AbortController propagado a cada checkpoint del pipeline
|
|
90
|
+
- **Fallback**: Los presets premium degradan automaticamente a garantizado en caso de fallo
|
|
91
|
+
- **Ejecucion segura**: FreeCAD usa one-liners Python preconstruidos (sin exec/eval/codigo de usuario)
|
|
92
|
+
- **Multi-binario**: GDAL despacha a gdalwarp, ogr2ogr o gdal_translate segun el preset
|
|
93
|
+
|
|
94
|
+
## Docker
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
docker build -t toolshopstudio .
|
|
98
|
+
docker run -v ./sandbox:/sandbox toolshopstudio
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Los cuatro binarios (`ffmpeg`, `pandoc`, `freecad-cmd`, `gdal-bin`) vienen preinstalados en la imagen.
|
|
102
|
+
|
|
103
|
+
## Desarrollo
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm install # dependencias
|
|
107
|
+
npm run typecheck # tsc --noEmit
|
|
108
|
+
npm test # vitest (114 tests)
|
|
109
|
+
npm run build # compilar a dist/
|
|
110
|
+
npm run smoke # smoke end-to-end (4 herramientas, 10 tests)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Licencia
|
|
114
|
+
|
|
115
|
+
MIT
|
package/README.fr.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.png" width="400" alt="ToolShopStudio">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">ToolShopStudio</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
Une seule installation. Quatre outils MCP de production pour les createurs.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="README.md">English</a> |
|
|
13
|
+
<a href="README.ja.md">日本語</a> |
|
|
14
|
+
<a href="README.zh.md">中文</a> |
|
|
15
|
+
<a href="README.es.md">Español</a> |
|
|
16
|
+
<strong>Français</strong> |
|
|
17
|
+
<a href="README.hi.md">हिन्दी</a> |
|
|
18
|
+
<a href="README.it.md">Italiano</a> |
|
|
19
|
+
<a href="README.pt-BR.md">Português</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions"><img src="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
24
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/toolshopstudio"><img src="https://img.shields.io/npm/v/@mcptoolshop/toolshopstudio" alt="npm version"></a>
|
|
25
|
+
<img src="https://img.shields.io/badge/tools-FFmpeg%20%2B%20Pandoc%20%2B%20FreeCAD%20%2B%20GDAL-orange" alt="Tools">
|
|
26
|
+
<img src="https://img.shields.io/badge/tests-114%20passing-brightgreen" alt="Tests">
|
|
27
|
+
<img src="https://img.shields.io/badge/license-MIT-blue" alt="License">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Outils Inclus
|
|
33
|
+
|
|
34
|
+
| Outil | Fonction |
|
|
35
|
+
|-------|----------|
|
|
36
|
+
| **FFmpeg YouTube MCP** | Presets YouTube (garanti + premium avec fallback), GOP ferme, double miniature |
|
|
37
|
+
| **Pandoc MCP** | Conversion de documents sans flags : blog, PDF academique, ebook, slides, newsletter |
|
|
38
|
+
| **FreeCAD MCP** | Export 3D CAD securise : STL, STEP, GLB, 3MF, OBJ — headless, sans code utilisateur |
|
|
39
|
+
| **GDAL MCP** | Transformations geospatiales : reprojection raster, conversion vectorielle, decoupage de regions — le FFmpeg du SIG |
|
|
40
|
+
|
|
41
|
+
Les quatre outils partagent la meme surface : **schema-first, sandbox, observable, DI par contexte, zero arguments bruts**.
|
|
42
|
+
|
|
43
|
+
## Demarrage Rapide
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @mcptoolshop/toolshopstudio
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import {
|
|
51
|
+
transcodeForYouTube,
|
|
52
|
+
createInMemoryCRUD,
|
|
53
|
+
pandoc,
|
|
54
|
+
freecad,
|
|
55
|
+
gdal,
|
|
56
|
+
} from "@mcptoolshop/toolshopstudio";
|
|
57
|
+
|
|
58
|
+
// ── FFmpeg : transcodage YouTube ────────────────────────────────
|
|
59
|
+
const video = await transcodeForYouTube(
|
|
60
|
+
{ inputPath: "input.mp4", outputPath: "output.mp4", preset: "yt-1080p-h264" },
|
|
61
|
+
{ signal, userId, notify, createAsset, runFfmpeg, runProbe },
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// ── Pandoc : conversion de documents ────────────────────────────
|
|
65
|
+
const doc = await pandoc.convertDocument(
|
|
66
|
+
{ inputPath: "thesis.md", outputPath: "thesis.pdf", preset: "academic-pdf" },
|
|
67
|
+
{ signal, userId, notify, createAsset, runPandoc, checkInput, assertOutput, statFile },
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// ── FreeCAD : export 3D CAD ─────────────────────────────────────
|
|
71
|
+
const part = await freecad.exportPart(
|
|
72
|
+
{ inputPath: "bracket.FCStd", outputPath: "bracket.stl", preset: "stl-print-ready" },
|
|
73
|
+
{ signal, userId, notify, createAsset, runFreeCAD, checkInput, assertOutput, statFile },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// ── GDAL : transformation geospatiale ───────────────────────────
|
|
77
|
+
const geo = await gdal.transformGeo(
|
|
78
|
+
{ inputPath: "terrain.tif", outputPath: "terrain_wgs84.tif", preset: "raster-wgs84-tiff" },
|
|
79
|
+
{ signal, userId, notify, createAsset, runGDAL, checkInput, assertOutput, statFile },
|
|
80
|
+
);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Architecture
|
|
84
|
+
|
|
85
|
+
- **Schema-first** : Schemas Zod pour chaque entree/sortie, entierement type
|
|
86
|
+
- **Context DI** : Tous les effets de bord injectes via des objets de contexte, 100% mockable
|
|
87
|
+
- **Isolation sandbox** : Prevention de path traversal sur chaque operation fichier
|
|
88
|
+
- **Observable** : Notifications typees (progression, avertissements, pret) a chaque etape
|
|
89
|
+
- **Annulation** : AbortController propage a chaque checkpoint du pipeline
|
|
90
|
+
- **Fallback** : Les presets premium se degradent automatiquement en garanti en cas d'echec
|
|
91
|
+
- **Execution securisee** : FreeCAD utilise des one-liners Python preconstruits (pas d'exec/eval/code utilisateur)
|
|
92
|
+
- **Multi-binaire** : GDAL dispatche vers gdalwarp, ogr2ogr ou gdal_translate selon le preset
|
|
93
|
+
|
|
94
|
+
## Docker
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
docker build -t toolshopstudio .
|
|
98
|
+
docker run -v ./sandbox:/sandbox toolshopstudio
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Les quatre binaires (`ffmpeg`, `pandoc`, `freecad-cmd`, `gdal-bin`) sont preinstalles dans l'image.
|
|
102
|
+
|
|
103
|
+
## Developpement
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm install # dependances
|
|
107
|
+
npm run typecheck # tsc --noEmit
|
|
108
|
+
npm test # vitest (114 tests)
|
|
109
|
+
npm run build # compiler vers dist/
|
|
110
|
+
npm run smoke # smoke end-to-end (4 outils, 10 tests)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Licence
|
|
114
|
+
|
|
115
|
+
MIT
|
package/README.hi.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.png" width="400" alt="ToolShopStudio">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">ToolShopStudio</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
एक इंस्टॉल। क्रिएटर्स के लिए चार प्रोडक्शन-ग्रेड MCP टूल्स।
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="README.md">English</a> |
|
|
13
|
+
<a href="README.ja.md">日本語</a> |
|
|
14
|
+
<a href="README.zh.md">中文</a> |
|
|
15
|
+
<a href="README.es.md">Español</a> |
|
|
16
|
+
<a href="README.fr.md">Français</a> |
|
|
17
|
+
<strong>हिन्दी</strong> |
|
|
18
|
+
<a href="README.it.md">Italiano</a> |
|
|
19
|
+
<a href="README.pt-BR.md">Português</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions"><img src="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
24
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/toolshopstudio"><img src="https://img.shields.io/npm/v/@mcptoolshop/toolshopstudio" alt="npm version"></a>
|
|
25
|
+
<img src="https://img.shields.io/badge/tools-FFmpeg%20%2B%20Pandoc%20%2B%20FreeCAD%20%2B%20GDAL-orange" alt="Tools">
|
|
26
|
+
<img src="https://img.shields.io/badge/tests-114%20passing-brightgreen" alt="Tests">
|
|
27
|
+
<img src="https://img.shields.io/badge/license-MIT-blue" alt="License">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## शामिल टूल्स
|
|
33
|
+
|
|
34
|
+
| टूल | कार्य |
|
|
35
|
+
|------|-------|
|
|
36
|
+
| **FFmpeg YouTube MCP** | YouTube-सुरक्षित प्रीसेट (गारंटीड + प्रीमियम ऑटो-फ़ॉलबैक), क्लोज़्ड-GOP, दोहरे थंबनेल |
|
|
37
|
+
| **Pandoc MCP** | ज़ीरो-फ़्लैग डॉक्यूमेंट कन्वर्ज़न: ब्लॉग, एकेडमिक PDF, ebook, स्लाइड्स, न्यूज़लेटर |
|
|
38
|
+
| **FreeCAD MCP** | सुरक्षित 3D CAD एक्सपोर्ट: STL, STEP, GLB, 3MF, OBJ — हेडलेस, यूज़र कोड नहीं |
|
|
39
|
+
| **GDAL MCP** | भू-स्थानिक ट्रांसफ़ॉर्म: रैस्टर री-प्रोजेक्शन, वेक्टर कन्वर्ज़न, रीजन क्लिप — GIS का FFmpeg |
|
|
40
|
+
|
|
41
|
+
चारों टूल्स एक ही डिज़ाइन साझा करते हैं: **स्कीमा-फ़र्स्ट, सैंडबॉक्स्ड, ऑब्ज़र्वेबल, कॉन्टेक्स्ट DI, ज़ीरो रॉ आर्ग्स**।
|
|
42
|
+
|
|
43
|
+
## त्वरित शुरुआत
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @mcptoolshop/toolshopstudio
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import {
|
|
51
|
+
transcodeForYouTube,
|
|
52
|
+
createInMemoryCRUD,
|
|
53
|
+
pandoc,
|
|
54
|
+
freecad,
|
|
55
|
+
gdal,
|
|
56
|
+
} from "@mcptoolshop/toolshopstudio";
|
|
57
|
+
|
|
58
|
+
// ── FFmpeg: YouTube-सुरक्षित ट्रांसकोड ─────────────────────────
|
|
59
|
+
const video = await transcodeForYouTube(
|
|
60
|
+
{ inputPath: "input.mp4", outputPath: "output.mp4", preset: "yt-1080p-h264" },
|
|
61
|
+
{ signal, userId, notify, createAsset, runFfmpeg, runProbe },
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// ── Pandoc: डॉक्यूमेंट कन्वर्ज़न ───────────────────────────────
|
|
65
|
+
const doc = await pandoc.convertDocument(
|
|
66
|
+
{ inputPath: "thesis.md", outputPath: "thesis.pdf", preset: "academic-pdf" },
|
|
67
|
+
{ signal, userId, notify, createAsset, runPandoc, checkInput, assertOutput, statFile },
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// ── FreeCAD: 3D CAD एक्सपोर्ट ──────────────────────────────────
|
|
71
|
+
const part = await freecad.exportPart(
|
|
72
|
+
{ inputPath: "bracket.FCStd", outputPath: "bracket.stl", preset: "stl-print-ready" },
|
|
73
|
+
{ signal, userId, notify, createAsset, runFreeCAD, checkInput, assertOutput, statFile },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// ── GDAL: भू-स्थानिक ट्रांसफ़ॉर्म ──────────────────────────────
|
|
77
|
+
const geo = await gdal.transformGeo(
|
|
78
|
+
{ inputPath: "terrain.tif", outputPath: "terrain_wgs84.tif", preset: "raster-wgs84-tiff" },
|
|
79
|
+
{ signal, userId, notify, createAsset, runGDAL, checkInput, assertOutput, statFile },
|
|
80
|
+
);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## आर्किटेक्चर
|
|
84
|
+
|
|
85
|
+
- **स्कीमा-फ़र्स्ट**: हर इनपुट/आउटपुट के लिए Zod स्कीमा, पूर्ण टाइप-सेफ़
|
|
86
|
+
- **कॉन्टेक्स्ट DI**: सभी साइड इफ़ेक्ट्स कॉन्टेक्स्ट ऑब्जेक्ट्स से इंजेक्ट, 100% मॉक करने योग्य
|
|
87
|
+
- **सैंडबॉक्स आइसोलेशन**: हर फ़ाइल ऑपरेशन पर पाथ ट्रैवर्सल रोकथाम
|
|
88
|
+
- **ऑब्ज़र्वेबल**: हर स्टेज पर टाइप्ड नोटिफ़िकेशन (प्रगति, चेतावनी, तैयार)
|
|
89
|
+
- **रद्दीकरण**: AbortController हर पाइपलाइन चेकपॉइंट तक प्रसारित
|
|
90
|
+
- **फ़ॉलबैक**: प्रीमियम प्रीसेट विफलता पर गारंटीड में स्वचालित डिग्रेड
|
|
91
|
+
- **सुरक्षित निष्पादन**: FreeCAD पूर्व-निर्मित Python वन-लाइनर्स का उपयोग करता है (कोई exec/eval/यूज़र कोड नहीं)
|
|
92
|
+
- **मल्टी-बाइनरी**: GDAL प्रीसेट के अनुसार gdalwarp, ogr2ogr या gdal_translate को डिस्पैच करता है
|
|
93
|
+
|
|
94
|
+
## Docker
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
docker build -t toolshopstudio .
|
|
98
|
+
docker run -v ./sandbox:/sandbox toolshopstudio
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
चारों रनटाइम बाइनरी (`ffmpeg`, `pandoc`, `freecad-cmd`, `gdal-bin`) इमेज में प्री-इंस्टॉल्ड हैं।
|
|
102
|
+
|
|
103
|
+
## विकास
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm install # डिपेंडेंसी
|
|
107
|
+
npm run typecheck # tsc --noEmit
|
|
108
|
+
npm test # vitest (114 टेस्ट)
|
|
109
|
+
npm run build # dist/ में कंपाइल
|
|
110
|
+
npm run smoke # एंड-टू-एंड स्मोक (4 टूल्स, 10 टेस्ट)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## लाइसेंस
|
|
114
|
+
|
|
115
|
+
MIT
|
package/README.it.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.png" width="400" alt="ToolShopStudio">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">ToolShopStudio</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
Un'unica installazione. Quattro strumenti MCP di produzione per creatori.
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="README.md">English</a> |
|
|
13
|
+
<a href="README.ja.md">日本語</a> |
|
|
14
|
+
<a href="README.zh.md">中文</a> |
|
|
15
|
+
<a href="README.es.md">Español</a> |
|
|
16
|
+
<a href="README.fr.md">Français</a> |
|
|
17
|
+
<a href="README.hi.md">हिन्दी</a> |
|
|
18
|
+
<strong>Italiano</strong> |
|
|
19
|
+
<a href="README.pt-BR.md">Português</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions"><img src="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
24
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/toolshopstudio"><img src="https://img.shields.io/npm/v/@mcptoolshop/toolshopstudio" alt="npm version"></a>
|
|
25
|
+
<img src="https://img.shields.io/badge/tools-FFmpeg%20%2B%20Pandoc%20%2B%20FreeCAD%20%2B%20GDAL-orange" alt="Tools">
|
|
26
|
+
<img src="https://img.shields.io/badge/tests-114%20passing-brightgreen" alt="Tests">
|
|
27
|
+
<img src="https://img.shields.io/badge/license-MIT-blue" alt="License">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Strumenti Inclusi
|
|
33
|
+
|
|
34
|
+
| Strumento | Funzione |
|
|
35
|
+
|-----------|----------|
|
|
36
|
+
| **FFmpeg YouTube MCP** | Preset sicuri per YouTube (garantito + premium con fallback), GOP chiuso, doppia miniatura |
|
|
37
|
+
| **Pandoc MCP** | Conversione documenti senza flag: blog, PDF accademico, ebook, slide, newsletter |
|
|
38
|
+
| **FreeCAD MCP** | Esportazione 3D CAD sicura: STL, STEP, GLB, 3MF, OBJ — headless, nessun codice utente |
|
|
39
|
+
| **GDAL MCP** | Trasformazioni geospaziali: riproiezione raster, conversione vettoriale, ritaglio regioni — l'FFmpeg del GIS |
|
|
40
|
+
|
|
41
|
+
Tutti e quattro gli strumenti condividono la stessa superficie: **schema-first, sandbox, osservabile, DI per contesto, zero argomenti grezzi**.
|
|
42
|
+
|
|
43
|
+
## Avvio Rapido
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @mcptoolshop/toolshopstudio
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import {
|
|
51
|
+
transcodeForYouTube,
|
|
52
|
+
createInMemoryCRUD,
|
|
53
|
+
pandoc,
|
|
54
|
+
freecad,
|
|
55
|
+
gdal,
|
|
56
|
+
} from "@mcptoolshop/toolshopstudio";
|
|
57
|
+
|
|
58
|
+
// ── FFmpeg: transcodifica sicura per YouTube ────────────────────
|
|
59
|
+
const video = await transcodeForYouTube(
|
|
60
|
+
{ inputPath: "input.mp4", outputPath: "output.mp4", preset: "yt-1080p-h264" },
|
|
61
|
+
{ signal, userId, notify, createAsset, runFfmpeg, runProbe },
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// ── Pandoc: conversione documenti ───────────────────────────────
|
|
65
|
+
const doc = await pandoc.convertDocument(
|
|
66
|
+
{ inputPath: "thesis.md", outputPath: "thesis.pdf", preset: "academic-pdf" },
|
|
67
|
+
{ signal, userId, notify, createAsset, runPandoc, checkInput, assertOutput, statFile },
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// ── FreeCAD: esportazione 3D CAD ────────────────────────────────
|
|
71
|
+
const part = await freecad.exportPart(
|
|
72
|
+
{ inputPath: "bracket.FCStd", outputPath: "bracket.stl", preset: "stl-print-ready" },
|
|
73
|
+
{ signal, userId, notify, createAsset, runFreeCAD, checkInput, assertOutput, statFile },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// ── GDAL: trasformazione geospaziale ────────────────────────────
|
|
77
|
+
const geo = await gdal.transformGeo(
|
|
78
|
+
{ inputPath: "terrain.tif", outputPath: "terrain_wgs84.tif", preset: "raster-wgs84-tiff" },
|
|
79
|
+
{ signal, userId, notify, createAsset, runGDAL, checkInput, assertOutput, statFile },
|
|
80
|
+
);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Architettura
|
|
84
|
+
|
|
85
|
+
- **Schema-first**: Schemi Zod per ogni input/output, completamente tipizzato
|
|
86
|
+
- **Context DI**: Tutti gli effetti collaterali iniettati tramite oggetti di contesto, 100% mockabile
|
|
87
|
+
- **Isolamento sandbox**: Prevenzione path traversal su ogni operazione file
|
|
88
|
+
- **Osservabile**: Notifiche tipizzate (progresso, avvertimenti, pronto) ad ogni fase
|
|
89
|
+
- **Cancellazione**: AbortController propagato ad ogni checkpoint della pipeline
|
|
90
|
+
- **Fallback**: I preset premium degradano automaticamente a garantito in caso di errore
|
|
91
|
+
- **Esecuzione sicura**: FreeCAD usa one-liner Python precostituiti (nessun exec/eval/codice utente)
|
|
92
|
+
- **Multi-binario**: GDAL dispatcha verso gdalwarp, ogr2ogr o gdal_translate in base al preset
|
|
93
|
+
|
|
94
|
+
## Docker
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
docker build -t toolshopstudio .
|
|
98
|
+
docker run -v ./sandbox:/sandbox toolshopstudio
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
Tutti e quattro i binari (`ffmpeg`, `pandoc`, `freecad-cmd`, `gdal-bin`) sono preinstallati nell'immagine.
|
|
102
|
+
|
|
103
|
+
## Sviluppo
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm install # dipendenze
|
|
107
|
+
npm run typecheck # tsc --noEmit
|
|
108
|
+
npm test # vitest (114 test)
|
|
109
|
+
npm run build # compilare in dist/
|
|
110
|
+
npm run smoke # smoke end-to-end (4 strumenti, 10 test)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Licenza
|
|
114
|
+
|
|
115
|
+
MIT
|
package/README.ja.md
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="assets/logo.png" width="400" alt="ToolShopStudio">
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">ToolShopStudio</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">
|
|
8
|
+
1回のインストールで、クリエイター向け本番グレードMCPツール4本。
|
|
9
|
+
</p>
|
|
10
|
+
|
|
11
|
+
<p align="center">
|
|
12
|
+
<a href="README.md">English</a> |
|
|
13
|
+
<strong>日本語</strong> |
|
|
14
|
+
<a href="README.zh.md">中文</a> |
|
|
15
|
+
<a href="README.es.md">Español</a> |
|
|
16
|
+
<a href="README.fr.md">Français</a> |
|
|
17
|
+
<a href="README.hi.md">हिन्दी</a> |
|
|
18
|
+
<a href="README.it.md">Italiano</a> |
|
|
19
|
+
<a href="README.pt-BR.md">Português</a>
|
|
20
|
+
</p>
|
|
21
|
+
|
|
22
|
+
<p align="center">
|
|
23
|
+
<a href="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions"><img src="https://github.com/mcp-tool-shop-org/ToolShopStudio/actions/workflows/ci.yml/badge.svg" alt="CI"></a>
|
|
24
|
+
<a href="https://www.npmjs.com/package/@mcptoolshop/toolshopstudio"><img src="https://img.shields.io/npm/v/@mcptoolshop/toolshopstudio" alt="npm version"></a>
|
|
25
|
+
<img src="https://img.shields.io/badge/tools-FFmpeg%20%2B%20Pandoc%20%2B%20FreeCAD%20%2B%20GDAL-orange" alt="Tools">
|
|
26
|
+
<img src="https://img.shields.io/badge/tests-114%20passing-brightgreen" alt="Tests">
|
|
27
|
+
<img src="https://img.shields.io/badge/license-MIT-blue" alt="License">
|
|
28
|
+
</p>
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 搭載ツール
|
|
33
|
+
|
|
34
|
+
| ツール | 機能 |
|
|
35
|
+
|--------|------|
|
|
36
|
+
| **FFmpeg YouTube MCP** | YouTube安全プリセット(保証+プレミアム自動フォールバック)、クローズドGOP、デュアルサムネイル |
|
|
37
|
+
| **Pandoc MCP** | フラグ不要のドキュメント変換:ブログ、学術PDF、電子書籍、スライド、ニュースレター |
|
|
38
|
+
| **FreeCAD MCP** | 安全な3D CADエクスポート:STL, STEP, GLB, 3MF, OBJ — ヘッドレス、ユーザーコード不要 |
|
|
39
|
+
| **GDAL MCP** | 地理空間変換:ラスター再投影、ベクター変換、領域クリップ — GISのFFmpeg |
|
|
40
|
+
|
|
41
|
+
4つのツールすべてが同じ設計原則を共有:**スキーマファースト、サンドボックス化、監視可能、コンテキストDI、生引数なし**。
|
|
42
|
+
|
|
43
|
+
## クイックスタート
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
npm install @mcptoolshop/toolshopstudio
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```typescript
|
|
50
|
+
import {
|
|
51
|
+
transcodeForYouTube,
|
|
52
|
+
createInMemoryCRUD,
|
|
53
|
+
pandoc,
|
|
54
|
+
freecad,
|
|
55
|
+
gdal,
|
|
56
|
+
} from "@mcptoolshop/toolshopstudio";
|
|
57
|
+
|
|
58
|
+
// ── FFmpeg: YouTube安全トランスコード ──────────────────────────
|
|
59
|
+
const video = await transcodeForYouTube(
|
|
60
|
+
{ inputPath: "input.mp4", outputPath: "output.mp4", preset: "yt-1080p-h264" },
|
|
61
|
+
{ signal, userId, notify, createAsset, runFfmpeg, runProbe },
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
// ── Pandoc: ドキュメント変換 ─────────────────────────────────────
|
|
65
|
+
const doc = await pandoc.convertDocument(
|
|
66
|
+
{ inputPath: "thesis.md", outputPath: "thesis.pdf", preset: "academic-pdf" },
|
|
67
|
+
{ signal, userId, notify, createAsset, runPandoc, checkInput, assertOutput, statFile },
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
// ── FreeCAD: 3D CADエクスポート ──────────────────────────────────
|
|
71
|
+
const part = await freecad.exportPart(
|
|
72
|
+
{ inputPath: "bracket.FCStd", outputPath: "bracket.stl", preset: "stl-print-ready" },
|
|
73
|
+
{ signal, userId, notify, createAsset, runFreeCAD, checkInput, assertOutput, statFile },
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
// ── GDAL: 地理空間変換 ──────────────────────────────────────────
|
|
77
|
+
const geo = await gdal.transformGeo(
|
|
78
|
+
{ inputPath: "terrain.tif", outputPath: "terrain_wgs84.tif", preset: "raster-wgs84-tiff" },
|
|
79
|
+
{ signal, userId, notify, createAsset, runGDAL, checkInput, assertOutput, statFile },
|
|
80
|
+
);
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## アーキテクチャ
|
|
84
|
+
|
|
85
|
+
- **スキーマファースト**: すべての入出力にZodスキーマ、完全な型安全性
|
|
86
|
+
- **コンテキストDI**: すべての副作用をコンテキストオブジェクトで注入、100%モック可能
|
|
87
|
+
- **サンドボックス分離**: すべてのファイル操作でパストラバーサル防止
|
|
88
|
+
- **監視可能**: すべてのステージで型付き通知(進捗、警告、完了)
|
|
89
|
+
- **キャンセル対応**: AbortControllerをパイプラインの全チェックポイントに伝播
|
|
90
|
+
- **フォールバック**: プレミアムプリセットは失敗時に保証プリセットに自動降格
|
|
91
|
+
- **安全な実行**: FreeCADは事前構築されたPythonワンライナーを使用(exec/eval/ユーザーコードなし)
|
|
92
|
+
- **マルチバイナリ**: GDALはプリセットごとにgdalwarp, ogr2ogr, gdal_translateに振り分け
|
|
93
|
+
|
|
94
|
+
## Docker
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
docker build -t toolshopstudio .
|
|
98
|
+
docker run -v ./sandbox:/sandbox toolshopstudio
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
4つのランタイムバイナリ(`ffmpeg`, `pandoc`, `freecad-cmd`, `gdal-bin`)がイメージにプリインストール済み。
|
|
102
|
+
|
|
103
|
+
## 開発
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
npm install # 依存関係
|
|
107
|
+
npm run typecheck # tsc --noEmit
|
|
108
|
+
npm test # vitest(114テスト)
|
|
109
|
+
npm run build # dist/にコンパイル
|
|
110
|
+
npm run smoke # エンドツーエンドスモーク(4ツール全10テスト)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## ライセンス
|
|
114
|
+
|
|
115
|
+
MIT
|