reportflow-mcp 1.1.3 → 1.2.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 (49) hide show
  1. package/dist/auth-context.d.ts +10 -0
  2. package/dist/auth-context.d.ts.map +1 -0
  3. package/dist/auth-context.js +10 -0
  4. package/dist/auth-context.js.map +1 -0
  5. package/dist/auth.d.ts +1 -1
  6. package/dist/auth.d.ts.map +1 -1
  7. package/dist/auth.js +27 -3
  8. package/dist/auth.js.map +1 -1
  9. package/dist/client.d.ts +43 -3
  10. package/dist/client.d.ts.map +1 -1
  11. package/dist/client.js +30 -4
  12. package/dist/client.js.map +1 -1
  13. package/dist/config.d.ts +23 -0
  14. package/dist/config.d.ts.map +1 -0
  15. package/dist/config.js +62 -0
  16. package/dist/config.js.map +1 -0
  17. package/dist/http-server.d.ts +16 -0
  18. package/dist/http-server.d.ts.map +1 -0
  19. package/dist/http-server.js +267 -0
  20. package/dist/http-server.js.map +1 -0
  21. package/dist/http.d.ts +14 -0
  22. package/dist/http.d.ts.map +1 -1
  23. package/dist/http.js +15 -1
  24. package/dist/http.js.map +1 -1
  25. package/dist/index-http.d.ts +2 -0
  26. package/dist/index-http.d.ts.map +1 -0
  27. package/dist/index-http.js +14 -0
  28. package/dist/index-http.js.map +1 -0
  29. package/dist/server.d.ts +41 -0
  30. package/dist/server.d.ts.map +1 -1
  31. package/dist/server.js +110 -53
  32. package/dist/server.js.map +1 -1
  33. package/dist/telemetry/client.d.ts +30 -0
  34. package/dist/telemetry/client.d.ts.map +1 -0
  35. package/dist/telemetry/client.js +85 -0
  36. package/dist/telemetry/client.js.map +1 -0
  37. package/dist/telemetry/index.d.ts +4 -0
  38. package/dist/telemetry/index.d.ts.map +1 -0
  39. package/dist/telemetry/index.js +11 -0
  40. package/dist/telemetry/index.js.map +1 -0
  41. package/dist/telemetry/interceptor.d.ts +9 -0
  42. package/dist/telemetry/interceptor.d.ts.map +1 -0
  43. package/dist/telemetry/interceptor.js +72 -0
  44. package/dist/telemetry/interceptor.js.map +1 -0
  45. package/dist/tools/generate-pdf-sync.d.ts +32 -8
  46. package/dist/tools/generate-pdf-sync.d.ts.map +1 -1
  47. package/dist/tools/generate-pdf-sync.js +118 -10
  48. package/dist/tools/generate-pdf-sync.js.map +1 -1
  49. package/package.json +10 -1
@@ -1,28 +1,136 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.handleGeneratePdfSync = exports.generatePdfSyncTool = void 0;
37
+ const path = __importStar(require("path"));
38
+ const url_1 = require("url");
4
39
  const client_js_1 = require("../client.js");
5
40
  exports.generatePdfSyncTool = {
6
41
  name: 'generate_pdf_sync',
7
- description: 'デザインIDとパラメータを指定してPDFを同期生成します。生成完了後にローカルファイルパスを返します。単一PDFの即時生成に適しています。outputDir を指定するとそのディレクトリに、未指定の場合はクライアントのワークスペース (Roots) または OS 一時ディレクトリに保存します。\n\n【重要】呼び出し前に必ず get_design_parameters でデザインの必要パラメータ構造を確認し、ユーザーから必要な値を聞き出すこと。ユーザーが指定していないパラメータがある場合は、本ツールを呼ぶ前にユーザーに必ず確認すること。プレースホルダー値・架空の値を勝手に生成しないこと。パラメータが一切提供されていない場合も、まずユーザーに値を尋ねること。',
42
+ description: 'デザインIDとパラメータを指定してPDFを生成します。応答にダウンロード URL が含まれるため、本ツール 1 回の呼び出しで結果提示が完結します (別途ダウンロード用ツールを呼ぶ必要はありません)。\n- stdio モード (Claude Desktop / Code): ローカルに保存し絶対パスも返します。outputDir で保存先を指定できます (未指定時はクライアントのワークスペース Roots または OS 一時ディレクトリ)。\n- HTTP モード (claude.ai / n8n 等): サーバー側には保存しません。includePreview=true を指定すると inline preview 用のバイナリも併せて返します (claude.ai が PDF preview をサポートしていない現状ではデフォルト false 推奨)。\n\n【重要】呼び出し前に必ず get_design_parameters でデザインの必要パラメータ構造を確認し、ユーザーから必要な値を聞き出すこと。プレースホルダー値・架空の値を勝手に生成しないこと。',
43
+ };
44
+ const toBase64 = (data) => Buffer.from(data).toString('base64');
45
+ /**
46
+ * EmbeddedResource の `uri` を組み立てる。
47
+ *
48
+ * - filePath あり (stdio mode): `pathToFileURL` で OS 依存パスを RFC 8089 準拠の
49
+ * file URI に変換する。Windows の `C:\\Users\\...` も `file:///C:/Users/...`
50
+ * になる。空白等の特殊文字も URL-encode される。
51
+ * - filePath なし (http mode): サーバ filesystem に書いていないので、fileName
52
+ * を URL-encode した合成 URI を返す。クライアントがファイル位置を解決する
53
+ * ことは期待されない (preview 用 placeholder)。
54
+ */
55
+ const buildResourceUri = (filePath, fileName) => {
56
+ if (filePath) {
57
+ return (0, url_1.pathToFileURL)(filePath).href;
58
+ }
59
+ const safeName = encodeURIComponent(path.basename(fileName));
60
+ return `file:///${safeName}`;
61
+ };
62
+ /**
63
+ * 人間向け 1 行サマリを組み立てる。Claude (LLM) がそのままユーザーに提示できる
64
+ * 形を目指す。stdio は保存先、HTTP は URL を提示。
65
+ */
66
+ const buildHumanSummary = (filePath, fileUrl) => {
67
+ if (filePath && fileUrl) {
68
+ return `PDF生成完了\n- 保存先: ${filePath}\n- ダウンロード: ${fileUrl}`;
69
+ }
70
+ if (filePath)
71
+ return `PDF生成完了\n- 保存先: ${filePath}`;
72
+ if (fileUrl)
73
+ return `PDF生成完了\n- ダウンロード: ${fileUrl}`;
74
+ return 'PDF生成完了';
8
75
  };
9
76
  const handleGeneratePdfSync = async (input, deps = {}) => {
77
+ const mode = deps.mode ?? 'stdio';
78
+ const includePreview = input.includePreview === true;
10
79
  try {
11
- const outputDir = input.outputDir ?? (await deps.resolveOutputDir?.());
12
- const filePath = await (0, client_js_1.generatePdfSync)({ ...input, outputDir });
80
+ const outputDir = mode === 'http'
81
+ ? undefined
82
+ : (input.outputDir ?? (await deps.resolveOutputDir?.()));
83
+ const { data, filePath, fileUrl, requestId, fileId } = await (0, client_js_1.generatePdfSync)({
84
+ designId: input.designId,
85
+ version: input.version,
86
+ content: input.content,
87
+ outputDir,
88
+ skipSave: mode === 'http',
89
+ });
90
+ // ─── text content ───────────────────────────────────────────────────
91
+ // 人間向け 1 行 + 構造化 JSON を 1 つの text に同梱。Claude (LLM) が一貫した
92
+ // 形でユーザーに提示できるようにする。
93
+ const structured = {};
94
+ if (filePath)
95
+ structured.filePath = filePath;
96
+ if (fileUrl)
97
+ structured.fileUrl = fileUrl;
98
+ if (requestId)
99
+ structured.requestId = requestId;
100
+ if (fileId)
101
+ structured.fileId = fileId;
102
+ const summary = buildHumanSummary(filePath, fileUrl);
103
+ const text = Object.keys(structured).length > 0
104
+ ? `${summary}\n\n${JSON.stringify(structured, null, 2)}`
105
+ : summary;
106
+ const content = [
107
+ { type: 'text', text },
108
+ ];
109
+ // ─── EmbeddedResource (opt-in) ──────────────────────────────────────
110
+ // claude.ai は現状 PDF resource を inline 表示しないため、毎回 base64 blob を
111
+ // 返すと payload bloat になる。includePreview=true 明示時のみ含める。
112
+ if (includePreview) {
113
+ const fileName = input.content.fileName;
114
+ content.push({
115
+ type: 'resource',
116
+ resource: {
117
+ uri: buildResourceUri(filePath, fileName),
118
+ mimeType: 'application/pdf',
119
+ blob: toBase64(data),
120
+ },
121
+ });
122
+ }
123
+ return { content };
124
+ }
125
+ catch (err) {
126
+ const message = err instanceof Error ? err.message : String(err);
13
127
  return {
14
128
  content: [
15
129
  {
16
130
  type: 'text',
17
- text: JSON.stringify({ filePath }, null, 2),
131
+ text: `PDF生成に失敗しました: ${message}\n対処: designId / version / params を get_design_parameters の出力と照合してください。認証エラーの場合は再認証が必要です。`,
18
132
  },
19
133
  ],
20
- };
21
- }
22
- catch (err) {
23
- const message = err instanceof Error ? err.message : String(err);
24
- return {
25
- content: [{ type: 'text', text: `エラー: ${message}` }],
26
134
  isError: true,
27
135
  };
28
136
  }
@@ -1 +1 @@
1
- {"version":3,"file":"generate-pdf-sync.js","sourceRoot":"","sources":["../../src/tools/generate-pdf-sync.ts"],"names":[],"mappings":";;;AAAA,4CAA2D;AAE9C,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,8UAA8U;CACjV,CAAC;AAuBK,MAAM,qBAAqB,GAAG,KAAK,EACxC,KAA2B,EAC3B,OAA4B,EAAE,EACE,EAAE;IAClC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QACvE,MAAM,QAAQ,GAAG,MAAM,IAAA,2BAAe,EAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAChE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAM;oBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;iBAC5C;aACF;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO;YACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,OAAO,EAAE,EAAE,CAAC;YACpD,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;AAtBW,QAAA,qBAAqB,yBAsBhC"}
1
+ {"version":3,"file":"generate-pdf-sync.js","sourceRoot":"","sources":["../../src/tools/generate-pdf-sync.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "reportflow-mcp",
3
- "version": "1.1.3",
3
+ "version": "1.2.0",
4
4
  "mcpName": "io.github.re-port-flow/reportflow-mcp",
5
5
  "description": "ReportFlow MCP Server - PDF report generation for Claude and AI agents",
6
6
  "keywords": ["mcp", "pdf", "report", "reportflow", "claude", "anthropic", "ai-agent"],
@@ -27,28 +27,37 @@
27
27
  "scripts": {
28
28
  "build": "tsc -p tsconfig.build.json",
29
29
  "start": "node dist/index.js",
30
+ "start:http": "node dist/index-http.js",
30
31
  "dev": "ts-node src/index.ts",
32
+ "dev:http": "ts-node src/index-http.ts",
31
33
  "lint": "eslint \"src/**/*.ts\" --ignore-pattern \"src/**/*.spec.ts\"",
34
+ "lint:tsc": "tsc -p tsconfig.build.json --noEmit",
32
35
  "format": "prettier --write \"src/**/*.ts\"",
33
36
  "test": "jest"
34
37
  },
35
38
  "dependencies": {
36
39
  "@modelcontextprotocol/sdk": "^1.12.1",
37
40
  "@napi-rs/keyring": "^1.2.0",
41
+ "cors": "^2.8.5",
42
+ "express": "^4.21.2",
38
43
  "open": "^8.4.2",
39
44
  "zod": "^3.25.51"
40
45
  },
41
46
  "devDependencies": {
42
47
  "@eslint/eslintrc": "^3.2.0",
43
48
  "@eslint/js": "^9.18.0",
49
+ "@types/cors": "^2.8.17",
50
+ "@types/express": "^4.17.21",
44
51
  "@types/jest": "^29.5.14",
45
52
  "@types/node": "^22.10.7",
53
+ "@types/supertest": "^6.0.2",
46
54
  "eslint": "^9.18.0",
47
55
  "eslint-config-prettier": "^10.0.1",
48
56
  "eslint-plugin-prettier": "^5.2.2",
49
57
  "globals": "^16.0.0",
50
58
  "jest": "^29.7.0",
51
59
  "prettier": "^3.4.2",
60
+ "supertest": "^7.0.0",
52
61
  "ts-jest": "^29.2.5",
53
62
  "ts-node": "^10.9.2",
54
63
  "typescript": "^5.7.3",