@vint.tri/report_gen_mcp 1.7.32 → 1.7.33

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 CHANGED
@@ -1,167 +1,47 @@
1
- # Report Generator MCP
1
+ # Генератор Отчетов (report_gen_mcp)
2
2
 
3
- A powerful CLI tool and MCP server for generating HTML reports with embedded charts and images.
3
+ Этот инструмент позволяет создавать качественные, визуально насыщенные HTML-отчеты на основе простого текстового описания.
4
4
 
5
- ## Features
5
+ ## Основной инструмент: `create_report`
6
6
 
7
- - Generate professional HTML reports from Markdown documents
8
- - Embed interactive charts (bar, line, pie, doughnut, radar, polarArea)
9
- - Embed AI-generated images using Pollinations.ai
10
- - Embed images from URLs
11
- - Edit existing reports by adding, removing, or replacing content
12
- - MCP server integration for use with Claude Desktop
7
+ Это единственный инструмент, который вам нужно использовать. Он берет на себя всю сложную работу по анализу текста, генерации диаграмм и подбору изображений.
13
8
 
14
- ## Installation
9
+ ### Параметры:
10
+ - `report_description` (string): **Обязательный.** Подробное текстовое описание того, какой отчет вы хотите получить. Включите в него все данные, которые должны быть отражены.
11
+ - `outputFile` (string): **Обязательный.** Имя файла для сохранения отчета (например, `my_report.html`).
15
12
 
16
- ```bash
17
- npm install -g @vint.tri/report_gen_mcp@latest
18
- ```
19
-
20
- For Python dependencies (required for image generation/editing):
21
-
22
- ```bash
23
- npm run install-python-deps
24
- ```
25
-
26
- Or set up a Python virtual environment:
27
-
28
- ```bash
29
- npm run setup-python
30
- ```
31
-
32
- ## Environment Variables
33
-
34
- - `REPORTS_DIR`: Directory where reports will be generated (required for CLI and HTTP API modes)
35
- - `CHUTES_API_TOKEN`: API token for Chutes AI services (required for image generation/editing)
36
- - `IMG_SAVE_BASE_DIR`: Base directory for saving generated/edited images
37
-
38
- ## Usage
39
-
40
- ### CLI Mode
41
-
42
- ```bash
43
- # Set the reports directory
44
- export REPORTS_DIR=/path/to/reports
45
-
46
- # Generate a report
47
- report_gen_mcp generate --document report.md --elements '{"chart1":{"type":"bar","config":{"labels":["A","B","C"],"datasets":[{"label":"Dataset 1","data":[1,2,3]}]}}}'
48
- ```
49
-
50
- ### Programmatic Usage (Node.js)
51
-
52
- ```javascript
53
- import { generateReport, generateImage } from '@vint.tri/report_gen_mcp';
13
+ ### Как это работает:
14
+ 1. Вы предоставляете текстовое описание.
15
+ 2. Инструмент анализирует текст, находит ключевые данные и темы.
16
+ 3. На основе анализа, он автоматически генерирует 1-3 диаграммы и 1-2 релевантных изображения.
17
+ 4. Он создает полноценный HTML-отчет с вашим текстом и сгенерированными визуальными элементами.
18
+ 5. Отчет сохраняется во временной директории, и вам возвращается путь к файлу.
54
19
 
55
- // Generate a report
56
- const reportResult = await generateReport(
57
- '# My Report\nThis is a sample report with a chart.\n[[chart:chart1]]',
58
- {
59
- chart1: {
60
- type: 'bar',
61
- config: {
62
- labels: ['A', 'B', 'C'],
63
- datasets: [{
64
- label: 'Dataset 1',
65
- data: [1, 2, 3]
66
- }]
67
- }
68
- }
69
- },
70
- '/path/to/output/report.html'
71
- );
20
+ ---
72
21
 
73
- // Generate an image
74
- const imageDataUri = await generateImage('A beautiful landscape', {
75
- width: 512,
76
- height: 512,
77
- guidance_scale: 7.5
78
- });
79
- ```
80
-
81
- ### HTTP API Mode
82
-
83
- ```bash
84
- # Start the server
85
- report_gen_mcp start-server
86
-
87
- # Generate a report via HTTP POST to http://localhost:3000/generate-report
88
- curl -X POST http://localhost:3000/generate-report \
89
- -H "Content-Type: application/json" \
90
- -d '{
91
- "document": "# My Report\nThis is a sample report with a chart.\n[[chart:chart1]]",
92
- "elements": {
93
- "chart1": {
94
- "type": "bar",
95
- "config": {
96
- "labels": ["A", "B", "C"],
97
- "datasets": [{
98
- "label": "Dataset 1",
99
- "data": [1, 2, 3]
100
- }]
101
- }
102
- }
103
- }
104
- }'
105
- ```
106
-
107
- ### MCP Server Mode (for Claude Desktop)
22
+ ### **Пример использования**
108
23
 
109
- Run without arguments to start the MCP server:
24
+ **Ваш запрос:**
25
+ "Сделай отчет о финансовых результатах Apple за 2024 год. Общий доход составил $391 млрд, а чистая прибыль — $99 млрд. Продажи по продуктам: iPhone - $216 млрд, Mac - $31 млрд, iPad - $27 млрд."
110
26
 
111
- ```bash
112
- report_gen_mcp
27
+ **Правильный вызов инструмента:**
28
+ ```json
29
+ {
30
+ "method": "create_report",
31
+ "params": {
32
+ "report_description": "Финансовый отчет Apple за 2024 год. Общий доход составил $391 млрд, а чистая прибыль — $99 млрд. Продажи по продуктам: iPhone - $216 млрд, Mac - $31 млрд, iPad - $27 млрд.",
33
+ "outputFile": "apple_finance_2024.html"
34
+ }
35
+ }
113
36
  ```
114
37
 
115
- Available tools:
116
- 1. `generate-report`: Generate an HTML report with embedded charts and images
117
- 2. `edit-report`: Edit an existing HTML report by adding or removing content
118
- 3. `generate-image`: Generate an image from a text prompt using AI
119
-
120
- ## Image Generation and Editing
121
-
122
- This tool includes advanced image generation and editing capabilities powered by Chutes AI:
123
-
124
- ### Generate Image
125
- Create new images from text prompts with customizable parameters:
126
- - Prompt (in English)
127
- - Width and height (128-2048 pixels)
128
- - Model selection
129
- - Guidance scale
130
- - Negative prompts
131
- - Number of inference steps
132
- - Seed for reproducibility
133
-
134
- ### Edit Image
135
- Modify existing images based on text descriptions:
136
- - Input image path
137
- - Output image path
138
- - Edit prompt (in English)
139
- - Width and height (512-2048 pixels)
140
- - CFG scale
141
- - Negative prompts
142
- - Number of inference steps
143
- - Seed for reproducibility
144
-
145
- ## Report Elements
146
-
147
- Reports can include various elements referenced in the Markdown document using placeholders like `[[chart:id]]` or `[[image:id]]`.
148
-
149
- ### Charts
150
- - Bar charts
151
- - Line charts
152
- - Pie charts
153
- - Doughnut charts
154
- - Radar charts
155
- - Polar area charts
156
-
157
- ### Images
158
- - AI-generated images (Pollinations.ai)
159
- - Images from URLs
160
-
161
- ## Examples
162
-
163
- See the test files in the repository for examples of how to use all features.
38
+ **Результат:**
39
+ Инструмент вернет вам путь к готовому HTML-файлу, который будет содержать:
40
+ - Ваш текст.
41
+ - Диаграмму, сравнивающую общий доход и чистую прибыль.
42
+ - Круговую диаграмму с разбивкой продаж по продуктам.
43
+ - Релевантное изображение на тему технологий или Apple.
164
44
 
165
- ## License
45
+ ---
166
46
 
167
- MIT
47
+ **КЛЮЧЕВОЕ ПРАВИЛО:** Просто опишите, что вы хотите видеть в отчете, и передайте это описание в `create_report`. Не пытайтесь самостоятельно формировать сложные структуры данных.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA4IA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA+HA,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBjD"}
package/dist/index.js CHANGED
@@ -6,9 +6,9 @@ import path from 'path';
6
6
  import fs from 'fs-extra';
7
7
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
8
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
9
- import { z } from 'zod';
10
9
  import { pathToFileURL } from 'url';
11
10
  import { ImageGenerator } from './mcp/imageGenerationServer.js';
11
+ import { reportWizardTool } from './tools/reportWizard.js';
12
12
  const isStdioMode = process.argv.length === 2;
13
13
  let reportsDir = undefined;
14
14
  if (!isStdioMode) {
@@ -73,30 +73,16 @@ program
73
73
  console.log(JSON.stringify(comprehensiveResult, null, 2));
74
74
  });
75
75
  if (isStdioMode) {
76
- const mcpServer = new McpServer({ name: "report_gen_mcp", version: "1.7.32" });
77
- mcpServer.registerTool("generate-report", {
78
- description: "Generate an HTML report with embedded charts and images",
79
- inputSchema: {
80
- document: z.string().describe("Markdown document with placeholders"),
81
- elements: z.any().describe("A JSON object or a stringified JSON object of elements"),
82
- outputFile: z.string().optional().describe("Output HTML file name"),
83
- tempDirectory: z.string().optional().describe("Temporary directory for file storage"),
84
- },
76
+ const mcpServer = new McpServer({ name: "report_gen_mcp", version: "1.7.33" });
77
+ mcpServer.registerTool(reportWizardTool.name, {
78
+ description: reportWizardTool.description,
79
+ inputSchema: reportWizardTool.inputSchema,
85
80
  }, async (params) => {
86
81
  let processedParams = params;
87
82
  if (params.arguments && typeof params.arguments === 'object') {
88
83
  processedParams = params.arguments;
89
84
  }
90
- let { document, elements, outputFile = 'report.html', tempDirectory } = processedParams;
91
- try {
92
- if (typeof elements === 'string') {
93
- elements = JSON.parse(elements);
94
- }
95
- }
96
- catch (e) {
97
- throw new Error('Invalid JSON format for "elements" parameter.');
98
- }
99
- const result = await generateReport(document, elements, outputFile, tempDirectory);
85
+ const result = await reportWizardTool.execute(processedParams);
100
86
  const fileUrl = pathToFileURL(result.filePath).href;
101
87
  const fileContent = await fs.readFile(result.filePath, 'utf8');
102
88
  return {
@@ -0,0 +1,17 @@
1
+ import { z } from 'zod';
2
+ export declare const reportWizardTool: {
3
+ name: string;
4
+ description: string;
5
+ inputSchema: {
6
+ report_description: z.ZodString;
7
+ outputFile: z.ZodString;
8
+ };
9
+ execute: ({ report_description, outputFile }: {
10
+ report_description: string;
11
+ outputFile: string;
12
+ }) => Promise<{
13
+ success: boolean;
14
+ filePath: string;
15
+ }>;
16
+ };
17
+ //# sourceMappingURL=reportWizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reportWizard.d.ts","sourceRoot":"","sources":["../../src/tools/reportWizard.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AA8DxB,eAAO,MAAM,gBAAgB;;;;;;;kDAOyB;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;;;;CAIvG,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { generateReport } from '../utils/reportGenerator.js';
2
+ import { z } from 'zod';
3
+ // Эта функция будет извлекать данные из текста и генерировать элементы
4
+ async function designReportFromDescription(description) {
5
+ const elements = {};
6
+ let newDocument = description;
7
+ // Извлечение данных по продуктам
8
+ const productMatches = [...description.matchAll(/-\s*\*\*(.*?)\*\*: \$([\d,.]+) (млрд|миллиарда)/gi)];
9
+ if (productMatches.length > 0) {
10
+ const labels = productMatches.map(match => match[1]);
11
+ const data = productMatches.map(match => parseFloat(match[2].replace(/,/g, '')));
12
+ elements['product_sales_chart'] = {
13
+ type: 'doughnut',
14
+ config: {
15
+ labels,
16
+ datasets: [{
17
+ label: 'Выручка по продуктам (млрд $)',
18
+ data,
19
+ backgroundColor: ['#5A9E6F', '#E67E22', '#F1C40F', '#3498DB', '#9B59B6']
20
+ }]
21
+ }
22
+ };
23
+ newDocument += '\n\n## Диаграмма: Продажи по продуктам\n\n[[chart:product_sales_chart]]';
24
+ }
25
+ // Извлечение данных по регионам
26
+ const regionMatches = [...description.matchAll(/Выручка в (.*?)\s*в 2024.*? \$([\d,.]+) (млрд|миллиарда)/gi)];
27
+ if (regionMatches.length > 0) {
28
+ const labels = regionMatches.map(match => match[1]);
29
+ const data = regionMatches.map(match => parseFloat(match[2].replace(/,/g, '')));
30
+ elements['region_sales_chart'] = {
31
+ type: 'bar',
32
+ config: {
33
+ labels,
34
+ datasets: [{
35
+ label: 'Выручка по регионам (млрд $)',
36
+ data,
37
+ backgroundColor: ['#2ECC71', '#3498DB', '#E74C3C', '#F1C40F', '#9B59B6']
38
+ }]
39
+ }
40
+ };
41
+ newDocument += '\n\n## Диаграмма: Выручка по регионам\n\n[[chart:region_sales_chart]]';
42
+ }
43
+ // Пример: добавляем изображение на основе контекста
44
+ let imagePrompt = "business report and data analysis";
45
+ if (/apple/i.test(description)) {
46
+ imagePrompt = "futuristic design representing apple inc innovation";
47
+ }
48
+ else if (/tesla/i.test(description)) {
49
+ imagePrompt = "electric cars and modern technology";
50
+ }
51
+ elements['context_image'] = {
52
+ type: 'pollinations',
53
+ config: { prompt: imagePrompt }
54
+ };
55
+ newDocument += '\n\n## Иллюстрация\n\n[[image:context_image]]';
56
+ return { document: newDocument, elements };
57
+ }
58
+ export const reportWizardTool = {
59
+ name: "create_report",
60
+ description: "Designs and generates a complete, visually rich HTML report from a simple text description.",
61
+ inputSchema: {
62
+ report_description: z.string().describe("A text description of the desired report (e.g., 'an apple financial report for 2024')."),
63
+ outputFile: z.string().describe("The desired output HTML file name (e.g., 'report.html').")
64
+ },
65
+ execute: async ({ report_description, outputFile }) => {
66
+ const { document, elements } = await designReportFromDescription(report_description);
67
+ return await generateReport(document, elements, outputFile);
68
+ }
69
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vint.tri/report_gen_mcp",
3
- "version": "1.7.32",
3
+ "version": "1.7.33",
4
4
  "description": "CLI tool for generating HTML reports with embedded charts and images",
5
5
  "main": "dist/index.js",
6
6
  "bin": {
@@ -24,6 +24,7 @@
24
24
  "fs-extra": "^11.2.0",
25
25
  "jsdom": "^26.1.0",
26
26
  "marked": "^14.1.2",
27
+ "openai": "^4.52.7",
27
28
  "zod": "^3.23.8"
28
29
  },
29
30
  "devDependencies": {
@@ -1,89 +0,0 @@
1
- # Главная инструкция по работе с инструментом report_gen_mcp v1.9.0
2
-
3
- **ЦЕЛЬ:** Генерация качественных, визуально насыщенных HTML-отчетов по запросу пользователя.
4
-
5
- **КЛЮЧЕВОЕ ПРАВИЛО:** При любом запросе, связанном с отчетами, диаграммами или графиками, вы **обязаны** использовать инструмент `report_gen_mcp`. Не пытайтесь отвечать текстом или генерировать отчеты самостоятельно.
6
-
7
- ---
8
-
9
- ### **АЛГОРИТМ ДЕЙСТВИЙ**
10
-
11
- **Шаг 1: Проанализируй текст отчета**
12
- - Внимательно изучи текст, предоставленный пользователем. Найди в нем ключевые данные: цифры, категории, продукты, регионы.
13
-
14
- **Шаг 2: Спланируй визуальные элементы (`elements`)**
15
- - На основе найденных данных, придумай **2-3 диаграммы**, которые наглядно представят эту информацию.
16
- - Придумай **1-2 промпта** для изображений, которые будут соответствовать теме отчета.
17
- - **Обязательно** создай плейсхолдеры для каждого элемента в тексте отчета, например `[[chart:sales_by_product]]` или `[[image:cover_image]]`.
18
-
19
- **Шаг 3: Сформируй `elements` ПРАВИЛЬНО (КРИТИЧЕСКИ ВАЖНО!)**
20
- - `elements` — это **ОБЪЕКТ**, где ключи — это названия плейсхолдеров.
21
- - **Для диаграмм:**
22
- - `labels`, `data`, `backgroundColor`, `borderColor` — **ВСЕГДА МАССИВЫ**.
23
- - **Для изображений:**
24
- - Используй `type: "pollinations"` и `config: { prompt: "..." }`.
25
-
26
- **Шаг 4: Вызови инструмент**
27
- - Передай в `generate-report` три параметра: `document`, `elements` и `outputFile`.
28
-
29
- ---
30
-
31
- ### **Разбор реального примера (Отчет Apple)**
32
-
33
- Вот как нужно было обработать отчет про Apple, чтобы избежать ошибок:
34
-
35
- **Исходный текст:**
36
- *Финансовый отчет Apple за 2024 год... iPhone: $216,4 млрд... Mac: $31,04 млрд... iPad: $26,89 млрд... Услуги: $92,3 млрд...*
37
-
38
- **ПРАВИЛЬНЫЙ ХОД МЫСЛЕЙ:**
39
-
40
- 1. "Ага, в тексте есть разбивка выручки по продуктам. Это отличные данные для круговой диаграммы (`pie`)."
41
- 2. "Также есть данные по выручке в разных регионах (Америка, Европа, Китай). Сделаю столбчатую диаграмму (`bar`)."
42
- 3. "Для обложки сгенерирую изображение с логотипом Apple."
43
- 4. "Теперь я создам плейсхолдеры в тексте: `[[chart:product_sales]]`, `[[chart:region_sales]]`, `[[image:apple_logo]]`."
44
- 5. "Наконец, я соберу объект `elements`, где ключами будут эти плейсхолдеры, а значениями — правильно отформатированные конфигурации."
45
-
46
- ### **ИДЕАЛЬНЫЙ ВЫЗОВ ДЛЯ ОТЧЕТА APPLE**
47
-
48
- ```json
49
- {
50
- "method": "generate-report",
51
- "params": {
52
- "outputFile": "apple_financial_report_2024.html",
53
- "document": "# Финансовый отчет Apple за 2024 год\n\n[[image:apple_logo]]\n\n## Разбивка по продуктам\n\n[[chart:product_sales]]\n\n## Выручка по регионам\n\n[[chart:region_sales]]\n\n...",
54
- "elements": {
55
- "apple_logo": {
56
- "type": "pollinations",
57
- "config": {
58
- "prompt": "Apple logo on a futuristic blue background"
59
- }
60
- },
61
- "product_sales": {
62
- "type": "pie",
63
- "config": {
64
- "labels": ["iPhone", "Mac", "iPad", "Услуги"],
65
- "datasets": [{
66
- "data": [216.4, 31.04, 26.89, 92.3],
67
- "backgroundColor": ["#5A9E6F", "#E67E22", "#F1C40F", "#3498DB"]
68
- }],
69
- "options": { "title": "Выручка по продуктам (млрд $)" }
70
- }
71
- },
72
- "region_sales": {
73
- "type": "bar",
74
- "config": {
75
- "labels": ["Америка", "Европа", "Китай", "Япония", "Азия (ост.)"],
76
- "datasets": [{
77
- "label": "Выручка по регионам (млрд $)",
78
- "data": [193.8, 113.8, 85.1, 31.0, 67.4],
79
- "backgroundColor": ["#2ECC71", "#3498DB", "#E74C3C", "#F1C40F", "#9B59B6"]
80
- }],
81
- "options": { "title": "Региональная выручка" }
82
- }
83
- }
84
- }
85
- }
86
- }
87
- ```
88
-
89
- Следуй этому примеру, и все будет работать идеально.