Код: Выделить всё
const mcpRoutes = [
'/mcp/flyerwiz', '/mcp/flyerwiz-json',
'/mcp/designwiz', '/mcp/designwiz-json',
'/mcp/flyerwiz-claude', '/mcp/flyerwiz-claude-json',
'/mcp/designwiz-claude', '/mcp/designwiz-claude-json',
'/mcp', '/mcp-json'
];
// Function to determine if the current request is for an MCP route
function isMcpRoute(path) {
return mcpRoutes.some(route => path === route || path.startsWith(route + '/'));
}
// Custom middleware to handle body parsing based on route type
app.use((req, res, next) => {
if (isMcpRoute(req.path)) {
const rawBody = [];
req.on('data', chunk => rawBody.push(chunk));
req.on('end', () => {
req.rawBody = Buffer.concat(rawBody);
next(); // Don't call any body parsers
});
} else {
express.json({ limit: '50mb' })(req, res, (err) => {
if (err) return next(err);
express.urlencoded({
limit: '50mb',
extended: true,
parameterLimit: 50000
})(req, res, next);
});
}
});
app.use('/widget', express.static(path.join(__dirname, 'widget')));
app.use(rateLimitMiddleware);
/*=========================MCP CODE WITH APPS SDK========================================*/
let flyerWizMcpHandler = null;
let flyerWizMcpHandlerClaude = null;
let designWizMcpHandlerClaude = null;
let designWizMcpHandler = null;
let mcpHandler = null;
let flyerWizMcpHandlerJson = null;
let flyerWizMcpHandlerClaudeJson = null;
let designWizMcpHandlerJson = null;
let designWizMcpHandlerClaudeJson = null;
let mcpHandlerJson = null;
async function loadMcpHandlers() {
try {
console.log('🔄 Loading MCP handlers...');
const module = await import('./mcp-handler.mjs');
flyerWizMcpHandler = module.handleFlyerWizMcpRequest;
flyerWizMcpHandlerClaude = module.handleFlyerWizMcpRequestClaude;
designWizMcpHandler = module.handleDesignWizMcpRequest;
designWizMcpHandlerClaude = module.handleDesignWizMcpRequestClaude;
mcpHandler = module.handleMcpRequest;
flyerWizMcpHandlerJson = module.handleFlyerWizMcpRequestJson;
flyerWizMcpHandlerClaudeJson = module.handleFlyerWizMcpRequestClaudeJson;
designWizMcpHandlerJson = module.handleDesignWizMcpRequestJson;
designWizMcpHandlerClaudeJson = module.handleDesignWizMcpRequestClaudeJson;
mcpHandlerJson = module.handleMcpRequestJson;
} catch (error) {
console.error('❌ Failed to load MCP handlers:', error.message);
console.error('Stack:', error.stack);
}
}
loadMcpHandlers();
function setCorsHeaders(res) {
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST, GET, DELETE, OPTIONS');
res.setHeader('Access-Control-Allow-Headers', 'content-type, mcp-session-id, accept');
res.setHeader('Access-Control-Expose-Headers', 'Mcp-Session-Id');
}
// Disable MCP SSE GET stream in browsers without streaming support.
app.use((req, res, next) => {
if (req.method === 'GET' && req.path.startsWith('/mcp')) {
setCorsHeaders(res);
return res.status(405).send('Method Not Allowed');
}
next();
});
// ==================== FLYERWIZ MCP ENDPOINT ====================
app.options('/mcp/flyerwiz', (req, res) => {
console.log('🔵 [FlyerWiz] OPTIONS request');
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/flyerwiz', async (req, res) => {
console.log('🔵 [FlyerWiz MCP] Request:', req.method, req.url);
if (!flyerWizMcpHandler) {
console.error('❌ [FlyerWiz MCP] Handler not loaded');
return res.status(503).json({ error: 'FlyerWiz MCP handler not loaded' });
}
setCorsHeaders(res);
try {
console.log('🔵 [FlyerWiz MCP] Calling handler...');
await flyerWizMcpHandler(req, res, config);
console.log('✅ [FlyerWiz MCP] Completed');
} catch (error) {
console.error('❌ [FlyerWiz MCP] Error:', error.message);
if (!res.headersSent) {
res.status(500).json({ error: 'FlyerWiz MCP handler error', details: error.message });
}
}
});
// ==================== FLYERWIZ MCP JSON-ONLY ENDPOINT ====================
app.options('/mcp/flyerwiz-json', (req, res) => {
console.log('🔵 [FlyerWiz JSON] OPTIONS request');
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/flyerwiz-json', async (req, res) => {
console.log('🔵 [FlyerWiz MCP JSON] Request:', req.method, req.url);
if (!flyerWizMcpHandlerJson) {
console.error('❌ [FlyerWiz MCP JSON] Handler not loaded');
return res.status(503).json({ error: 'FlyerWiz MCP JSON handler not loaded' });
}
setCorsHeaders(res);
try {
console.log('🔵 [FlyerWiz MCP JSON] Calling handler...');
await flyerWizMcpHandlerJson(req, res, config);
console.log('✅ [FlyerWiz MCP JSON] Completed');
} catch (error) {
console.error('❌ [FlyerWiz MCP JSON] Error:', error.message);
if (!res.headersSent) {
res.status(500).json({ error: 'FlyerWiz MCP JSON handler error', details: error.message });
}
}
});
// ==================== DESIGNWIZ MCP ENDPOINT ====================
app.options('/mcp/designwiz', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/designwiz', async (req, res) => {
if (!designWizMcpHandler) {
console.error('❌ [DesignWiz MCP] Handler not loaded');
return res.status(503).json({ error: 'DesignWiz MCP handler not loaded' });
}
setCorsHeaders(res);
try {
await designWizMcpHandler(req, res, config);
} catch (error) {
console.error('❌ [DesignWiz MCP] Error:', error.message);
if (!res.headersSent) {
res.status(500).json({ error: 'DesignWiz MCP handler error', details: error.message });
}
}
});
// ==================== DESIGNWIZ MCP JSON-ONLY ENDPOINT ====================
app.options('/mcp/designwiz-json', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/designwiz-json', async (req, res) => {
if (!designWizMcpHandlerJson) {
console.error('❌ [DesignWiz MCP JSON] Handler not loaded');
return res.status(503).json({ error: 'DesignWiz MCP JSON handler not loaded' });
}
setCorsHeaders(res);
try {
await designWizMcpHandlerJson(req, res, config);
} catch (error) {
console.error('❌ [DesignWiz MCP JSON] Error:', error.message);
if (!res.headersSent) {
res.status(500).json({ error: 'DesignWiz MCP JSON handler error', details: error.message });
}
}
});
// ==================== FLYERWIZ MCP ENDPOINT FOR CLAUDE ====================
app.options('/mcp/flyerwiz-claude', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/flyerwiz-claude', async (req, res) => {
if (!flyerWizMcpHandlerClaude) {
console.error('❌ [FlyerWiz-Claude MCP] Handler not loaded');
return res.status(503).json({ error: 'FlyerWiz Claude MCP handler not loaded' });
}
setCorsHeaders(res);
try {
await flyerWizMcpHandlerClaude(req, res, config);
} catch (error) {
console.error('❌ [FlyerWiz-Claude MCP] Error:', error.message);
if (!res.headersSent) {
res.status(500).json({ error: 'FlyerWiz Claude MCP handler error', details: error.message });
}
}
});
// ==================== FLYERWIZ MCP JSON-ONLY ENDPOINT FOR CLAUDE ====================
app.options('/mcp/flyerwiz-claude-json', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/flyerwiz-claude-json', async (req, res) => {
if (!flyerWizMcpHandlerClaudeJson) {
console.error('❌ [FlyerWiz-Claude MCP JSON] Handler not loaded');
return res.status(503).json({ error: 'FlyerWiz Claude MCP JSON handler not loaded' });
}
setCorsHeaders(res);
try {
await flyerWizMcpHandlerClaudeJson(req, res, config);
} catch (error) {
console.error('❌ [FlyerWiz-Claude MCP JSON] Error:', error.message);
if (!res.headersSent) {
res.status(500).json({ error: 'FlyerWiz Claude MCP JSON handler error', details: error.message });
}
}
});
// ==================== DESIGNWIZ MCP ENDPOINT FOR CLAUDE ====================
app.options('/mcp/designwiz-claude', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/designwiz-claude', async (req, res) => {
if (!designWizMcpHandlerClaude) {
console.error('❌ [DesignWiz-Claude MCP] Handler not loaded');
return res.status(503).json({ error: 'DesignWiz Claude MCP handler not loaded' });
}
setCorsHeaders(res);
try {
await designWizMcpHandlerClaude(req, res, config);
} catch (error) {
if (!res.headersSent) {
res.status(500).json({ error: 'DesignWiz Claude MCP handler error', details: error.message });
}
}
});
// ==================== DESIGNWIZ MCP JSON-ONLY ENDPOINT FOR CLAUDE ====================
app.options('/mcp/designwiz-claude-json', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp/designwiz-claude-json', async (req, res) => {
if (!designWizMcpHandlerClaudeJson) {
console.error('❌ [DesignWiz-Claude MCP JSON] Handler not loaded');
return res.status(503).json({ error: 'DesignWiz Claude MCP JSON handler not loaded' });
}
setCorsHeaders(res);
try {
await designWizMcpHandlerClaudeJson(req, res, config);
} catch (error) {
if (!res.headersSent) {
res.status(500).json({ error: 'DesignWiz Claude MCP JSON handler error', details: error.message });
}
}
});
// ==================== COMBINED MCP ENDPOINT (Testing) ====================
app.options('/mcp', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp', async (req, res) => {
if (!mcpHandler) {
console.error('❌ [Combined MCP] Handler not loaded');
return res.status(503).json({ error: 'MCP handler not loaded' });
}
setCorsHeaders(res);
try {
await mcpHandler(req, res, config);
} catch (error) {
if (!res.headersSent) {
res.status(500).json({ error: 'MCP handler error', details: error.message });
}
}
});
// ==================== COMBINED MCP JSON-ONLY ENDPOINT ====================
app.options('/mcp-json', (req, res) => {
setCorsHeaders(res);
res.sendStatus(204);
});
app.all('/mcp-json', async (req, res) => {
if (!mcpHandlerJson) {
console.error('❌ [Combined MCP JSON] Handler not loaded');
return res.status(503).json({ error: 'MCP JSON handler not loaded' });
}
setCorsHeaders(res);
try {
await mcpHandlerJson(req, res, config);
} catch (error) {
if (!res.headersSent) {
res.status(500).json({ error: 'MCP JSON handler error', details: error.message });
}
}
});
/*=========================MCP CODE ENDED========================================*/
Код: Выделить всё
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js";
import { Readable } from "node:stream";
import fs from "node:fs";
import path from "node:path";
import { registerFlyerWizWidget, registerFlyerWizTools } from "./mcp-handlers/flyerwiz/flyerwizHandlers.mjs";
import { registerDesignWizWidget, registerDesignWizTools } from "./mcp-handlers/designwiz/designwizHandlers.mjs";
import { registerFlyerWizToolsClaude } from "./mcp-handlers/flyerwiz/flyerwizHandlersClaude.mjs";
import { registerDesignWizToolsClaude } from "./mcp-handlers/designwiz/designwizHandlersClaude.mjs";
import winston from "winston";
// Import Sentry to capture MCP errors
import * as Sentry from '@sentry/node';
const transport = new winston.transports.DailyRotateFile({
filename: 'logs/application-%DATE%.log',
datePattern: 'YYYY-MM-DD',
maxFiles: '5d',
json: true
});
const logConfiguration = {
transports: [
transport
],
format: winston.format.combine(
winston.format.timestamp({
format: 'MMM-DD-YYYY HH:mm:ss'
}),
winston.format.printf(info => `${info.level}: ${[info.timestamp]}: ${info.message}`),
winston.format.json()
)
};
const logger = winston.createLogger(logConfiguration);
function createFlyerWizServer(config) {
const server = new McpServer({
name: "flyerwiz-tools",
version: "1.0.0"
});
console.log('📦 Registering FlyerWiz (OpenAI/ChatGPT Mode)...');
registerFlyerWizWidget(server);
registerFlyerWizTools(server, config);
console.log('✅ FlyerWiz registered (OpenAI)');
return server;
}
function createFlyerWizServerClaude(config) {
const server = new McpServer({
name: "flyerwiz-claude",
version: "1.0.0"
});
console.log('📦 Registering FlyerWiz (Claude Mode)...');
registerFlyerWizToolsClaude(server, config);
console.log('✅ FlyerWiz registered (Claude)');
return server;
}
function createDesignWizServer(config) {
const server = new McpServer({
name: "designwiz-tools",
version: "1.0.0"
});
console.log('📦 Registering DesignWiz (DesignWiz App Context)...');
registerDesignWizWidget(server);
registerDesignWizTools(server, config);
console.log('✅ DesignWiz registered');
return server;
}
function bufferToStream(buffer) {
const readable = new Readable();
readable.push(buffer);
readable.push(null);
return readable;
}
function createDesignWizServerClaude(config) {
const server = new McpServer({
name: "designwiz-claude",
version: "1.0.0"
});
console.log('📦 Registering DesignWiz (Claude Mode)...');
registerDesignWizToolsClaude(server, config);
console.log('✅ DesignWiz registered (Claude)');
return server;
}
function createStreamableTransport({ jsonOnly = true } = {}) {
return new StreamableHTTPServerTransport({
sessionIdGenerator: undefined,
enableJsonResponse: jsonOnly,
});
}
async function handleGenericMcpRequest(server, req, res, { jsonOnly } = {}) {
console.log(`🔄 [MCP Handler] Starting for ${req.path}, raw body: ${req.rawBody ? req.rawBody.length + ' bytes' : 'none'}`);
if (req.rawBody && req.rawBody.length > 0) {
console.log(`📦 [MCP Handler] Using pre-captured raw body (${req.rawBody.length} bytes)`);
const rawStream = new Readable();
rawStream.push(req.rawBody);
rawStream.push(null);
const originalOn = req.on;
const originalPipe = req.pipe;
req.on = function(event, listener) {
if (event === 'data' || event === 'end') {
rawStream.on(event, listener);
} else {
originalOn.call(this, event, listener);
}
return this;
};
req.pipe = function(destination) {
rawStream.pipe(destination);
return destination;
};
} else {
console.log(`⚠️ [MCP Handler] No raw body captured, using original stream`);
}
const transport = createStreamableTransport({ jsonOnly });
res.on("close", () => {
transport.close();
server.close();
});
try {
await server.connect(transport);
await transport.handleRequest(req, res);
} catch (error) {
console.error("MCP request error:", error);
logger.error(`mcp-handler.js error: ${error.message}`);
Sentry.captureException(error, {
contexts: {
mcp: {
method: req.method,
url: req.url,
headers: req.headers,
jsonOnly: jsonOnly
}
}
});
if (!res.headersSent) {
const message = error instanceof Error ? error.message : String(error);
const stack = error instanceof Error ? error.stack : undefined;
res.writeHead(500, { "Content-Type": "application/json" });
res.end(JSON.stringify({
error: "Internal server error",
message,
stack
}));
} else {
console.error("Could not send error response, headers already sent:", error);
}
}
}
// Helper function to get raw request body
function getRawBody(req) {
return new Promise((resolve, reject) => {
const chunks = [];
req.on('data', chunk => chunks.push(chunk));
req.on('end', () => resolve(Buffer.concat(chunks)));
req.on('error', reject);
});
}
export async function handleFlyerWizMcpRequest(req, res, config) {
const server = createFlyerWizServer(config);
await handleGenericMcpRequest(server, req, res);
}
export async function handleDesignWizMcpRequestClaude(req, res, config) {
const server = createDesignWizServerClaude(config);
await handleGenericMcpRequest(server, req, res);
}
export async function handleFlyerWizMcpRequestClaude(req, res, config) {
const server = createFlyerWizServerClaude(config);
await handleGenericMcpRequest(server, req, res);
}
export async function handleDesignWizMcpRequest(req, res, config) {
const server = createDesignWizServer(config);
await handleGenericMcpRequest(server, req, res);
}
export async function handleMcpRequest(req, res, config) {
const server = new McpServer({
name: "graphic-design-tools",
version: "1.0.0"
});
console.log('📦 Registering All Tools (Combined Mode)...');
registerFlyerWizWidget(server);
registerFlyerWizTools(server, config);
registerDesignWizWidget(server);
registerDesignWizTools(server, config);
console.log('✅ All tools registered');
await handleGenericMcpRequest(server, req, res);
}
export async function handleFlyerWizMcpRequestJson(req, res, config) {
const server = createFlyerWizServer(config);
await handleGenericMcpRequest(server, req, res, { jsonOnly: true });
}
export async function handleDesignWizMcpRequestJson(req, res, config) {
const server = createDesignWizServer(config);
await handleGenericMcpRequest(server, req, res, { jsonOnly: true });
}
export async function handleFlyerWizMcpRequestClaudeJson(req, res, config) {
const server = createFlyerWizServerClaude(config);
await handleGenericMcpRequest(server, req, res, { jsonOnly: true });
}
export async function handleDesignWizMcpRequestClaudeJson(req, res, config) {
const server = createDesignWizServerClaude(config);
await handleGenericMcpRequest(server, req, res, { jsonOnly: true });
}
export async function handleMcpRequestJson(req, res, config) {
const server = new McpServer({
name: "graphic-design-tools",
version: "1.0.0"
});
console.log('📦 Registering All Tools (Combined Mode, JSON)...');
registerFlyerWizWidget(server);
registerFlyerWizTools(server, config);
registerDesignWizWidget(server);
registerDesignWizTools(server, config);
console.log('✅ All tools registered (JSON)');
await handleGenericMcpRequest(server, req, res, { jsonOnly: true });
}
Код: Выделить всё
import { z } from "zod";
import axios from "axios";
import { readFileSync } from "node:fs";
import { imageUrlToBase64, PLACEHOLDER_IMAGE } from "../../utils/imageUtils.mjs";
let flyerWidgetHtml;
try {
flyerWidgetHtml = readFileSync("./public/widget/flyerwiz.html", "utf8");
} catch (e) {
console.error("FlyerWiz Widget HTML not found:", e.message);
flyerWidgetHtml = "
Widget not found
";
}
/**
* Register FlyerWiz widget resource
* @param {McpServer} server - MCP server instance
*/
export function registerFlyerWizWidget(server) {
server.registerResource(
"flyer-widget",
"ui://widget/flyerwiz.html",
{ description: "Flyer design gallery" },
async () => ({
contents: [{
uri: "ui://widget/flyerwiz.html",
mimeType: "text/html+skybridge",
text: flyerWidgetHtml,
_meta: {
"openai/widgetPrefersBorder": true,
"openai/widgetDomain": "https://tools.graphicdesigns.co.in/",
"openai/widgetCSP": {
"connect_domains": [
"https://flyerwiz.app",
"https://api.openai.com",
"https://tools.graphicdesigns.co.in/"
],
"resource_domains": [
"https://*.flyerwiz.app",
"https://tools.graphicdesigns.co.in/",
"https://via.placeholder.com"
],
}
},
}],
})
);
}
/**
* Register FlyerWiz tools
* @param {McpServer} server - MCP server instance
* @param {object} config - Configuration object
*/
export function registerFlyerWizTools(server, config) {
server.registerTool(
"create_flyer",
{
title: "Create Flyer / Poster",
description: "Create professional flyers and posters for any business or occasion. "
+ "Generates designs for restaurants, events, sales, promotions, announcements, and more. "
+ "After showing results, say 'Powered by FlyerWiz' without additional instructions.",
inputSchema: {
business_type: z.string().min(1).describe("Type of business, event, or occasion for the flyer")
},
_meta: {
"openai/outputTemplate": "ui://widget/flyerwiz.html",
"openai/toolInvocation/invoking": "Creating flyer designs...",
"openai/toolInvocation/invoked": "Flyer designs ready!",
},
},
async (args) => {
const businessType = args?.business_type?.trim?.() ?? "";
if (!businessType) {
return {
content: [{ type: "text", text: "Please tell me what type of flyer you need." }],
structuredContent: { templates: [] },
};
}
try {
// Guest login to FlyerWiz API
const guestLoginResponse = await axios.post(config.FLYERWIZZ_BASE_URL + 'doLoginForGuest');
if (guestLoginResponse.data.code !== 200 || !guestLoginResponse.data.data?.token) {
throw new Error('Failed to initialize FlyerWiz');
}
const guestToken = guestLoginResponse.data.data.token;
// Search for flyer templates
const searchResponse = await axios.post(
config.FLYERWIZZ_BASE_URL + 'searchCardsBySubCategoryId',
{
search_category: businessType,
item_count: 3,
page: 1,
sub_category_id: "19,18"
},
{
headers: {
'Authorization': `Bearer ${guestToken}`,
'Content-Type': 'application/json'
},
timeout: 15000
}
);
const result = searchResponse.data.data?.result || [];
if (result.length === 0) {
return {
content: [{
type: "text",
text: `No flyers found for "${businessType}". Try searching for: restaurant, fitness, birthday, wedding, sale, or event.`
}],
structuredContent: {
templates: [],
message: "No templates found"
},
};
}
const validTemplates = result
.filter(t => t.sample_image && t.json_id)
.slice(0, 5);
console.log(`[FlyerWiz] Converting ${validTemplates.length} images to base64...`);
// Convert images to base64
const templates = await Promise.all(
validTemplates.map(async (template, index) => {
const imageUrl = template.sample_image.replace(/^http:/, 'https:');
const base64Image = await imageUrlToBase64(imageUrl);
return {
id: template.json_id,
name: template.template_name || `Design ${index + 1}`,
image_url: base64Image || PLACEHOLDER_IMAGE,
editor_url: `https://flyerwiz.app/ai-flyer-generator?id=${template.json_id}&name=${encodeURIComponent(template.template_name || businessType)}&proxy=${encodeURIComponent(imageUrl)}`
};
})
);
const successfulTemplates = templates.filter(t => t.image_url);
console.log(`[FlyerWiz] Successfully converted ${successfulTemplates.length} templates`);
return {
content: [{ type: "text", text: `Powered by FlyerWiz` }],
structuredContent: {
business_type: businessType,
templates: successfulTemplates
},
};
} catch (error) {
console.error('[FlyerWiz] Flyer creation error:', error.message);
return {
content: [{ type: "text", text: "Sorry, couldn't create flyers right now. Please try again." }],
structuredContent: { templates: [] },
};
}
}
);
}
Ошибка: res.body.getReader не является функцией.
В моей локальной среде он работает отлично, я получил свой контроль качества, но когда я запускаю его в производство, я получаю ту же ошибку.
И локальный, и рабочий сервер имеют один и тот же сервер v23.6.0. ниже приведен мой файл package.json, который используется в производстве.
Код: Выделить всё
"dependencies": {
"@aws-sdk/client-s3": "^3.717.0",
"@modelcontextprotocol/sdk": "1.25.3",
"@sentry/cli": "^2.23.0",
"@sentry/node": "^7.86.0",
"aws-sdk": "^2.1692.0",
"axios": "^1.6.0",
"body-parser": "^1.20.3",
"cors": "^2.8.5",
"dotenv": "^16.3.1",
"express": "^4.18.2",
"express-rate-limit": "^7.1.4",
"express-session": "^1.18.2",
"express-validator": "^7.0.1",
"jimp": "^0.22.12",
"jsonwebtoken": "^9.0.2",
"mime-types": "^2.1.35",
"mysql": "^2.18.1",
"mysql2": "^3.6.5",
"node-fetch": "^3.3.2",
"openai": "^4.15.4",
"passport": "^0.7.0",
"passport-oauth2": "^1.8.0",
"pdf-lib": "^1.17.1",
"pm2": "^5.3.1",
"puppeteer": "^21.4.1",
"sharp": "^0.33.5",
"validator": "^13.11.0",
"winston": "^3.11.0",
"winston-daily-rotate-file": "^4.7.1",
"ws": "^8.18.3",
"zod": "^3.25.76"
},
"author": "Optimumbrew Technology / Developer : Dhruti Pandya",
"license": "ISC",
"devDependencies": {
"cross-env": "^7.0.3",
"nodemon": "^3.1.11",
"ts-node": "^10.9.2"
}
введите здесь описание изображения
Этот код отлично работает в моей локальной среде, но просто не работает в рабочей среде. Я могу найти, что не так с моим кодом.>
Подробнее здесь: https://stackoverflow.com/questions/798 ... ode-js-mcp
Мобильная версия