pptx-viewer-mcp 2.0.0 → 2.0.1

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/CHANGELOG.md CHANGED
@@ -4,6 +4,12 @@ All notable changes to this project are documented here.
4
4
  This file is generated from [Conventional Commits](https://www.conventionalcommits.org)
5
5
  by [git-cliff](https://git-cliff.org); do not edit it by hand.
6
6
 
7
+ ## [2.0.0](https://github.com/ChristopherVR/pptx-viewer/releases/tag/pptx-viewer-mcp@2.0.0) - 2026-07-23
8
+
9
+ ### Documentation
10
+
11
+ - Friendly 2.0.0 changelog for root and packages (by @ChristopherVR) ([f56564d](https://github.com/ChristopherVR/pptx-viewer/commit/f56564de0dea3f3aa6f0bdf5ad5ed1bf6e9d4823))
12
+
7
13
  ## 2.0.0
8
14
 
9
15
  V2 tidies the MCP server's public API. (The exact version and date are set
package/dist/index.d.ts CHANGED
@@ -476,10 +476,25 @@ interface ConvertToMarkdownParams {
476
476
  semanticMode?: boolean;
477
477
  sourceName?: string;
478
478
  /**
479
- * Root directory under which `outputDir` must resolve. Defaults to
479
+ * Root directory under which `outputDir` must resolve. Only meaningful when
480
+ * {@link ConvertToMarkdownParams.scopeOutputDir} is supplied. Defaults to
480
481
  * `process.env.PPTX_TOOLS_ROOT` if set, else `process.cwd()`.
481
482
  */
482
483
  rootDir?: string;
484
+ /**
485
+ * Optional host-supplied guard that resolves `outputDir` under `rootDir` and
486
+ * rejects traversal escapes.
487
+ *
488
+ * Confining an output directory is a filesystem concern that only exists on
489
+ * the server, and it needs `node:path` to do correctly. This module is also
490
+ * reached from the browser (the in-viewer AI assistant calls this tool for
491
+ * the markdown string, with no filesystem, so `outputDir` is just a prefix
492
+ * for image links), and a `node:path` import here (even a lazy one behind a
493
+ * runtime check) puts a Node builtin into every bundler's module graph and
494
+ * makes browser builds warn. So the MCP server injects
495
+ * {@link resolveScopedDir} instead and browsers simply omit it.
496
+ */
497
+ scopeOutputDir?: (outputDir: string, rootDir?: string) => string;
483
498
  }
484
499
  interface ConvertToMarkdownResult {
485
500
  markdown: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/execution.ts","../src/tools/slide-tools.ts","../src/tools/helpers.ts","../src/tools/element-tools.ts","../src/tools/table-tools.ts","../src/tools/style-tools.ts","../src/tools/content-tools.ts","../src/tools/conversion-tools.ts","../src/tools/theme-tools.ts","../src/tools/chart-tools.ts","../src/tools/smartart-tools.ts","../src/tools/merge-tools.ts","../src/tools/template-tools.ts","../src/tools/metadata-tools.ts","../src/tools/section-tools.ts","../src/tools/export-tools.ts","../src/tools/hyperlink-tools.ts","../src/tools/geometry-tools.ts","../src/tools/lock-tools.ts","../src/tools/validation-tools.ts","../src/tools/presentation-tools.ts","../src/tools/layout-tools.ts"],"mappings":";;;;;;;UAOiB;;EAEhB,UAAU;;EAEV,gBAAgB,iBAAiB,QAAQ;;EAEzC,gBAAgB,iBAAiB,QAAQ;;;;;;UAOzB,WAAW;;EAE3B,UAAU;;EAEV,QAAQ;;EAER;;;;;;UAWgB;;EAEhB,QAAQ;IAAqB,MAAM;;;EAEnC,SAAS;IACR,QAAQ,MAAM,KAAM,OAAO,YAAY,kBAAkB;IACzD,UAAU,MAAM,MAAO,QAAQ;;;EAGhC,YAAY;;;;;;;UAQI;EAChB,SAAS,eAAe,QAAQ;EAChC,UAAU,cAAc,MAAM,aAAa;;;;;;UAO3B;EAChB,eACC,kBACA,OAAO,YACP;IAAW;IAAoB;;EAEhC,SAAS,mBAAmB;;;;;UAMZ;;EAEhB,YAAY;;EAEZ,gBAAgB;;EAEhB,SAAS;;EAET;;;;;;;;;iBCvEqB,iBACrB,kBACA,SAAS,mBACP;EAAU,UAAU;EAAU,UAAU;;;;;iBA0BrB,iBACrB,kBACA,UAAU,YACV,UAAU,YACV,SAAS,mBACP;EAAU;EAAsB;;;;;;iBAgDb,uBAAuB,GAC5C,kBACA,SAAS,kBACT,SAAS,KAAK,gBAAgB,WAAW,KAAK,QAAQ,WAAW,MAC/D,QAAQ;EAAM;EAAuB;;;;UCxFvB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;;iBAGK,SACf,KAAK,aACL;EAAU;IACR,WAAW;UAuBG;EAChB;EACA;;UAGgB;EAChB;EACA;;iBAGe,SAAS,KAAK,aAAa,QAAQ,iBAAiB,WAAW;UA2B9D;EAChB;;UAGgB;EAChB;EACA;;iBAGe,aACf,KAAK,aACL,QAAQ,qBACN,WAAW;UA4BG;EAChB;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN;EAAa;;UA2BC;EAChB;EACA;;iBAGe,eACf,KAAK,aACL,QAAQ,uBACN;EAAa;EAAuB;;UA4BtB;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGe,sBACf,KAAK,aACL,QAAQ,8BACN;EAAa;;UA8BC;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGe,mBACf,KAAK,aACL,QAAQ,2BACN;EAAa;EAAoB;;UAmCnB;EAChB;EACA;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN;EAAa;EAAqB;;;;iBChSrB;iBAIA;;iBAKA,gBAAgB,IAAI,gBAAc;;iBAwGlC,iBAAiB,OAAO;;iBA0BxB,mBAAmB,oBAAoB;;;UC9HtC;EAChB;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;;iBAGe,WACf,KAAK,aACL,QAAQ,mBACN,WAAW;UAmKG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN;EAAa;;UA8GC;EAChB;EACA;;iBAGe,eACf,KAAK,aACL,QAAQ,uBACN;EAAa;;UA0BC;EAChB;EACA;EAEA;EACA;EAEA;EACA;;iBAGe,gBACf,KAAK,aACL,QAAQ,wBACN;EAAa;;UA6GC;EAChB;EACA;EACA;EACA;EACA;;UAGgB;EAChB;;iBAGe,aACf,KAAK,aACL,QAAQ,qBACN,WAAW;UAuCG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,oBACf,KAAK,aACL,QAAQ,4BACN;EAAa;;UAsDC;EAChB;EACA;;UAGgB;EAChB;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN,WAAW;UAyDG;EAChB;EACA;;UAGgB;EAChB;;iBAGe,gBACf,KAAK,aACL,QAAQ,wBACN,WAAW;UAqCG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,oBACf,KAAK,aACL,QAAQ,4BACN;EAAa;;;;UC7vBC;EAChB;EACA;EACA,OAAO;IAAQ;IAAa;IAAa;;;iBAG1B,iBACf,KAAK,aACL,QAAQ,yBACN;EAAa;;UA6CC;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGe,qBACf,KAAK,aACL,QAAQ,6BACN;EAAa;EAAkB;;;;UCjEjB;EAChB;EACA;EAEA;EACA,WAAW;EACX,oBAAoB;IAAQ;IAAe;IAAkB;;EAC7D;EACA;EACA;EAEA;EACA;EACA,aAAa;EACb;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,mBACf,KAAK,aACL,QAAQ,2BACN;EAAa;;UA6HC;EAChB;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;EACA;EACA;EACA,QAAQ;;iBAGO,sBAAsB,KAAK,cAAc,WAAW;;;UCnJnD;EAChB;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA,SAAS;;iBAGM,SAAS,KAAK,aAAa,QAAQ,iBAAiB,WAAW;UA2G9D;EAChB;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;;iBAGe,YACf,KAAK,aACL,QAAQ,oBACN,WAAW;UAiGG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA,WAAW;EACX;EACA;;iBAGe,eACf,KAAK,aACL,QAAQ,uBACN,WAAW;;;UC/SG;EAChB;EACA;EACA;EACA;IAAe;IAAgB;;EAC/B;EACA;EACA;;;;;EAKA;;UA0BgB;EAChB;EACA;EACA;EACA;;iBAGqB,kBACrB,KAAK,aACL,QAAQ,0BACN,QAAQ,WAAW;;;UC9CL;EAChB;EACA,cAAc;EACd,aAAa;EACb;;iBAGe,aAAa,KAAK,cAAc,WAAW;UAgB1C;EAChB;;UAGgB;EAChB;EACA,aAAa;;iBAGE,iBACf,KAAK,aACL,QAAQ,yBACN,WAAW;UA8BG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,kBACf,KAAK,aACL,QAAQ,0BACN;EAAa,aAAa;;UAsCZ;EAChB;EACA;;iBAGe,iBACf,KAAK,aACL,QAAQ,yBACN;EAAa,YAAY;;;;UCpHX;EAChB;EACA;EACA;EACA;EACA;EACA;IAAW;IAAgB;;EAC3B;IACC;IACA;IACA;I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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/execution.ts","../src/tools/slide-tools.ts","../src/tools/helpers.ts","../src/tools/element-tools.ts","../src/tools/table-tools.ts","../src/tools/style-tools.ts","../src/tools/content-tools.ts","../src/tools/conversion-tools.ts","../src/tools/theme-tools.ts","../src/tools/chart-tools.ts","../src/tools/smartart-tools.ts","../src/tools/merge-tools.ts","../src/tools/template-tools.ts","../src/tools/metadata-tools.ts","../src/tools/section-tools.ts","../src/tools/export-tools.ts","../src/tools/hyperlink-tools.ts","../src/tools/geometry-tools.ts","../src/tools/lock-tools.ts","../src/tools/validation-tools.ts","../src/tools/presentation-tools.ts","../src/tools/layout-tools.ts"],"mappings":";;;;;;;UAOiB;;EAEhB,UAAU;;EAEV,gBAAgB,iBAAiB,QAAQ;;EAEzC,gBAAgB,iBAAiB,QAAQ;;;;;;UAOzB,WAAW;;EAE3B,UAAU;;EAEV,QAAQ;;EAER;;;;;;UAWgB;;EAEhB,QAAQ;IAAqB,MAAM;;;EAEnC,SAAS;IACR,QAAQ,MAAM,KAAM,OAAO,YAAY,kBAAkB;IACzD,UAAU,MAAM,MAAO,QAAQ;;;EAGhC,YAAY;;;;;;;UAQI;EAChB,SAAS,eAAe,QAAQ;EAChC,UAAU,cAAc,MAAM,aAAa;;;;;;UAO3B;EAChB,eACC,kBACA,OAAO,YACP;IAAW;IAAoB;;EAEhC,SAAS,mBAAmB;;;;;UAMZ;;EAEhB,YAAY;;EAEZ,gBAAgB;;EAEhB,SAAS;;EAET;;;;;;;;;iBCvEqB,iBACrB,kBACA,SAAS,mBACP;EAAU,UAAU;EAAU,UAAU;;;;;iBA0BrB,iBACrB,kBACA,UAAU,YACV,UAAU,YACV,SAAS,mBACP;EAAU;EAAsB;;;;;;iBAgDb,uBAAuB,GAC5C,kBACA,SAAS,kBACT,SAAS,KAAK,gBAAgB,WAAW,KAAK,QAAQ,WAAW,MAC/D,QAAQ;EAAM;EAAuB;;;;UCxFvB;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA,UAAU;;iBAGK,SACf,KAAK,aACL;EAAU;IACR,WAAW;UAuBG;EAChB;EACA;;UAGgB;EAChB;EACA;;iBAGe,SAAS,KAAK,aAAa,QAAQ,iBAAiB,WAAW;UA2B9D;EAChB;;UAGgB;EAChB;EACA;;iBAGe,aACf,KAAK,aACL,QAAQ,qBACN,WAAW;UA4BG;EAChB;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN;EAAa;;UA2BC;EAChB;EACA;;iBAGe,eACf,KAAK,aACL,QAAQ,uBACN;EAAa;EAAuB;;UA4BtB;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGe,sBACf,KAAK,aACL,QAAQ,8BACN;EAAa;;UA8BC;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGe,mBACf,KAAK,aACL,QAAQ,2BACN;EAAa;EAAoB;;UAmCnB;EAChB;EACA;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN;EAAa;EAAqB;;;;iBChSrB;iBAIA;;iBAKA,gBAAgB,IAAI,gBAAc;;iBAwGlC,iBAAiB,OAAO;;iBA0BxB,mBAAmB,oBAAoB;;;UC9HtC;EAChB;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;;iBAGe,WACf,KAAK,aACL,QAAQ,mBACN,WAAW;UAmKG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN;EAAa;;UA8GC;EAChB;EACA;;iBAGe,eACf,KAAK,aACL,QAAQ,uBACN;EAAa;;UA0BC;EAChB;EACA;EAEA;EACA;EAEA;EACA;;iBAGe,gBACf,KAAK,aACL,QAAQ,wBACN;EAAa;;UA6GC;EAChB;EACA;EACA;EACA;EACA;;UAGgB;EAChB;;iBAGe,aACf,KAAK,aACL,QAAQ,qBACN,WAAW;UAuCG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,oBACf,KAAK,aACL,QAAQ,4BACN;EAAa;;UAsDC;EAChB;EACA;;UAGgB;EAChB;;iBAGe,cACf,KAAK,aACL,QAAQ,sBACN,WAAW;UAyDG;EAChB;EACA;;UAGgB;EAChB;;iBAGe,gBACf,KAAK,aACL,QAAQ,wBACN,WAAW;UAqCG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,oBACf,KAAK,aACL,QAAQ,4BACN;EAAa;;;;UC7vBC;EAChB;EACA;EACA,OAAO;IAAQ;IAAa;IAAa;;;iBAG1B,iBACf,KAAK,aACL,QAAQ,yBACN;EAAa;;UA6CC;EAChB;EACA;EACA;EACA;EACA;EACA;;iBAGe,qBACf,KAAK,aACL,QAAQ,6BACN;EAAa;EAAkB;;;;UCjEjB;EAChB;EACA;EAEA;EACA,WAAW;EACX,oBAAoB;IAAQ;IAAe;IAAkB;;EAC7D;EACA;EACA;EAEA;EACA;EACA,aAAa;EACb;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,mBACf,KAAK,aACL,QAAQ,2BACN;EAAa;;UA6HC;EAChB;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;EACA;EACA;EACA,QAAQ;;iBAGO,sBAAsB,KAAK,cAAc,WAAW;;;UCnJnD;EAChB;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA,SAAS;;iBAGM,SAAS,KAAK,aAAa,QAAQ,iBAAiB,WAAW;UA2G9D;EAChB;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;;iBAGe,YACf,KAAK,aACL,QAAQ,oBACN,WAAW;UAiGG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA;EACA;EACA;EACA;EACA;;UAGgB;EAChB;EACA,WAAW;EACX;EACA;;iBAGe,eACf,KAAK,aACL,QAAQ,uBACN,WAAW;;;UCpTG;EAChB;EACA;EACA;EACA;IAAe;IAAgB;;EAC/B;EACA;EACA;;;;;;EAMA;;;;;;;;;;;;;;EAcA,kBAAkB,mBAAmB;;UAGrB;EAChB;EACA;EACA;EACA;;iBAGqB,kBACrB,KAAK,aACL,QAAQ,0BACN,QAAQ,WAAW;;;UCjCL;EAChB;EACA,cAAc;EACd,aAAa;EACb;;iBAGe,aAAa,KAAK,cAAc,WAAW;UAgB1C;EAChB;;UAGgB;EAChB;EACA,aAAa;;iBAGE,iBACf,KAAK,aACL,QAAQ,yBACN,WAAW;UA8BG;EAChB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;iBAGe,kBACf,KAAK,aACL,QAAQ,0BACN;EAAa,aAAa;;UAsCZ;EAChB;EACA;;iBAGe,iBACf,KAAK,aACL,QAAQ,yBACN;EAAa,YAAY;;;;UCpHX;EAChB;EACA;EACA;EACA;EACA;EACA;IA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"}
package/dist/index.js CHANGED
@@ -1556,24 +1556,6 @@ function manageComments(ctx, params) {
1556
1556
  }
1557
1557
  }
1558
1558
  }
1559
- function isNodeRuntime() {
1560
- return typeof process !== "undefined" && Boolean(process.versions?.node);
1561
- }
1562
- async function scopeOutputDir(outputDir, rootDir) {
1563
- if (!isNodeRuntime()) {
1564
- return outputDir;
1565
- }
1566
- const { isAbsolute, resolve, sep } = await import('path');
1567
- const root = resolve(rootDir ?? process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
1568
- const resolved = isAbsolute(outputDir) ? resolve(outputDir) : resolve(root, outputDir);
1569
- const rootWithSep = root.endsWith(sep) ? root : root + sep;
1570
- if (resolved !== root && !resolved.startsWith(rootWithSep)) {
1571
- throw new Error(
1572
- `convertToMarkdown: outputDir "${outputDir}" resolves outside the allowed root "${root}"`
1573
- );
1574
- }
1575
- return resolved;
1576
- }
1577
1559
  async function convertToMarkdown(ctx, params) {
1578
1560
  const options = {
1579
1561
  mediaFolderName: params.mediaFolderName ?? "media",
@@ -1583,7 +1565,8 @@ async function convertToMarkdown(ctx, params) {
1583
1565
  semanticMode: params.semanticMode === true,
1584
1566
  sourceName: params.sourceName ?? "unknown"
1585
1567
  };
1586
- const safeOutputDir = await scopeOutputDir(params.outputDir ?? ".", params.rootDir);
1568
+ const outputDir = params.outputDir ?? ".";
1569
+ const safeOutputDir = params.scopeOutputDir ? params.scopeOutputDir(outputDir, params.rootDir) : outputDir;
1587
1570
  const converter = new pptxViewerCore.PptxMarkdownConverter(safeOutputDir, options);
1588
1571
  const markdown = await converter.convert(ctx.pptxData);
1589
1572
  return {
package/dist/index.mjs CHANGED
@@ -1555,24 +1555,6 @@ function manageComments(ctx, params) {
1555
1555
  }
1556
1556
  }
1557
1557
  }
1558
- function isNodeRuntime() {
1559
- return typeof process !== "undefined" && Boolean(process.versions?.node);
1560
- }
1561
- async function scopeOutputDir(outputDir, rootDir) {
1562
- if (!isNodeRuntime()) {
1563
- return outputDir;
1564
- }
1565
- const { isAbsolute, resolve, sep } = await import('path');
1566
- const root = resolve(rootDir ?? process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
1567
- const resolved = isAbsolute(outputDir) ? resolve(outputDir) : resolve(root, outputDir);
1568
- const rootWithSep = root.endsWith(sep) ? root : root + sep;
1569
- if (resolved !== root && !resolved.startsWith(rootWithSep)) {
1570
- throw new Error(
1571
- `convertToMarkdown: outputDir "${outputDir}" resolves outside the allowed root "${root}"`
1572
- );
1573
- }
1574
- return resolved;
1575
- }
1576
1558
  async function convertToMarkdown(ctx, params) {
1577
1559
  const options = {
1578
1560
  mediaFolderName: params.mediaFolderName ?? "media",
@@ -1582,7 +1564,8 @@ async function convertToMarkdown(ctx, params) {
1582
1564
  semanticMode: params.semanticMode === true,
1583
1565
  sourceName: params.sourceName ?? "unknown"
1584
1566
  };
1585
- const safeOutputDir = await scopeOutputDir(params.outputDir ?? ".", params.rootDir);
1567
+ const outputDir = params.outputDir ?? ".";
1568
+ const safeOutputDir = params.scopeOutputDir ? params.scopeOutputDir(outputDir, params.rootDir) : outputDir;
1586
1569
  const converter = new PptxMarkdownConverter(safeOutputDir, options);
1587
1570
  const markdown = await converter.convert(ctx.pptxData);
1588
1571
  return {
package/dist/mcp/index.js CHANGED
@@ -1044,24 +1044,6 @@ function manageComments(ctx, params) {
1044
1044
  }
1045
1045
  }
1046
1046
  }
1047
- function isNodeRuntime() {
1048
- return typeof process !== "undefined" && Boolean(process.versions?.node);
1049
- }
1050
- async function scopeOutputDir(outputDir, rootDir) {
1051
- if (!isNodeRuntime()) {
1052
- return outputDir;
1053
- }
1054
- const { isAbsolute: isAbsolute2, resolve: resolve2, sep: sep2 } = await import('path');
1055
- const root = resolve2(rootDir ?? process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
1056
- const resolved = isAbsolute2(outputDir) ? resolve2(outputDir) : resolve2(root, outputDir);
1057
- const rootWithSep = root.endsWith(sep2) ? root : root + sep2;
1058
- if (resolved !== root && !resolved.startsWith(rootWithSep)) {
1059
- throw new Error(
1060
- `convertToMarkdown: outputDir "${outputDir}" resolves outside the allowed root "${root}"`
1061
- );
1062
- }
1063
- return resolved;
1064
- }
1065
1047
  async function convertToMarkdown(ctx, params) {
1066
1048
  const options = {
1067
1049
  mediaFolderName: params.mediaFolderName ?? "media",
@@ -1071,7 +1053,8 @@ async function convertToMarkdown(ctx, params) {
1071
1053
  semanticMode: params.semanticMode === true,
1072
1054
  sourceName: params.sourceName ?? "unknown"
1073
1055
  };
1074
- const safeOutputDir = await scopeOutputDir(params.outputDir ?? ".", params.rootDir);
1056
+ const outputDir = params.outputDir ?? ".";
1057
+ const safeOutputDir = params.scopeOutputDir ? params.scopeOutputDir(outputDir, params.rootDir) : outputDir;
1075
1058
  const converter = new pptxViewerCore.PptxMarkdownConverter(safeOutputDir, options);
1076
1059
  const markdown = await converter.convert(ctx.pptxData);
1077
1060
  return {
@@ -2986,16 +2969,23 @@ async function executeToolWithContext(filePath, execCtx, toolFn) {
2986
2969
 
2987
2970
  // src/mcp/handlers.ts
2988
2971
  var ALLOWED_EXTENSIONS = /* @__PURE__ */ new Set([".pptx", ".ppt"]);
2989
- function resolveScopedFilePath(filePath, rootDir) {
2990
- if (typeof filePath !== "string" || filePath.length === 0) {
2991
- throw new Error("MCP tool: filePath must be a non-empty string");
2972
+ function resolveScopedDir(dir, rootDir) {
2973
+ if (typeof dir !== "string" || dir.length === 0) {
2974
+ throw new Error("MCP tool: path must be a non-empty string");
2992
2975
  }
2993
- const root = path.resolve(process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
2994
- const resolved = path.isAbsolute(filePath) ? path.resolve(filePath) : path.resolve(root, filePath);
2976
+ const root = path.resolve(rootDir ?? process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
2977
+ const resolved = path.isAbsolute(dir) ? path.resolve(dir) : path.resolve(root, dir);
2995
2978
  const rootWithSep = root.endsWith(path.sep) ? root : root + path.sep;
2996
2979
  if (resolved !== root && !resolved.startsWith(rootWithSep)) {
2997
- throw new Error(`MCP tool: filePath "${filePath}" resolves outside the allowed root "${root}"`);
2980
+ throw new Error(`MCP tool: path "${dir}" resolves outside the allowed root "${root}"`);
2981
+ }
2982
+ return resolved;
2983
+ }
2984
+ function resolveScopedFilePath(filePath, rootDir) {
2985
+ if (typeof filePath !== "string" || filePath.length === 0) {
2986
+ throw new Error("MCP tool: filePath must be a non-empty string");
2998
2987
  }
2988
+ const resolved = resolveScopedDir(filePath, rootDir);
2999
2989
  const lower = resolved.toLowerCase();
3000
2990
  let isAllowed = false;
3001
2991
  for (const ext of ALLOWED_EXTENSIONS) {
@@ -3021,7 +3011,7 @@ function createMcpContext(_options) {
3021
3011
  return { filesystem: nodeFs };
3022
3012
  }
3023
3013
  async function runMcpTool(filePath, fn, options) {
3024
- const safePath = resolveScopedFilePath(filePath);
3014
+ const safePath = resolveScopedFilePath(filePath, options?.rootDir);
3025
3015
  const ctx = createMcpContext();
3026
3016
  return executeToolWithContext(safePath, ctx, fn);
3027
3017
  }
@@ -3541,7 +3531,7 @@ function createServer() {
3541
3531
  async (params) => {
3542
3532
  const result = await runMcpTool(
3543
3533
  params.filePath,
3544
- (ctx) => convertToMarkdown(ctx, params)
3534
+ (ctx) => convertToMarkdown(ctx, { ...params, scopeOutputDir: resolveScopedDir })
3545
3535
  );
3546
3536
  return {
3547
3537
  content: [
@@ -1042,24 +1042,6 @@ function manageComments(ctx, params) {
1042
1042
  }
1043
1043
  }
1044
1044
  }
1045
- function isNodeRuntime() {
1046
- return typeof process !== "undefined" && Boolean(process.versions?.node);
1047
- }
1048
- async function scopeOutputDir(outputDir, rootDir) {
1049
- if (!isNodeRuntime()) {
1050
- return outputDir;
1051
- }
1052
- const { isAbsolute: isAbsolute2, resolve: resolve2, sep: sep2 } = await import('path');
1053
- const root = resolve2(rootDir ?? process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
1054
- const resolved = isAbsolute2(outputDir) ? resolve2(outputDir) : resolve2(root, outputDir);
1055
- const rootWithSep = root.endsWith(sep2) ? root : root + sep2;
1056
- if (resolved !== root && !resolved.startsWith(rootWithSep)) {
1057
- throw new Error(
1058
- `convertToMarkdown: outputDir "${outputDir}" resolves outside the allowed root "${root}"`
1059
- );
1060
- }
1061
- return resolved;
1062
- }
1063
1045
  async function convertToMarkdown(ctx, params) {
1064
1046
  const options = {
1065
1047
  mediaFolderName: params.mediaFolderName ?? "media",
@@ -1069,7 +1051,8 @@ async function convertToMarkdown(ctx, params) {
1069
1051
  semanticMode: params.semanticMode === true,
1070
1052
  sourceName: params.sourceName ?? "unknown"
1071
1053
  };
1072
- const safeOutputDir = await scopeOutputDir(params.outputDir ?? ".", params.rootDir);
1054
+ const outputDir = params.outputDir ?? ".";
1055
+ const safeOutputDir = params.scopeOutputDir ? params.scopeOutputDir(outputDir, params.rootDir) : outputDir;
1073
1056
  const converter = new PptxMarkdownConverter(safeOutputDir, options);
1074
1057
  const markdown = await converter.convert(ctx.pptxData);
1075
1058
  return {
@@ -2984,16 +2967,23 @@ async function executeToolWithContext(filePath, execCtx, toolFn) {
2984
2967
 
2985
2968
  // src/mcp/handlers.ts
2986
2969
  var ALLOWED_EXTENSIONS = /* @__PURE__ */ new Set([".pptx", ".ppt"]);
2987
- function resolveScopedFilePath(filePath, rootDir) {
2988
- if (typeof filePath !== "string" || filePath.length === 0) {
2989
- throw new Error("MCP tool: filePath must be a non-empty string");
2970
+ function resolveScopedDir(dir, rootDir) {
2971
+ if (typeof dir !== "string" || dir.length === 0) {
2972
+ throw new Error("MCP tool: path must be a non-empty string");
2990
2973
  }
2991
- const root = resolve(process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
2992
- const resolved = isAbsolute(filePath) ? resolve(filePath) : resolve(root, filePath);
2974
+ const root = resolve(rootDir ?? process.env["PPTX_TOOLS_ROOT"] ?? process.cwd());
2975
+ const resolved = isAbsolute(dir) ? resolve(dir) : resolve(root, dir);
2993
2976
  const rootWithSep = root.endsWith(sep) ? root : root + sep;
2994
2977
  if (resolved !== root && !resolved.startsWith(rootWithSep)) {
2995
- throw new Error(`MCP tool: filePath "${filePath}" resolves outside the allowed root "${root}"`);
2978
+ throw new Error(`MCP tool: path "${dir}" resolves outside the allowed root "${root}"`);
2979
+ }
2980
+ return resolved;
2981
+ }
2982
+ function resolveScopedFilePath(filePath, rootDir) {
2983
+ if (typeof filePath !== "string" || filePath.length === 0) {
2984
+ throw new Error("MCP tool: filePath must be a non-empty string");
2996
2985
  }
2986
+ const resolved = resolveScopedDir(filePath, rootDir);
2997
2987
  const lower = resolved.toLowerCase();
2998
2988
  let isAllowed = false;
2999
2989
  for (const ext of ALLOWED_EXTENSIONS) {
@@ -3019,7 +3009,7 @@ function createMcpContext(_options) {
3019
3009
  return { filesystem: nodeFs };
3020
3010
  }
3021
3011
  async function runMcpTool(filePath, fn, options) {
3022
- const safePath = resolveScopedFilePath(filePath);
3012
+ const safePath = resolveScopedFilePath(filePath, options?.rootDir);
3023
3013
  const ctx = createMcpContext();
3024
3014
  return executeToolWithContext(safePath, ctx, fn);
3025
3015
  }
@@ -3539,7 +3529,7 @@ function createServer() {
3539
3529
  async (params) => {
3540
3530
  const result = await runMcpTool(
3541
3531
  params.filePath,
3542
- (ctx) => convertToMarkdown(ctx, params)
3532
+ (ctx) => convertToMarkdown(ctx, { ...params, scopeOutputDir: resolveScopedDir })
3543
3533
  );
3544
3534
  return {
3545
3535
  content: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pptx-viewer-mcp",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "description": "PowerPoint PPTX tools and MCP server: manipulate, convert, and collaborate on .pptx files from AI agents.",
5
5
  "keywords": [
6
6
  "ai",
@@ -72,11 +72,11 @@
72
72
  "@modelcontextprotocol/sdk": "^1.29.0",
73
73
  "fast-xml-parser": "^5.10.1",
74
74
  "jszip": "^3.10.1",
75
- "pptx-viewer-core": "^1.1.0",
75
+ "pptx-viewer-core": "^2.0.0",
76
76
  "zod": "^4.4.3"
77
77
  },
78
78
  "devDependencies": {
79
- "tsdown": "^0.22.12",
79
+ "tsdown": "^0.22.14",
80
80
  "tsup": "^8.5.1",
81
81
  "typescript": "^7.0.2",
82
82
  "vitest": "^4.1.10",