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.
- package/dist/auth-context.d.ts +10 -0
- package/dist/auth-context.d.ts.map +1 -0
- package/dist/auth-context.js +10 -0
- package/dist/auth-context.js.map +1 -0
- package/dist/auth.d.ts +1 -1
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +27 -3
- package/dist/auth.js.map +1 -1
- package/dist/client.d.ts +43 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +30 -4
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +62 -0
- package/dist/config.js.map +1 -0
- package/dist/http-server.d.ts +16 -0
- package/dist/http-server.d.ts.map +1 -0
- package/dist/http-server.js +267 -0
- package/dist/http-server.js.map +1 -0
- package/dist/http.d.ts +14 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/http.js +15 -1
- package/dist/http.js.map +1 -1
- package/dist/index-http.d.ts +2 -0
- package/dist/index-http.d.ts.map +1 -0
- package/dist/index-http.js +14 -0
- package/dist/index-http.js.map +1 -0
- package/dist/server.d.ts +41 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +110 -53
- package/dist/server.js.map +1 -1
- package/dist/telemetry/client.d.ts +30 -0
- package/dist/telemetry/client.d.ts.map +1 -0
- package/dist/telemetry/client.js +85 -0
- package/dist/telemetry/client.js.map +1 -0
- package/dist/telemetry/index.d.ts +4 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +11 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/telemetry/interceptor.d.ts +9 -0
- package/dist/telemetry/interceptor.d.ts.map +1 -0
- package/dist/telemetry/interceptor.js +72 -0
- package/dist/telemetry/interceptor.js.map +1 -0
- package/dist/tools/generate-pdf-sync.d.ts +32 -8
- package/dist/tools/generate-pdf-sync.d.ts.map +1 -1
- package/dist/tools/generate-pdf-sync.js +118 -10
- package/dist/tools/generate-pdf-sync.js.map +1 -1
- 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
|
|
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 =
|
|
12
|
-
|
|
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:
|
|
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":"
|
|
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.
|
|
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",
|